// Пины подключенных модулей constexpr uint8_t LED_R_PIN = 10; constexpr uint8_t LED_G_PIN = 9; constexpr uint8_t LED_B_PIN = 4; constexpr uint8_t LED_Y_PIN = 6; constexpr uint8_t BUZZER_PIN = 7; constexpr uint8_t BUTTON_PIN = 8; // Время таймера в минутах constexpr uint8_t POMODORO_TIME = 25; // Количество светодиодов constexpr uint8_t LED_COUNT = 4; // Массив пинов со светодиодами int leds[] = { LED_R_PIN, LED_G_PIN, LED_Y_PIN, LED_B_PIN }; // Переменная для хранения времени таймера в миллисекундах unsigned long pomodoroTimeInMillis; // Переменная для хранения времени переключения светодиодов unsigned long ledSwitchTime; // Переменная для хранения времени начала работы таймера unsigned long lastTime = 0; // Состояние таймера — выключен bool pomodoroState = false; void setup() { // Рассчитаем время таймера в миллисекундах pomodoroTimeInMillis = POMODORO_TIME * 60000; // Рассчитаем время переключения светодиодов ledSwitchTime = pomodoroTimeInMillis / LED_COUNT; // Переключим пины светодиодов в состояние выхода for (int i = 0; i < LED_COUNT; ++i) { pinMode(leds[i], OUTPUT); } } void loop() { // Если был клик кнопки if (checkClick()) { // Запомним текущее время lastTime = millis(); // Переключим состояние таймера вкл/выкл pomodoroState = !pomodoroState; // Выключим все светодиоды for (int i = 0; i < LED_COUNT; ++i) { digitalWrite(leds[i], LOW); } } // Если таймер включён if (pomodoroState) { // Рассчитаем прошедшее время unsigned long elapsedTime = millis() - lastTime; // Если прошедшее время меньше времени срабатывания таймера if (elapsedTime < pomodoroTimeInMillis) { // Рассчитаем, какой из светодиодов должен гореть unsigned long currentLed = elapsedTime / ledSwitchTime; // И зажжём этот светодиод digitalWrite(leds[currentLed], HIGH); // Если прошедшее время таймера больше времени срабатывания — звеним } else { finish(); } } } // Функция для проверки клика кнопки bool checkClick() { // Переменная для хранения предыдущего состояния кнопки static bool buttonWasUp = true; bool result = false; // Читаем текущее состояние кнопки bool buttonIsUp = digitalRead(BUTTON_PIN); // Если кнопка была не нажата, а теперь нажата // значит был клик if (buttonWasUp && !buttonIsUp) { delay(100); result = true; } buttonWasUp = buttonIsUp; return result; } void finish() { // Переменная для хранения переключателя светодиодов bool toggle = true; // Попиликаем 10 раз for (int i = 0; i < 10; i++) { tone(BUZZER_PIN, 500 + toggle * 500); // Почерёдно моргаем парами светодиодов for (int i = 0; i < LED_COUNT; ++i) { digitalWrite(leds[i], toggle); toggle = !toggle; } toggle = !toggle; delay(100); } // Отключаем звук noTone(BUZZER_PIN); // Выключаем таймер pomodoroState = false; }