Espruino:Примеры/Свет, реагирующий на движение: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
(не показаны 2 промежуточные версии 2 участников) | |||
Строка 23: | Строка 23: | ||
Подключите пироэлектрический датчик к [[Espruino]] следующим образом: | Подключите пироэлектрический датчик к [[Espruino]] следующим образом: | ||
HC-SR501 | {| class="wikitable" | ||
|- | |||
VCC | ! HC-SR501 !! Espruino | ||
VBAT (5v) | |- | ||
OUT | | VCC || VBAT (5v) | ||
|- | |||
GND | | OUT || A1 | ||
|- | |||
| GND || GND | |||
|} | |||
Подключите | Подключите [[светодиод]]ы [[WS2811]] к [[Espruino]] следующим образом: | ||
Полоса светодиодов | {| class="wikitable" | ||
|- | |||
Белый провод | ! Полоса светодиодов !! Espruino | ||
|- | |||
Зелёный провод (DI) | | Белый провод || GND | ||
|- | |||
Красный провод | | Зелёный провод (DI) || B15 | ||
|- | |||
| Красный провод || VBAT | |||
|} | |||
== Код == | == Код == | ||
Строка 47: | Строка 51: | ||
Просто скопируйте код ниже в правую часть [[IDE]] и кликните на кнопку загрузки кода. | Просто скопируйте код ниже в правую часть [[IDE]] и кликните на кнопку загрузки кода. | ||
<syntaxhighlight lang="javascript | <syntaxhighlight lang="javascript"> | ||
// Настраиваем SPI-порт (для коммуникации со светодиодами): | // Настраиваем SPI-порт (для коммуникации со светодиодами): | ||
SPI2.setup({baud:3200000, mosi:B15}); | SPI2.setup({baud:3200000, mosi:B15}); | ||
Строка 99: | Строка 103: | ||
Если вы хотите знать, как выглядит сигнал от [[PIR-датчик]]а, просто добавьте в код команду ниже – она будет использовать в качестве индикатора красный светодиод. | Если вы хотите знать, как выглядит сигнал от [[PIR-датчик]]а, просто добавьте в код команду ниже – она будет использовать в качестве индикатора красный светодиод. | ||
<syntaxhighlight lang="javascript | <syntaxhighlight lang="javascript"> | ||
setInterval("digitalWrite(LED1,digitalRead(A1));",50); | setInterval("digitalWrite(LED1,digitalRead(A1));",50); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 107: | Строка 111: | ||
Скопируйте код ниже в правую часть [[Web IDE]]: | Скопируйте код ниже в правую часть [[Web IDE]]: | ||
<syntaxhighlight lang="javascript | <syntaxhighlight lang="javascript"> | ||
// Настраиваем SPI-порт (для коммуникации со светодиодами): | // Настраиваем SPI-порт (для коммуникации со светодиодами): | ||
SPI2.setup({baud:3200000, mosi:B15}); | SPI2.setup({baud:3200000, mosi:B15}); | ||
Строка 187: | Строка 191: | ||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 193: | Строка 197: | ||
<references /> | <references /> | ||
{{Навигационная таблица/Espruino | {{Навигационная таблица/Портал/Espruino}} | ||
Текущая версия от 15:08, 20 мая 2023
Свет, реагирующий на движение[1]
Если вы поставили себе цель сэкономить электроэнергию, то один из способов – это не забывать выключать свет в комнатах, когда вы их покидаете. Но как быть с коридорной лестницей, если вам приходится постоянно спускаться и подниматься по ней? В этом случае вам понадобится освещение, способное включаться и выключаться автоматически.
Конечно, такую систему можно купить, но что если подойти к этой проблеме творчески?
Espruino - Motion Sensitive Lights
Нам понадобятся
- Плата 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-вольтовой линии светодиодной полосы реле или полевой транзистор, чтобы светодиоды были гарантировано выключены и не потребляли вообще никакой энергии.
Также было бы полезно оснастить этот проект светочувствительным резистором. С его помощью можно определить, освещается ли в данный момент область, где находятся светодиоды, а соответственно – решить, есть ли смысл их включать или нет.
См.также
Внешние ссылки