#include <LiquidCrystal_I2C.h> // Knižnica pre LCD displej
// Priradenie pinov
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int Buzzer = 6;
const int TimeUp = 2; // Tlačidlo 1 v pine 2
const int TimeDown = 3; // Tlačidlo 2 v pine 3
const int SettingValue = 4; // Tlačidlo 3 a 4 v pine 4
const int ModeSwitch = 5; // Tlačidlo 4 v pine 5
// Vytvorenie premenných
int hours = 0;
int minutes = 0;
int seconds = 0;
int alarmHours = 0;
int alarmMinutes = 0;
int alarmSeconds = 0; // Nastavenie času budíka na 0
int Mode = 1;
int settingValue = 0;
bool SettingTime = false;
bool SettingTimeUp = false;
bool SettingTimeDown = false;
bool alarmIsActive = false;
// Počiatočná inicilizácia
void setup() {
pinMode(TimeUp, INPUT_PULLUP);
pinMode(TimeDown, INPUT_PULLUP);
pinMode(SettingValue, INPUT_PULLUP);
pinMode(ModeSwitch, INPUT_PULLUP);
pinMode(Buzzer, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print("Time");
}
void loop() {
UpdateTime(); // Aktualizácia času
// Nastavenie času nahor
if (digitalRead(TimeUp) == LOW || SettingTimeUp) {
SettingTime = true;
if (Mode == 1) // v prípade nastavenia hodín:
{
if (settingValue == 0) {
hours++;
if (hours >= 24) {
lcd.clear();
lcd.print("Time");
lcd.setCursor(0,1);
hours = 0;
}
} else if (settingValue == 1) {
minutes++;
if (minutes >= 60) {
lcd.clear();
lcd.print("Time");
lcd.setCursor(0,1);
minutes = 0;
}
}
}
else if (Mode == 2) // v prípade nastavenia budíka
{
if (settingValue == 0) {
SettingTime = false;
alarmHours++;
if (alarmHours >= 24) {
lcd.clear();
lcd.print("Alarm");
lcd.setCursor(0,1);
alarmHours = 0;
}
} else if (settingValue == 1) {
SettingTime = false;
alarmMinutes++;
if (alarmMinutes >= 60) {
lcd.clear();
lcd.print("Alarm");
lcd.setCursor(0,1);
alarmMinutes = 0;
}
}
}
DisplayTime();
delay(200); // Malé oneskorenie pre stabilné čítanie tlačidla
SettingTime = false; // Resetovanie premenných
SettingTimeUp = false;
}
// Nastavenie času nadol
if (digitalRead(TimeDown) == LOW || SettingTimeDown) {
if (Mode == 1) // v prípade nastavenia hodín:
{
if (settingValue == 0) {
hours--;
if (hours < 0) {
lcd.clear();
lcd.print("Time");
lcd.setCursor(0,1);
hours = 23;
}
} else if (settingValue == 1) {
minutes--;
if (minutes < 0) {
lcd.clear();
lcd.print("Time");
lcd.setCursor(0,1);
minutes = 59;
}
}
}
else if (Mode == 2) // v prípade nastavenia budíka:
{
if (settingValue == 0) {
SettingTime = false;
alarmHours--;
if (alarmHours < 0) {
lcd.clear();
lcd.print("Alarm");
lcd.setCursor(0,1);
alarmHours = 23;
}
} else if (settingValue == 1) {
SettingTime = false;
alarmMinutes--;
if (alarmMinutes < 0) {
lcd.clear();
lcd.print("Alarm");
lcd.setCursor(0,1);
alarmMinutes = 59;
}
}
}
DisplayTime();
delay(200); // Malé oneskorenie pre stabilné čítanie tlačidla
SettingTime = false; // Resetovanie premenných
SettingTimeDown = false;
}
if (digitalRead(SettingValue) == LOW && !SettingTime) // Prepínanie medzi nastavením hodín a minút
{
settingValue++;
if (settingValue > 1) {
settingValue = 0;
}
if (settingValue == 0) {
lcd.clear();
lcd.print("Set Hours");
delay(500);
lcd.clear();
}
else if (settingValue == 1)
{
lcd.clear();
lcd.print("Set Minutes");
delay(500);
lcd.clear();
}
if(Mode == 1)
{
lcd.print("Time");
DisplayTime();
}
else if(Mode == 2)
{
lcd.print("Alarm");
DisplayTime();
}
delay(200); // Malé oneskorenie pre stabilné čítanie tlačidla
}
// Prepínanie režimov
if (digitalRead(ModeSwitch) == LOW && !alarmIsActive) // Prepínanie medzi režimami hodín a budíka
{
Mode++;
if(Mode > 2)
{
Mode = 1;
}
if(Mode == 1)
{
lcd.clear();
lcd.print("Time");
lcd.setCursor(0,1);
DisplayTime();
}
else if(Mode == 2)
{
lcd.clear();
lcd.print("Alarm");
lcd.setCursor(0,1);
DisplayTime();
}
}
else if (digitalRead(ModeSwitch) == HIGH)
{
alarmIsActive = false;
}
// Kontrola alarmu
if (hours == alarmHours && minutes == alarmMinutes && seconds == alarmSeconds) {
Alarm();
}
// Aktualizácia bzučiaka
if (alarmIsActive) {
tone(Buzzer, 2000, 1000); // Zapnutie bzučiaka s frekvenciou 2000Hz a dĺžkou 1000ms
} else {
noTone(Buzzer); // Vypnutie bzučiaka
}
}
// Aktualizácia času
void UpdateTime()
{
if (!SettingTime)
{
// Kontrola stlačenia tlačidla TimeUp aj po uplynutí jednej sekundy
if (digitalRead(TimeUp) == LOW) {
SettingTime = true;
SettingTimeUp = true;
}
if(digitalRead(TimeDown) == LOW)
{
SettingTime = true;
SettingTimeDown = true;
}
}
if (!SettingTime) {
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
if (minutes >= 60) {
minutes = 0;
hours++;
if (hours >= 24) {
hours = 0;
}
}
}
DisplayTime();
delay(1000); // Každú sekundu
}
}
// Zobrazenie času v oboch režimoch hodín a budíka
void DisplayTime()
{
if(Mode == 1)
{
lcd.setCursor(0,1);
lcd.print(hours < 10 ? "0" : ""); // Zabezpečuje zobrazenie hodín formáte 00:00:00, ak je premenná jednociferná, pridá pred tú premennú cifru 0 aby sa dodržal formát
lcd.print(hours);
lcd.print(":");
lcd.print(minutes < 10 ? "0" : "");
lcd.print(minutes);
lcd.print(":");
lcd.print(seconds < 10 ? "0" : "");
lcd.print(seconds);
}
else if(Mode == 2)
{
lcd.setCursor(0,1);
lcd.print(alarmHours < 10 ? "0" : ""); // Zabezpečuje zobrazenie hodín formáte 00:00:00, ak je premenná jednociferná, pridá pred tú premennú cifru 0 aby sa dodržal formát
lcd.print(alarmHours);
lcd.print(":");
lcd.print(alarmMinutes < 10 ? "0" : "");
lcd.print(alarmMinutes);
lcd.print(":");
lcd.print(alarmSeconds < 10 ? "0" : "");
lcd.print(alarmSeconds);
}
}
// Funkcia pre zapnutie alarmu
void Alarm() {
tone(Buzzer, 2000, 1000);
delay(500);
lcd.clear();
lcd.print("ALARM IS ON");
alarmIsActive = true;
}