Espruino:Примеры/Запись и воспроизведение ИК-сигналов при помощи Puck.js

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Запись и воспроизведение ИК-сигналов при помощи Puck.js[1]

В видео ниже рассказывается, как управлять инфракрасными устройствами при помощи Puck.js.

Controlling Infrared devices with Puck.js and Espruino

Нам понадобятся Puck.js и ИК-ресивер.

Примечание

Если у вас нет ИК-ресивера, то вы можете поискать в сети код в формате Pronto Hex для своего устройства, а затем расшифровать его с помощью этой библиотеки.

Запись

Вот код, который использовался в видео:

digitalWrite(D2,0);
pinMode(D1,"input_pullup");
var d = [];
setWatch(function(e) {
  d.push(1000*(e.time-e.lastTime));
}, D1, {edge:"both",repeat:true});

При помощи строчки ниже можно вывести в консоль содержимое массива d[], округлённое до одного знака после запятой (так читать его будет гораздо удобнее):

console.log(d.map(a=>a.toFixed(1)).toString())

А код ниже автоматически печатает получаемый ИК-код сразу после отправки:

var lastLen = 0;
setInterval(function() {
  if (d.length && d.length==lastLen) {
    d.shift(); // удаляем первый элемент
    console.log(d.map(a=>a.toFixed(1)).toString());
    d=[];
  }
  lastLen = d.length;
},200);

У лампочки, которая использовалась в видео, коды получились вот такими:

var commands = {
  off:[8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,0.6,0.5,1.7,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,0.6,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.5,96.2,8.9,2.3,0],
  on:[8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.5,96.2,8.9,2.3,0.5],
  white:[9.0,4.4,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,1.7,0.5,1.7,0.5,0.6,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,39.9,8.9,2.3,0.5,96.2,8.9,2.3,0.5],
  red:[8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,1.7,0.5,0.6,0.5,0.6,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.8,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.8,0.6,1.7,0.5,1.7,0.5,39.9,8.9,2.3,0.5],  
  green:[8,8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.5],
  blue:[8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,39.9,8.9,2.3,0.5,96.2,8.9,2.3,0.5],
  dim:[8.9,4.6,0.4,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.8,0.5,1.7,0.5,0.6,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,39.9,8.9,2.3,0.4,96.2,8.9,2.3,0.5],
  bright:[8.9,4.6,0.4,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,0.6,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.5],
  flash:[8.9,4.6,0.4,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.4],
  fade:[8.9,4.8,0.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.8,0.5,0.6,0.5,0.6,0.5,1.8,0.5,0.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,39.9,8.9,2.3,0.5,106.8,0.4]
};

Воспроизведение

Для этого нужно лишь поместить массив в Puck.IR(). Например, если у вас та же лампочка, которая используется в видео, просто напечатайте Puck.IR(commands.on), и она включится.

Кроме того, вы можете воспользоваться Web Bluetooth для отправки данных с веб-страницы на любой Puck.js – его даже не надо будет программировать, потому что веб-страница может одновременно отправлять и код, и данные.

<html>
 <head>
  <style>
body {
  margin: 5%;
  background-color: #000;
}

table {
  width:100%;
  height:100%;
 table-layout: fixed;
}

td {
  background-color: #444;
  color: #fff;
  border: 2px solid white;
  border-radius: 5px;  
  font-size: 5vw;
  margin: 5px;
  text-align:center;
  cursor: pointer;
  user-select: none;
}
  </style>    
 </head>
 <body>
  <script>
var commands = {
  off:[8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,0.6,0.5,1.7,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,0.6,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.5,96.2,8.9,2.3,0],
  on:[8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.5,96.2,8.9,2.3,0.5],
  white:[9.0,4.4,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,1.7,0.5,1.7,0.5,0.6,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,39.9,8.9,2.3,0.5,96.2,8.9,2.3,0.5],
  red:[8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,1.7,0.5,0.6,0.5,0.6,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.8,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.8,0.6,1.7,0.5,1.7,0.5,39.9,8.9,2.3,0.5],  
  green:[8,8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.5],
  blue:[8.9,4.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,39.9,8.9,2.3,0.5,96.2,8.9,2.3,0.5],
  dim:[8.9,4.6,0.4,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.8,0.5,1.7,0.5,0.6,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,39.9,8.9,2.3,0.4,96.2,8.9,2.3,0.5],
  bright:[8.9,4.6,0.4,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,0.6,0.5,1.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.5],
  flash:[8.9,4.6,0.4,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,1.8,0.4,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,1.8,0.5,1.7,0.5,39.9,8.9,2.3,0.4],
  fade:[8.9,4.8,0.8,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.7,0.5,1.7,0.5,1.8,0.5,1.8,0.5,0.6,0.5,0.6,0.5,1.8,0.5,0.5,0.5,0.6,0.5,0.6,0.5,0.6,0.5,0.6,0.5,1.7,0.5,1.8,0.5,0.6,0.5,1.7,0.5,1.7,0.5,1.7,0.5,39.9,8.9,2.3,0.5,106.8,0.4]
};

function sendIR(array) {
  Puck.write('Puck.IR(['+array+']);\n')
}
  </script>
  <script src="https://www.puck-js.com/puck.js"></script>
  <table>
    <tr>
     <td onclick="sendIR(commands.on)">ON</td>
     <td onclick="sendIR(commands.off)">OFF</td>
     <td onclick="sendIR(commands.flash)">FLASH</td>
     <td onclick="sendIR(commands.fade)">FADE</td>
    </tr>
    <tr>
     <td></td>
     <td onclick="sendIR(commands.dim)">DIM</td>
     <td onclick="sendIR(commands.bright)">BRIGHT</td>
     <td></td>
    </tr>
    <tr>
     <td onclick="sendIR(commands.red)" style="background-color:red">RED</td>
     <td onclick="sendIR(commands.green)" style="background-color:green">GREEN</td>
     <td onclick="sendIR(commands.blue)" style="background-color:blue">BLUE</td>
     <td onclick="sendIR(commands.white)">WHITE</td>
    </tr>
  </table>
 </body>
</html>

Где купить

ИК-управляемую лампочку вроде той, что показана в видео, можно купить на eBay. Они также продаются в виде полос.

Примечание

Хотя некоторые из этих лампочек внешне идентичны, их коды управления часто отличаются. Единственный способ проверить это – записать их самому.

См.также

Внешние ссылки