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


#include <FastLED.h>

// =====================================================
// АДРЕСНЫЕ RGB СВЕТОДИОДЫ
// =====================================================

#define LED_DATA_PIN 25
#define NUM_LEDS     10

#define LED_TYPE     WS2812B
#define COLOR_ORDER  GRB

CRGB leds[NUM_LEDS];


// =====================================================
// КНОПКА BOOT ESP32
// =====================================================

#define BOOT_PIN 0


// =====================================================
// РЕЖИМЫ
// =====================================================

enum RGBMode {
  MODE_OFF,
  MODE_WHITE,
  MODE_RAINBOW,
  MODE_GRADIENT
};

RGBMode currentMode = MODE_OFF;


// =====================================================
// КНОПКА
// =====================================================

bool lastButtonState = HIGH;

unsigned long lastButtonTime = 0;

const unsigned long DEBOUNCE_TIME = 300;


// =====================================================
// НАСТРОЙКИ ЯРКОСТИ
// =====================================================

#define BRIGHTNESS 80


// =====================================================
// SETUP
// =====================================================

void setup() {

  Serial.begin(115200);

  // BOOT-кнопка
  pinMode(BOOT_PIN, INPUT_PULLUP);


  // ===================================================
  // RGB LED
  // ===================================================

  FastLED.addLeds<
    LED_TYPE,
    LED_DATA_PIN,
    COLOR_ORDER
  >(
    leds,
    NUM_LEDS
  );

  FastLED.setBrightness(BRIGHTNESS);

  FastLED.clear();
  FastLED.show();


  Serial.println();
  Serial.println("================================");
  Serial.println("        RGB LED TEST");
  Serial.println("================================");
  Serial.println();

  Serial.println("BOOT = смена режима");
  Serial.println();

  Serial.println("0 = OFF");
  Serial.println("1 = WHITE");
  Serial.println("2 = RAINBOW");
  Serial.println("3 = GRADIENT");

  Serial.println();
}


// =====================================================
// OFF
// =====================================================

void showOff() {

  FastLED.clear();
}


// =====================================================
// WHITE
// =====================================================

void showWhite() {

  for (int i = 0; i < NUM_LEDS; i++) {

    leds[i] = CRGB::White;
  }
}


// =====================================================
// RAINBOW
// =====================================================

void showRainbow() {

  static uint8_t hue = 0;

  for (int i = 0; i < NUM_LEDS; i++) {

    leds[i] = CHSV(
      hue + (i * 12),
      255,
      255
    );
  }

  hue++;
}


// =====================================================
// GRADIENT
// =====================================================

void showGradient() {

  static uint8_t offset = 0;

  for (int i = 0; i < NUM_LEDS; i++) {

    leds[i] = CHSV(
      offset + (i * 20),
      255,
      255
    );
  }

  offset++;
}


// =====================================================
// СМЕНА РЕЖИМА
// =====================================================

void nextMode() {

  currentMode =
    (RGBMode)(
      ((int)currentMode + 1) % 4
    );


  Serial.print("MODE = ");


  switch (currentMode) {

    case MODE_OFF:
      Serial.println("OFF");
      break;

    case MODE_WHITE:
      Serial.println("WHITE");
      break;

    case MODE_RAINBOW:
      Serial.println("RAINBOW");
      break;

    case MODE_GRADIENT:
      Serial.println("GRADIENT");
      break;
  }
}


// =====================================================
// LOOP
// =====================================================

void loop() {

  // ===================================================
  // ЧИТАЕМ BOOT
  // ===================================================

  bool buttonState = digitalRead(BOOT_PIN);


  // Новое нажатие
  if (
    lastButtonState == HIGH &&
    buttonState == LOW
  ) {

    unsigned long now = millis();


    if (
      now - lastButtonTime >
      DEBOUNCE_TIME
    ) {

      nextMode();

      lastButtonTime = now;
    }
  }


  lastButtonState = buttonState;


  // ===================================================
  // ОТРИСОВКА РЕЖИМА
  // ===================================================

  switch (currentMode) {

    case MODE_OFF:

      showOff();

      break;


    case MODE_WHITE:

      showWhite();

      break;


    case MODE_RAINBOW:

      showRainbow();

      break;


    case MODE_GRADIENT:

      showGradient();

      break;
  }


  FastLED.show();


  // Скорость анимации
  delay(20);
}