Автоматическая подсветка лестницы на адресной светодиодной ленте

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Появилась идея сделать автоматическую подсветку лестницы в темноте, чтобы при спуске/подъеме по которой в ночное время при прохождении первой ступеньки загоралась светодиодная лента, освещающая всю лестницу. Планировалось разместить светодиодную ленту под поручнем, на краях лестницы разместить ультразвуковые датчики для обнаружения движения.
d9c77064-355d-407f-bc0d-20a577e9cf2b.jpg
При поиске подобного решения обнаружилось, что такие проекты существуют, но не совсем в том виде, к котором мне было необходимо, в них предлагалось использовать куски светодиодной ленты под отдельную ступень, но в этом случае вся система получалась очень громоздкой и мне просто не подошла бы, так как ее негде разместить, да и в целом под Ардуино мало что было, пришлось все делать самому.

Было принято решение реализовать проект на адресной светодиодной ленте, прелесть которой в том, что можно управлять каждым светодиодом по отдельности.

Для реализации проекта понадобились следующие компоненты:
  • Адресная светодиодная лента WS2812B
  • Arduino NANO v3
  • Ультразвуковой датчик расстояния HC-SR04 (2шт.)
  • Фоторезистор
  • Блок питания
  • Резисторы на 10 кОм и 200-500 Ом
Все элементы соединяются по данной схеме (спасибо AlexGyver):
Схема.png
ВНИМАНИЕ! Обращаю особое внимание на то, что лента должна питаться от блока питания, а НЕ от Ардуино! Ибо в таком случае лента может сгореть!

Был написан скетч с использованием библиотеки NeoPixel для работы с адресной светодиодной ленты, в котором вся система начинает свою работу только в темноте (благодаря фоторезистору), при подъеме нижний датчик обнаруживает движение, и вся лента загорается, ожидается срабатывание верхнего датчика. При срабатывании верхнего датчика лента начинает затухать, начиная от нижнего датчика. Аналогично система работает и при спуске.

Для работы скетча с Вашей лентой необходимо настроить некоторые параметры, указать пины, к которым подключаются ультразвуковые датчики, фоторезистор и сама лента, указать количество светодиодов в ленте. Остальные параметры изменяются по желанию.
Настройка.png
Так как ранее на ардуино я скетчи не писал и с программированием почти не знаком, у моего проекта есть ряд исправимых недостатков, которые я еще не исправил, а также есть идеи, что можно добавить в будущем:

Что реализовано:
  1. В режиме ожидания всегда горит два (или по выбору) светодиода внизу и вверху лестницы (дежурные светодиоды)
  2. При подъеме или спуске посветодиодно загорается вся лента от начала до конца лестницы, при пересечении второго сенсора светодиоды начинают затухать в том же порядке
  3. Подключен фоторезистор, который включает всю систему только тогда, когда в помещении не горит свет
Что не реализовано, но не помешало бы (возможно скоро доделаю):
  1. При наступлении темноты не загораются "дежурные" светодиоды в начале и конце лестницы, они загорятся только посте первого прохода по лестнице
  2. Не реализовано решение проблемы, когда человек прошел через первый сенсор и вдруг решил, что ему не нужно подниматься, в этом случае система все равно ожидает проход через второй датчик
  3. Не добавлены различные эффекты и нет плавного зажигания светодиодов
Если есть желающие помочь доделать код и реализовать задуманный функционал - буду рад принять любую помощь, желательно подправляйте скетч и прикрепляйте к сообщению.

Демонстрация работы:
photo5296632881965280491.jpg photo5298734087340665965.jpg

Преимуществом данного решения является компактность. Также данный проект можно использовать не только с прямой лентой под поручнем, но и в виде "классического" варианта с подсветкой каждой ступени следующим образом:
Классика.png
В этом случае лента нарезается кусочками в длину ступеней и соединяется между собой проводами. При использовании моего скетча лестница будет загораться "змейкой".

Ну и в заключении сам скетч и необходимые библиотеки:
 

