Horloge Arduino temps réel pour les heures de prière islamiques
Composants et fournitures
- Arduino UNO (×1)
- Écran Nokia 5110 (×1)
- Module RTC Seeed Pi (DS1307) (×1)
Outils nécessaires
- Fils de connexion mâle/mâle premium, 40 × 3″ (75 mm)
- Plaque d'essai 400 points
Applications et services en ligne
- Arduino IDE
À propos du projet
Cette horloge temps réel affiche la date grégorienne et les heures de prière quotidiennes. Le circuit simple utilise un Arduino UNO (ou tout autre modèle), un module RTC DS1307 et un écran LCD Nokia 5110.
Matériel
Arduino UNO
Carte microcontrôleur open-source basée sur l'ATmega328P, dotée de 14 entrées/sorties numériques (6 PWM), 6 entrées analogiques, 16 MHz, 32 Ko Flash, 2 Ko SRAM, 1 Ko EEPROM, prise d'alimentation DC et port USB.
DS1307
Horloge temps réel (RTC) série à faible consommation, codage BCD. Fournit secondes, minutes, heures, jour, date, mois, année avec ajustement automatique des fins de mois et années bissextiles. Fonctionne en format 12 h ou 24 h avec indicateur AM/PM. Détecte les coupures d'alimentation et bascule automatiquement sur la batterie de secours.
Broches : VCC, GND, SCL (horloge série), SDA (données série, drain ouvert, résistance de pull-up externe), SQW/OUT (onde carrée configurable), X1/X2 (quartz 32,768 kHz).
Écran LCD Nokia 5110
Écran monochrome 84×48 pixels avec rétroéclairage, contrôleur PCD8544 (identique au Nokia 3310), interface série type SPI.
Brochage : VCC, GND, RST (reset actif bas), CE (activation puce actif bas), D/C (données/commande), DIN (données série), CLK (horloge), BL (rétroéclairage, pilotable par PWM sur broches 3,5,6,9,10,11).
Comment adapter le programme
Modifiez la ligne 161 du code :
calcPrayerTimes(year, month, dayOfMonth, 41.3, 20.6, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha);
Les paramètres requis :
- Longitude / Latitude / Fuseau horaire du lieu souhaité.
- Angles de crépuscule pour Fajr et Icha (varient selon les pays).
Obtenez les coordonnées géographiques de votre ville via le site IslamicFinder (latitude, longitude, angle Icha, angle Fajr) et remplacez les valeurs dans le programme.
Exemple pour Le Caire :
calcPrayerTimes(year, month, dayOfMonth, 30.2, 30, 2, -19.5, -17.5, fajr, sunRise, zuhr, asr, maghrib, isha);
Les heures de prière sont retournées sous forme double ; la fonction doubleToHrMin (fourni) les convertit en heures/minutes.
N'oubliez pas de laisser un pouce en l'air si vous trouvez cela utile.
Note : L'algorithme de calcul des heures de prière est de Mahmoud Adly Ezzat (voir son blog).
Fonctionnement du programme
La fonction prend l'année/mois/jour, longitude, latitude, fuseau horaire, angles de crépuscule Fajr/Icha et 6 références vers des variables double (Fajr, Lever du soleil, Dohr, Asr, Maghrib, Icha). Des fonctions utilitaires effectuent conversions degrés/radians et normalisation 0-360° / 0-24 h.
Code
#include "Wire.h"
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
int xegg, yegg;
#define DS1307_I2C_ADDRESS 0x68
long previousMillis = 0;
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
long interval = 200;
int displayx, displayy, displayradius, x2, y2, x3, y3;
int zero = 0;
char *Day[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
double fajr, sunRise, zuhr, asr, maghrib, isha;
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(zero);
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 setDateDs1307() {
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(zero);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void printTime() {
int hours, minutes;
char s[12];
display.clearDisplay();
display.setCursor(0, 16);
display.print(Day[dayOfWeek]);
display.print(":");
display.print(char(dayOfMonth / 10 + 0x30));
display.print(char(dayOfMonth % 10 + 0x30));
display.print("/");
display.print(char(month / 10 + 0x30));
display.print(char(month % 10 + 0x30));
display.print("/");
display.print("20");
display.print(char(year / 10 + 0x30));
display.print(char(year % 10 + 0x30));
display.setCursor(18, 26);
display.print(char(hour / 10 + 0x30));
display.print(char(hour % 10 + 0x30));
display.print(":");
display.print(char(minute / 10 + 0x30));
display.print(char(minute % 10 + 0x30));
display.print(":");
display.print(char(second / 10 + 0x30));
display.print(char(second % 10 + 0x30));
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);
xegg = (display.width()) / 2;
yegg = (display.height()) / 2;
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();
calcPrayerTimes(year, month, dayOfMonth, 39.8, 21.4, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
printTime();
}
}
/*-------------------------------------------------------------------------------------*/
// CALCUL DES HEURES DE PRIÈRE (par Mahmoud Adly Ezzat, Le Caire)
double degToRad(double degree) { return ((3.1415926 / 180) * degree); }
double radToDeg(double radian) { return (radian * (180 / 3.1415926)); }
double moreLess360(double value) {
while (value > 360 || value < 0) {
if (value > 360) value -= 360;
else if (value < 0) value += 360;
}
return value;
}
double moreLess24(double value) {
while (value > 24 || value < 0) {
if (value > 24) value -= 24;
else if (value < 0) value += 24;
}
return value;
}
void doubleToHrMin(double number, int &hours, int &minutes) {
hours = floor(moreLess24(number));
minutes = 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 * year) - ((year + (int)((month + 9) / 12)) * 7 / 4) + (((int)(275 * month / 9)) + day - 730531.5);
double L = 280.461 + 0.9856474 * D; L = moreLess360(L);
double M = 357.528 + (0.9856003) * D; M = moreLess360(M);
double Lambda = L + 1.915 * sin(degToRad(M)) + 0.02 * sin(degToRad(2 * M)); Lambda = moreLess360(Lambda);
double Obliquity = 23.439 - 0.0000004 * D;
double Alpha = radToDeg(atan((cos(degToRad(Obliquity)) * tan(degToRad(Lambda))))); Alpha = moreLess360(Alpha);
Alpha = Alpha - (360 * (int)(Alpha / 360));
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(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))));
double Noon = Alpha - ST; Noon = moreLess360(Noon);
double UT_Noon = Noon - longitude;
// Calcul des heures de prière
zuhrTime = UT_Noon / 15 + timeZone; // Dohr
double Asr_Alt = radToDeg(atan(1.7 + tan(degToRad(latitude - Dec)))); // Asr Hanafi
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;
asrTime = zuhrTime + Asr_Arc; // Asr
sunRiseTime = zuhrTime - (Durinal_Arc / 15); // Chrouq
maghribTime = zuhrTime + (Durinal_Arc / 15); // Maghrib
double Esha_Arc = radToDeg(acos((sin(degToRad(ishaTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))));
ishaTime = zuhrTime + (Esha_Arc / 15); // Icha
double Fajr_Arc = radToDeg(acos((sin(degToRad(fajrTwilight)) - sin(degToRad(Dec)) * sin(degToRad(latitude))) / (cos(degToRad(Dec)) * cos(degToRad(latitude)))));
fajrTime = zuhrTime - (Fajr_Arc / 15); // Fajr
}
Schéma de câblage
Schéma de connexion (image non incluse).
Processus de fabrication
- Horloge POV Arduino : Construire un affichage LED à persistance rétinienne
- Construire une horloge Numitron rétro avec Arduino : simple, fiable et économe en énergie
- Horloge à Mots DIY Arduino – Afficheur Temps Réel Élégant et Personnalisable
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Construire un Réveil Fiable avec RTC DS1302 et Arduino UNO
- Contrôle de ventilateur PWM 4 broches 25 kHz avec Arduino Uno – Construction, code et test