Создал код совместно с ЧатGPT. кнопкой переключаются режимы. Кнопка к пину 10 и питанию с резистором от пина до земли.
Есть ргб светодиод и оранжевый.
Все режимы нормально переключает, но режим радуги проскакивает.
const int redPin = 9;
const int greenPin = 6;
const int bluePin = 5;
const int orangePin = 3;
const int buttonPin = 10;
const int FADE_DELAY = 10; // Задержка между шагами плавного изменения цвета
int currentMode = 0;
// Массив с цветами радуги в RGB формате
int rainbow[][3] = {
{255, 0, 0}, // Красный
{255, 255, 0}, // Желтый
{0, 255, 0}, // Зеленый
{0, 255, 255}, // Голубой
{0, 0, 255}, // Синий
{255, 0, 255} // Фиолетовый
};
void updateLEDs() {
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
analogWrite(orangePin, 0);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(orangePin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
updateLEDs();
}
unsigned long lastDebounceTime = 0; // Переменная для хранения времени последнего нажатия
unsigned long debounceDelay = 500; // Задержка для дебаунсинга
void loop() {
unsigned long currentMillis = millis(); // Получение текущего времени
// Проверка, прошла ли достаточная задержка для дебаунсинга
if (currentMillis - lastDebounceTime > debounceDelay) {
if (digitalRead(buttonPin) == LOW) {
currentMode = (currentMode + 1) % 11;
updateLEDs();
lastDebounceTime = currentMillis; // Обновление времени последнего нажатия
}
}
switch (currentMode) {
case 0:
break;
case 1:
analogWrite(orangePin, 255);
break;
case 2:
analogWrite(orangePin, 155);
break;
case 3:
rainbowEffect();
break;
case 4:
analogWrite(redPin, 255);
break;
case 5:
analogWrite(redPin, 255);
analogWrite(greenPin, 255);
break;
case 6:
analogWrite(greenPin, 255);
break;
case 7:
analogWrite(greenPin, 255);
analogWrite(bluePin, 255);
break;
case 8:
analogWrite(bluePin, 255);
break;
case 9:
analogWrite(redPin, 255);
analogWrite(bluePin, 255);
break;
case 10:
analogWrite(redPin, 255);
analogWrite(greenPin, 255);
analogWrite(bluePin, 255);
break;
}
}
void rainbowEffect() {
for (int colorIndex = 0; colorIndex < 5; colorIndex++) {
if (digitalRead(buttonPin) == LOW) {
delay(50);
currentMode = (currentMode + 1) % 11;
updateLEDs();
return; // Выход из функции и цикла, чтобы перейти к следующему режиму
}
int startColor[3] = {rainbow[colorIndex][0], rainbow[colorIndex][1], rainbow[colorIndex][2]};
int endColor[3] = {rainbow[colorIndex + 1][0], rainbow[colorIndex + 1][1], rainbow[colorIndex + 1][2]};
for (int step = 0; step <= 255; step++) {
int currentColor[3];
for (int j = 0; j < 3; j++) {
currentColor[j] = startColor[j] + (endColor[j] - startColor[j]) * step / 255;
}
analogWrite(redPin, currentColor[0]);
analogWrite(greenPin, currentColor[1]);
analogWrite(bluePin, currentColor[2]);
delay(FADE_DELAY);
if (colorIndex == 4) {
delay(1000); // Дополнительная пауза перед возвращением к началу
} else {
delay(1000); // Пауза между цветами
}
}
}
}