Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Horloge Arduino temps réel pour les heures de prière islamiques

Composants et fournitures

Outils nécessaires

Applications et services en ligne

À 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 :

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

  1. Horloge POV Arduino : Construire un affichage LED à persistance rétinienne
  2. Construire une horloge Numitron rétro avec Arduino : simple, fiable et économe en énergie
  3. Horloge à Mots DIY Arduino – Afficheur Temps Réel Élégant et Personnalisable
  4. Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
  5. Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
  6. Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
  7. Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
  8. Construire un Réveil Fiable avec RTC DS1302 et Arduino UNO
  9. Contrôle de ventilateur PWM 4 broches 25 kHz avec Arduino Uno – Construction, code et test