#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
RTC_DS1307 rtc;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// جدول الحصص العادي
const char* regularTimetable[5][8] = {
{"Arabic", "English", "French", "Maths", "Rel.", "Arabic", "P.E.", ""},
{"Arabic", "Arabic", "Science", "Science", "English", "Maths", "Social", "Social"},
{"Art", "Arabic", "Maths", "French", "English", "English", "ICT", "French"},
{"English", "English", "Arabic", "Arabic", "Rel.", "Maths", "Science", "Science"},
{"Social", "English", "English", "Arabic", "Arabic", "French", "Social", "Maths"}
};
// جدول رمضان
const char* ramadanTimetable[5][8] = {
{"Arabic", "English", "French", "Maths", "Rel.", "Arabic", "P.E.", ""},
{"Arabic", "Arabic", "Science", "Science", "English", "Maths", "Social", "Social"},
{"Art", "Arabic", "Maths", "French", "English", "English", "ICT", "French"},
{"English", "English", "Arabic", "Arabic", "Rel.", "Maths", "Science", "Science"},
{"Social", "English", "English", "Arabic", "Arabic", "French", "Social", "Maths"}
};
// مواعيد الحصص العادية بالدقائق
const int regularSessionStartTimes[8] = {480, 525, 570, 615, 660, 720, 760, 800}; // 8:00 - 1:20
const int regularSessionDurations[8] = {45, 45, 45, 45, 40, 40, 40, 40};
// مواعيد الحصص في رمضان بالدقائق
const int ramadanSessionStartTimes[8] = {480, 520, 560, 600, 640, 700, 730, 760}; // 8:00 - 12:40
const int ramadanSessionDurations[8] = {40, 40, 40, 40, 40, 30, 30, 35};
// مواعيد بداية ونهاية رمضان 2025
const DateTime ramadanStart(2025, 2, 28);
const DateTime ramadanEnd(2025, 3, 30);
void setup() {
Wire.begin();
rtc.begin();
if (!rtc.isrunning()) {
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // ضبط الوقت على وقت الكومبايل
rtc.adjust(DateTime(2025, 2, 28, 12, 36, 0)); // Year, Month, Day, Hour, Minute, Second
}
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop() {
display.clearDisplay();
// الحصول على الوقت الحالي
DateTime now = rtc.now();
int currentTimeInMinutes = now.hour() * 60 + now.minute(); // تحويل الوقت إلى دقائق منذ منتصف الليل
bool isRamadan = (now >= ramadanStart && now <= ramadanEnd);
// اختيار الجدول المناسب
const char* (*timetable)[8] = isRamadan ? ramadanTimetable : regularTimetable;
const int* sessionStartTimes = isRamadan ? ramadanSessionStartTimes : regularSessionStartTimes;
const int* sessionDurations = isRamadan ? ramadanSessionDurations : regularSessionDurations;
// عرض الوقت الحالي بصيغة 12 ساعة
int hour12 = now.hour() % 12;
hour12 = (hour12 == 0) ? 12 : hour12; // تحويل 0 إلى 12
char am_pm[] = "AM";
if (now.hour() >= 12) am_pm[0] = 'P';
char timeStr[9]; // "h:mm AM"
snprintf(timeStr, sizeof(timeStr), "%d:%02d %s", hour12, now.minute(), am_pm);
display.setTextSize(2);
int16_t x = (SCREEN_WIDTH - (strlen(timeStr) * 12)) / 2;
display.setCursor(x, 1);
display.print(timeStr);
// تحديد الحصة الحالية والوقت المتبقي
int dayOfWeek = now.dayOfTheWeek();
String sessionInfo = getCurrentSession(dayOfWeek, currentTimeInMinutes, timetable, sessionStartTimes, sessionDurations);
String remainingTime = getRemainingTime(dayOfWeek, currentTimeInMinutes, sessionStartTimes, sessionDurations);
display.setTextSize(1);
display.setCursor(0, 30);
display.print("Session: " + sessionInfo);
display.setCursor(0, 45);
display.print("Remaining: " + remainingTime);
display.display();
delay(1000);
}
// دالة تحديد الحصة الحالية
String getCurrentSession(int dayOfWeek, int currentTimeInMinutes, const char* (*timetable)[8], const int* sessionStartTimes, const int* sessionDurations) {
if (dayOfWeek >= 5) return "No session";
for (int i = 0; i < 8; i++) {
if (currentTimeInMinutes >= sessionStartTimes[i] && currentTimeInMinutes < sessionStartTimes[i] + sessionDurations[i]) {
return String(timetable[dayOfWeek][i]);
}
}
return "No session";
}
// دالة حساب الوقت المتبقي
String getRemainingTime(int dayOfWeek, int currentTimeInMinutes, const int* sessionStartTimes, const int* sessionDurations) {
if (dayOfWeek >= 5) return "No time";
for (int i = 0; i < 8; i++) {
if (currentTimeInMinutes >= sessionStartTimes[i] && currentTimeInMinutes < sessionStartTimes[i] + sessionDurations[i]) {
int remainingTime = sessionStartTimes[i] + sessionDurations[i] - currentTimeInMinutes;
return formatTime(remainingTime);
}
}
return "No time";
}
// دالة تنسيق الوقت المتبقي
String formatTime(int timeInMinutes) {
if (timeInMinutes < 60) {
return String(timeInMinutes) + "m";
} else {
int hours = timeInMinutes / 60;
int minutes = timeInMinutes % 60;
return String(hours) + "h:" + String(minutes) + "m";
}
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW
Loading
ssd1306
ssd1306