Indholdsfortegnelse:

Brug af DS1307 og DS3231 Real-time urmoduler med Arduino: 3 trin
Brug af DS1307 og DS3231 Real-time urmoduler med Arduino: 3 trin

Video: Brug af DS1307 og DS3231 Real-time urmoduler med Arduino: 3 trin

Video: Brug af DS1307 og DS3231 Real-time urmoduler med Arduino: 3 trin
Video: 7 projects Build LED LCD Alarm Clock using DS1307 with Arduino | Lesson 105 2024, November
Anonim
Brug af DS1307 og DS3231 Real-time urmoduler med Arduino
Brug af DS1307 og DS3231 Real-time urmoduler med Arduino
Brug af DS1307 og DS3231 Real-time urmoduler med Arduino
Brug af DS1307 og DS3231 Real-time urmoduler med Arduino

Vi bliver ved med at få anmodninger om, hvordan du bruger DS1307 og DS3231 real-time urmoduler med Arduino fra forskellige kilder-så dette er den første af en todelt tutorial om, hvordan du bruger dem. Til denne Arduino-vejledning har vi to real-time urmoduler at bruge, et baseret på Maxim DS1307 (det firkantede modul) og DS3231 (det rektangulære modul).

Der er to hovedforskelle mellem IC'erne på realtidsurmodulerne, hvilket er nøjagtigheden af tidsopbevaring. DS1307, der bruges i det første modul, fungerer meget godt, men den ydre temperatur kan påvirke frekvensen af oscillatorkredsløbet, der driver DS1307s interne tæller.

Dette kan lyde som et problem, men vil normalt resultere i, at uret er slukket med cirka fem minutter om måneden. DS3231 er meget mere præcis, da den har en intern oscillator, der ikke påvirkes af eksterne faktorer - og dermed er nøjagtig op til et par minutter om året højst. Hvis du har et DS1307-modul- føler dig ikke dårlig, det er stadig et værdibord og vil tjene dig godt. Med begge moduler kræves et backupbatteri.

Det er en god idé at købe et nyt CR2032 -batteri og passe det til modulet. Sammen med at holde styr på tid og dato har disse moduler også en lille EEPROM, en alarmfunktion (kun DS3231) og evnen til at generere en firkantbølge af forskellige frekvenser-som alle vil blive genstand for en anden vejledning.

Trin 1: Tilslutning af dit modul til en Arduino

Begge moduler bruger I2C -bussen, hvilket gør forbindelsen meget let.

Først skal du identificere, hvilke ben på din Arduino eller kompatible tavler, der bruges til I2C -bussen - disse kendes som SDA (eller data) og SCL (eller ur). På Arduino Uno eller kompatible tavler er disse ben A4 og A5 til data og ur; På Arduino Mega er benene D20 og D21 til data og ur; Og hvis du bruger en Pro Mini-kompatibel, er benene A4 og A5 for data og ur, som er parallelle med hovedstifterne.

DS1307 modul

Hvis du har DS1307 -modulet, skal du lodde ledningerne til brættet eller lodde på nogle inline header pins, så du kan bruge jumperwires. Tilslut derefter SCL- og SDA -benene til din Arduino og Vcc -stiften til 5V -stiften og GND til GND.

DS3231 modul

Tilslutning af dette modul er let, da headerstifter er installeret på kortet på fabrikken. Du kan simpelthen køre jumper -ledninger igen fra SCL og SDA til Arduino og igen fra modulets Vcc- og GND -ben til dit tavles 5V eller 3.3. V og GND. Disse er dog kopieret på den anden side til lodning af dine egne ledninger. Begge disse moduler har de nødvendige pull-up modstande, så du behøver ikke tilføje dine egne. Ligesom alle enheder, der er tilsluttet I2C -bussen, skal du prøve at holde længden af SDA- og SCL -ledningerne til et minimum.

Trin 2: Læsning og skrivning af tiden fra dit RTC -modul

