#include <Adafruit_NeoPixel.h>
// === НАСТРОЙКИ ===
#define BUTTON_PIN 8 // Пин кнопки
#define BUTTON_GND 10 // Пин земли для кнопки
#define NUM_LEDS 4 // Количество светодиодов
#define LED_PIN 3 // Пин управления светодиодами
// Параметры для нажатого состояния (кнопка удерживается)
unsigned int led_delay_ON[NUM_LEDS] = {1000, 0, 100, 10000}; // Задержка перед включением (мс)
unsigned int led_time_ON[NUM_LEDS] = {2000, 3000, 5000, 2000}; // Время нарастания яркости (мс)
byte led_bright_ON[NUM_LEDS] = {100, 255, 255, 255}; // Максимальная яркость
// Параметры для отпущенного состояния (кнопка отпущена)
unsigned int led_delay_OFF[NUM_LEDS] = {1000, 0, 1000, 1000}; // Задержка перед выключением (мс)
unsigned int led_time_OFF[NUM_LEDS] = {1000, 100, 100, 1000}; // Время затухания яркости (мс)
byte led_bright_OFF[NUM_LEDS] = {0, 0, 0, 0}; // Минимальная яркость
// Цвета светодиодов в HEX формате
const uint32_t hexcolor_ON[NUM_LEDS] = {
0xFF0000, // Красный
0x00FF00, // Зеленый
0x0000FF, // Синий
0xFFFF00 // Желтый
};
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// Состояния светодиодов
byte led_bright_NOW[NUM_LEDS] = {0};
unsigned long led_timers[NUM_LEDS] = {0};
enum LedState { IDLE, DELAY_ON, FADE_ON, DELAY_OFF, FADE_OFF };
LedState led_states[NUM_LEDS] = {IDLE};
void setup() {
strip.begin();
strip.show(); // Инициализация - все светодиоды выключены
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUTTON_GND, OUTPUT);
digitalWrite(BUTTON_GND, LOW);
Serial.begin(9600);
}
void loop() {
static bool button_pressed = false;
static unsigned long button_press_time = 0;
// Обработка нажатия кнопки
bool current_button_state = digitalRead(BUTTON_PIN) == LOW;
if (!button_pressed && current_button_state) {
// Кнопка только что нажата
button_pressed = true;
button_press_time = millis();
startFadeIn();
Serial.println("pressed");
}
else if (button_pressed && !current_button_state && (millis() - button_press_time > 5)) {
// Кнопка только что отпущена (с антидребезгом)
button_pressed = false;
button_press_time = millis();
startFadeOut();
Serial.println("released");
}
// Обновление состояния светодиодов
updateLeds();
}
void startFadeIn() {
for (int i = 0; i < NUM_LEDS; i++) {
led_states[i] = DELAY_ON;
led_timers[i] = millis();
}
}
void startFadeOut() {
for (int i = 0; i < NUM_LEDS; i++) {
led_states[i] = DELAY_OFF;
led_timers[i] = millis();
}
}
void updateLeds() {
for (int i = 0; i < NUM_LEDS; i++) {
switch (led_states[i]) {
case DELAY_ON:
if (millis() - led_timers[i] >= led_delay_ON[i]) {
led_states[i] = FADE_ON;
led_timers[i] = millis();
}
break;
case FADE_ON:
if (led_bright_NOW[i] < led_bright_ON[i]) {
unsigned long fadeInterval = (unsigned long)led_time_ON[i] / led_bright_ON[i];
if (millis() - led_timers[i] >= fadeInterval) {
led_timers[i] = millis();
led_bright_NOW[i]++;
setLed(i, hexcolor_ON[i], led_bright_NOW[i]);
}
} else {
led_states[i] = IDLE;
}
break;
case DELAY_OFF:
if (millis() - led_timers[i] >= led_delay_OFF[i]) {
led_states[i] = FADE_OFF;
led_timers[i] = millis();
}
break;
case FADE_OFF:
if (led_bright_NOW[i] > led_bright_OFF[i]) {
unsigned long fadeInterval = (unsigned long)led_time_OFF[i] / led_bright_ON[i];
if (millis() - led_timers[i] >= fadeInterval) {
led_timers[i] = millis();
led_bright_NOW[i]--;
setLed(i, hexcolor_ON[i], led_bright_NOW[i]);
}
} else {
led_states[i] = IDLE;
}
break;
case IDLE:
// Ничего не делаем
break;
}
}
}
void setLed(int num, uint32_t color, byte brightness) {
uint8_t r = (color >> 16) & 0xFF;
uint8_t g = (color >> 8) & 0xFF;
uint8_t b = color & 0xFF;
// Применяем яркость
r = (r * brightness) / 255;
g = (g * brightness) / 255;
b = (b * brightness) / 255;
strip.setPixelColor(num, strip.Color(r, g, b));
strip.show();
}