Espruino:Примеры/Свет, реагирующий на движение

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Свет, реагирующий на движение[1]

Если вы поставили себе цель сэкономить электроэнергию, то один из способов – это не забывать выключать свет в комнатах, когда вы их покидаете. Но как быть с коридорной лестницей, если вам приходится постоянно спускаться и подниматься по ней? В этом случае вам понадобится освещение, способное включаться и выключаться автоматически.

Конечно, такую систему можно купить, но что если подойти к этой проблеме творчески?

Espruino - Motion Sensitive Lights

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

Подсоединение

Motion Sensing Lights setup.jpg

Подключите пироэлектрический датчик к 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-вольтовой линии светодиодной полосы реле или полевой транзистор, чтобы светодиоды были гарантировано выключены и не потребляли вообще никакой энергии.

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

См.также

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