Når du har tilsluttet dit RTC -modul. indtast og upload følgende skitse. Selvom noterne og funktionerne i skitsen kun refererer til DS3231, fungerer koden også med DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Konverter normale decimaltal til binært kodet decimal byte decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Konverter binær kodet decimal til normale decimaltal byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } ugyldig opsætning () {Wire.begin (); Serial.begin (9600); // indstil starttiden her: // DS3231 sekunder, minutter, timer, dag, dato, måned, år // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte sekund, byte minut, byte time, byte dayOfWeek, byte dayOfMonth, byte måned, byte år) {// indstiller tid og dato data til DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // indstil næste input til at starte ved sekundærregistret Wire.write (decToBcd (sekund)); // sæt sekunder Wire.write (decToBcd (minut)); // sæt minutter Wire.write (decToBcd (time)); // indstil timer Wire.write (decToBcd (dayOfWeek)); // angivet ugedag (1 = søndag, 7 = lørdag) Wire.write (decToBcd (dayOfMonth)); // indstil dato (1 til 31) Wire.write (decToBcd (måned)); // sæt måned Wire.write (decToBcd (år)); // sæt år (0 til 99) Wire.endTransmission (); } void readDS3231time (byte *sekund, byte *minut, byte *time, byte *dayOfWeek, byte *dayOfMonth, byte *måned, byte *år) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // indstil DS3231 registermarkør til 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // anmode om syv bytes data fra DS3231 fra register 00h *second = bcdToDec (Wire.read () & 0x7f); *minut = bcdToDec (Wire.read ()); *time = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *måned = bcdToDec (Wire.read ()); *år = bcdToDec (Wire.read ()); } void displayTime () {byte sekund, minut, time, dayOfWeek, dayOfMonth, måned, år; // hent data fra DS3231 readDS3231time (& sekund, & minut, & time, & dayOfWeek, & dayOfMonth, & måned, & år); // send den til den serielle skærm Serial.print (time, DEC); // konverter bytevariablen til et decimaltal, når den vises Serial.print (":"); hvis (minut <10) {Serial.print ("0"); } Serial.print (minut, DEC); Serial.print (":"); hvis (anden <10) {Serial.print ("0"); } Serial.print (andet, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (måned, DEC); Serial.print ("/"); Serial.print (år, DEC); Serial.print ("Ugedag:"); switch (dayOfWeek) {case 1: Serial.println ("søndag"); pause; sag 2: Serial.println ("mandag"); pause; sag 3: Serial.println ("tirsdag"); pause; sag 4: Serial.println ("onsdag"); pause; sag 5: Serial.println ("torsdag"); pause; sag 6: Serial.println ("fredag"); pause; sag 7: Serial.println ("lørdag"); pause; }} void loop () {displayTime (); // vis real-time urdata på den serielle monitor, forsinkelse (1000); // hvert sekund }

Der kan være meget kode, men den opdeles godt i overskuelige dele.

Det inkluderer først Wire -biblioteket, der bruges til I2C -buskommunikation, efterfulgt af at definere busadressen for RTC som 0x68. Disse efterfølges af to funktioner, der konverterer decimaltal til BCD (binært kodet decimal) og omvendt. Disse er nødvendige, da RTC IC'erne fungerer i BCD ikke decimal.

Funktionen setDS3231time () bruges til at indstille uret. Brug af det er meget let, enkelt indsæt værdierne fra år ned til sekund, og RTC starter fra det tidspunkt. Hvis du f.eks. Vil angive følgende dato og klokkeslæt - onsdag den 26. november 2014 og 21:42 og 30 sekunder - ville du bruge:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

Trin 3:

Bemærk, at klokkeslættet er indstillet ved hjælp af 24-timers tid, og den fjerde parameter er "ugedag". Dette falder mellem 1 og 7, som er henholdsvis søndag til lørdag. Disse parametre er byteværdier, hvis du subsituerer dine egne variabler.

Når du først har kørt funktionen, er det klogt at prefikse det med // og uploade din kode igen, så det nulstiller ikke tiden, når strømmen er blevet cyklet eller micrcontroller nulstillet. Læsning af tidspunktet fra din RTC er lige så enkel, faktisk kan processen følges pænt inde i funktionen displayTime (). Du skal definere syv bytevariabler for at gemme dataene fra RTC, og disse indsættes derefter i funktionen readDS3231time (). For eksempel hvis dine variabler er:

byte sekund, minut, time, dayOfWeek, dayOfMonth, måned, år;

… du ville opdatere dem med de aktuelle data fra RTC ved at bruge:

readDS3232time (& sekund, & minut, & time, & dayOfWeek, & dayOfMonth, & måned, & år);

Derefter kan du bruge variablerne, som du finder passende, fra at sende klokkeslæt og dato til den serielle skærm, som eksempelskitsen gør - til at konvertere dataene til en passende form til alle slags outputenheder.

Bare for at kontrollere, at alt fungerer, skal du indtaste den passende tid og dato i demonstrationsskitsen, uploade den, kommentere funktionen setDS3231time () og uploade den igen. Åbn derefter den serielle skærm, og du skal have et løbende display med den aktuelle tid og dato.

Fra dette tidspunkt har du nu software-værktøjer til at indstille data til og hente dem fra dit real-time urmodul, og vi håber, at du har en forståelse for, hvordan du bruger disse billige moduler.

Du kan lære mere om de særlige real-time ur-IC'er fra producentens websted-DS1307 og DS3231.

Dette indlæg blev bragt til dig af pmdway.com - alt for producenter og elektronikentusiaster, med gratis levering over hele verden.

Anbefalede: