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


#include <Adafruit_NeoPixel.h>

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

#define LED_PIN     2
#define BUTTON_PIN  34

#define NUM_LEDS    6

// Яркость 0-255
int brightness = 100;

// =========================
// СВЕТОДИОДЫ
// =========================

Adafruit_NeoPixel strip(
  NUM_LEDS,
  LED_PIN,
  NEO_GRB + NEO_KHZ800
);

// =========================
// КНОПКИ
// =========================

const int MUTE      = 2400;
const int PHONE     = 2700;
const int SOURCE    = 2900;
const int PREV      = 3100;
const int NEXT      = 3250;
const int VOL_DOWN  = 3450;
const int VOL_UP    = 3600;

const int TOLERANCE = 40;

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

int mode = 0;
const int MODE_COUNT = 5;

bool lightsOn = true;

// =========================
// ВСПОМОГАТЕЛЬНЫЕ
// =========================

uint32_t Wheel(byte WheelPos) {

  WheelPos = 255 - WheelPos;

  if (WheelPos < 85) {
    return strip.Color(
      255 - WheelPos * 3,
      0,
      WheelPos * 3
    );
  }

  if (WheelPos < 170) {

    WheelPos -= 85;

    return strip.Color(
      0,
      WheelPos * 3,
      255 - WheelPos * 3
    );
  }

  WheelPos -= 170;

  return strip.Color(
    WheelPos * 3,
    255 - WheelPos * 3,
    0
  );
}


// =========================
// ПОЛУЧЕНИЕ КНОПКИ
// =========================

String getButton(int adc) {

  if (abs(adc - MUTE) <= TOLERANCE)
    return "MUTE";

  if (abs(adc - PHONE) <= TOLERANCE)
    return "PHONE";

  if (abs(adc - SOURCE) <= TOLERANCE)
    return "SOURCE";

  if (abs(adc - PREV) <= TOLERANCE)
    return "PREV";

  if (abs(adc - NEXT) <= TOLERANCE)
    return "NEXT";

  if (abs(adc - VOL_DOWN) <= TOLERANCE)
    return "VOL-";

  if (abs(adc - VOL_UP) <= TOLERANCE)
    return "VOL+";

  return "";
}


// =========================
// РЕЖИМ 1
// RAINBOW
// =========================

void modeRainbow() {

  static uint16_t j = 0;

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

    strip.setPixelColor(
      i,
      Wheel((i * 256 / NUM_LEDS + j) & 255)
    );
  }

  strip.show();

  j++;
}


// =========================
// РЕЖИМ 2
// COLOR WAVE
// =========================

void modeColorWave() {

  static uint16_t offset = 0;

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

    int pos = (i * 256 / NUM_LEDS + offset) & 255;

    strip.setPixelColor(
      i,
      Wheel(pos)
    );
  }

  strip.show();

  offset += 2;
}


// =========================
// РЕЖИМ 3
// BREATHING
// =========================

void modeBreathing() {

  static int brightnessBreath = 0;
  static int direction = 1;

  brightnessBreath += direction * 2;

  if (brightnessBreath >= 255) {
    brightnessBreath = 255;
    direction = -1;
  }

  if (brightnessBreath <= 5) {
    brightnessBreath = 5;
    direction = 1;
  }

  uint32_t color = strip.Color(
    brightnessBreath,
    0,
    brightnessBreath
  );

  for (int i = 0; i < NUM_LEDS; i++) {
    strip.setPixelColor(i, color);
  }

  strip.show();
}


// =========================
// РЕЖИМ 4
// CENTER PULSE
// =========================

