Espruino:Примеры/Дистанционно управляемые розетки: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
 
(не показаны 3 промежуточные версии 2 участников)
Строка 7: Строка 7:
[[File:Remote_Control_Sockets_sockets.jpg|center]]
[[File:Remote_Control_Sockets_sockets.jpg|center]]


Сейчас дистанционно управляемые розетки можно купить [https://www.ebay.com/sch/i.html?_nkw=remote+control+socket&mkcid=1&mkrid=711-53200-19255-0&siteid=0&campid=5337979701&customid=&toolid=10001&mkevt=1 очень дёшево]. Это идеальный вариант, если вы хотите прямо с ПК включать и выключать устройства, подключенные к электросети, но не хотите возиться с [https://www.espruino.com/Relays реле] и ручным подключением этих устройств к электросети.  
Сейчас дистанционно управляемые розетки можно купить [https://www.ebay.com/sch/i.html?_nkw=remote+control+socket&mkcid=1&mkrid=711-53200-19255-0&siteid=0&campid=5337979701&customid=&toolid=10001&mkevt=1 очень дёшево]. Это идеальный вариант, если вы хотите прямо с [[ПК]] включать и выключать устройства, подключенные к электросети, но не хотите возиться с [https://www.espruino.com/Relays реле] и ручным подключением этих устройств к электросети.  


Я решил воспользоваться розетками под брендом Status.
Я решил воспользоваться розетками под брендом [[Status]].


Есть два главных способа управления такими розетками.
Есть два главных способа управления такими розетками.
Строка 15: Строка 15:
== Простой способ ==
== Простой способ ==


Вскройте пульт управления и с помощью соединительных проводов подключите каждую его кнопку к Espruino. Так вы можете управлять чем угодно, просто имитируя нажатия на эти кнопки.
Вскройте пульт управления и с помощью соединительных проводов подключите каждую его кнопку к [[Espruino]]. Так вы можете управлять чем угодно, просто имитируя нажатия на эти кнопки.


== Сложный способ ==
== Сложный способ ==
Строка 21: Строка 21:
Вы также можете купить радиопередатчик, чтобы использовать его в качестве пульта управления. Это сложнее, но зато позволяет управлять большим количеством розеток, а также интереснее!
Вы также можете купить радиопередатчик, чтобы использовать его в качестве пульта управления. Это сложнее, но зато позволяет управлять большим количеством розеток, а также интереснее!


Мои розетки работают на 433.92 МГц (это было написано на их задней стороне). Это «открытая» частота – вам не нужна лицензия на её использование, и она полностью бесплатна для всех. В каждом устройстве используется собственный протокол, и все они отправляют данные куда хотят. Это значит, что отправленный вами сигнал вряд ли дойдёт до пункта назначения в целости и сохранности, поэтому некоторые устройства отправляют один и тот же сигнал по несколько раз.
Мои розетки работают на [[433.92 МГц]] (это было написано на их задней стороне). Это «открытая» частота – вам не нужна лицензия на её использование, и она полностью бесплатна для всех. В каждом устройстве используется собственный протокол, и все они отправляют данные куда хотят. Это значит, что отправленный вами сигнал вряд ли дойдёт до пункта назначения в целости и сохранности, поэтому некоторые устройства отправляют один и тот же сигнал по несколько раз.


== Протокол ==
== Протокол ==


В отсутствие запоминающего осциллоскопа узнать протокол, по которому работают розетки, будет довольно проблематично. Чтобы чуть упростить это руководство, я описал этот протокол внизу (кроме того, он хорошо описан в [http://www.picaxeforum.co.uk/archive/index.php/t-16509.html этой ветке] на форуме PicAxe):
В отсутствие запоминающего [[осциллоскоп]]а узнать протокол, по которому работают розетки, будет довольно проблематично. Чтобы чуть упростить это руководство, я описал этот протокол внизу (кроме того, он хорошо описан в [http://www.picaxeforum.co.uk/archive/index.php/t-16509.html этой ветке] на форуме PicAxe):
* Всего есть 25 бит, равноудалённых друг от друга
* Всего есть [[25 бит]], равноудалённых друг от друга
* Единица в бите задаётся сигналом ON в течение 0.9 мс, а затем OFF в течение 0.3 мс
* Единица в бите задаётся сигналом '''ON''' в течение ''0.9 мс'', а затем '''OFF''' в течение ''0.3 мс''
* Ноль в бите задаётся сигналом ON в течение 0.3 мс, а затем OFF в течение 0.9 мс
* Ноль в бите задаётся сигналом '''ON''' в течение ''0.3 мс'', а затем '''OFF''' в течение ''0.9 мс''
* Отправка всех этих 25 бит постоянно повторяется (покуда вы нажимаете на кнопку), а пауза между ними составляет примерно 8 мс
* Отправка всех этих [[25 бит]] постоянно повторяется (покуда вы нажимаете на кнопку), а пауза между ними составляет примерно ''8 мс''


== Нам понадобятся ==
== Нам понадобятся ==
Строка 39: Строка 39:
== Узнаём код управления ==
== Узнаём код управления ==


Простейший способ узнать код управления розеткой (а также то, используется ли тот же протокол в пульте дистанционного управления) – это воспользоваться цифровым [https://www.espruino.com/Tools#oscilloscope запоминающим осциллоскопом]. Но давайте сделаем это при помощи Espruino.
Простейший способ узнать код управления розеткой (а также то, используется ли тот же протокол в пульте дистанционного управления) – это воспользоваться цифровым [https://www.espruino.com/Tools#oscilloscope запоминающим осциллоскопом]. Но давайте сделаем это при помощи [[Espruino]].


Подключите радиоприёмник (433 МГц) к Espruino следующим образом:
Подключите радиоприёмник (433 МГц) к Espruino следующим образом:
Строка 54: Строка 54:
|}
|}


'''Примечание:''' Мы решили воспользоваться напряжением, которое ниже рекомендуемого напряжения – это сделает приёмник менее чувствительным, благодаря чему он с меньшей вероятностью будет получать сигналы от передатчиков, находящихся далеко.
{{Примечание1|Мы решили воспользоваться напряжением, которое ниже рекомендуемого напряжения – это сделает приёмник менее чувствительным, благодаря чему он с меньшей вероятностью будет получать сигналы от передатчиков, находящихся далеко.}}


Мы уже знаем протокол (см. выше), поэтому давайте попробуем понять, как он работает.
Мы уже знаем протокол (см. выше), поэтому давайте попробуем понять, как он работает.
Строка 60: Строка 60:
Загрузите на [[Espruino]] вот этот код:
Загрузите на [[Espruino]] вот этот код:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
function startListening(pin) {
function startListening(pin) {
   // Данные, которые мы получили до сих пор:
   // Данные, которые мы получили до сих пор:
Строка 80: Строка 80:
</syntaxhighlight>
</syntaxhighlight>


Функция sig() выше написана с прицелом на максимально быстрое выполнение кода, но это также делает её трудночитаемой. Ниже я добавил в эту функцию комментарии, чтобы вам было понятнее, как она работает.
Функция [[sig()]] выше написана с прицелом на максимально быстрое выполнение кода, но это также делает её трудночитаемой. Ниже я добавил в эту функцию комментарии, чтобы вам было понятнее, как она работает.


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
   function sig(e) {
   function sig(e) {
     // Задаем в «d» продолжительность
     // Задаем в «d» продолжительность
Строка 120: Строка 120:
Поместите передатчик рядом с приёмником и нажмите на одну из кнопок. В консоли должно появиться несколько похожих друг на друга строк (и несколько некорректных). Примерно вот таких:
Поместите передатчик рядом с приёмником и нажмите на одну из кнопок. В консоли должно появиться несколько похожих друг на друга строк (и несколько некорректных). Примерно вот таких:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
0000010100000111111101110
0000010100000111111101110
0000010100000111111101110
0000010100000111111101110
Строка 133: Строка 133:
Это и есть передаваемый код управления.
Это и есть передаваемый код управления.


Попробуйте понажимать разные кнопки. Вы должны заметить, что числа в начале строк одни и те же, а те, что в конце, меняются (за исключением последнего «0»). Они должны выглядеть примерно так:
Попробуйте понажимать разные кнопки. Вы должны заметить, что числа в начале строк одни и те же, а те, что в конце, меняются (за исключением последнего ''«0»''). Они должны выглядеть примерно так:


{| class="wikitable"
{| class="wikitable"
Строка 175: Строка 175:
|}
|}


Теперь выполните сброс Espruino и загрузите на неё код ниже, замените число в переменной CODE на любое из чисел, которые мы нашли в разделе выше.
Теперь выполните сброс [[Espruino]] и загрузите на неё код ниже, замените число в переменной '''CODE''' на любое из чисел, которые мы нашли в разделе выше.


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var TX = A0;
var TX = A0;
var CODE = 0b0000010100000111111101110;
var CODE = 0b0000010100000111111101110;
Строка 210: Строка 210:
</syntaxhighlight>
</syntaxhighlight>


Теперь, если нажимать на кнопку BTN1, это будет включать или выключать розетку 1.
Теперь, если нажимать на кнопку '''BTN1''', это будет включать или выключать ''розетку 1''.


== Управление через интернет ==
== Управление через интернет ==


Теперь давайте подключим к Espruino модуль CC3000 (как описывается в [https://www.espruino.com/CC3000 этой статье]) и воспользуемся кодом ниже (не забудьте задать название и пароль к своей точке WiFi-доступа).
Теперь давайте подключим к [[Espruino]] модуль [[CC3000]] (как описывается в [https://www.espruino.com/CC3000 этой статье]) и воспользуемся кодом ниже (не забудьте задать название и пароль к своей точке WiFi-доступа).


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var TX = A0;
var TX = A0;
var CODE = 0b0000010100000111111101110;
var CODE = 0b0000010100000111111101110;
Строка 263: Строка 263:
</syntaxhighlight>
</syntaxhighlight>


Когда в консоли появится сообщение с просьбой подключиться к IP-адресу, впишите его в адресной строке своего браузера. В результате в браузере должна открыться простая веб-страница с текстом «Socket on or off».  
Когда в консоли появится сообщение с просьбой подключиться к [[IP-адрес]]у, впишите его в адресной строке своего [[браузер]]а. В результате в [[браузер]]е должна открыться простая веб-страница с текстом ''«Socket on or off»''.  


Теперь кликните по какой-либо из кнопок, чтобы поменять состояние розетки 1.
Теперь кликните по какой-либо из кнопок, чтобы поменять состояние ''розетки 1''.


=См.также=
=См.также=


{{ads}}
 


=Внешние ссылки=
=Внешние ссылки=
Строка 275: Строка 275:
<references />
<references />


{{Навигационная таблица/Espruino}}
{{Навигационная таблица/Портал/Espruino}}
{{Навигационная таблица/Телепорт}}

Текущая версия от 20:46, 22 мая 2023

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


Дистанционно управляемые розетки[1]

Сейчас дистанционно управляемые розетки можно купить очень дёшево. Это идеальный вариант, если вы хотите прямо с ПК включать и выключать устройства, подключенные к электросети, но не хотите возиться с реле и ручным подключением этих устройств к электросети.

Я решил воспользоваться розетками под брендом Status.

Есть два главных способа управления такими розетками.

Простой способ

Вскройте пульт управления и с помощью соединительных проводов подключите каждую его кнопку к Espruino. Так вы можете управлять чем угодно, просто имитируя нажатия на эти кнопки.

Сложный способ

Вы также можете купить радиопередатчик, чтобы использовать его в качестве пульта управления. Это сложнее, но зато позволяет управлять большим количеством розеток, а также интереснее!

Мои розетки работают на 433.92 МГц (это было написано на их задней стороне). Это «открытая» частота – вам не нужна лицензия на её использование, и она полностью бесплатна для всех. В каждом устройстве используется собственный протокол, и все они отправляют данные куда хотят. Это значит, что отправленный вами сигнал вряд ли дойдёт до пункта назначения в целости и сохранности, поэтому некоторые устройства отправляют один и тот же сигнал по несколько раз.

Протокол

В отсутствие запоминающего осциллоскопа узнать протокол, по которому работают розетки, будет довольно проблематично. Чтобы чуть упростить это руководство, я описал этот протокол внизу (кроме того, он хорошо описан в этой ветке на форуме PicAxe):

  • Всего есть 25 бит, равноудалённых друг от друга
  • Единица в бите задаётся сигналом ON в течение 0.9 мс, а затем OFF в течение 0.3 мс
  • Ноль в бите задаётся сигналом ON в течение 0.3 мс, а затем OFF в течение 0.9 мс
  • Отправка всех этих 25 бит постоянно повторяется (покуда вы нажимаете на кнопку), а пауза между ними составляет примерно 8 мс

Нам понадобятся

Узнаём код управления

Простейший способ узнать код управления розеткой (а также то, используется ли тот же протокол в пульте дистанционного управления) – это воспользоваться цифровым запоминающим осциллоскопом. Но давайте сделаем это при помощи Espruino.

Подключите радиоприёмник (433 МГц) к Espruino следующим образом:

Радиоприёмник Espruino
GND GND
VCC 3.3
DATA A0
Примечание

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

Мы уже знаем протокол (см. выше), поэтому давайте попробуем понять, как он работает.

Загрузите на Espruino вот этот код:

function startListening(pin) {
  // Данные, которые мы получили до сих пор:
  var n="";
  // Функция-обработчик, вызываемая,
  // когда сигнал меняет своё состояние:
  function sig(e) {
    var d = 10000*(e.time-e.lastTime);
    if (d<2 || d>10) {
      if (n.length>20) console.log(n);
      n="";
    } else if (!e.state) n+=0|d>5;
  }
  // Начинаем прослушивать изменения:
  setWatch(sig, pin, {repeat:true, edge:"both"});
}

startListening(A0);

Функция sig() выше написана с прицелом на максимально быстрое выполнение кода, но это также делает её трудночитаемой. Ниже я добавил в эту функцию комментарии, чтобы вам было понятнее, как она работает.

  function sig(e) {
    // Задаем в «d» продолжительность
    // положительного или отрицательного импульса (в 0.1 мс),
    // благодаря чему далее с числами будет работать гораздо проще:
    var d = 10000*(e.time-e.lastTime);
    // Если продолжительность импульса выходит за пределы диапазона...
    // Здесь мы ищем импульсы 0.3 и 0.9 мс,
    // отбраковывая всё, что меньше 0.2 или больше 1 мс:
    if (d<2 || d>10) {
      // Продолжительность импульса выходит за пределы диапазона...
      // Если данных достаточно, это может быть наш сигнал,
      // так что печатаем его!
      if (n.length>20) console.log(n);
      // Теперь очищаем:
      n="";
    } else if (!e.state) {
      // Итак, продолжительность импульса в пределах диапазона,
      // так что далее мы проверяем состояние текущего контакта,
      // и если это «0», это будет значить, что импульс закончился,
      // и то, что получилось – это продолжительность импульса в «d».

      // Теперь мы просто добавляем «1» или «0» в строку «n».

      // По сути это:
      // if (d>5) n+="1" else n+="0";

      // Результат «d>5» - это булево значение,
      // но мы превращаем его в целое число,
      // применяя побитовое ИЛИ («|») к нему и «0»,
      // и по итогу получаем «0» или «1».
      n+=0|d>5;
    }
  }

Поместите передатчик рядом с приёмником и нажмите на одну из кнопок. В консоли должно появиться несколько похожих друг на друга строк (и несколько некорректных). Примерно вот таких:

0000010100000111111101110
0000010100000111111101110
0000010100000111111101110
0000010100000111111101110
0000010100000111111101110
0000010100000111111101110
0000010100000111111101110
0000010100000111111101110

Это и есть передаваемый код управления.

Попробуйте понажимать разные кнопки. Вы должны заметить, что числа в начале строк одни и те же, а те, что в конце, меняются (за исключением последнего «0»). Они должны выглядеть примерно так:

Кнопка Код
ALL OFF ...10000
ON 1 ...11110
OFF 1 ...01110
ON 2 ...10110
OFF 2 ...00110
ON 3 ...11010
OFF 3 ...01010
ON 4 ...11110
OFF 4 ...01110

Итак, код мы узнали. Теперь настало время написать код для передатчика.

Создаём передатчик

Подключите передатчик к Espruino следующим образом:

Передатчик Espruino
GND GND
VCC BAT
DATA A0

Теперь выполните сброс Espruino и загрузите на неё код ниже, замените число в переменной CODE на любое из чисел, которые мы нашли в разделе выше.

var TX = A0;
var CODE = 0b0000010100000111111101110;

function sendCommand(command) {
  var bits = (CODE & ~0b11111) | command;
  for (var i=24;i>=0;i--) {
    if ((bits>>i)&1) {
      digitalPulse(TX,1,0.9);
      digitalPulse(TX,0,0.3);
    } else {
      digitalPulse(TX,1,0.3);
      digitalPulse(TX,0,0.9);
    }
  }
  digitalPulse(TX,1,0.001);
}

function sendMultiple(command) {
  var n = 10;
  var interval = setInterval(function() {
    sendCommand(command);
    if (n-- < 0) clearInterval(interval);
  }, 50);
}

var socketOn = false;
setWatch(function() {
  socketOn = !socketOn;
  sendMultiple(socketOn ? 0b11110 : 0b01110);
}, BTN1, { repeat:true, edge:"rising", debounce:10 });

Теперь, если нажимать на кнопку BTN1, это будет включать или выключать розетку 1.

Управление через интернет

Теперь давайте подключим к Espruino модуль CC3000 (как описывается в этой статье) и воспользуемся кодом ниже (не забудьте задать название и пароль к своей точке WiFi-доступа).

var TX = A0;
var CODE = 0b0000010100000111111101110;

function sendCommand(command) {
  var bits = (CODE & ~0b11111) | command;
  for (var i=24;i>=0;i--) {
    if ((bits>>i)&1) {
      digitalPulse(TX,1,0.9);
      digitalPulse(TX,0,0.3);
    } else {
      digitalPulse(TX,1,0.3);
      digitalPulse(TX,0,0.9);
    }
  }
  digitalPulse(TX,1,0.001);
}

function sendMultiple(command) {
  print("Отправляем "+command);
  var n = 10;
  var interval = setInterval(function() {
    sendCommand(command);
    if (n-- < 0) clearInterval(interval);
  }, 50);
}

function pageHandler(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var u = url.parse(req.url, true);
  res.write('<html><body>Socket <a href="/?s1=on">on</a> or <a href="/?s1=off">off</a></body></html>');
  if (u.query !== null) {
    if (u.query["s1"]=="on") sendMultiple(0b11110);
    if (u.query["s1"]=="off") sendMultiple(0b01110);
  }
  res.end();
}

var wlan = require("CC3000").connect();
wlan.connect( "AccessPointName", "WPA2key", function (s) { 
  if (s=="dhcp") {
    console.log("Подключитесь к http://"+wlan.getIP().ip);
    require("http").createServer(pageHandler).listen(80);
  }
});

Когда в консоли появится сообщение с просьбой подключиться к IP-адресу, впишите его в адресной строке своего браузера. В результате в браузере должна открыться простая веб-страница с текстом «Socket on or off».

Теперь кликните по какой-либо из кнопок, чтобы поменять состояние розетки 1.

См.также

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