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

Arduino-Uhr mit islamischen Gebetszeiten

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
Nokia 5510-Display
× 1
Seeed Pi RTC (DS1307)
× 1

Notwendige Werkzeuge und Maschinen

Premium-Überbrückungsdrähte, männlich/männlich, 40 x 3" (75 mm .) )
Breadboard, 400 Pin

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Dies ist eine Echtzeituhr mit der Möglichkeit, das gregorianische Datum und die täglichen Gebetszeiten anzuzeigen. Für diese einfache Schaltung benötigen wir ein Arduino UNO (oder ein beliebiges Arduino-Board), ein RTC DS1307 und ein NOKIA 5110 LCD.

Sie können die Teile hier kaufen (Affiliate-Links):

  • Arduino UNO
  • DS1307
  • NOKIA 5110 LCD

Materialien

Arduino UNO

Das Arduino Uno ist ein Open-Source-Mikrocontroller-Board, das auf dem ATmega328P-Mikrocontroller basiert. Dieses Board ist mit Sätzen von analogen und digitalen GPIOs (General Purpose Input/Output) ausgestattet, die an verschiedene Sensoren, Aktoren, Erweiterungskarten und andere Schaltkreise angeschlossen werden können.

Das Arduino UNO hat:

  • 14 digitale Ein-/Ausgangspins (davon können 6 als PWM-Ausgänge verwendet werden)
  • 6 analoge Eingänge
  • 16 MHz Keramikresonator
  • 32 KB Flash-Speicher (0,5 KB vom Bootloader verwendet)
  • 2 KB SRAM
  • 1 KB EEPROM
  • Gleichstrombuchse und USB-Anschluss

DS1307

Die serielle Echtzeituhr (RTC) des DS1307 ist eine stromsparende, vollständig binär codierte Dezimaluhr (BCD) bzw. ein Kalender.

Die Uhr/der Kalender bietet Informationen zu Sekunden, Minuten, Stunden, Tag, Datum, Monat und Jahr. Das Monatsendedatum wird automatisch für Monate mit weniger als 31 Tagen angepasst, einschließlich Korrekturen für das Schaltjahr.

Der DS1307 arbeitet entweder im 24-Stunden- oder 12-Stunden-Format mit AM/PM-Anzeige. Es verfügt über eine eingebaute Power-Sense-Schaltung, die Stromausfälle erkennt und automatisch auf die Batterieversorgung umschaltet.

Pin-Funktion des DS1307

  • VCC, GND: Über diese Pins wird das Gerät mit Gleichstrom versorgt.
  • SCL (Serieller Takteingang): verwendet, um die Datenbewegung auf der seriellen Schnittstelle zu synchronisieren.
  • SDA (Serielle Dateneingabe/-ausgabe): SDA ist der Ein-/Ausgangspin für die serielle 2-Draht-Schnittstelle. Der SDA-Pin ist ein Open-Drain, der einen externen Pullup-Widerstand erfordert.
  • SQW/OUT (Square Wave/Output Driver): Wenn aktiviert, wird das SQWE-Bit auf 1 gesetzt, der SQW/OUT-Pin gibt eine von vier Rechteckwellenfrequenzen aus (1 Hz, 4 kHz, 8 kHz, 32 kHz). Der SQW/OUT-Pin ist ein Open-Drain und erfordert einen externen Pull-Up-Widerstand. Es funktioniert mit entweder Vcc oder Vbat angewendet.
  • X1, X2: Anschlüsse für einen Standard 32,768kHz Quarzkristall. Die interne Oszillatorschaltung ist für den Betrieb mit einem Quarz mit einer spezifizierten Lastkapazität von 12,5 pF ausgelegt.

NOKIA 5110 LCD

Das Nokia 5110 LCD ist ein monochromer Bildschirm mit 84*48 Pixeln, der mit einer Hintergrundbeleuchtung ausgestattet ist und zum Zeichnen von Text, Grafiken oder Bildern verwendet werden kann. Das LCD verwendet den PCD8544-Controller (derselbe wie beim Nokia 3310 LCD), dieser Controller ist über eine serielle Busschnittstelle ähnlich SPI mit Mikrocontrollern verbunden.

