
Автоматическая подсветка лестницы на Arduino с адресной лентой — простой проект, который способен в лучшую сторону преобразить интерьер вашего дома. Наш вариант этого популярного DIY проекта отличается простой электрической схемой и программой (скетчем). Для автоматического включения лестничных светильников можно использовать датчики движения или ультразвуковые датчики расстояния.
В лестничных светильниках используется по два адресных светодиода ws2812b (это количество можно увеличить по желанию), поэтому для подсветки лестницы можно использовать блок питания на 5 Вольт с минимальной мощностью. Включателем можно задействовать «ночной режим» в котором лестничный марш будет всегда подсвечиваться с установленной яркостью, что смотрится очень эффектно.
Подсветка лестницы на Ардуино своими руками
- Arduino Nano / Arduino Uno / Arduino Mega;
- адресная лента WS2812B;
- блок питания DC 5V;
- датчик движения или расстояния;
- включатель;
- провода, припой, термоусадка и т.д.

В первом варианте проекта для индикации наличия движения используются HC-SR04 ультразвуковые датчики расстояния Ардуино. Далее размещена схема сборки умной лестницы — подключение адресной ленты и датчиков к плате Arduino Nano (можно использовать Arduino Uno) и рабочая прошивка для микроконтроллера.
Подсветка лестницы на Ардуино своими руками

