Espruino:Примеры/Дистанционно управляемые розетки: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Myagkij (обсуждение | вклад) |
||
(не показаны 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): | ||
* Всего есть 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 | <syntaxhighlight lang="javascript"> | ||
function startListening(pin) { | function startListening(pin) { | ||
// Данные, которые мы получили до сих пор: | // Данные, которые мы получили до сих пор: | ||
Строка 80: | Строка 80: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Функция sig() выше написана с прицелом на максимально быстрое выполнение кода, но это также делает её трудночитаемой. Ниже я добавил в эту функцию комментарии, чтобы вам было понятнее, как она работает. | Функция [[sig()]] выше написана с прицелом на максимально быстрое выполнение кода, но это также делает её трудночитаемой. Ниже я добавил в эту функцию комментарии, чтобы вам было понятнее, как она работает. | ||
<syntaxhighlight lang="javascript | <syntaxhighlight lang="javascript"> | ||
function sig(e) { | function sig(e) { | ||
// Задаем в «d» продолжительность | // Задаем в «d» продолжительность | ||
Строка 120: | Строка 120: | ||
Поместите передатчик рядом с приёмником и нажмите на одну из кнопок. В консоли должно появиться несколько похожих друг на друга строк (и несколько некорректных). Примерно вот таких: | Поместите передатчик рядом с приёмником и нажмите на одну из кнопок. В консоли должно появиться несколько похожих друг на друга строк (и несколько некорректных). Примерно вот таких: | ||
<syntaxhighlight lang="javascript | <syntaxhighlight lang="javascript"> | ||
0000010100000111111101110 | 0000010100000111111101110 | ||
0000010100000111111101110 | 0000010100000111111101110 | ||
Строка 133: | Строка 133: | ||
Это и есть передаваемый код управления. | Это и есть передаваемый код управления. | ||
Попробуйте понажимать разные кнопки. Вы должны заметить, что числа в начале строк одни и те же, а те, что в конце, меняются (за исключением последнего «0»). Они должны выглядеть примерно так: | Попробуйте понажимать разные кнопки. Вы должны заметить, что числа в начале строк одни и те же, а те, что в конце, меняются (за исключением последнего ''«0»''). Они должны выглядеть примерно так: | ||
{| class="wikitable" | {| class="wikitable" | ||
Строка 175: | Строка 175: | ||
|} | |} | ||
Теперь выполните сброс Espruino и загрузите на неё код ниже, замените число в переменной CODE на любое из чисел, которые мы нашли в разделе выше. | Теперь выполните сброс [[Espruino]] и загрузите на неё код ниже, замените число в переменной '''CODE''' на любое из чисел, которые мы нашли в разделе выше. | ||
<syntaxhighlight lang="javascript | <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 | <syntaxhighlight lang="javascript"> | ||
var TX = A0; | var TX = A0; | ||
var CODE = 0b0000010100000111111101110; | var CODE = 0b0000010100000111111101110; | ||
Строка 263: | Строка 263: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Когда в консоли появится сообщение с просьбой подключиться к IP- | Когда в консоли появится сообщение с просьбой подключиться к [[IP-адрес]]у, впишите его в адресной строке своего [[браузер]]а. В результате в [[браузер]]е должна открыться простая веб-страница с текстом ''«Socket on or off»''. | ||
Теперь кликните по какой-либо из кнопок, чтобы поменять состояние розетки 1. | Теперь кликните по какой-либо из кнопок, чтобы поменять состояние ''розетки 1''. | ||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 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 МГц
- Модуль CC3000 (если вы хотите подключить свои розетки к сети)
Узнаём код управления
Простейший способ узнать код управления розеткой (а также то, используется ли тот же протокол в пульте дистанционного управления) – это воспользоваться цифровым запоминающим осциллоскопом. Но давайте сделаем это при помощи 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.
См.также
Внешние ссылки