Nokia 5110 LCD-Pinbelegung

  • VCC, GND: Über diese Pins wird das Gerät mit Gleichstrom versorgt.
  • RST: es setzt die Anzeige zurück. Es ist ein aktiver Low-Pin. Sie können diesen Pin auch mit dem Arduino-Reset verbinden, damit der Bildschirm automatisch zurückgesetzt wird.
  • CE (Chip aktivieren): ein aktiver Low-Pin, hilft es, eines von vielen verbundenen Geräten auszuwählen, die denselben SPI-Bus teilen.
  • D/C (Daten/Befehl): es teilt dem Display mit, ob es Daten empfängt oder anzeigt. Das HIGH-Signal ist für Daten und das LOW-Signal für Befehle.
  • DIN: Es ist ein serieller Daten-Pin für die SPI-Schnittstelle, er sendet die Daten vom Mikrocontroller an das LCD.
  • CLK (Uhr): das LCD und der Mikrocontroller benötigen aufgrund ihrer SPI-Kommunikation einen gemeinsamen Taktgeber. dieser Pin wird dazu beitragen, es zu schaffen.
  • BL (Hintergrundbeleuchtung): es steuert die Hintergrundbeleuchtung des Displays. Sie können die Helligkeit steuern, indem Sie ein Potentiometer hinzufügen oder an einen PWM-fähigen Arduino-Pin anschließen (Pin # 3, 5, 6, 9, 10 und 11).

Wie bearbeitet man das Programm?

Sie sollten Zeile 161 des Codes anpassen:

calcPrayerTimes(year, month, dayOfMonth, 41.3, 20.6, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha); 

Die benötigten Parameter sind:

  • Längengrad/Breitengrad/Zeitzone des gewünschten Ortes.
  • Fajr Twilight/ Esha Twilight unterscheiden sich in den Berechnungen von Land zu Land.

Sie können auch die geografischen Koordinaten Ihrer Stadt wie Breiten- und Längengrad abrufen, die das Programm benötigt, um die Gebetszeiten zu berechnen, indem Sie die IslamicFinder-Website besuchen und dann nach Ihrer Stadt suchen.

Wie wir im Bild oben bemerken, erschienen, nachdem ich nach der Stadt Kairo gesucht hatte, neben einigen Informationen auch Gebetszeiten. Was für uns zählt, sind Breitengrad, Längengrad, Isha-Winkel und Fajr-Winkel. Sie werden diese Zahlen im Programm an Ihre Stadt anpassen.

Wie funktioniert das Programm?

Die Funktion verwendet die Daten von Jahr/Monat/Tag/Längengrad/Breitengrad/Zeitzone/FajrTwilight/IshaTwilight plus 6 Verweise auf Doppelvariablen (Fajr/SunRise/Zuhr/Asr/Maghrib/Isha). Diese 6 Variablen sind diejenigen, in die Daten zurückgegeben werden. Es gibt auch einige Funktionen, die bei einigen Zahlenumrechnungen helfen (z. B. Radiant in Grad und umgekehrt).

Wenn wir Kairo als Beispiel nehmen:

  • Längengrad:30,2
  • Breitengrad:30
  • Zeitzone:+2
  • Fajr Twilight:-19,5
  • Esha Twilight:-17,5

Wir sollten Zeile 161 wie folgt anpassen:

calcPrayerTimes(year, month, dayOfMonth, 30.2, 30, 2, -19.5, -17.5, fajr, sunRise, zuhr, asr, maghrib, isha); 

Beachten Sie, dass diese Gebetszeiten immer noch "doppelt" sind und in ein Zeitformat umgewandelt werden sollten. Mahmoud Adly Ezzat hat die Funktion doubleToHrMin erstellt (Sie finden sie vor der Funktion calcPrayerTimes), die die Zahl in Stunden und Minuten aufteilt. Es benötigt die doppelte und zwei Referenzen auf int-Variablen.

Vergiss nicht, einen Daumen nach oben zu ziehen, wenn du es nützlich findest.

PS: Der Berechnungsalgorithmus für die Gebetszeit wurde von Mahmoud Adly Ezzat geschrieben. Du kannst mehr darüber in seinem Blogbeitrag lesen.

Code

  • Arduino-Uhr mit islamischen Gebetszeiten
Arduino-Uhr mit islamischen GebetszeitenArduino
- Gebetszeit auf dem Display des Nokia 5510/3310 von Hatem Zehir
- Die Berechnung der Gebetszeit stammt von http://3adly.blogspot.com/2010/07/prayer-times-calculations-pure-c-code.html
#include "Wire.h"#include  #include Adafruit_PCD8544 display =Adafruit_PCD8544(7, 6, 5, 4, 3);int xegg, yegg;#define DS1307_I2C_ADDRESS 0x68 // Dies ist die I2C-Adresselong previousMillis =0; // speichert das letzte Mal, wann die Zeit aktualisiert wurde Byte Sekunde, Minute, Stunde, dayOfWeek, dayOfMonth, month, year;long interval =200;int displayx, displayy, displayradius, x2, y2, x3, y3;int zero =0;char * Day[] ={"", "Sun", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};double fajr, sunRise, zuhr, asr, maghrib, isha; // Konvertieren Sie normale Dezimalzahlen in binär kodierte Dezimalzahlen decToBcd(byte val){ return ( (val / 10 * 16) + (val % 10) );}// Konvertieren binär kodierte Dezimalzahlen in normale Dezimalzahlenbyte bcdToDec(byte val){ return ( (val / 16 * 10) + (val % 16) );}// Ruft Datum und Uhrzeit von ds1307 ab und gibt resultvoid aus getDateDs1307(){ // Zurücksetzen des Registerzeigers Wire.beginTransmission(DS1307_I2C_ADDRESS); //Wire.write (0x00); Wire.write (null); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); zweite =bcdToDec(Wire.read() &0x7f); Minute =bcdToDec(Wire.read()); Stunde =bcdToDec(Wire.read() &0x3f); dayOfWeek =bcdToDec(Wire.read()); dayOfMonth =bcdToDec(Wire.read()); Monat =bcdToDec(Wire.read()); Jahr =bcdToDec(Wire.read());}void setDateDs1307(){ Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write (null); Wire.write (decToBcd (zweite)); // 0 bis Bit 7 startet die Uhr Wire.write (decToBcd (minute)); Wire.write (decToBcd (Stunde)); // für 12 Stunden am/pm muss Bit 6 gesetzt werden (auch readDateDs1307) muss geändert werden Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (Monat)); Wire.write (decToBcd (Jahr)); Wire.endTransmission();}void printTime(){ int Stunden, Minuten; Zeichen s[12]; display.clearDisplay(); display.setCursor(0, 16); display.print (Tag [Tag der Woche]); display.print(":"); display.print(char(dayOfMonth/10 + 0x30)); display.print(char(dayOfMonth % 10 + 0x30)); display.print("/"); display.print (char(Monat / 10 + 0x30)); display.print(char(Monat % 10 + 0x30)); display.print("/"); display.print("20"); display.print (char(Jahr / 10 + 0x30)); display.print(char(Jahr % 10 + 0x30)); display.setCursor(18, 26); display.print (char (Stunde / 10 + 0x30)); display.print ( char ( Stunde % 10 + 0x30 ) ); display.print(":"); display.print ( char (Minute / 10 + 0x30)); display.print( char(Minute % 10 + 0x30)); display.print(":"); display.print (char (Sekunde / 10 + 0x30)); display.print(char (zweite % 10 + 0x30)); display.display(); Verzögerung (1000); doubleToHrMin(fajr, Stunden, Minuten); display.clearDisplay(); display.setCursor(1, 1); display.print("Fajr"); display.print (Stunden); display.print(":"); display.print (Minuten); display.display(); doubleToHrMin(zur, Stunden, Minuten); display.setCursor(1, 10); display.print("Zuhr"); display.print (Stunden); display.print(":"); display.print (Minuten); display.display(); doubleToHrMin(asr, Stunden, Minuten); display.setCursor(1, 20); display.print("Asr"); display.print (Stunden); display.print(":"); display.print (Minuten); display.display(); doubleToHrMin(maghrib, Stunden, Minuten); display.setCursor(1, 30); display.print("Maghrib"); display.print (Stunden); display.print(":"); display.print (Minuten); display.display(); doubleToHrMin(isha, Stunden, Minuten); display.setCursor(1, 40); display.print("Isha"); display.print (Stunden); display.print(":"); display.print (Minuten); display.display(); delay(5000);}void setup() { Wire.begin(); display.begin(); display.clearDisplay(); display.setContrast(25); xegg =(display.width()) / 2; yegg =(display.height()) / 2; display.setTextColor (SCHWARZ); display.setTextSize(1); display.setCursor(22, 18); display.print("Hatem"); display.display(); Verzögerung (500); display.setCursor(24, 28); display.print("ZEHIR"); display.display(); Verzögerung (500); getDateDs1307();}void loop() { getDateDs1307(); calcPrayerTimes(year, month, dayOfMonth, 39.8, 21.4, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha); // Jahr, Monat, Tag, Längengrad, Breitengrad, Zeitzone, Fajr Twilight, Esha Twilight unsigned long currentMillis =millis(); if (currentMillis - previousMillis> Intervall) { previousMillis =currentMillis; //getDateDs1307(); printTime(); }}/*---------------------------------------------------------- ---------------------------------------* /// GEBETSZEIT (von Mahmoud Adly Ezzat , Kairo). } // Stellen Sie sicher, dass ein Wert zwischen 0 und 360 liegtdouble moreLess360(double value){ while (value> 360 || value <0) { if (value> 360) value -=360; sonst if (Wert <0) Wert +=360; } Rückgabewert;} // Stellen Sie sicher, dass ein Wert zwischen 0 und 24 liegtdouble moreLess24(double value){ while (value> 24 || value <0) { if (value> 24) value -=24; sonst if (Wert <0) Wert +=24; } Rückgabewert;} // Konvertieren der Double-Zahl in Stunden und Minutenvoid doubleToHrMin(double number, int &hours, int &minutes){ hours =floor(moreLess24(number)); minuten =floor(moreLess24(number - hours) * 60);}void calcPrayerTimes(int year, int month, int day, double longitude, double latitude, int timeZone, double fajrTwilight, double ishaTwilight, double &fajrTime, double &sunRiseTime, double &zuhrTime , double &asrTime, double &maghribTime, double &ishaTime){ double D =(367 * Jahr) - ((Jahr + (int)((Monat + 9) / 12)) * 7 / 4) + (((int)(275 .) * Monat / 9)) + Tag - 730531,5); doppeltes L =280.461 + 0.9856474 * D; L =mehrWeniger360(L); doppeltes M =357,528 + (0,9856003) * D; M =mehrWeniger360(M); doppeltes Lambda =L + 1,915 * sin(degToRad(M)) + 0,02 * sin(degToRad(2 * M)); Lambda =moreLess360(Lambda); doppelte Schiefe =23,439 - 0,000004 * D; doppeltes Alpha =radToDeg(atan((cos(degToRad(Obliquity)) * tan(degToRad(Lambda))))); Alpha =moreLess360(Alpha); Alpha =Alpha - (360 * (int) (Alpha / 360)); Alpha =Alpha + 90 * (Boden (Lambda / 90) - Boden (Alpha / 90)); Doppel-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(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)) ))); doppelter Mittag =Alpha - ST; Mittag =moreLess360 (Mittag); double UT_Noon =Mittag - Längengrad; ///////////////////////////////////////////// Berechnung der Gebetszeiten Bögen &Zeiten // ///////////////////////////////////////// // 2) Zuhr Time [Lokaler Mittag] zuhrTime =UT_Noon / 15 + timeZone; // Asr Hanafi //double Asr_Alt =radToDeg(atan(2+tan(degToRad(latitude - Dec)))); double Asr_Alt =radToDeg(atan(1.7 + tan(degToRad(Breite - Dez)))); // Asr Shafii //double Asr_Alt =radToDeg(atan(1 + tan(degToRad(latitude - Dec)))); double Asr_Arc =radToDeg(acos((sin(degToRad(90 - Asr_Alt)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude) )))); Asr_Arc =Asr_Arc / 15; // 3) Asr-Zeit asrTime =zuhrTime + Asr_Arc; // 1) Shorouq Time sunRiseTime =zuhrTime - (Durinal_Arc / 15); // 4) Maghrib-Zeit maghribTime =zuhrTime + (Durinal_Arc / 15); double Esha_Arc =radToDeg(acos((sin(degToRad(ishaTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude))) )); // 5) Isha Time ishaTime =zuhrTime + (Esha_Arc / 15); // 0) Fajr Time double Fajr_Arc =radToDeg(acos((sin(degToRad(fajrTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos( degToRad(Breite))))); fajrTime =zuhrTime - (Fajr_Arc / 15); zurück;}

Schaltpläne


Herstellungsprozess

  1. Arduino-Pov-Vision-Uhr
  2. DIY einfachste IV9 Numitron-Uhr mit Arduino
  3. Einfache Wordclock (Arduino)
  4. Hauptuhr
  5. Münzprüfer mit Arduino steuern
  6. Arduino-Temp. Monitor und Echtzeituhr mit 3.2 Display
  7. Arduino mit Bluetooth zur Steuerung einer LED!
  8. Anzeige eines Bildes auf einem LCD-TFT-Bildschirm mit Arduino UNO!
  9. Einfacher Wecker mit DS1302 RTC
  10. 25-kHz-4-Pin-PWM-Lüftersteuerung mit Arduino Uno