void modeCenterPulse() {

  static int brightnessPulse = 0;
  static int direction = 1;

  brightnessPulse += direction * 3;

  if (brightnessPulse >= 255) {
    brightnessPulse = 255;
    direction = -1;
  }

  if (brightnessPulse <= 0) {
    brightnessPulse = 0;
    direction = 1;
  }

  strip.clear();

  // Центральные светодиоды
  strip.setPixelColor(
    2,
    strip.Color(
      brightnessPulse,
      0,
      brightnessPulse
    )
  );

  strip.setPixelColor(
    3,
    strip.Color(
      brightnessPulse,
      0,
      brightnessPulse
    )
  );

  strip.show();
}


// =========================
// РЕЖИМ 5
// KNIGHT RIDER
// =========================

void modeKnightRider() {

  static int position = 0;
  static int direction = 1;

  strip.clear();

  strip.setPixelColor(
    position,
    strip.Color(255, 0, 0)
  );

  strip.show();

  position += direction;

  if (position >= NUM_LEDS - 1) {
    position = NUM_LEDS - 1;
    direction = -1;
  }

  if (position <= 0) {
    position = 0;
    direction = 1;
  }
}


// =========================
// ВЫКЛЮЧЕНИЕ
// =========================

void turnOffLights() {

  strip.clear();
  strip.show();
}


// =========================
// ОБРАБОТКА КНОПКИ
// =========================

void handleButton(String button) {

  Serial.print("Нажата: ");
  Serial.println(button);

  // MUTE = включить / выключить
  if (button == "MUTE") {

    lightsOn = !lightsOn;

    if (!lightsOn) {
      turnOffLights();
    }

    return;
  }


  // Если подсветка выключена —
  // остальные кнопки её не трогают
  if (!lightsOn) {
    return;
  }


  // VOL+ = яркость +
  if (button == "VOL+") {

    brightness += 20;

    if (brightness > 255)
      brightness = 255;

    strip.setBrightness(brightness);

    Serial.print("Яркость: ");
    Serial.println(brightness);

    return;
  }


  // VOL- = яркость -
  if (button == "VOL-") {

    brightness -= 20;

    if (brightness < 10)
      brightness = 10;

    strip.setBrightness(brightness);

    Serial.print("Яркость: ");
    Serial.println(brightness);

    return;
  }


  // SOURCE = следующий режим
  if (button == "SOURCE") {

    mode++;

    if (mode >= MODE_COUNT)
      mode = 0;

    Serial.print("Режим: ");
    Serial.println(mode + 1);

    return;
  }


  // ВПЕРЁД = следующий режим
  if (button == "NEXT") {

    mode++;

    if (mode >= MODE_COUNT)
      mode = 0;

    Serial.print("Режим: ");
    Serial.println(mode + 1);

    return;
  }


  // НАЗАД = предыдущий режим
  if (button == "PREV") {

    mode--;

    if (mode < 0)
      mode = MODE_COUNT - 1;

    Serial.print("Режим: ");
    Serial.println(mode + 1);

    return;
  }


  // ТРУБКА = фиксированный цвет
  if (button == "PHONE") {

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

      strip.setPixelColor(
        i,
        strip.Color(0, 255, 0)
      );
    }

    strip.show();

    return;
  }
}


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

void setup() {

  Serial.begin(115200);

  strip.begin();

  strip.setBrightness(brightness);

  strip.clear();
  strip.show();

  analogReadResolution(12);

  Serial.println("Система запущена");
}


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

void loop() {

  // ---------- КНОПКИ ----------

  static String lastButton = "";

  int adc = analogRead(BUTTON_PIN);

  String button = getButton(adc);


  // Новое нажатие
  if (button != "" && lastButton == "") {

    handleButton(button);
  }


  // Запоминаем состояние
  lastButton = button;


  // ---------- СВЕТОДИОДЫ ----------

  if (lightsOn) {

    switch (mode) {

      case 0:
        modeRainbow();
        break;

      case 1:
        modeColorWave();
        break;

      case 2:
        modeBreathing();
        break;

      case 3:
        modeCenterPulse();
        break;

      case 4:
        modeKnightRider();
        break;
    }
  }

  delay(20);
}