Вложения

Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
1. Дежурные это те что "В режиме ожидания всегда горит два (или по выбору) светодиода внизу и вверху лестницы" ? Так в чем проблема ? сэмулировать срабатываение нужных датчиков в конце setup, заодно и проверка будет некоторая
2. Тут тоже все не сложно. 1) Можно выключать по срабатыванию ЛЮБОГО датчика второй раз. Не думаю, что на лестнице как в метро 50 человек в минуту ходят. 2) Можно сделать тайм-аут. Запоминать время прохождения 1-го датчика, и через некоторое время просто гасить все. Мне больше 2-ой нравится. Но можно и совместить.
3. Я реализовывал плавное включение и выключение ленты через яркость. Тут будет код)
C++:
#define SHIFT_TIME 1000 - это время на плавное изменение яркости.
Этот кусок кода обрабатывает нажатие кнопки ИК-пульта и выбирает режим. У ленты в этом проекте 3 режима, 0, 1 и 2. 0 - рабочий, 1-гасить, 2 -зажигать.
C++:
case 0xFFC23D:
      OFF_flag=!OFF_flag;     
      if (OFF_flag) Shift_Mode = 1; else
        {
        ChangeCurrMode();
        Shift_Mode = 2;     
        }
      press_time = millis();     
      break;
Далее в loop есть такой фрагмент
C++:
switch (Shift_Mode)
....
case 1:
      {
....
        byte new_br = max_local_Brightness - calc_Brightness(press_time, millis());
        current_Brightness = min(new_br, current_Brightness);
        FastLED.setBrightness(current_Brightness);        
        FastLED.show();
....
      }
....
Это тушить, для зажигания идет немного другой подсчет яркости, на возрастание той же процедурой.
max_local_Brightness максимальная яркость в данный момент, можно менять по фоторезистору, датчику освещенности, ручками (теоретически), у меня пока постоянная
функция min нужна для того, что бы если во время изменения яркости были какое другое изменение не было рывков по свету. ну там сложно так объяснять отвлеченно. Хотя... на твоем примере
Идет человек по лестнице , прошел, яркость начала уменьшатся, но не до конца, а по лестнице прошел новый человек. если брать просто яркость, то она будет увеличиваться с 0, а если поставить max (напомню, что у меня фрагмент для уменьшения яркости) то некоторое время яркость не будет меняться, а потом будет увеличиваться, что более корректно
 
  • Лойс +1
Реакции: Dimasssiusis

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
1. Дежурные это те что "В режиме ожидания всегда горит два (или по выбору) светодиода внизу и вверху лестницы" ? Так в чем проблема ? сэмулировать срабатываение нужных датчиков в конце setup, заодно и проверка будет некоторая
2. Тут тоже все не сложно. 1) Можно выключать по срабатыванию ЛЮБОГО датчика второй раз. Не думаю, что на лестнице как в метро 50 человек в минуту ходят. 2) Можно сделать тайм-аут. Запоминать время прохождения 1-го датчика, и через некоторое время просто гасить все. Мне больше 2-ой нравится. Но можно и совместить.
3. Я реализовывал плавное включение и выключение ленты через яркость. Тут будет код)
C++:
#define SHIFT_TIME 1000 - это время на плавное изменение яркости.
Этот кусок кода обрабатывает нажатие кнопки ИК-пульта и выбирает режим. У ленты в этом проекте 3 режима, 0, 1 и 2. 0 - рабочий, 1-гасить, 2 -зажигать.
C++:
case 0xFFC23D:
      OFF_flag=!OFF_flag;  
      if (OFF_flag) Shift_Mode = 1; else
        {
        ChangeCurrMode();
        Shift_Mode = 2;  
        }
      press_time = millis();  
      break;
Далее в loop есть такой фрагмент
C++:
switch (Shift_Mode)
....
case 1:
      {
....
        byte new_br = max_local_Brightness - calc_Brightness(press_time, millis());
        current_Brightness = min(new_br, current_Brightness);
        FastLED.setBrightness(current_Brightness);     
        FastLED.show();
....
      }
