Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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

Apps und Online-Dienste

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:

Nokia 5110 LCD

84×48 Pixel monochrom mit Hintergrundbeleuchtung, PCD8544-Controller (SPI-ähnlich).

Pinbelegung:

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:

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

Arduino Echtzeituhr für islamische Gebetszeiten bauen

Herstellungsprozess

  1. Arduino POV-Uhr: Persistence-of-Vision LED-Display selbst bauen
  2. Retro-Numitron-Uhr mit Arduino bauen: Einfach, zuverlässig & energieeffizient
  3. DIY Arduino Word Clock – Elegante Wortuhr mit RTC & Schieberegistern
  4. Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
  5. Smartes Sparschwein: Münzprüfer mit Arduino Nano steuern
  6. Arduino Temperaturoverwachung & Echtzeituhr mit 3,2″ TFT-Display
  7. LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
  8. Bilder auf 1,17-Zoll-TFT-LCD mit Arduino UNO anzeigen
  9. Zuverlässigen Wecker mit DS1302 RTC und Arduino UNO bauen
  10. 25-kHz-4-Pin-PWM-Lüftersteuerung mit Arduino Uno – Bau, Code & Test