Arduino Echtzeituhr für islamische Gebetszeiten bauen
Komponenten und Zubehör
| Arduino UNO | ×1 |
| Nokia 5110 Display (84×48 Pixel, monochrom) | ×1 |
| DS1307 RTC Modul (Seeed Pi RTC) | ×1 |
Benötigte Werkzeuge
- Steckbrett (400 Pin)
- Jumper Kabel (Premium Male/Male, 40×3″)
Apps und Online-Dienste
- Arduino IDE
Projektbeschreibung
Dieses Projekt realisiert eine Echtzeituhr, die das gregorianische Datum und die täglichen islamischen Gebetszeiten anzeigt. Die Schaltung verwendet einen Arduino UNO, ein DS1307 RTC-Modul und ein Nokia 5110 LCD.
Bauteile im Detail
Arduino UNO
Open-Source-Mikrocontroller-Board basierend auf ATmega328P mit 14 Digitalpins (6 PWM), 6 Analogeingängen, 16 MHz, 32 KB Flash, 2 KB SRAM, 1 KB EEPROM.
DS1307 RTC
Serielle Echtzeituhr mit geringem Stromverbrauch, BCD-Format. Liefert Sekunden, Minuten, Stunden, Tag, Datum, Monat, Jahr. Automatische Monatsenden- und Schaltjahrkorrektur. 12/24-Stunden-Format mit AM/PM. Eingebaute Stromüberwachung mit Batterie-Backup.
Pinbelegung:
- VCC, GND: Stromversorgung
- SCL: Serieller Takteingang (I²C)
- SDA: Serielle Datenleitung (I²C, Open-Drain, Pull-Up nötig)
- SQW/OUT: Rechteckwellenausgang (1 Hz, 4/8/32 kHz)
- X1, X2: 32,768 kHz Quarzanschluss
Nokia 5110 LCD
84×48 Pixel monochrom mit Hintergrundbeleuchtung, PCD8544-Controller (SPI-ähnlich).
Pinbelegung:
- VCC, GND: Stromversorgung
- RST: Reset (Low-aktiv)
- CE: Chip Enable (Low-aktiv)
- D/C: Data/Command (High=Data, Low=Command)
- DIN: Serielle Daten (SPI)
- CLK: Takt (SPI)
- BL: Hintergrundbeleuchtung (PWM-fähig an Pins 3,5,6,9,10,11)
Programm anpassen
Zeile 161 im Code muss an den eigenen Standort angepasst werden:
calcPrayerTimes(year, month, dayOfMonth, 41.3, 20.6, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha);
Parameter: Längengrad, Breitengrad, Zeitzone, Fajr-Winkel, Isha-Winkel. Diese Werte erhält man z. B. über IslamicFinder.
Beispiel Kairo:
- Längengrad: 30.2
- Breitengrad: 30.0
- Zeitzone: +2
- Fajr-Winkel: -19.5
- Isha-Winkel: -17.5
calcPrayerTimes(year, month, dayOfMonth, 30.2, 30, 2, -19.5, -17.5, fajr, sunRise, zuhr, asr, maghrib, isha);
Die Funktion doubleToHrMin wandelt die berechneten Double-Werte in Stunden/Minuten um. Der Berechnungsalgorithmus stammt von Mahmoud Adly Ezzat.
Funktionsweise
Das Programm liest Datum/Zeit vom DS1307, berechnet die Gebetszeiten anhand astronomischer Formeln (Sonnenstand, Deklination, Stundenwinkel) und zeigt sie auf dem Display an. Die Anzeige wechselt zwischen Uhrzeit/Datum und den fünf Gebetszeiten (Fajr, Zuhr, Asr, Maghrib, Isha).
Code
#include "Wire.h"
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
#define DS1307_I2C_ADDRESS 0x68
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
double fajr, sunRise, zuhr, asr, maghrib, isha;
char *Day[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
// BCD-Konvertierung
byte decToBcd(byte val) { return (val/10*16) + (val%10); }
byte bcdToDec(byte val) { return (val/16*10) + (val%16); }
void getDateDs1307() {
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0x00); Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
second = bcdToDec(Wire.read() & 0x7f);
minute = bcdToDec(Wire.read());
hour = bcdToDec(Wire.read() & 0x3f);
dayOfWeek = bcdToDec(Wire.read());
dayOfMonth = bcdToDec(Wire.read());
month = bcdToDec(Wire.read());
year = bcdToDec(Wire.read());
}
void printTime() {
int hours, minutes;
display.clearDisplay();
display.setCursor(0, 16);
display.print(Day[dayOfWeek]); display.print(":");
display.print(dayOfMonth/10); display.print(dayOfMonth%10);
display.print("/"); display.print(month/10); display.print(month%10);
display.print("/20"); display.print(year/10); display.print(year%10);
display.setCursor(18, 26);
display.print(hour/10); display.print(hour%10); display.print(":");
display.print(minute/10); display.print(minute%10); display.print(":");
display.print(second/10); display.print(second%10);
display.display(); delay(1000);
doubleToHrMin(fajr, hours, minutes);
display.clearDisplay(); display.setCursor(1,1);
display.print("Fajr "); display.print(hours); display.print(":"); display.print(minutes); display.display();
doubleToHrMin(zuhr, hours, minutes);
display.setCursor(1,10); display.print("Zuhr "); display.print(hours); display.print(":"); display.print(minutes); display.display();
doubleToHrMin(asr, hours, minutes);
display.setCursor(1,20); display.print("Asr "); display.print(hours); display.print(":"); display.print(minutes); display.display();
doubleToHrMin(maghrib, hours, minutes);
display.setCursor(1,30); display.print("Maghrib "); display.print(hours); display.print(":"); display.print(minutes); display.display();
doubleToHrMin(isha, hours, minutes);
display.setCursor(1,40); display.print("Isha "); display.print(hours); display.print(":"); display.print(minutes); display.display();
delay(5000);
}
void setup() {
Wire.begin(); display.begin(); display.clearDisplay(); display.setContrast(25);
display.setTextColor(BLACK); display.setTextSize(1);
display.setCursor(22,18); display.print("Hatem"); display.display(); delay(500);
display.setCursor(24,28); display.print("ZEHIR"); display.display(); delay(500);
getDateDs1307();
}
void loop() {
getDateDs1307();
// Koordinaten für eigenen Ort anpassen!
calcPrayerTimes(year, month, dayOfMonth, 39.8, 21.4, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha);
static unsigned long prev = 0;
if (millis() - prev > 200) { prev = millis(); printTime(); }
}
// --- Gebetszeit-Berechnung (Mahmoud Adly Ezzat) ---
double degToRad(double d) { return d * 3.1415926 / 180; }
double radToDeg(double r) { return r * 180 / 3.1415926; }
double moreLess360(double v) { while(v>360||v<0) v>360?v-=360:v+=360; return v; }
double moreLess24(double v) { while(v>24||v<0) v>24?v-=24:v+=24; return v; }
void doubleToHrMin(double n, int &h, int &m) { h=floor(moreLess24(n)); m=floor((moreLess24(n)-h)*60); }
void calcPrayerTimes(int yr, int mo, int dy, double lon, double lat, int tz, double fajrTw, double ishaTw,
double &fajrT, double &sunRiseT, double &zuhrT, double &asrT, double &maghribT, double &ishaT) {
double D = 367*yr - ((yr+(int)((mo+9)/12))*7/4) + ((int)(275*mo/9)) + dy - 730531.5;
double L = moreLess360(280.461 + 0.9856474*D);
double M = moreLess360(357.528 + 0.9856003*D);
double Lambda = moreLess360(L + 1.915*sin(degToRad(M)) + 0.02*sin(degToRad(2*M)));
double Obliquity = 23.439 - 0.0000004*D;
double Alpha = moreLess360(radToDeg(atan(cos(degToRad(Obliquity))*tan(degToRad(Lambda)))));
Alpha = Alpha + 90*(floor(Lambda/90)-floor(Alpha/90));
double ST = 100.46 + 0.985647352*D;
double Dec = radToDeg(asin(sin(degToRad(Obliquity))*sin(degToRad(Lambda))));
double Durinal_Arc = radToDeg(acos((sin(degToRad(-0.8333))-sin(degToRad(Dec))*sin(degToRad(lat)))/(cos(degToRad(Dec))*cos(degToRad(lat)))));
double Noon = moreLess360(Alpha - ST);
double UT_Noon = Noon - lon;
zuhrT = UT_Noon/15 + tz; // Zuhr
double Asr_Alt = radToDeg(atan(1.7 + tan(degToRad(lat - Dec)))); // Hanafi
double Asr_Arc = radToDeg(acos((sin(degToRad(90-Asr_Alt))-sin(degToRad(Dec))*sin(degToRad(lat)))/(cos(degToRad(Dec))*cos(degToRad(lat)))))/15;
asrT = zuhrT + Asr_Arc; // Asr
sunRiseT = zuhrT - Durinal_Arc/15; // Shorouq
maghribT = zuhrT + Durinal_Arc/15; // Maghrib
double Esha_Arc = radToDeg(acos((sin(degToRad(ishaTw))-sin(degToRad(Dec))*sin(degToRad(lat)))/(cos(degToRad(Dec))*cos(degToRad(lat)))))/15;
ishaT = zuhrT + Esha_Arc; // Isha
double Fajr_Arc = radToDeg(acos((sin(degToRad(fajrTw))-sin(degToRad(Dec))*sin(degToRad(lat)))/(cos(degToRad(Dec))*cos(degToRad(lat)))))/15;
fajrT = zuhrT - Fajr_Arc; // Fajr
}
Schaltplan
Herstellungsprozess
- Arduino POV-Uhr: Persistence-of-Vision LED-Display selbst bauen
- Retro-Numitron-Uhr mit Arduino bauen: Einfach, zuverlässig & energieeffizient
- DIY Arduino Word Clock – Elegante Wortuhr mit RTC & Schieberegistern
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- Smartes Sparschwein: Münzprüfer mit Arduino Nano steuern
- Arduino Temperaturoverwachung & Echtzeituhr mit 3,2″ TFT-Display
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Bilder auf 1,17-Zoll-TFT-LCD mit Arduino UNO anzeigen
- Zuverlässigen Wecker mit DS1302 RTC und Arduino UNO bauen
- 25-kHz-4-Pin-PWM-Lüftersteuerung mit Arduino Uno – Bau, Code & Test