Загрузка данных
#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);
}