#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; // выходим из цикла в начало программы
}
}