Загрузка данных


#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();
}