Innehållsförteckning:

Använda DS1307 och DS3231 klockmoduler i realtid med Arduino: 3 steg
Använda DS1307 och DS3231 klockmoduler i realtid med Arduino: 3 steg

Video: Använda DS1307 och DS3231 klockmoduler i realtid med Arduino: 3 steg

Video: Använda DS1307 och DS3231 klockmoduler i realtid med Arduino: 3 steg
Video: 7 projects Build LED LCD Alarm Clock using DS1307 with Arduino | Lesson 105 2024, December
Anonim
Använda DS1307 och DS3231 Realtidsklocka med Arduino
Använda DS1307 och DS3231 Realtidsklocka med Arduino
Använda DS1307 och DS3231 klockmoduler i realtid med Arduino
Använda DS1307 och DS3231 klockmoduler i realtid med Arduino

Vi får fortfarande förfrågningar om hur man använder DS1307 och DS3231 realtidsklockemoduler med Arduino från olika källor-så det här är den första av en tvådelad handledning om hur man använder dem. För denna Arduino-handledning har vi två realtidsklockemoduler att använda, en baserad på Maxim DS1307 (kvadratmodulen) och DS3231 (den rektangulära modulen).

Det finns två huvudsakliga skillnader mellan IC: erna på realtidsklockemodulerna, vilket är noggrannheten i tiden. DS1307 som används i den första modulen fungerar mycket bra, men den yttre temperaturen kan påverka oscillatorkretsens frekvens som driver DS1307: s interna räknare.

Detta kan låta som ett problem, men det kommer vanligtvis att leda till att klockan är avstängd med cirka fem minuter per månad. DS3231 är mycket mer exakt, eftersom den har en intern oscillator som inte påverkas av yttre faktorer - och därmed är exakt högst några minuter per år. Om du har en DS1307-modul- må inte illa, det är fortfarande ett värdefullt bräda och kommer att tjäna dig bra. Med båda modulerna krävs ett reservbatteri.

Det är en bra idé att köpa ett nytt CR2032 -batteri och passa det på modulen. Förutom att hålla koll på tid och datum har dessa moduler också en liten EEPROM, en larmfunktion (endast DS3231) och möjligheten att generera en kvadratvåg med olika frekvenser-som alla kommer att bli föremål för en andra handledning.

Steg 1: Anslut din modul till en Arduino

Båda modulerna använder I2C -bussen, vilket gör anslutningen mycket enkel.

Först måste du identifiera vilka stift på din Arduino eller kompatibla kort som används för I2C -bussen - dessa kommer att kallas SDA (eller data) och SCL (eller klocka). På Arduino Uno eller kompatibla kort är dessa stift A4 och A5 för data och klocka; På Arduino Mega är stiften D20 och D21 för data och klocka; Och om du använder en Pro Mini-kompatibel är stiften A4 och A5 för data och klocka, som är parallella med huvudnålarna.

DS1307 -modul

Om du har DS1307 -modulen måste du löda trådarna till brädet, eller lödda på några inline header -stift så att du kan använda bygeltrådar. Anslut sedan SCL- och SDA -stiften till din Arduino och Vcc -stiftet till 5V -stiftet och GND till GND.

DS3231 -modul

Det är enkelt att ansluta denna modul eftersom huvudstiften är installerade på kortet på fabriken. Du kan helt enkelt köra bygelkablar igen från SCL och SDA till Arduino och igen från modulens Vcc- och GND -stift till din brädans 5V eller 3.3. V och GND. Dessa dupliceras dock på andra sidan för att lödda dina egna trådar. Båda dessa moduler har de nödvändiga uppdragningsmotstånden, så du behöver inte lägga till dina egna. Liksom alla enheter som är anslutna till I2C -bussen, försök att hålla längden på SDA- och SCL -ledningarna till ett minimum.

Steg 2: Läsa och skriva tiden från din RTC -modul

När du har kopplat upp din RTC -modul. ange och ladda upp följande skiss. Även om anteckningarna och funktionerna i skissen endast avser DS3231, fungerar koden också med DS1307.

