Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Bouw een Arduino Real-Time Clock voor Islamitische Gebedstijden

Onderdelen en benodigdheden

Onderdeel Aantal
Arduino UNO 1
Nokia 5110 LCD display (84x48 pixels, monochroom) 1
DS1307 RTC module (Seeed Pi RTC) 1

Benodigde tools en machines

  • Premium Male/Male Jumper Wires, 40 x 3" (75mm)
  • Breadboard, 400 pins

Apps en online services

  • Arduino IDE

Over dit project

Dit project is een real-time klok die de Gregoriaanse datum en de dagelijkse islamitische gebedstijden weergeeft. De schakeling gebruikt een Arduino UNO, een DS1307 RTC en een Nokia 5110 LCD.

Componenten uitleg

Arduino UNO

De Arduino Uno is een open-source microcontrollerboard gebaseerd op de ATmega328P. Het beschikt over 14 digitale I/O-pins (6 PWM), 6 analoge ingangen, 16 MHz resonator, 32 KB Flash, 2 KB SRAM, 1 KB EEPROM, DC-jack en USB.

DS1307 Real-Time Clock

De DS1307 is een lage-verbruik, volledige BCD klok/kalender met seconden, minuten, uren, dag, datum, maand, jaar. Automatische correctie voor maandlengtes en schrikkeljaren. Werkt in 12- of 24-uurs formaat met AM/PM indicator. Ingebouwde stroomdetectie schakelt automatisch over op batterij bij stroomuitval.

Pinout DS1307:

  • VCC, GND: Voeding
  • SCL: Serieel kloksignaal (I2C)
  • SDA: Serieel data (I2C), open-drain, pull-up nodig
  • SQW/OUT: Vierkante golf uitgang (1Hz, 4kHz, 8kHz, 32kHz), open-drain
  • X1, X2: Aansluiting 32.768kHz kristal

Nokia 5110 LCD

Monochroom scherm 84x48 pixels met backlight, bestuurd via PCD8544 controller (SPI-achtig).

Pinout:

  • VCC, GND: Voeding
  • RST: Reset (actief laag)
  • CE: Chip Enable (actief laag)
  • D/C: Data/Command selectie
  • DIN: Serieel data in
  • CLK: Klok voor SPI
  • BL: Backlight regeling (PWM mogelijk op pins 3,5,6,9,10,11)

Programma aanpassen voor jouw locatie

Pas regel 161 in de code aan met de geografische coördinaten en twilight-hoeken van je stad:

calcPrayerTimes(year, month, dayOfMonth, longitude, latitude, timeZone, fajrTwilight, ishaTwilight, fajr, sunRise, zuhr, asr, maghrib, isha);

Benodigde parameters:

  • Lengtegraad / Breedtegraad / Tijdzone
  • Fajr Twilight / Isha Twilight (verschillen per land/berekeningsmethode)

Je kunt de coördinaten en hoeken opvragen via IslamicFinder. Voorbeeld voor Caïro:

  • Lengtegraad: 30.2
  • Breedtegraad: 30.0
  • Tijdzone: +2
  • Fajr Twilight: -19.5
  • Isha Twilight: -17.5

De aangepaste regel wordt dan:

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

De berekende tijden zijn double waarden en worden omgerekend naar uren/minuten met de functie doubleToHrMin (geschreven door Mahmoud Adly Ezzat).

Hoe het programma werkt

De functie calcPrayerTimes berekent de gebedstijden op basis van astronomische formules (zonstand, deklinatie, uurhoek, etc.). Het algoritme is afkomstig van Mahmoud Adly Ezzat.

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;

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(0); 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() {
  char *Day[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
  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();
  // Pas de parameters aan voor jouw locatie!
  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(); }
}

/* --- Gebedstijden berekening (Mahmoud Adly Ezzat) --- */
double degToRad(double d) { return (3.1415926/180)*d; }
double radToDeg(double r) { return r*(180/3.1415926); }
double moreLess360(double v) { while(v>360||v<0){ if(v>360)v-=360; else v+=360; } return v; }
double moreLess24(double v) { while(v>24||v<0){ if(v>24)v-=24; else 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 year, int month, int day, double lon, double lat, int tz, double fajrTw, double ishaTw,
  double &fajr, double &sunRise, double &zuhr, double &asr, double &maghrib, double &isha) {
  double D = 367*year - ((year+(int)((month+9)/12))*7/4) + ((int)(275*month/9)) + day - 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;

  zuhr = UT_Noon/15 + tz;
  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;
  asr = zuhr + Asr_Arc;
  sunRise = zuhr - Durinal_Arc/15;
  maghrib = zuhr + Durinal_Arc/15;
  double Esha_Arc = radToDeg(acos((sin(degToRad(ishaTw))-sin(degToRad(Dec))*sin(degToRad(lat)))/(cos(degToRad(Dec))*cos(degToRad(lat)))))/15;
  isha = zuhr + Esha_Arc;
  double Fajr_Arc = radToDeg(acos((sin(degToRad(fajrTw))-sin(degToRad(Dec))*sin(degToRad(lat)))/(cos(degToRad(Dec))*cos(degToRad(lat)))))/15;
  fajr = zuhr - Fajr_Arc;
}

Schema

Bouw een Arduino Real-Time Clock voor Islamitische Gebedstijden

Productieproces

  1. Arduino POV-klok: Bouw een Persistence-of-Vision LED-display
  2. Bouw een retro Numitron-klok met Arduino: Eenvoudig, betrouwbaar en energiezuinig
  3. DIY Arduino Woordklok – Bouw een Elegant Real-Time Display
  4. Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
  5. Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
  6. Arduino Temperatuurbewaking & Realtime Klok met 3.2" TFT-display
  7. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  8. Afbeeldingen Weergeven op een 1,17-inch TFT LCD met Arduino UNO
  9. Een draagbaar Persistence-of-Vision-display bouwen met Arduino UNO en ATtiny85
  10. Bouw een betrouwbare wekker met DS1302 RTC en Arduino UNO
  11. 25 kHz 4-pins PWM-ventilatorbesturing met Arduino Uno – Bouw, Code & Test