#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <SD.h>
// RTC
RTC_DS1307 rtc;
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pins
int buzzerPin = 26;
int chipSelect = 5;
// Prayer time variables
int fajrH, fajrM;
int dhuhrH, dhuhrM;
int asrH, asrM;
int maghribH, maghribM;
int ishaH, ishaM;
// Control flag
bool alreadyTriggered = false;
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
pinMode(buzzerPin, OUTPUT);
lcd.init();
lcd.backlight();
lcd.print("Initializing...");
delay(2000);
lcd.clear();
// RTC
if (!rtc.begin()) {
lcd.print("RTC ERROR");
while (1);
}
// SD Card
if (!SD.begin(chipSelect)) {
lcd.print("SD FAIL!");
while (1);
}
lcd.print("SD OK");
delay(1500);
lcd.clear();
readPrayerTimes();
}
void loop() {
DateTime now = rtc.now();
int h = now.hour();
int m = now.minute();
int s = now.second();
Serial.printf("Time: %02d:%02d:%02d\n", h, m, s);
// Display Time
lcd.setCursor(0, 0);
lcd.print("Time: ");
print2digits(h);
lcd.print(":");
print2digits(m);
lcd.print(":");
print2digits(s);
// Display Date
lcd.setCursor(0, 1);
lcd.print("Date: ");
print2digits(now.day());
lcd.print("/");
print2digits(now.month());
lcd.print("/");
lcd.print(now.year());
checkPrayer(h, m);
delay(1000);
}
// READ SD CARD
void readPrayerTimes() {
File file = SD.open("/wokwi.txt");
if (!file) {
Serial.println("Error opening file!");
lcd.print("File Error!");
return;
}
Serial.println("Reading prayer times...");
while (file.available()) {
String line = file.readStringUntil('\n');
line.trim();
int firstComma = line.indexOf(',');
int secondComma = line.indexOf(',', firstComma + 1);
String name = line.substring(0, firstComma);
int hour = line.substring(firstComma + 1, secondComma).toInt();
int minute = line.substring(secondComma + 1).toInt();
if (name == "Fajr") {
fajrH = hour; fajrM = minute;
} else if (name == "Dhuhr") {
dhuhrH = hour; dhuhrM = minute;
} else if (name == "Asr") {
asrH = hour; asrM = minute;
} else if (name == "Maghrib") {
maghribH = hour; maghribM = minute;
} else if (name == "Isha") {
ishaH = hour; ishaM = minute;
}
}
file.close();
Serial.println("> Prayer times loaded");
}
void checkPrayer(int h, int m) {
if (h == fajrH && m == fajrM) triggerAlarm("Fajr");
else if (h == dhuhrH && m == dhuhrM) triggerAlarm("Dhuhr");
else if (h == asrH && m == asrM) triggerAlarm("Asr");
else if (h == maghribH && m == maghribM) triggerAlarm("Maghrib");
else if (h == ishaH && m == ishaM) triggerAlarm("Isha");
}
void triggerAlarm(String prayer) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Prayer Time:");
lcd.setCursor(0,1);
lcd.print(prayer);
tone(buzzerPin, 1000);
delay(1000);
noTone(buzzerPin);
}
void print2digits(int number) {
if (number < 10) lcd.print("0");
lcd.print(number);
}