....
Это тушить, для зажигания идет немного другой подсчет яркости, на возрастание той же процедурой.
max_local_Brightness максимальная яркость в данный момент, можно менять по фоторезистору, датчику освещенности, ручками (теоретически), у меня пока постоянная
функция min нужна для того, что бы если во время изменения яркости были какое другое изменение не было рывков по свету. ну там сложно так объяснять отвлеченно. Хотя... на твоем примере
Идет человек по лестнице , прошел, яркость начала уменьшатся, но не до конца, а по лестнице прошел новый человек. если брать просто яркость, то она будет увеличиваться с 0, а если поставить max (напомню, что у меня фрагмент для уменьшения яркости) то некоторое время яркость не будет меняться, а потом будет увеличиваться, что более корректно[/QUOTE]
Вау! Спасибо за такой подробный и полезный отклик! Но я, к сожалению, не очень понимаю, как это все в свой скетч добавить((
Это мой первый опыт программирования ардуинки и я еще только учусь. Было бы отлично, если бы Вы реализовали все предложенные техники в моем скетче))

А еще не очень понял как можно сэмулировать срабатывание датчика движения, просто послать на них значение, при котором срабатывает программа? Звучит логично, я попробую))
С выключением ленты при долгом ожидании второго датчика тоже хотел реализовать через таймаут, сейчас буду пробовать это делать.
И вообще не понял, как работает трюк с ИК- пультом и яркостью...

Плюс у меня не FastLED, а NeoPixel
У них же разные функции, вроде как
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
не, посылать на них ничего не надо. у тебя же где то это считывается ? а потом код выполняется. Наример так
a=digitalRead(10);
if (a==10) {делаем то то и то то}

так вот в setup достаточно просто написать эту часть: {делаем то то и то то} безусловно так сказать.

Что неопиксел, что фастлед - оба имеют управление яркостью, разница небольшая , переделать легко. В
Вот из неопиксльской либы
void Adafruit_NeoPixel::setBrightness(uint8_t b) {

Трюка нет, это я для примера. я переключаю режимы ленты, но не рывком, а сначала плавно гашу яркость до 0, потом меняю режим и опять поднимаю яркость до нужного мне уровня. Приятнее глазу так, в качестве кнопки у меня пульт ИК.

И да, ты можешь это сделать самостоятельно, раз уже что то сделал. Помочь советом помогу, делать за тебя только вредить тебе ;) иначе бы не влез в тему.
 
Изменено:

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
не, посылать на них ничего не надо. у тебя же где то это считывается ? а потом код выполняется. Наример так
a=digitalRead(10);
if (a==10) {делаем то то и то то}

так вот в setup достаточно просто написать эту часть: {делаем то то и то то} безусловно так сказать.

Что неопиксел, что фастлед - оба имеют управление яркостью, разница небольшая , переделать легко. В
Вот из неопиксльской либы
void Adafruit_NeoPixel::setBrightness(uint8_t b) {

Трюка нет, это я для примера. я переключаю режимы ленты, но не рывком, а сначала плавно гашу яркость до 0, потом меняю режим и опять поднимаю яркость до нужного мне уровня. Приятнее глазу так, в качестве кнопки у меня пульт ИК.[/QUOTE]
Ну вот у меня считывание данных с датчиков:
Screenshot_1.png
А после этого выполняется сам код при устовии, что перед датчиком кто-то прошел (расстояние меньше 20 см):
Screenshot_2.png

У меня и так в конце setup указано включение "Дежурных" светодиодов, но они же загорятся только при первом включении ардуинки:
Screenshot_3.png
И тут я понял, что не правильно описал недостаток...
Я имел ввиду, что когда наступает день - все гаснет, ни один светодиод не светится, но при наступлении ночи дежурные светодиоды не загораются, для их активации нужно один раз пройти по лестнице

Смысл кода такой:
if (значения_фоторезистора < указанного_уровня_освещенности) { Код работы всей системы
} else { тушим все горящие светодиоды }

После этого, когда наступает ночь, дежурные светодиоды не загораются автоматически
 

Вложения

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
И да, ты можешь это сделать самостоятельно, раз уже что то сделал. Помочь советом помогу, делать за тебя только вредить тебе ;) иначе бы не влез в тему.
Тоже верно)) Огромное спасибо за советы, буду пробовать))
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Вот смотри, что сейчас придумалось.
Считываешь нижний сенсор.
потом выполняешь то , что надо елси ... какое то условие.
А моджно сделеть так
в конце setup написать
downSensor=чему он там должен быть равен что бы все запустилось
в цикле loop
сначала сделать проверку на все что надо и в конце считать данные с сенсоров.

