#include <Adafruit_NeoPixel.h>
#define LENTA_1_PIN 5
#define LENTA_1_NUM_LEDS 4
#define BTN_1_PIN 11
#define BTN_2_PIN 12
#define BLUE_COLOR 0, 0, 255
#define RED_COLOR 255, 0, 0
#define WHITE_COLOR 255, 255, 255
#define ORANGE_COLOR 255, 165, 0
Adafruit_NeoPixel lenta1(LENTA_1_NUM_LEDS, LENTA_1_PIN, NEO_GRB + NEO_KHZ800); // 4 диода
const unsigned int maxFPS = 20;
// Переменные состояния системы
enum SystemState { IDLE, BUTTON_1, BUTTON_2 };
SystemState systemState = IDLE;
unsigned long LentaAnimTimer1 = 0;
// Переменные состояния и времени для кнопки 1
enum ButtonState1 { IDLE_1, BLUE_ALL_1, PULSE_BLUE_1 };
ButtonState1 buttonState1 = IDLE_1;
unsigned long previousMillis1 = 0;
const unsigned long blueDuration1 = 5000; // 5 секунд
const unsigned long pulseDuration1 = 5000; // 5 секунд
const int pulseSteps1 = 5; // Количество шагов пульсации
const unsigned long pulseStepDuration1 = pulseDuration1 / (2 * pulseSteps1); // Продолжительность одного шага пульсации
// Переменные состояния и времени для кнопки 2
enum ButtonState2 { IDLE_2, BLUE_ALL_2, PULSE_BLUE_2, RED_ALL_2, PULSE_RED_2 };
ButtonState2 buttonState2 = IDLE_2;
unsigned long previousMillis2 = 0;
const unsigned long blueDuration2 = 5000; // 5 секунд
const unsigned long pulseDuration2 = 5000; // 5 секунд
const int pulseSteps2 = 5; // Количество шагов пульсации
const unsigned long pulseStepDuration2 = pulseDuration2 / (2 * pulseSteps2); // Продолжительность одного шага пульсации
const unsigned long redDuration2 = 5000; // 5 секунд
const unsigned long pulseRedDuration2 = 3000; // 3 секунды
void setup() {
// Инициализация светодиодных лент и кнопок
lenta1.begin();
// Установка начального цвета для каждой ленты
lenta1.fill(lenta1.Color(ORANGE_COLOR));
// Обновление состояния светодиодных лент
lenta1.show();
// Настройка пинов для кнопок
pinMode(BTN_1_PIN, INPUT_PULLUP);
pinMode(BTN_2_PIN, INPUT_PULLUP);
}
unsigned long currentTime = 0;
unsigned long oldTime = 0;
void loop() {
// Расчёт времени, прошедшего с прошлого цикла
currentTime = millis();
unsigned long deltaTime = currentTime - oldTime;
oldTime = currentTime;
// Нажатия кнопок обрабатываются только в состоянии бездействия
if (systemState == IDLE)
{
// Нажата кнопка 1
if (digitalRead(BTN_1_PIN) == LOW)
{
systemState = BUTTON_1;
buttonState1 = BLUE_ALL_1; // Устанавливаем состояние для включения всех лент синим цветом
previousMillis1 = currentTime;
}
// Обработка нажатия кнопки 2
if (digitalRead(BTN_2_PIN) == LOW)
{
buttonState2 = BLUE_ALL_2; // Устанавливаем состояние для включения всех лент синим цветом
previousMillis2 = currentTime;
}
}
// Бегающий диод на первой ленте
if (systemState == IDLE)
{
// LentaAnimTimer1 += deltaTime;
// if (LentaAnimTimer1 > 200)
// {
// static int pos = 0;
// lenta1.setPixelColor((pos + LENTA_1_NUM_LEDS - 1) % LENTA_1_NUM_LEDS, lenta1.Color(ORANGE_COLOR)); // Выключаем предыдущий пиксель
// lenta1.setPixelColor(pos, lenta1.Color(WHITE_COLOR)); // Включаем текущий пиксель
// lenta1.show();
// // Смещение позиции диода для создания эффекта бегающей волны
// pos = (pos + 1) % LENTA_1_NUM_LEDS;
// LentaAnimTimer1 = 0;
// }
}
// Логика для различных состояний системы кнопки 1
switch (buttonState1) {
case BLUE_ALL_1:
// Включение всех лент синим цветом на протяжении 5 секунд
lenta1.fill(lenta1.Color(BLUE_COLOR));
lenta1.show();
delay(5000);
buttonState1 = PULSE_BLUE_1; // После завершения времени переходим к пульсации
previousMillis1 = millis();
break;
case PULSE_BLUE_1:
// Пульсация яркости синих лент
if (currentTime - previousMillis1 <= pulseDuration1) {
// Вычисление яркости в зависимости от времени
int brightness = map((currentTime - previousMillis1) % pulseStepDuration1, 0, pulseStepDuration1, 100, 255);
// Применение яркости ко всем лентам
for (int i = 0; i < lenta1.numPixels(); i++) {
lenta1.setPixelColor(i, lenta1.Color(0, 0, brightness));
}
lenta1.show();
} else
{
buttonState1 = IDLE_1; // После завершения времени возвращаемся к исходному состоянию
// Сброс ленты 1
lenta1.fill(lenta1.Color(ORANGE_COLOR));
lenta1.show();
}
break;
case IDLE_1:
if (systemState == BUTTON_1) systemState = IDLE;
break;
}
// Логика для различных состояний системы кнопки 2
switch (buttonState2) {
case BLUE_ALL_2:
// Включение всех лент синим цветом на протяжении 5 секунд
if (currentTime - previousMillis2 <= blueDuration2) {
lenta1.fill(lenta1.Color(BLUE_COLOR));
lenta1.show();
} else {
buttonState2 = PULSE_BLUE_2; // После завершения времени переходим к пульсации
previousMillis2 = currentTime;
}
break;
case PULSE_BLUE_2:
// Пульсация яркости синих лент
if (currentTime - previousMillis2 <= pulseDuration2) {
// Вычисление яркости в зависимости от времени
int brightness = map((currentTime - previousMillis2) % pulseStepDuration2, 0, pulseStepDuration2, 100, 255);
// Применение яркости ко всем лентам
for (int i = 0; i < lenta1.numPixels(); i++) {
lenta1.setPixelColor(i, lenta1.Color(0, 0, brightness));
}
lenta1.show();
} else {
buttonState2 = RED_ALL_2; // После завершения времени переходим к включению красных лент
previousMillis2 = currentTime;
}
break;
case RED_ALL_2:
// Включение всех лент красным цветом на протяжении 5 секунд
if (currentTime - previousMillis2 <= redDuration2) {
lenta1.fill(lenta1.Color(RED_COLOR));
lenta1.show();
} else {
buttonState2 = PULSE_RED_2; // После завершения времени переходим к пульсации
previousMillis2 = currentTime;
}
break;
case PULSE_RED_2:
// Пульсация яркости красных лент
if (currentTime - previousMillis2 <= pulseRedDuration2) {
// Вычисление яркости в зависимости от времени
int brightness = map((currentTime - previousMillis2) % pulseStepDuration2, 0, pulseStepDuration2, 100, 255);
// Применение яркости ко всем лентам
for (int i = 0; i < lenta1.numPixels(); i++) {
lenta1.setPixelColor(i, lenta1.Color(brightness, 0, 0));
}
lenta1.show();
} else
{
buttonState2 = IDLE_2; // После завершения времени возвращаемся к исходному состоянию
// Сброс ленты 1
lenta1.fill(lenta1.Color(ORANGE_COLOR));
lenta1.show();
}
break;
case IDLE_2:
if (systemState == BUTTON_2) systemState = IDLE;
break;
}
// Ограничение частоты кадров
delay(constrain(millis()-currentTime, 0, maxFPS));
}