#inkludera "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Konvertera normala decimaltal till binärt kodade decimalbyte decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Konvertera binärt kodad decimal till normala decimalnummer byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.begin (9600); // ställ in starttiden här: // DS3231 sekunder, minuter, timmar, dag, datum, månad, år // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte sekund, byte minut, byte timme, byte dayOfWeek, byte dayOfMonth, byte månad, byte år) {// ställer in tid och datum data till DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // ställ in nästa ingång för att börja vid sekundregistret Wire.write (decToBcd (andra)); // ställ in sekunder Wire.write (decToBcd (minut)); // ställ in minuter Wire.write (decToBcd (timme)); // ställ in timmar Wire.write (decToBcd (dayOfWeek)); // ställ in veckodag (1 = söndag, 7 = lördag) Wire.write (decToBcd (dayOfMonth)); // ställ in datum (1 till 31) Wire.write (decToBcd (månad)); // ange månad Wire.write (decToBcd (år)); // ange år (0 till 99) Wire.endTransmission (); } void readDS3231time (byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // ställ in DS3231 registerpekare till 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // begär sju byte med data från DS3231 från registret 00h *second = bcdToDec (Wire.read () & 0x7f); *minut = bcdToDec (Wire.read ()); *timme = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *månad = bcdToDec (Wire.read ()); *år = bcdToDec (Wire.read ()); } void displayTime () {byte sekund, minut, timme, dayOfWeek, dayOfMonth, månad, år; // hämta data från DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // skicka den till seriell bildskärm Serial.print (timme, DEC); // konvertera bytevariabeln till ett decimaltal när Serial.print (":") visas; if (minut <10) {Serial.print ("0"); } Serial.print (minut, DEC); Serial.print (":"); if (andra <10) {Serial.print ("0"); } Serial.print (andra, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (månad, DEC); Serial.print ("/"); Serial.print (år, DEC); Serial.print ("Veckodag:"); switch (dayOfWeek) {case 1: Serial.println ("söndag"); ha sönder; fall 2: Serial.println ("måndag"); ha sönder; fall 3: Serial.println ("tisdag"); ha sönder; fall 4: Serial.println ("onsdag"); ha sönder; fall 5: Serial.println ("torsdag"); ha sönder; fall 6: Serial.println ("fredag"); ha sönder; fall 7: Serial.println ("lördag"); ha sönder; }} void loop () {displayTime (); // visa klockdata i realtid på seriemonitorn, fördröjning (1000); // varje sekund }

Det kan finnas mycket kod, men det bryts ner väl i hanterbara delar.

Det innehåller först trådbiblioteket, som används för I2C -busskommunikation, följt av att definiera bussadressen för RTC som 0x68. Dessa följs av två funktioner som konverterar decimaltal till BCD (binärt kodad decimal) och vice versa. Dessa är nödvändiga eftersom RTC IC: erna fungerar i BCD inte decimal.

Funktionen setDS3231time () används för att ställa in klockan. Att använda det är mycket enkelt, enkelt infoga värdena från år till sekund, och RTC kommer att börja från den tiden. Om du till exempel vill ställa in följande datum och tid - onsdagen den 26 november 2014 och 21:42 och 30 sekunder - skulle du använda:

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

Steg 3:

Observera att tiden är inställd med 24-timmars tid, och den fjärde parametern är "veckodag". Detta faller mellan 1 och 7 vilket är söndag till lördag. Dessa parametrar är bytevärden om du lägger ut dina egna variabler.

När du väl har kört funktionen en gång är det klokt att prefixa den med // och ladda upp din kod igen, så att den inte kommer att återställa tiden när strömmen har cyklats eller micrcontroller återställts. Att läsa tiden från din RTC är lika enkel, faktiskt kan processen följas snyggt inuti funktionen displayTime (). Du måste definiera sju bytevariabler för att lagra data från RTC, och dessa infogas sedan i funktionen readDS3231time (). Till exempel om dina variabler är:

byte sekund, minut, timme, dayOfWeek, dayOfMonth, månad, år;

… du skulle uppdatera dem med nuvarande data från RTC genom att använda:

readDS3232time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

Sedan kan du använda variablerna efter eget tycke, från att skicka tid och datum till seriell bildskärm som exempelskissen gör - till att konvertera data till en lämplig form för alla typer av utdataenheter.

Bara för att kontrollera att allt fungerar, ange lämplig tid och datum i demonstrationsskissen, ladda upp det, kommentera funktionen setDS3231time () och ladda upp det igen. Öppna sedan den seriella bildskärmen och du bör få en löpande visning av aktuell tid och datum.

Från denna punkt har du nu mjukvaruverktygen för att ställa in data och hämta dem från din realtidsklockemodul, och vi hoppas att du har förståelse för hur du använder dessa billiga moduler.

Du kan lära dig mer om de specifika realtidsklockans IC: er från tillverkarens webbplats-DS1307 och DS3231.

Det här inlägget kommer till dig av pmdway.com - allt för tillverkare och elektronikentusiaster, med gratis leverans över hela världen.

Rekommenderad: