#include <LiquidCrystal.h>
// Пины дисплея (согласно вашей схеме)
LiquidCrystal lcd(12, 11, 5, 6, 7, 8);
// Пины кнопок
const int buttonPlusPin = 2; // Кнопка "+" (увеличение времени)
const int buttonMinusPin = 3; // Кнопка "-" (уменьшение времени)
const int buttonStartPin = 4; // Кнопка "Старт"
const int buzzerPin = 10;
int timerValue = 0; // Установленное время (сек)
int remainingTime = 0; // Оставшееся время
bool timerRunning = false; // Флаг: идёт ли отсчёт
void setup() {
lcd.begin(16, 2);
pinMode(buttonPlusPin, INPUT_PULLUP); // Включаем внутренний подтягивающий резистор
pinMode(buttonMinusPin, INPUT_PULLUP);
pinMode(buttonStartPin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
lcd.print("Таймер:");
updateDisplay(); // Покажем начальное время 0
}
void loop() {
if (!timerRunning) {
// ----- Обработка кнопок только когда таймер не работает -----
if (digitalRead(buttonPlusPin) == LOW) {
delay(200); // Простая защита от дребезга
timerValue++;
if (timerValue > 999) timerValue = 999; // максимум 999 сек
updateDisplay();
}
if (digitalRead(buttonMinusPin) == LOW) {
delay(200);
timerValue--;
if (timerValue < 0) timerValue = 0;
updateDisplay();
}
if (digitalRead(buttonStartPin) == LOW && timerValue > 0) {
delay(200);
startTimer();
}
}
}
// Обновляем экран: первая строка — "Таймер:", вторая — значение
void updateDisplay() {
lcd.setCursor(0, 1);
lcd.print(" "); // Очищаем старые цифры
lcd.setCursor(0, 1);
lcd.print(timerValue);
lcd.print(" сек ");
}
void startTimer() {
timerRunning = true;
remainingTime = timerValue;
lcd.clear();
lcd.print("Таймер запущен!");
delay(1000);
// Основной цикл обратного отсчёта
while (remainingTime > 0 && timerRunning) {
lcd.clear();
lcd.print("Осталось:");
lcd.setCursor(0, 1);
lcd.print(remainingTime);
lcd.print(" сек ");
delay(1000);
remainingTime--;
}
// Если дошли до 0 (не сброшены кнопкой)
if (remainingTime == 0 && timerRunning) {
beep(); // Пищим
lcd.clear();
lcd.print("Время вышло!");
delay(2000);
}
resetTimer();
}
void beep() {
for (int i = 0; i < 3; i++) {
tone(buzzerPin, 1000);
delay(300);
noTone(buzzerPin);
delay(200);
}
}
void resetTimer() {
timerRunning = false;
// timerValue не сбрасываем — остаётся прежним, чтобы удобно повторить
lcd.clear();
lcd.print("Таймер:");
updateDisplay();
}