Можно еще завести переменную ПерыйРаз логического типа и присвоитье тру
тогда условие будет такое
если сработал сенсор или ПервыйРаз, то выполнить то то.
И когда ждешь срабатывания второго сенсора в 1-ый то проверить точно так же и в конце уже написать ПервыйРаз равно фальш

по дежурным надо делать отдельную проверку. возможно ты сначала их зажигаешь , как ночные, а потом гасишь из чего то еще. проверь подключив к компу и поставив вывод в монитор порта в местах, которые это все делают, что бы понять что не работает
 
  • Лойс +1
Реакции: Dimasssiusis

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Вот смотри, что сейчас придумалось.
Считываешь нижний сенсор.
потом выполняешь то , что надо елси ... какое то условие.
А моджно сделеть так
в конце setup написать
downSensor=чему он там должен быть равен что бы все запустилось
в цикле loop
сначала сделать проверку на все что надо и в конце считать данные с сенсоров.

Можно еще завести переменную ПерыйРаз логического типа и присвоитье тру
тогда условие будет такое
если сработал сенсор или ПервыйРаз, то выполнить то то.
И когда ждешь срабатывания второго сенсора в 1-ый то проверить точно так же и в конце уже написать ПервыйРаз равно фальш

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

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Посмотрел сегодня работу с адресной лентой от непоиксел. есть одно существенное отличее. нельзя яркостью просто менять яркость пикслей. т.е. уменьшить ее получится, а увеличить уже нет. Неопиксел при изменении яркости пропорционально уменьшает сами значения красного, синего и зеленого цвета и уже потом передает их на ленту, т.е. уменьшив яркость до 0 получим 0 в массиве, или на ленте. там нет такого понятия как массив.
а фастлед есть массив пикселей задав который и меняя яркость не изменим сам массив, что очень помогает в некоторых эффектах. Надо посмотреть как с этим неопикселем работать можно
 

Dimasssiusis

★✩✩✩✩✩✩
20 Янв 2020
128
49
Посмотрел сегодня работу с адресной лентой от непоиксел. есть одно существенное отличее. нельзя яркостью просто менять яркость пикслей. т.е. уменьшить ее получится, а увеличить уже нет. Неопиксел при изменении яркости пропорционально уменьшает сами значения красного, синего и зеленого цвета и уже потом передает их на ленту, т.е. уменьшив яркость до 0 получим 0 в массиве, или на ленте. там нет такого понятия как массив.
а фастлед есть массив пикселей задав который и меняя яркость не изменим сам массив, что очень помогает в некоторых эффектах. Надо посмотреть как с этим неопикселем работать можно
Может тогда просто легче перейти на FastLed и все?
Когда я начинал писать код - я наугад взял библиотеку, особо не разбираясь, какую использовать лучше, NeoPixel или FastLED
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
У Неопикселя есть свои плюсы, со всем надо разбираться, просто я как то сразу начал с фастледа и на неопиксели даже не смотрел.
Вот так меню яркость в неопикселях. но думаю должен быть какой то другой способ
C++:
void loop() {
current_Brightness=current_Brightness+db;
    if (current_Brightness==0) db=1;
    if (current_Brightness==100) db=-1;
    leds.setBrightness(current_Brightness);
    leds.fill(leds.Color(255,15,15));
    leds.show();
    delay(10);
}
Т.е. тут, в отличии от фастлед мне надо всегда вызвать эту функцию leds.fill(leds.Color(255,15,15));
 

Подвох

✩✩✩✩✩✩✩
1 Фев 2020
10
1
Добрый день.
при попытке залить скетч выдает ошибку жалуется на библиотеку #include <Ultrasonic.h>
скачать новую "Ultrasonic-3.0.0" и переименовал в "Ultrasonic" скетч загрузился но не работает.

может быть связанно с версией Ultrasonic-3.0.0?
до этого с Ардуино не работал
 
  • Лойс +1
Реакции: Exxx

Кирюша

✩✩✩✩✩✩✩
14 Янв 2020
11
1
Киев
Теоретически можно на одном датчике сделать. А еще лучше переключится на ИК датчик движения(присутствия) тогда проблема отключения отпадает сама собой.
В теории ты ставишь один датчик вверху или внизу а можно и там и там. И если есть срабатывание, точнее, пока хотя бы одно срабатывание есть свет горит иначе не горит.
Пишется это так:
Код:
if ((условие 1)||(условие 2))
{
//лента гори;
}
else
{
//лента не гори;
}
 

