Загрузка данных


#include <FastLED.h>

#define LED_PIN     25       // Пин управления светодиодами (GPIO 25)
#define BUTTON_PIN  4        // Пин кнопки (на GND)
#define NUM_LEDS    10       // Всего 10 светодиодов
#define BRIGHTNESS  120      // Яркость

CRGB leds[NUM_LEDS];
CRGB realLeds[NUM_LEDS];

// --- ЧЕТКИЕ И НОРМАЛЬНЫЕ ЦВЕТА ---
// Здесь собраны чистые цвета и приятные оттенки, без «вырвиглазных» ошибок
const CRGB pureColors[] = {
  CRGB::Red,          // 0. Красный
  CRGB::Green,        // 1. Зеленый
  CRGB::Blue,         // 2. Синий
  CRGB::White,        // 3. Белый
  CRGB::Yellow,       // 4. Желтый
  CRGB::Cyan,         // 5. Голубой
  CRGB::Magenta,      // 6. Пурпурный/Розовый
  CRGB::Orange,       // 7. Оранжевый
  CRGB::Purple        // 8. Фиолетовый
};
const int totalColors = 9;

int currentColorIndex = 0;
int currentMode = 0;       // 0 - автоматическая смена каждую секунду, 1 - статика выбранного цвета кнопкой
const int totalModes = 2;  // Всего 2 режима: авто-перебор или ручной выбор

// Таймер для смены цветов каждую секунду в авто-режиме
unsigned long lastColorChangeTime = 0;
const unsigned long colorInterval = 1000; // 1000 миллисекунд = 1 секунда

// Кнопка
unsigned long buttonPressStartTime = 0;
bool buttonIsPressed = false;
bool longPressHandled = false;
const unsigned long longPressTime = 500; 

void setup() {
  Serial.begin(115200);
  // Если цвета перепутаны (например, вместо красного загорается зеленый), 
  // измените GRB на RGB вот здесь:
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(realLeds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
  handleButton();

  // --- ЛОГИКА РЕЖИМОВ ---
  if (currentMode == 0) {
    // РЕЖИМ 0: Каждую секунду цвет всех светодиодов меняется автоматически по кругу
    if (millis() - lastColorChangeTime >= colorInterval) {
      lastColorChangeTime = millis();
      currentColorIndex = (currentColorIndex + 1) % totalColors;
    }
    fill_solid(leds, NUM_LEDS, pureColors[currentColorIndex]);
  } 
  else if (currentMode == 1) {
    // РЕЖИМ 1: Цвет меняется ТОЛЬКО когда вы сами нажмете кнопку
    fill_solid(leds, NUM_LEDS, pureColors[currentColorIndex]);
  }

  // Перенос в реальный порядок под вашу плату (чтобы светились все 10)
  for (int i = 0; i < NUM_LEDS; i++) {
    realLeds[getPhysicalIndex(i)] = leds[i];
  }
  
  FastLED.show();
  FastLED.delay(20);
}

// Карта вашей разводки под 10 светодиодов
int getPhysicalIndex(int logicalIndex) {
  const int mapTable[10] = {3, 2, 1, 0, 4, 5, 6, 7, 8, 9}; 
  return mapTable[logicalIndex];
}

// Обработка кнопки
void handleButton() {
  bool reading = (digitalRead(BUTTON_PIN) == LOW);

  if (reading && !buttonIsPressed) {
    buttonIsPressed = true;
    buttonPressStartTime = millis();
    longPressHandled = false;
  } 
  else if (reading && buttonIsPressed) {
    if (!longPressHandled && (millis() - buttonPressStartTime >= longPressTime)) {
      // Долгое нажатие переключает РЕЖИМ: 
      // (Авто-смена каждую секунду <-> Ручной выбор цвета кнопкой)
      currentMode = (currentMode + 1) % totalModes;
      longPressHandled = true;
    }
  } 
  else if (!reading && buttonIsPressed) {
    buttonIsPressed = false;
    if (!longPressHandled) {
      // Короткое нажатие вручную переключает следующий цвет в ручном режиме
      currentColorIndex = (currentColorIndex + 1) % totalColors;
    }
  }
}