Все настройки, которые можно внести в скетч, даже без знаний основ программирования Arduino — расположены в начале программы. Но при изменении количества светодиодов, размещенных на одной ступени, в код потребуется внести небольшие правки. В этом случае, необходимо будет добавить или убавить строчки в циклах for — strip.setPixelColor(i + 1, strip.Color(j, j, j * 2));
Скетч с датчиком расстояния
#include "Ultrasonic.h" #include "Adafruit_NeoPixel.h" // === настройки, которые можно поменять === // #define LESENKA 6 // количество ступеней на лесенке #define LED 2 // количество светодиодов на одной ступени #define PIN_LED 3 // пин для подключения адресной ленты #define PIN_VKL 9 // пин для подключения переключателя #define TIMER 5 // пауза для плавного включения/выключения #define PAUSA 100 // пауза между включениями ступенек #define BRIGHT 200 // максимальная яркость ленты #define LIGHT 10 // минимальная яркость ленты #define DIST1 50 // расстояние срабатывания 1 датчика #define DIST2 50 // расстояние срабатывания 2 датчика // === настройки, которые можно поменять === // Ultrasonic ultrasonic1 (15, 14); // Trig - A1, Echo - A0 Ultrasonic ultrasonic2 (19, 18); // Trig - A5, Echo - A4 int NUM_LED = LESENKA * LED; Adafruit_NeoPixel strip (NUM_LED, PIN_LED, NEO_GRB + NEO_KHZ800); int cm1, cm2, t, i, j, g, J; byte w; void setup() { strip.begin(); // инициализируем объект NeoPixel strip.show(); // отключаем все пиксели на ленте strip.setBrightness(BRIGHT); // указываем яркость (максимум 255) Serial.begin(9600); pinMode (PIN_VKL, INPUT); // инициализируем пин для включателя } // узнаем расстояние с 1 датчика void u1() { for (byte i = 0; i <= 3; i++) { cm1 = ultrasonic1.Ranging(CM); cm1 = cm1 + cm1; delay(10); } cm1 = cm1 / 3; Serial.print("DIST1 - "); Serial.println(cm1); } // узнаем расстояние со 2 датчика void u2() { for (byte i = 0; i <= 3; i++) { cm2 = ultrasonic2.Ranging(CM); cm2 = cm2 + cm2; delay(10); } cm2 = cm2 / 3; Serial.print("DIST2 - "); Serial.println(cm2); } void loop() { // если переключатель включен устанавливаем минимальную яркость ленты if (digitalRead(PIN_VKL) == HIGH) { J = 0; } if (digitalRead(PIN_VKL) == LOW) { J = LIGHT; } // включаем все ступени на лестнице с заданной яркостью for (i = 0; i <= NUM_LED; i++) { strip.setPixelColor(i, strip.Color(J, J, J * 2)); strip.show(); } // поочередно опрашиваем ультразвуковые датчики u1(); delay(100); u2(); delay(100); if (cm1 < DIST1) { w = 1; } // если сработал первый датчик - заходим в 1 цикл if (cm2 < DIST2) { w = 2; } // если сработал второй датчик - заходим во 2 цикл while (w == 1) { // плавное включение адресной ленты на лестнице снизу-вверх for (i = 0; i <= NUM_LED + 1; i = i + LED) { for (j = J; j <= 125; j++) { strip.setPixelColor(i, strip.Color(j, j, j * 2)); strip.setPixelColor(i + 1, strip.Color(j, j, j * 2)); strip.show(); delay(TIMER); } delay(PAUSA); } w = 5; // переход в пятый цикл для ожидания } while (w == 2) { // плавное включение адресной ленты на лестнице сверху-вниз for (i = NUM_LED + 1; i >= 0; i = i - LED) { for (j = J; j <= 160; j++) { strip.setPixelColor(i, strip.Color(j, j, j * 2)); strip.setPixelColor(i - 1, strip.Color(j, j, j * 2)); strip.show(); delay(TIMER); } delay(PAUSA); } w = 5; // переход в пятый цикл для ожидания } while (w == 5) { // плавное затухание подсветки лестницы на адресной ленте for (j = 124; j >= J; j = j - 2) { for (i = 0; i <= NUM_LED; i++) { strip.setPixelColor(i, strip.Color(j, j, j * 2 )); strip.show(); } // поочередно опрашиваем ультразвуковые датчики u1(); delay(j / 4); u2(); delay(j / 4); // если сработал один из датчиков - переходим в соответствующий цикл if (cm1 < DIST1) { w = 3; goto w3; } if (cm2 < DIST2) { w = 4; goto w4; } } w = 0; // если ни один из датчиков не сработал выходим из цикла } while (w == 3) { w3: t = map (j, 10, 125, 20, 0); // плавное выключение подсветки лестницы снизу-вверх for (i = 0; i <= NUM_LED + 1; i = i + LED) { for (g = j; g >= J; g--) { strip.setPixelColor(i, strip.Color(g, g, g * 2)); strip.setPixelColor(i + 1, strip.Color(g, g, g * 2)); strip.show(); delay(TIMER + t / 2); } delay(PAUSA); } w = 0; // выходим из цикла в начало программы } while (w == 4) { w4: t = map (j, 10, 125, 20, 0); // плавное выключение подсветки лестницы сверху-вниз for (i = NUM_LED + 1; i >= 0; i = i - LED) { for (g = j; g >= J; g--) { strip.setPixelColor(i, strip.Color(g, g, g * 2)); strip.setPixelColor(i - 1, strip.Color(g, g, g * 2)); strip.show(); delay(TIMER + t / 2); } delay(PAUSA); } w = 0; // выходим из цикла в начало программы } }
В начале программы можно указать количество ступеней в лестнице, скорость включения «умной» подсветки и задать минимальную яркость освещения;
Оттенок свечения адресной ленты можно также указать свою, по умолчанию стоит голубоватый цвет для автоматической подсветки лестницы;
Лучше всего использовать в схеме ультразвуковые датчики, так как, в отличие от датчиков движения, можно самому указать расстояние для срабатывания подсветки и производить сразу несколько измерений для исключения ошибки.
Скетч с датчиком движения