Slaiterx

✩✩✩✩✩✩✩
4 Фев 2020
6
1
вот этот проект перенести на esp с веб интерфейсом вот былоб круть и эфекты добавить там для нового года например хоть бегущий текст хоть че вот это да Алексу нужно сделать таких в интернете не нащол
 

Slaiterx

✩✩✩✩✩✩✩
4 Фев 2020
6
1
под каждой ступенькой кусок ленты ws2812 вот тебе и матрица можно залить прошивку алекса для матрицы но нужны датчики присутствия человека пир сенсоры или сонары и фотодатчик который будет разрешать включение только в темноте

чем не матрица
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Эту картинку я видел. Ты мне пример буквы нарисуй.
Ступеньки как бы смещены по горизонтали друг от друга, это принцип такой лестницы, так что это скорее не матрица, а лента под углом к горизонтали. 1 ступенька 1 отрезок ленты. А косить глазами, что бы видеть 1-ую строку матрицы правее на метр, а последнюю левее на полтора я не умею.
Может мы о разном говорим ? Я кажется начал догадываться о чем ты. У автора подсветка идет ВДОЛЬ лестницы, что более экономично по расходу ленты. А ты предлагаешь поперек ?
 
  • Лойс +1
Реакции: Подвох

Подвох

✩✩✩✩✩✩✩
1 Фев 2020
10
1
@Slaiterx, тем что у матрицы растояния между пикселями равное.
Если учесть высоту ступени то расстояние между пикселями ленты должно быть см 30 , тоесть 3 светодиода на ступеньку.

Кроме того видно будет с одной стороны и из далека это все, и главное зачем.


Пс кто нибудь подскажет на мои вопрос
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
@Slaiterx,
Пс кто нибудь подскажет на мои вопрос
Вряд ли кто то сможет ответить, даже если захочет. Объясняю ты залил КАКОЙ-ТО скетч, я не знаю какой. Он загрузился и не работает. Т.е. не делает то, что должен. А я даже не знаю что он должен делать. Могу только догадываться , что он как то связан с этой темой . Возможно это скетч автора, тогда первое слово за ним.
Далее, скетч тесно связан со схемой, с тем как ты все это подключил, поэтому наличие фото сборки (внятное, где видно что куда идет) очень бы помогло.
 

Slaiterx

✩✩✩✩✩✩✩
4 Фев 2020
6
1
Конечно поперек текст выводить это так для прикола просто можно эффекты разные использовать подсветки и лента не такая уж и дорогая учитывая что на лестницу с 16 ступенями будет метров 16 и esp с веб интерфейсом где можно настраивать датчики и эфекты
 

Slaiterx

✩✩✩✩✩✩✩
4 Фев 2020
6
1
Что то типо этого только с веб интерфейсом и разными эффектами и настройками через веб
 

Подвох

✩✩✩✩✩✩✩
1 Фев 2020
10
1
@Старик Похабыч, сборка по схеме предложении в этот теме, в проблем в принципе нет.
заливаю скетч, ставлю приложенные библиотеки, нажимаю проверить выдает ошибку



_______________________________________________________________________
In file included from C:\Users\User\Downloads\Stairs_Final\Stairs_Final.ino:1:0:

C:\Users\User\Documents\Arduino\libraries\Ultrasonic/Ultrasonic.h:11:10: fatal error: WProgram.h: No such file or directory

#include "WProgram.h"

^~~~~~~~~~~~

compilation terminated.

exit status 1
Ошибка компиляции для платы Arduino Nano.
_______________________________________________________________________
меняю библиотеку Ultrasonic на скаченную новую версию Ultrasonic 3.0
и меняю навивание в библиотеке с "Ultrasonic3.0" на "Ultrasonic" ( думаю проблема в этом и кроется)
Нажимаю проверит и залить, все проходит нормально но работать не хочет.

после заливки первый светодиод мигает пару раз и все на этом!

пайка для меня не новое, а вот ардуино, можно сказать первые шаги
Проблема появляться8711-3acfc7ba77a47cfe42f8a65ded764819.png