#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Встановлюємо адрес дисплея та розміри (16 символів на 2 рядки)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Визначення розмірів клавіатури
const byte ROWS = 4; // 4 рядки
const byte COLS = 3; // 3 стовпці
// Визначення символів на клавіатурі
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
// Піни, до яких підключена клавіатура
byte rowPins[ROWS] = {9, 8, 7, 6}; // Піни рядків
byte colPins[COLS] = {5, 4, 3}; // Піни стовпців
// Ініціалізація клавіатури
Keypad keypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
int relayPin = 10; // Пін для керування реле
int buzzerPin = 11; // Пін для п'єзо динаміка
unsigned long timerStart = 0; // Час початку відліку
int duration = 0; // Тривалість у хвилинах
unsigned long lastSecondUpdate = 0; // Останнє оновлення секунд
void setup() {
// Ініціалізація дисплея
lcd.init();
lcd.backlight();
// Ініціалізація пінів
pinMode(relayPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Встановлюємо реле у вимкнений стан
digitalWrite(relayPin, LOW);
// Відображення початкового повідомлення на дисплеї
lcd.setCursor(0, 0);
lcd.print("Set Timer:");
}
void loop() {
char key = keypad.getKey(); // Отримуємо натиснуту клавішу
// Якщо натиснута клавіша
if (key) {
// Якщо натиснуто '#', розпочинаємо відлік
if (key == '#') {
timerStart = millis();
lastSecondUpdate = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Timer: ");
lcd.print(duration);
lcd.print(" min");
digitalWrite(relayPin, HIGH); // Увімкнення реле
}
// Якщо натиснуто '*', скидаємо таймер
else if (key == '*') {
duration = 0;
timerStart = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Timer:");
}
// Якщо натиснуто цифру
else if (key >= '0' && key <= '9') {
int durationNew = duration * 10 + (key - '0');
if (durationNew <= 99 ) {
duration = durationNew;
}
lcd.setCursor(0, 1);
lcd.print(duration);
lcd.print(" min ");
}
}
// Перевірка завершення таймера
if (timerStart > 0 && (millis() - timerStart >= duration * 60000)) {
digitalWrite(relayPin, LOW); // Вимкнення реле
timerStart = 0;
// Звуковий сигнал про завершення відліку
for (int i = 0; i < 3; i++) {
tone(buzzerPin, 500, 500);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time's up!");
}
// Оновлення часу що залишився кожну секунду
if (timerStart > 0 && (millis() - lastSecondUpdate >= 1000)) {
unsigned long timeLeft = duration * 60000 - (millis() - timerStart);
int secondsLeft = (timeLeft / 1000) % 60;
int minutesLeft = (timeLeft / 60000);
lcd.setCursor(0, 1);
lcd.print("Left: ");
lcd.print(minutesLeft);
lcd.print("m ");
lcd.print(secondsLeft);
lcd.print("s ");
lastSecondUpdate = millis();
}
}