#include "Adafruit_NeoPixel.h" // === настройки, которые можно поменять === // #define LESENKA 6 // количество ступеней на лесенке #define LED 2 // количество светодиодов на одной ступени #define PIN_LED 3 // пин для подключения адресной ленты #define PIN_VKL 9 // пин для подключения переключателя #define PIN_PIR1 15 // пин для подключения 1 датчика движения #define PIN_PIR2 19 // пин для подключения 2 датчика движения #define TIMER 5 // пауза для плавного включения/выключения #define PAUSA 100 // пауза между включениями ступенек #define BRIGHT 200 // максимальная яркость ленты #define LIGHT 10 // минимальная яркость ленты // === настройки, которые можно поменять === // int NUM_LED = LESENKA * LED; Adafruit_NeoPixel strip (NUM_LED, PIN_LED, NEO_GRB + NEO_KHZ800); int t, i, j, g, J; byte w; void setup() { strip.begin(); // инициализируем объект NeoPixel strip.show(); // отключаем все пиксели на ленте strip.setBrightness(BRIGHT); // указываем яркость (максимум 255) pinMode (PIN_VKL, INPUT); // инициализируем пин для включателя pinMode (PIN_PIR1, INPUT); // инициализируем пин для датчика движения pinMode (PIN_PIR2, INPUT); // инициализируем пин для датчика движения } void loop() { // если переключатель включен устанавливаем минимальную яркость ленты if (digitalRead(PIN_VKL) == HIGH) { J = 0; } if (digitalRead(PIN_VKL) == LOW) { J = LIGHT; } // включаем все ступени на лестнице с заданной яркостью for (i = 0; i <= NUM_LED; i++) { strip.setPixelColor(i, strip.Color(J, J, J * 2)); strip.show(); } // поочередно опрашиваем датчики движения if (digitalRead(PIN_PIR1) == HIGH) { w = 1; } delay(100); if (digitalRead(PIN_PIR2) == HIGH) { w = 2; } delay(100); while (w == 1) { // плавное включение адресной ленты на лестнице снизу-вверх for (i = 0; i <= NUM_LED + 1; i = i + LED) { for (j = J; j <= 125; j++) { strip.setPixelColor(i, strip.Color(j, j, j * 2)); strip.setPixelColor(i + 1, strip.Color(j, j, j * 2)); strip.show(); delay(TIMER); } delay(PAUSA); } w = 5; // переход в пятый цикл для ожидания } while (w == 2) { // плавное включение адресной ленты на лестнице сверху-вниз for (i = NUM_LED + 1; i >= 0; i = i - LED) { for (j = J; j <= 160; j++) { strip.setPixelColor(i, strip.Color(j, j, j * 2)); strip.setPixelColor(i - 1, strip.Color(j, j, j * 2)); strip.show(); delay(TIMER); } delay(PAUSA); } w = 5; // переход в пятый цикл для ожидания } while (w == 5) { for (j = 124; j >= J; j--) { // плавное выключение подсветки лестницы на адресной ленте for (i = 0; i <= NUM_LED; i++) { strip.setPixelColor(i, strip.Color(j, j, j * 2 )); strip.show(); } // поочередно опрашиваем датчики движения if (digitalRead(PIN_PIR1) == HIGH) { w = 3; goto w3; } delay(TIMER + j / 2); if (digitalRead(PIN_PIR2) == HIGH) { w = 4; goto w4; } delay(TIMER + j / 2); } w = 0; // если ни один из датчиков не сработал выходим из цикла } while (w == 3) { w3: t = map (j, 10, 125, 20, 0); // плавное выключение подсветки лестницы на Ардуино снизу-вверх for (i = 0; i <= NUM_LED + 1; i = i + LED) { for (g = j; g >= J; g--) { strip.setPixelColor(i, strip.Color(g, g, g * 2)); strip.setPixelColor(i + 1, strip.Color(g, g, g * 2)); strip.show(); delay(TIMER + t / 2); } delay(PAUSA); } w = 0; // выходим из цикла в начало программы } while (w == 4) { w4: t = map (j, 10, 125, 20, 0); // плавное выключение подсветки лестницы на Ардуино сверху-вниз for (i = NUM_LED + 1; i >= 0; i = i - LED) { for (g = j; g >= J; g--) { strip.setPixelColor(i, strip.Color(g, g, g * 2)); strip.setPixelColor(i - 1, strip.Color(g, g, g * 2)); strip.show(); delay(TIMER + t / 2); } delay(PAUSA); } w = 0; // выходим из цикла в начало программы } }
Радиус срабатывания PIR датчиков движения HC-SR501 программно изменить нельзя, в отличие от ультразвуковых датчиков движения;
Датчики движения можно заменить датчиками препятствия (KY-032 Arduino), при этом схема сборки и прошивка микроконтроллера не изменится.
Для создания «умной» подсветки лестницы своими руками на Ардуино существует множество вариантов исполнения. В нашем случае большинство настроек задается только в программе, что значительно упрощает схему сборки и прошивку DIY проекта.
Теги: