Espruino:Примеры/Свет, реагирующий на движение: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Свет, реагирующий на движение<ref>[https://www.espruino.com/Motion+Sensing+Lights www.espruino.com - Motion Sensing Lights]</ref>= | ||
Если вы поставили себе цель сэкономить электроэнергию, то один из способов – это не забывать выключать свет в комнатах, когда вы их покидаете. Но как быть с коридорной лестницей, если вам приходится постоянно спускаться и подниматься по ней? В этом случае вам понадобится освещение, способное включаться и выключаться автоматически. | |||
Конечно, такую систему можно купить, но что если подойти к этой проблеме творчески? | |||
[Видео] | |||
== Нам понадобятся == | |||
* [https://www.espruino.com/Original Плата Espruino] | |||
* [https://www.espruino.com/WS2811 Светодиоды WS2811] | |||
* [https://www.espruino.com/Pyroelectric Пироэлектрический датчик движения] (или что-то другое, способное определять движения) | |||
== Подсоединение == | |||
[Картинка] | |||
Подключите пироэлектрический датчик к Espruino следующим образом: | |||
HC-SR501 | |||
Espruino | |||
VCC | |||
VBAT (5v) | |||
OUT | |||
A1 | |||
GND | |||
GND | |||
Подключите светодиоды WS2811 к Espruino следующим образом: | |||
Полоса светодиодов | |||
Espruino | |||
Белый провод | |||
GND | |||
Зелёный провод (DI) | |||
B15 | |||
Красный провод | |||
VBAT | |||
== Код == | |||
Просто скопируйте код ниже в правую часть IDE и кликните на кнопку загрузки кода. | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
// Настраиваем SPI-порт (для коммуникации со светодиодами): | |||
SPI2.setup({baud:3200000, mosi:B15}); | |||
// Переменная для хранения таймаута, | |||
// который будет использоваться для выключения светодиодов: | |||
var timeout; | |||
// Переменная для хранения RGB-данных, | |||
// которые мы будем отправлять светодиодам: | |||
var rgb = new Uint8ClampedArray(25*3); // 25 RGB-светодиодов | |||
// Включаем светодиоды: | |||
function lightsOn() { | |||
digitalWrite(LED3,1); // включаем синий светодиод | |||
// (он служит индикатором) | |||
// Включаем все светодиоды: | |||
for (var i in rgb) | |||
rgb[i] = 255; | |||
// Отправляем данные светодиодам: | |||
SPI2.send4bit(rgb, 0b0001, 0b0011); | |||
} | |||
// Выключаем светодиоды: | |||
function lightsOff() { | |||
digitalWrite(LED3,0); // выключаем синий светодиод | |||
// (он служит индикатором) | |||
// Выключаем все светодиоды: | |||
for (var i in rgb) | |||
rgb[i] = 0; | |||
// Отправляем данные светодиодам: | |||
SPI2.send4bit(rgb, 0b0001, 0b0011); | |||
} | |||
// Если сигнал от PIR-датчика меняется... | |||
setWatch(function(e) { | |||
// Если таймаут истёк, то это из-за того, | |||
// что светодиоды уже включены. | |||
// Очищаем переменную с таймаутом... | |||
if (timeout!==undefined) | |||
clearTimeout(timeout); | |||
else // в противном случае включаем светодиоды | |||
lightsOn(); | |||
// Теперь задаём таймаут, | |||
// чтобы выключить светодиоды через 15 секунд: | |||
timeout = setTimeout(function() { | |||
timeout = undefined; | |||
lightsOff(); | |||
}, 15000); | |||
}, A1, { repeat:true, edge: "rising" }); | |||
</syntaxhighlight> | |||
Если вы хотите знать, как выглядит сигнал от PIR-датчика, просто добавьте в код команду ниже – она будет использовать в качестве индикатора красный светодиод. | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
setInterval("digitalWrite(LED1,digitalRead(A1));",50); | |||
</syntaxhighlight> | |||
Код выше прекрасно выполняет свою функцию (что исчерпывающе объясняется в комментариях), но результат получается немного скучным. Светодиоды просто внезапно включаются, а потом спустя 15 секунд внезапно выключаются. Может, сделать так, чтобы они не резко гасли, а постепенно угасали? | |||
Скопируйте код ниже в правую часть Web IDE: | |||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
// Настраиваем SPI-порт (для коммуникации со светодиодами): | |||
SPI2.setup({baud:3200000, mosi:B15}); | |||
// В этой переменной будет храниться таймаут, | |||
// используемый для выключения светодиодов: | |||
var timeout; | |||
// В этой переменной будут храниться RGB-данные, | |||
// которые мы будем отправлять светодиодам: | |||
var rgb = new Uint8ClampedArray(25*3); // 25 RGB-светодиодов | |||
// Включаем светодиоды: | |||
function lightsOn() { | |||
digitalWrite(LED3,1); // включаем синий светодиод | |||
// (он служит индикатором) | |||
// Анимация включения светодиодов: | |||
var pos = 0; | |||
var interval = setInterval(function() { | |||
pos += 0.025; | |||
if (pos>=1) clearInterval(interval); | |||
// Рассчитываем постепенное изменение цвета: | |||
for (var i=0;i<rgb.length;) { | |||
var a = (i/rgb.length)+(pos*2)-1; | |||
rgb[i++] = a*512; // красный | |||
rgb[i++] = (a*512)-128; // зелёный | |||
rgb[i++] = (a*512)-256; // синий | |||
} | |||
// Отправляем данные светодиодам: | |||
SPI2.send4bit(rgb, 0b0001, 0b0011); | |||
}, 50); | |||
} | |||
// Выключаем светодиоды: | |||
function lightsOff() { | |||
digitalWrite(LED3,0); // выключаем синий светодиод | |||
// (он служит индикатором) | |||
// Анимация выключения светодиодов: | |||
var pos = 0; | |||
var interval = setInterval(function() { | |||
pos += 0.05; | |||
if (pos>=1) clearInterval(interval); | |||
// Рассчитываем постепенное изменение цвета: | |||
var amtr = (1-pos)*255; // красный | |||
var amtg = (1-pos*1.5)*255; // зелёный | |||
var amtb = (1-pos*2)*255; // синий | |||
for (var i=0;i<rgb.length;) { | |||
rgb[i++] = amtr; | |||
rgb[i++] = amtg; | |||
rgb[i++] = amtb; | |||
} | |||
// Отправляем данные светодиодам: | |||
SPI2.send4bit(rgb, 0b0001, 0b0011); | |||
}, 50); | |||
} | |||
// Если сигнал от PIR-датчика меняется... | |||
setWatch(function(e) { | |||
// Если таймаут истёк, то это из-за того, | |||
// что светодиоды уже включены. | |||
// Очищаем переменную с таймаутом... | |||
if (timeout!==undefined) | |||
clearTimeout(timeout); | |||
else // в противном случае включаем светодиоды | |||
lightsOn(); | |||
// Теперь задаём таймаут, | |||
// чтобы выключить светодиоды через 15 секунд: | |||
timeout = setTimeout(function() { | |||
timeout = undefined; | |||
lightsOff(); | |||
}, 15000); | |||
}, A1, { repeat:true, edge: "rising" }); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Теперь светодиоды будут загораться и гаснуть постепенно. | |||
Код выше построен на событиях (мы прослушиваем движения при помощи setWatch() вместо опроса при помощи setInterval()), поэтому мы также может использовать команду setDeepSleep(true). Она переведёт Espruino в очень энергоэффективный режим сна – это значит, что благодаря этому проект может очень долго работать от батареи. В то же время светодиодная полоса (даже когда все её светодиоды выключены) потребляет примерно 20 мА. Так что если вы хотите сделать свой проект по-настоящему энергоэффективным, вам нужно будет подключить к 5-вольтовой линии светодиодной полосы [https://www.espruino.com/Relays реле] или полевой транзистор, чтобы светодиоды были гарантировано выключены и не потребляли вообще никакой энергии. | |||
Также было бы полезно оснастить этот проект [https://www.espruino.com/LDR светочувствительным резистором]. С его помощью можно определить, освещается ли в данный момент область, где находятся светодиоды, а соответственно – решить, есть ли смысл их включать или нет. | |||
=См.также= | =См.также= |
Версия от 18:27, 7 июля 2021
Свет, реагирующий на движение[1]
Если вы поставили себе цель сэкономить электроэнергию, то один из способов – это не забывать выключать свет в комнатах, когда вы их покидаете. Но как быть с коридорной лестницей, если вам приходится постоянно спускаться и подниматься по ней? В этом случае вам понадобится освещение, способное включаться и выключаться автоматически.
Конечно, такую систему можно купить, но что если подойти к этой проблеме творчески?
[Видео]
Нам понадобятся
- Плата Espruino
- Светодиоды WS2811
- Пироэлектрический датчик движения (или что-то другое, способное определять движения)
Подсоединение
[Картинка]
Подключите пироэлектрический датчик к Espruino следующим образом:
HC-SR501 Espruino VCC VBAT (5v) OUT A1 GND GND
Подключите светодиоды WS2811 к Espruino следующим образом:
Полоса светодиодов Espruino Белый провод GND Зелёный провод (DI) B15 Красный провод VBAT
Код
Просто скопируйте код ниже в правую часть IDE и кликните на кнопку загрузки кода.
// Настраиваем SPI-порт (для коммуникации со светодиодами):
SPI2.setup({baud:3200000, mosi:B15});
// Переменная для хранения таймаута,
// который будет использоваться для выключения светодиодов:
var timeout;
// Переменная для хранения RGB-данных,
// которые мы будем отправлять светодиодам:
var rgb = new Uint8ClampedArray(25*3); // 25 RGB-светодиодов
// Включаем светодиоды:
function lightsOn() {
digitalWrite(LED3,1); // включаем синий светодиод
// (он служит индикатором)
// Включаем все светодиоды:
for (var i in rgb)
rgb[i] = 255;
// Отправляем данные светодиодам:
SPI2.send4bit(rgb, 0b0001, 0b0011);
}
// Выключаем светодиоды:
function lightsOff() {
digitalWrite(LED3,0); // выключаем синий светодиод
// (он служит индикатором)
// Выключаем все светодиоды:
for (var i in rgb)
rgb[i] = 0;
// Отправляем данные светодиодам:
SPI2.send4bit(rgb, 0b0001, 0b0011);
}
// Если сигнал от PIR-датчика меняется...
setWatch(function(e) {
// Если таймаут истёк, то это из-за того,
// что светодиоды уже включены.
// Очищаем переменную с таймаутом...
if (timeout!==undefined)
clearTimeout(timeout);
else // в противном случае включаем светодиоды
lightsOn();
// Теперь задаём таймаут,
// чтобы выключить светодиоды через 15 секунд:
timeout = setTimeout(function() {
timeout = undefined;
lightsOff();
}, 15000);
}, A1, { repeat:true, edge: "rising" });
Если вы хотите знать, как выглядит сигнал от PIR-датчика, просто добавьте в код команду ниже – она будет использовать в качестве индикатора красный светодиод.
setInterval("digitalWrite(LED1,digitalRead(A1));",50);
Код выше прекрасно выполняет свою функцию (что исчерпывающе объясняется в комментариях), но результат получается немного скучным. Светодиоды просто внезапно включаются, а потом спустя 15 секунд внезапно выключаются. Может, сделать так, чтобы они не резко гасли, а постепенно угасали?
Скопируйте код ниже в правую часть Web IDE:
// Настраиваем SPI-порт (для коммуникации со светодиодами):
SPI2.setup({baud:3200000, mosi:B15});
// В этой переменной будет храниться таймаут,
// используемый для выключения светодиодов:
var timeout;
// В этой переменной будут храниться RGB-данные,
// которые мы будем отправлять светодиодам:
var rgb = new Uint8ClampedArray(25*3); // 25 RGB-светодиодов
// Включаем светодиоды:
function lightsOn() {
digitalWrite(LED3,1); // включаем синий светодиод
// (он служит индикатором)
// Анимация включения светодиодов:
var pos = 0;
var interval = setInterval(function() {
pos += 0.025;
if (pos>=1) clearInterval(interval);
// Рассчитываем постепенное изменение цвета:
for (var i=0;i<rgb.length;) {
var a = (i/rgb.length)+(pos*2)-1;
rgb[i++] = a*512; // красный
rgb[i++] = (a*512)-128; // зелёный
rgb[i++] = (a*512)-256; // синий
}
// Отправляем данные светодиодам:
SPI2.send4bit(rgb, 0b0001, 0b0011);
}, 50);
}
// Выключаем светодиоды:
function lightsOff() {
digitalWrite(LED3,0); // выключаем синий светодиод
// (он служит индикатором)
// Анимация выключения светодиодов:
var pos = 0;
var interval = setInterval(function() {
pos += 0.05;
if (pos>=1) clearInterval(interval);
// Рассчитываем постепенное изменение цвета:
var amtr = (1-pos)*255; // красный
var amtg = (1-pos*1.5)*255; // зелёный
var amtb = (1-pos*2)*255; // синий
for (var i=0;i<rgb.length;) {
rgb[i++] = amtr;
rgb[i++] = amtg;
rgb[i++] = amtb;
}
// Отправляем данные светодиодам:
SPI2.send4bit(rgb, 0b0001, 0b0011);
}, 50);
}
// Если сигнал от PIR-датчика меняется...
setWatch(function(e) {
// Если таймаут истёк, то это из-за того,
// что светодиоды уже включены.
// Очищаем переменную с таймаутом...
if (timeout!==undefined)
clearTimeout(timeout);
else // в противном случае включаем светодиоды
lightsOn();
// Теперь задаём таймаут,
// чтобы выключить светодиоды через 15 секунд:
timeout = setTimeout(function() {
timeout = undefined;
lightsOff();
}, 15000);
}, A1, { repeat:true, edge: "rising" });
Теперь светодиоды будут загораться и гаснуть постепенно.
Код выше построен на событиях (мы прослушиваем движения при помощи setWatch() вместо опроса при помощи setInterval()), поэтому мы также может использовать команду setDeepSleep(true). Она переведёт Espruino в очень энергоэффективный режим сна – это значит, что благодаря этому проект может очень долго работать от батареи. В то же время светодиодная полоса (даже когда все её светодиоды выключены) потребляет примерно 20 мА. Так что если вы хотите сделать свой проект по-настоящему энергоэффективным, вам нужно будет подключить к 5-вольтовой линии светодиодной полосы реле или полевой транзистор, чтобы светодиоды были гарантировано выключены и не потребляли вообще никакой энергии.
Также было бы полезно оснастить этот проект светочувствительным резистором. С его помощью можно определить, освещается ли в данный момент область, где находятся светодиоды, а соответственно – решить, есть ли смысл их включать или нет.
См.также
Внешние ссылки