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

Arduino klok met islamitische gebedstijden

Componenten en benodigdheden

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

Benodigde gereedschappen en machines

Premium mannelijke/mannelijke verbindingsdraden, 40 x 3" (75 mm) )
Broodplank, 400 pins

Apps en online services

Arduino IDE

Over dit project

Dit is een realtime klok met de mogelijkheid om de Gregoriaanse datum en dagelijkse gebedstijden weer te geven. Voor dit eenvoudige circuit hebben we een Arduino UNO (of een ander Arduino-bord), een RTC DS1307 en een NOKIA 5110 LCD nodig.

U kunt de onderdelen hier kopen (affiliate links):

  • Arduino UNO
  • DS1307
  • NOKIA 5110 LCD

Materialen

Arduino UNO

De Arduino Uno is een open-source microcontrollerkaart op basis van de ATmega328P-microcontroller. Dit bord is uitgerust met sets analoge en digitale GPIO's (ingang/uitgang voor algemeen gebruik) die kunnen worden gekoppeld aan verschillende sensoren, actuatoren, uitbreidingskaarten en andere circuits.

De Arduino UNO heeft:

  • 14 digitale input/output-pinnen (waarvan 6 kunnen worden gebruikt als PWM-uitgangen)
  • 6 analoge ingangen
  • 16 MHz keramische resonator
  • 32 KB Flash-geheugen (0,5 KB gebruikt door bootloader)
  • 2 KB SRAM
  • 1 KB EEPROM
  • DC-voedingsaansluiting en USB-poort

DS1307

De DS1307 seriële real-time klok (RTC) is een energiezuinige, volledig binair gecodeerde decimale (BCD) klok/kalender.

De klok/kalender biedt informatie over seconden, minuten, uren, dag, datum, maand en jaar. De einddatum van de maand wordt automatisch aangepast voor maanden met minder dan 31 dagen, inclusief correcties voor schrikkeljaar.

De DS1307 werkt in het 24-uurs- of 12-uursformaat met AM/PM-indicator. Het heeft een ingebouwd Power Sense-circuit dat stroomstoringen detecteert en automatisch overschakelt naar de batterijvoeding.

Pin-functie van de DS1307

  • VCC, GND: Op deze pinnen wordt gelijkstroom aan het apparaat geleverd.
  • SCL (Seriële klokinvoer): gebruikt om gegevensverplaatsing op de seriële interface te synchroniseren.
  • SDA (invoer/uitvoer van seriële gegevens): SDA is de input/output-pin voor de 2-draads seriële interface. De SDA-pin is een open drain waarvoor een externe pullup-weerstand nodig is.
  • SQW/OUT (Square Wave/Output-stuurprogramma): Indien ingeschakeld, is de SQWE-bit ingesteld op 1, de SQW/OUT-pin voert een van de vier blokgolffrequenties uit (1Hz, 4kHz, 8kHz, 32kHz). De SQW/OUT-pin is een open-drain en vereist een externe pull-up-weerstand. Het werkt met ofwel Vcc of Vbat toegepast.
  • X1, X2: Aansluitingen voor een standaard 32.768kHz kwartskristal. Het interne oscillatorcircuit is ontworpen voor gebruik met een kristal met een gespecificeerde belastingscapaciteit van 12,5 pF

NOKIA 5110 LCD

Nokia 5110 LCD is een monochroom scherm van 84*48 pixels, het wordt geleverd met achtergrondverlichting en kan worden gebruikt om tekst, afbeeldingen of afbeeldingen te tekenen. Het LCD-scherm gebruikt de PCD8544-controller (dezelfde die wordt gebruikt in de Nokia 3310 LCD), deze controller is verbonden met microcontrollers via een seriële businterface vergelijkbaar met SPI.

Nokia 5110 LCD-pinout

  • VCC, GND: Op deze pinnen wordt gelijkstroom aan het apparaat geleverd.
  • RST: het reset het display. Het is een actieve lage pin. Je kunt deze pin ook aansluiten op de Arduino-reset, zodat het scherm automatisch wordt gereset.
  • CE (Chip inschakelen): een actieve lage pin, helpt het om een ​​van de vele aangesloten apparaten te selecteren die dezelfde SPI-bus delen.
  • D/C (gegevens/opdracht): het vertelt het display of het gegevens ontvangt of weergeeft. Het HOOG signaal is voor data en het LAAG signaal voor commando.
  • DIN: het is een seriële datapin voor de SPI-interface, het stuurt de gegevens van de microcontroller naar het LCD-scherm.
  • CLK (klok): het LCD-scherm en de microcontroller hebben een gemeenschappelijke klok nodig om te werken vanwege hun SPI-communicatie. deze pin zal helpen om het te maken.
  • BL (achtergrondverlichting): het regelt de achtergrondverlichting van het scherm. U kunt de helderheid regelen door een potentiometer toe te voegen of deze aan te sluiten op een PWM-compatibele Arduino-pin (Pin # 3, 5, 6, 9, 10 en 11).

Hoe het programma bewerken?

U moet regel 161 van de code aanpassen:

calcPrayerTimes(jaar, maand, dagvan de maand, 41.3, 20.6, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha); 

De benodigde parameters zijn:

  • Lengtegraad/Breedtegraad/Tijdzone van de gewenste plaats.
  • Fajr Twilight/ Esha Twilight verschillen in berekeningen van land tot land.

U kunt ook de geografische coördinaten van uw stad krijgen, zoals breedte- en lengtegraad, die het programma nodig heeft om gebedstijden te berekenen door naar de website van IslamicFinder te gaan en vervolgens naar uw stad te zoeken.

Zoals we in de afbeelding hierboven zien, verschenen er gebedstijden naast wat informatie nadat ik naar de stad Caïro had gezocht. Wat voor ons belangrijk is, is de breedtegraad, lengtegraad, Isha-hoek en Fajr-hoek, u zult die nummers in het programma aanpassen aan uw stad.

Hoe werkt het programma?

De functie neemt de gegevens van Jaar/Maand/Dag/Longitude/Latitude/TimeZone/FajrTwilight/IshaTwilight plus 6 verwijzingen naar dubbele variabelen (Fajr/SunRise/Zuhr/Asr/Maghrib/Isha). Deze 6 variabelen zijn degenen om gegevens naar terug te sturen. er zijn ook enkele functies die helpen bij sommige nummerconversies (bijvoorbeeld radialen naar graden en vice versa).

Dus, als we Caïro als voorbeeld nemen:

  • Lengtegraad:30,2
  • Breedtegraad:30
  • Tijdzone:+2
  • Fajr Schemering:-19,5
  • Esha Schemering:-17,5

We zouden regel 161 als volgt moeten aanpassen:

calcPrayerTimes(jaar, maand, dagvan de maand, 30.2, 30, 2, -19.5, -17.5, fajr, sunRise, zuhr, asr, maghrib, isha); 

Merk op dat deze gebedstijden nog steeds "dubbel" zijn en moeten worden omgezet naar een tijdformaat. Mahmoud Adly Ezzat heeft de doubleToHrMin-functie gemaakt (je kunt deze vinden vóór de calcPrayerTimes-functie) die het getal splitst in uren en minuten. Er zijn de dubbele en twee verwijzingen naar int-variabelen nodig.

Vergeet niet een duimpje omhoog te doen als je het handig vindt.

PS: het algoritme voor het berekenen van de gebedstijd is geschreven door Mahmoud Adly Ezzat. Je kunt er meer over lezen in zijn blogpost.

Code

  • Arduino klok met islamitische gebedstijden
Arduino klok met islamitische gebedstijdenArduino
- Gebedstijd op Nokia 5510/3310 display van Hatem Zehir
- Berekening van de gebedstijd is van 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 // Dit is het I2C-adres lang previousMillis =0; // slaat de laatste keer op dat de tijd is bijgewerkt byte seconde, minuut, uur, dag van de week, dag van de maand, maand, jaar; lang interval =200; int displayx, displayy, displayradius, x2, y2, x3, y3; int nul =0; char * Day[] ={"", "Sun", "Mon", "Tue", "Wed", "Do", "Fri", "Sat"};dubbel fajr, sunRise, zuhr, asr, maghrib, isha; // Converteer normale decimale getallen naar binair gecodeerde decimale byte decToBcd(byte val){ return ( (val / 10 * 16) + (val % 10));}// Converteer binair gecodeerde decimale getallen naar normale decimale getallenbyte bcdToDec(byte val){ return ( ((val / 16 * 10) + (val % 16));}// Haalt de datum en tijd op uit de ds1307 en print resultvoid getDateDs1307(){ // Reset de registeraanwijzer Wire.beginTransmission(DS1307_I2C_ADDRESS); //Wire.write (0x00); Wire.write (nul); Wire.endTransmission(); Wire.requestFrom (DS1307_I2C_ADDRESS, 7); tweede =bcdToDec(Wire.read() &0x7f); minuut =bcdToDec(Wire.read()); uur =bcdToDec(Wire.read() &0x3f); dayOfWeek =bcdToDec(Wire.read()); dayOfMonth =bcdToDec(Wire.read()); maand =bcdToDec(Wire.read()); jaar =bcdToDec(Wire.read());}void setDateDs1307(){ Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write (nul); Wire.write (decToBcd (tweede)); // 0 tot bit 7 start de klok Wire.write(decToBcd(minute)); Wire.write(decToBcd(uur)); // voor 12 uur am/pm, moet bit 6 worden ingesteld (moet ook readDateDs1307 wijzigen) Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(maand)); Wire.write(decToBcd(jaar)); Wire.endTransmission();}void printTime(){ in uren, minuten; char s[12]; display.clearDisplay(); display.setCursor(0, 16); display.print(Dag[dayOfWeek]); display.print(":"); display.print(char(dayOfMonth/10 + 0x30)); display.print(char(dayOfMonth % 10 + 0x30)); display.print("/"); display.print(char(maand/10 + 0x30)); display.print(char(maand % 10 + 0x30)); display.print("/"); display.print("20"); display.print(char (jaar / 10 + 0x30)); display.print(char (jaar % 10 + 0x30)); display.setCursor (18, 26); display.print( char (uur / 10 + 0x30)); display.print( char (uur % 10 + 0x30)); display.print(":"); display.print( char (minuut / 10 + 0x30)); display.print( char (minuut % 10 + 0x30)); display.print(":"); display.print(char (seconde / 10 + 0x30)); display.print(char (tweede % 10 + 0x30)); weergave.weergave(); vertraging (1000); doubleToHrMin(fajr, uren, minuten); display.clearDisplay(); display.setCursor(1, 1); display.print("Fajr"); display.print(uren); display.print(":"); display.print(minuten); weergave.weergave(); doubleToHrMin(zuhr, uren, minuten); display.setCursor(1, 10); display.print("Zuhr "); display.print(uren); display.print(":"); display.print(minuten); weergave.weergave(); doubleToHrMin(asr, uren, minuten); display.setCursor(1, 20); display.print("Asr "); display.print(uren); display.print(":"); display.print(minuten); weergave.weergave(); doubleToHrMin(maghrib, uren, minuten); display.setCursor(1, 30); display.print("Maghreb"); display.print(uren); display.print(":"); display.print(minuten); weergave.weergave(); doubleToHrMin(isha, uren, minuten); display.setCursor(1, 40); display.print("Isha"); display.print(uren); display.print(":"); display.print(minuten); weergave.weergave(); vertraging (5000);} ongeldige setup () { Wire.begin (); weergave.begin(); display.clearDisplay(); display.setContrast(25); xegg =(weergave.breedte()) / 2; yegg =(display.height()) / 2; display.setTextColor(ZWART); display.setTextSize(1); display.setCursor(22, 18); display.print("Hatem"); weergave.weergave(); vertraging (500); display.setCursor(24, 28); display.print("ZEHIR"); weergave.weergave(); vertraging (500); getDateDs1307();}void loop() { getDateDs1307(); calcPrayerTimes (jaar, maand, dag van de maand, 39.8, 21.4, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha); // jaar, maand, dag, lengtegraad, breedtegraad, tijdzone, Fajr Twilight, Esha Twilight unsigned long currentMillis =millis(); if (currentMillis - previousMillis> interval) { previousMillis =currentMillis; //getDateDs1307(); printTime(); }}/*---------------------------------------------- ---------------------------------------*/// GEBEDTIJD (door Mahmoud Adly Ezzat , Caïro)//convert Graden naar Radiandouble degToRad(dubbele graad){ return ((3.1415926 / 180) * degree);}//convert Radian naar Degreedouble radToDeg(dubbele radiaal){ return (radiaal * (180/3.1415926)); }//zorg ervoor dat een waarde tussen 0 en 360 ligt double moreLess360(double value){ while (value> 360 || value <0) { if (value> 360) value -=360; anders als (waarde <0) waarde +=360; } retourneer waarde;}//zorg ervoor dat een waarde tussen 0 en 24dubbel meerLess24(dubbele waarde){ while (waarde> 24 || waarde <0) { if (waarde> 24) waarde -=24; anders als (waarde <0) waarde +=24; } retourwaarde;}//converteer het dubbele getal naar Hours and Minutesvoid doubleToHrMin(double number, int &hours, int &minutes){ hours =floor(moreLess24(number)); minuten =verdieping(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 , dubbele &asrTime, dubbele &maghribTime, dubbele &ishaTime){ dubbele D =(367 * jaar) - ((jaar + (int)((maand + 9) / 12)) * 7 / 4) + (((int)(275 * maand / 9)) + dag - 730531.5); dubbele L =280.461 + 0.9856474 * D; L =meerMinder360(L); dubbele M =357,528 + (0,9856003) * D; M =meerMinder360(M); dubbele Lambda =L + 1.915 * sin(degToRad(M)) + 0.02 * sin(degToRad(2 * M)); Lambda =meerMinder360(Lambda); dubbele Obliquity =23.439 - 0.0000004 * D; dubbele Alpha =radToDeg(atan((cos(degToRad(Obliquity)) * tan(degToRad(Lambda))))); Alfa =meerMinder360(Alfa); Alfa =Alfa - (360 * (int)(Alfa / 360)); Alpha =Alpha + 90 * (vloer(Lambda / 90) - vloer(Alpha / 90)); dubbele ST =100,46 + 0,985647352 * D; dubbel 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)) ))); dubbele middag =Alpha - ST; Middag =meerMinder360(Noon); dubbel UT_Noon =Middag - lengtegraad; //////////////////////////////////////////// // Berekenen van gebedstijden Bogen &Tijden // ////////////////////////////////////////// // 2) Zuhr Time [Lokale middag] zuhrTime =UT_Noon / 15 + timeZone; // Asr Hanafi //double Asr_Alt =radToDeg(atan(2+tan(degToRad(latitude - Dec)))); dubbele Asr_Alt =radToDeg(atan(1.7 + tan(degToRad(latitude - Dec)))); // Asr Shafii //double Asr_Alt =radToDeg(atan(1 + tan(degToRad(latitude - Dec)))); dubbele 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-tijd asrTime =zuhrTime + Asr_Arc; // 1) Shorouq-tijd sunRiseTime =zuhrTime - (Durinal_Arc / 15); // 4) Maghrib Tijd 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 Tijd 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(breedtegraad))))); fajrTime =zuhrTime - (Fajr_Arc / 15); terug;}

Schema's


Productieproces

  1. Arduino pov vision-klok
  2. DIY eenvoudigste IV9 Numitron-klok met Arduino
  3. Eenvoudige Word Clock (Arduino)
  4. Hoofdklok
  5. Bedien muntvangers met Arduino
  6. Arduino Temp. Monitor en realtimeklok met 3.2-weergave
  7. Arduino met Bluetooth om een ​​LED te bedienen!
  8. Een afbeelding weergeven op een LCD TFT-scherm met Arduino UNO!
  9. Persistentie van visie
  10. Eenvoudige wekker met DS1302 RTC
  11. 25 kHz 4-pins PWM-ventilatorregeling met Arduino Uno