#include <LiquidCrystal.h>
const int RS_Pin = A4;
const int EN_Pin = A5;
const int D4_Pin = A3;
const int D5_Pin = A2;
const int D6_Pin = A1;
const int D7_Pin = A0;
const int MinutesButtonPin = 13;
const int SecondsButtonPin = 11;
const int MilliSecondsButtonPin = 9;
const int ResetButtonPin = 2;
const int StartButtonPin = 3;
const int GreenLEDPin = 10;
const int RedLEDPin = 8;
int set_minutes = 0;
int set_seconds = 0;
int set_milliseconds = 0;
int display_minutes = 0;
int display_seconds = 0;
int display_milliseconds = 0;
bool timerStarted = false;
unsigned long startTime = 0;
LiquidCrystal lcd(RS_Pin, EN_Pin, D4_Pin, D5_Pin, D6_Pin, D7_Pin);
void setup() {
lcd.begin(16, 2);
pinMode(MinutesButtonPin, INPUT_PULLUP);
pinMode(SecondsButtonPin, INPUT_PULLUP);
pinMode(MilliSecondsButtonPin, INPUT_PULLUP);
pinMode(ResetButtonPin, INPUT_PULLUP);
pinMode(StartButtonPin, INPUT_PULLUP);
pinMode(GreenLEDPin, OUTPUT);
pinMode(RedLEDPin, OUTPUT);
reset();
}
void loop() {
if (digitalRead(StartButtonPin) == LOW && !timerStarted) {
startTime = millis();
display_minutes = set_minutes;
display_seconds = set_seconds;
display_milliseconds = set_milliseconds;
timerStarted = true;
}
if (digitalRead(ResetButtonPin) == LOW) {
reset();
}
if (digitalRead(MinutesButtonPin) == LOW) {
set_minutes = (set_minutes + 1) % 60;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(formatTime());
delay(200);
}
if (digitalRead(SecondsButtonPin) == LOW) {
set_seconds = (set_seconds + 1) % 60;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(formatTime());
delay(200);
}
if (digitalRead(MilliSecondsButtonPin) == LOW) {
set_milliseconds = (set_milliseconds + 1) % 100;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(formatTime());
delay(200);
}
if (timerStarted) {
unsigned long elapsed = millis() - startTime;
int elapsed_seconds = (int)(elapsed / 1000) % 60;
int elapsed_minutes = (int)(elapsed / (60 * 1000));
// ТУТ НАЧИНАЕТСЯ ОБРАТНЫЙ ОТСЧЕТ
int total_elapsed_seconds = (elapsed_minutes * 60 + elapsed_seconds);
int total_set_seconds = (set_minutes * 60 + set_seconds);
if (total_set_seconds - total_elapsed_seconds <= 1) {
timerStarted = false;
reset();
} else {
display_minutes = total_set_seconds - total_elapsed_seconds;
display_seconds = display_minutes % 60;
display_minutes = (display_minutes / 60) % 60;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(display_minutes);
lcd.print(":");
lcd.print(display_seconds);
lcd.print(":");
lcd.print(set_milliseconds);
// Обработка светодиодов
if (display_seconds % 10 == 0) {
digitalWrite(GreenLEDPin, HIGH);
} else {
digitalWrite(GreenLEDPin, LOW);
}
if (display_seconds % 5 == 0) {
digitalWrite(RedLEDPin, HIGH);
} else {
digitalWrite(RedLEDPin, LOW);
}
}
}
}
void reset() {
timerStarted = false;
set_minutes = 0;
set_seconds = 0;
set_milliseconds = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("00:00:00");
digitalWrite(GreenLEDPin, LOW);
digitalWrite(RedLEDPin, LOW);
}
String formatTime() {
String formattedTime = "";
formattedTime += (set_minutes < 10) ? "0" + String(set_minutes) : String(set_minutes);
formattedTime += ":";
formattedTime += (set_seconds < 10) ? "0" + String(set_seconds) : String(set_seconds);
formattedTime += ":";
formattedTime += (set_milliseconds < 10) ? "0" + String(set_milliseconds) : String(set_milliseconds);
return formattedTime;
}