#define RED_PIN 9
#define GREEN_PIN 10
#define BLUE_PIN 11
#define BUTTON_PIN 2
int mode = 0; // Переменная для текущего режима
int lastButtonState = HIGH; // Последнее состояние кнопки
int buttonState; // Текущее состояние кнопки
unsigned long lastDebounceTime = 0; // Время последнего изменения состояния кнопки
unsigned long debounceDelay = 50; // Задержка для устранения дребезга кнопки
unsigned long previousMillis = 0;
// Настроим пины для RGB-светодиода и кнопки
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Включаем подтягивающий резистор для кнопки
// Изначально выключим светодиоды
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 0);
}
void loop() {
int reading = digitalRead(BUTTON_PIN); // Чтение состояния кнопки
// Проверка изменения состояния кнопки (с учётом дебаунса)
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
mode = (mode + 1) % 3; // Переключение между режимами
}
}
}
lastButtonState = reading; // Обновляем состояние кнопки
// В зависимости от текущего режима выполняем соответствующую функцию
switch (mode) {
case 0:
smoothTransitionNonBlocking();
break;
case 1:
sosSignalNonBlocking();
break;
case 2:
whiteLight();
break;
}
}
// Переменные для плавного перехода цветов
int step = 0;
int subStep = 0;
unsigned long lastStepTime = 0;
void smoothTransitionNonBlocking() {
unsigned long currentMillis = millis();
if (currentMillis - lastStepTime >= 10) {
lastStepTime = currentMillis;
switch (step) {
case 0:
analogWrite(RED_PIN, subStep);
analogWrite(BLUE_PIN, 255 - subStep);
analogWrite(GREEN_PIN, 0);
subStep++;
if (subStep > 255) {
subStep = 0;
step = 1;
}
break;
case 1:
analogWrite(BLUE_PIN, subStep);
analogWrite(GREEN_PIN, 255 - subStep);
analogWrite(RED_PIN, 0);
subStep++;
if (subStep > 255) {
subStep = 0;
step = 2;
}
break;
case 2:
analogWrite(GREEN_PIN, subStep);
analogWrite(RED_PIN, 255 - subStep);
analogWrite(BLUE_PIN, 0);
subStep++;
if (subStep > 255) {
subStep = 0;
step = 0;
}
break;
}
}
}
// Переменные для сигнала SOS
int sosState = 0;
int sosCount = 0;
unsigned long sosLastTime = 0;
bool sosLedOn = false;
void sosSignalNonBlocking() {
unsigned long currentMillis = millis();
int onDuration, offDuration;
switch (sosState) {
case 0: case 2: case 4:
onDuration = 200;
offDuration = 200;
break;
case 6: case 8: case 10:
onDuration = 500;
offDuration = 500;
break;
case 12:
onDuration = 0;
offDuration = 1000;
break;
default:
onDuration = 0;
offDuration = 0;
break;
}
if (sosLedOn && currentMillis - sosLastTime >= onDuration) {
// Выключаем свет
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 0);
sosLedOn = false;
sosLastTime = currentMillis;
sosState++;
} else if (!sosLedOn && currentMillis - sosLastTime >= offDuration) {
if (sosState < 12) {
// Включаем свет
analogWrite(RED_PIN, 255);
analogWrite(GREEN_PIN, 100);
analogWrite(BLUE_PIN, 0);
sosLedOn = true;
sosLastTime = currentMillis;
} else {
// После паузы сбрасываем
sosState = 0;
}
}
}
// Режим белого света
void whiteLight() {
analogWrite(RED_PIN, 255); // Красный канал на 100%
analogWrite(GREEN_PIN, 255); // Зелёный канал на 100%
analogWrite(BLUE_PIN, 255); // Синий канал на 100%
}