/* Задание 6.1
Управляем свечением диодов кнопками.
При удержании кнопки - горит диод соответсвующего цвета */
#define LED_R 4 // Вывод для Красного диода
#define LED_G 3 // Вывод для Зеленого диода
#define LED_B 2 // Вывод для Синего диода
#define BUTTON_R A0 // Вывод для Красной кнопки
#define BUTTON_G A1 // Вывод для Зеленой кнопки
#define BUTTON_B A2 // Вывод для Синей кнопки
bool flag_button_R; // Флаг состояние кнопки (нажата или нет)
bool flag_button_G;
bool flag_button_B;
bool flag_state_R; // Флаг состояние диода (горит или нет)
bool flag_state_B;
bool flag_state_G;
bool last_press_B;
bool last_press_R;
bool last_press_G;
//Настроим GPIO соответсвующим образом
void setup() {
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(BUTTON_R, INPUT_PULLUP);
pinMode(BUTTON_G, INPUT_PULLUP);
pinMode(BUTTON_B, INPUT_PULLUP);
}
// Прочитаем состояние кнопок и запишем их на соответсвующие светодиоды
void loop()
{// Красный диод
if (digitalRead(BUTTON_R) == LOW)
{
flag_button_R = true;
last_press_R = millis();
} else
{
if (flag_button_R)
{
flag_button_R = false;
if (millis() - last_press_R > 500)
{ // Длительное нажатие
flag_state_R = !flag_state_R;
} else
{ // Короткое нажатие
flag_state_R = !flag_state_R;
}
}
}
// Зеленый диод
if (digitalRead(BUTTON_G) == LOW) {
flag_button_G = true;
last_press_G = millis();
} else
{
if (flag_button_G)
{
flag_button_G = false;
if (millis() - last_press_G > 500)
{ // Длительное нажатие
flag_state_G = !flag_state_G;
} else
{ // Короткое нажатие
flag_state_G = !flag_state_G;
}
}
}
// Синий диод
if (digitalRead(BUTTON_B) == LOW)
{
flag_button_B = true;
last_press_B = millis();
} else
{
if (flag_button_B)
{
flag_button_B = false;
if (millis() - last_press_B > 500)
{ // Длительное нажатие
flag_state_B = !flag_state_B;
} else
{ // Короткое нажатие
flag_state_B = !flag_state_B;
}
}
}
// Управление светодиодами
digitalWrite(LED_R, flag_state_R);
digitalWrite(LED_G, flag_state_G);
digitalWrite(LED_B, flag_state_B);
// Мигание при длительном нажатии
if (flag_state_R && (millis() - last_press_R) % 500 < 250)
{
digitalWrite(LED_R, HIGH);
} else if (flag_state_R)
{
digitalWrite(LED_R, LOW);
}
if (flag_state_G && (millis() - last_press_G) % 500 < 250)
{
digitalWrite(LED_G, HIGH);
} else if (flag_state_G)
{
digitalWrite(LED_G, LOW);
}
if (flag_state_B && (millis() - last_press_B) % 500 < 250)
{
digitalWrite(LED_B, HIGH);
}
else if (flag_state_B)
{
digitalWrite(LED_B, LOW);
}
delay(10); // Небольшая задержка для избежания слишком частых проверок состояния кнопок
digitalWrite(LED_R, !digitalRead(BUTTON_R));//Не забудем инвертировать сигнал!
digitalWrite(LED_G, !digitalRead(BUTTON_G));//Не забудем инвертировать сигнал!
digitalWrite(LED_B, !digitalRead(BUTTON_B));//Не забудем инвертировать сигнал!
}