Innholdsfortegnelse:
Video: Bruke DS1307 og DS3231 sanntids klokkemoduler med Arduino: 3 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:22
Vi får stadig forespørsler om hvordan du bruker DS1307 og DS3231 sanntidsklokke-moduler med Arduino fra forskjellige kilder-så dette er den første av en todelt opplæring om hvordan du bruker dem. For denne Arduino-opplæringen har vi to sanntidsklokkemoduler å bruke, en basert på Maxim DS1307 (kvadratmodulen) og DS3231 (den rektangulære modulen).
Det er to hovedforskjeller mellom IC-ene på sanntidsklokke-modulene, som er nøyaktigheten av tidsoppbevaringen. DS1307 som brukes i den første modulen fungerer veldig bra, men den eksterne temperaturen kan påvirke frekvensen til oscillatorkretsen som driver DS1307s interne teller.
Dette kan høres ut som et problem, men vil vanligvis føre til at klokken er av med omtrent fem minutter i måneden. DS3231 er mye mer nøyaktig, siden den har en intern oscillator som ikke påvirkes av eksterne faktorer - og dermed er nøyaktig ned til noen få minutter per år. Hvis du har en DS1307-modul- ikke føler deg dårlig, er det fortsatt et verdifullt bord og vil tjene deg godt. Med begge modulene kreves et reservebatteri.
Det er en god idé å kjøpe et nytt CR2032 -batteri og passe det til modulen. I tillegg til å holde styr på tid og dato, har disse modulene også en liten EEPROM, en alarmfunksjon (bare DS3231) og muligheten til å generere en firkantbølge med forskjellige frekvenser-som alle vil bli gjenstand for en annen opplæring.
Trinn 1: Koble modulen til en Arduino
Begge modulene bruker I2C -bussen, noe som gjør tilkoblingen veldig enkel.
Først må du identifisere hvilke pinner på Arduino eller kompatible kort som brukes til I2C -bussen - disse vil bli kjent som SDA (eller data) og SCL (eller klokke). På Arduino Uno eller kompatible tavler er disse pinnene A4 og A5 for data og klokke; På Arduino Mega er pinnene D20 og D21 for data og klokke; Og hvis du bruker en Pro Mini-kompatibel, er pinnene A4 og A5 for data og klokke, som er parallelle med hovedpinnene.
DS1307 modul
Hvis du har DS1307 -modulen, må du lodde ledningene til brettet, eller lodde på noen inline header pins slik at du kan bruke hoppetråder. Koble deretter SCL- og SDA -pinnene til Arduinoen din, og Vcc -pinnen til 5V -pinnen og GND til GND.
DS3231 -modul
Det er enkelt å koble til denne modulen ettersom toppnålene er installert på brettet fra fabrikken. Du kan ganske enkelt kjøre jumperkabler igjen fra SCL og SDA til Arduino og igjen fra modulens Vcc- og GND -pinner til brettets 5V eller 3.3. V og GND. Disse er imidlertid duplisert på den andre siden for lodding av dine egne ledninger. Begge disse modulene har de nødvendige pull-up-motstandene, så du trenger ikke legge til dine egne. Som alle enheter som er koblet til I2C -bussen, kan du prøve å holde lengden på SDA- og SCL -ledningene til et minimum.
Trinn 2: Lese og skrive tiden fra din RTC -modul
Når du har koblet til RTC -modulen. skriv inn og last opp følgende skisse. Selv om notatene og funksjonene i skissen bare refererer til DS3231, fungerer koden også med DS1307.
#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Konverter normale desimaltall til binært kodet desimal byte decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Konverter binær kodet desimal til normale desimaltall byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } ugyldig oppsett () {Wire.begin (); Serial.begin (9600); // angi starttiden her: // DS3231 sekunder, minutter, timer, dag, dato, måned, år // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte sekund, byte minutt, byte time, byte dayOfWeek, byte dayOfMonth, byte måned, byte år) {// angir tid og dato data til DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // sett neste inngang for å starte ved sekundregisteret Wire.write (decToBcd (andre)); // sett sekunder Wire.write (decToBcd (minutt)); // sett minutter Wire.write (decToBcd (time)); // angi timer Wire.write (decToBcd (dayOfWeek)); // angi ukedag (1 = søndag, 7 = lørdag) Wire.write (decToBcd (dayOfMonth)); // angi dato (1 til 31) Wire.write (decToBcd (måned)); // sett måned Wire.write (decToBcd (år)); // sett år (0 til 99) Wire.endTransmission (); } void readDS3231time (byte *sekund, byte *minutt, byte *time, byte *dayOfWeek, byte *dayOfMonth, byte *måned, byte *år) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // sett DS3231 registerpeker til 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // be om syv byte med data fra DS3231 fra register 00h *second = bcdToDec (Wire.read () & 0x7f); *minutt = 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, minutt, time, dayOfWeek, dayOfMonth, måned, år; // hente data fra DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // send den til den serielle skjermen Serial.print (time, DEC); // konvertere bytevariabelen til et desimalnummer når den vises Serial.print (":"); if (minutt <10) {Serial.print ("0"); } Serial.print (minutt, DEC); Serial.print (":"); hvis (andre <10) {Serial.print ("0"); } Serial.print (andre, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (måned, DEC); Serial.print ("/"); Serial.print (år, DEC); Serial.print ("Ukedag:"); switch (dayOfWeek) {case 1: Serial.println ("søndag"); gå i stykker; sak 2: Serial.println ("mandag"); gå i stykker; sak 3: Serial.println ("tirsdag"); gå i stykker; sak 4: Serial.println ("onsdag"); gå i stykker; sak 5: Serial.println ("torsdag"); gå i stykker; sak 6: Serial.println ("fredag"); gå i stykker; sak 7: Serial.println ("lørdag"); gå i stykker; }} void loop () {displayTime (); // vise sanntids klokkedata på seriell monitor, forsinkelse (1000); // hvert sekund }
Det kan være mye kode, men den brytes godt ned i håndterbare deler.
Det inkluderer først Wire -biblioteket, som brukes til I2C -busskommunikasjon, etterfulgt av å definere bussadressen for RTC som 0x68. Disse blir fulgt av to funksjoner som konverterer desimaltall til BCD (binært kodet desimal) og omvendt. Disse er nødvendige ettersom RTC ICene fungerer i BCD ikke desimal.
Funksjonen setDS3231time () brukes til å stille klokken. Å bruke det er veldig enkelt, enkelt sette inn verdiene fra år til sekund, og RTC starter fra den tiden. For eksempel hvis du vil angi følgende dato og klokkeslett - onsdag 26. november 2014 og 21:42 og 30 sekunder - vil du bruke:
setDS3231time (30, 42, 21, 4, 26, 11, 14);
Trinn 3:
Vær oppmerksom på at tiden er angitt med 24-timers tid, og den fjerde parameteren er "ukedagen". Dette faller mellom 1 og 7, som er henholdsvis søndag til lørdag. Disse parametrene er byteverdier hvis du substituerer dine egne variabler.
Når du har kjørt funksjonen en gang, er det lurt å prefikse den med // og laste opp koden din igjen, så den vil ikke tilbakestille tiden når strømmen har blitt syklet eller mikrkontrolleren tilbakestilt. Å lese klokkeslettet fra din RTC er like enkelt, faktisk kan prosessen følges pent inne i funksjonen displayTime (). Du må definere syv bytevariabler for å lagre dataene fra RTC, og disse settes deretter inn i funksjonen readDS3231time (). For eksempel hvis variablene dine er:
byte sekund, minutt, time, dayOfWeek, dayOfMonth, måned, år;
… du vil oppdatere dem med gjeldende data fra RTC ved å bruke:
readDS3232time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);
Deretter kan du bruke variablene som du finner passende, fra å sende klokkeslett og dato til seriell skjerm som eksempelskissen gjør - til å konvertere dataene til et passende skjema for alle slags utskriftsenheter.
Bare for å kontrollere at alt fungerer, skriver du inn passende klokkeslett og dato i demonstrasjonsskissen, laster det opp, kommenterer funksjonen setDS3231time () og laster det opp igjen. Deretter åpner du den serielle skjermen, og du bør få en visning av gjeldende klokkeslett og dato.
Fra dette tidspunktet har du nå programvareverktøyene for å sette data til og hente dem fra sanntids klokkemodulen, og vi håper du har forståelse for hvordan du bruker disse rimelige modulene.
Du kan lære mer om de spesifikke sanntidsklokke-IC-ene fra produsentens nettsted-DS1307 og DS3231.
Dette innlegget ble brakt til deg av pmdway.com - alt for produsenter og elektronikkentusiaster, med gratis levering over hele verden.
Anbefalt:
Hvordan lage fuktighet og temperatur sanntids datarekorder med Arduino UNO og SD-kort - DHT11 Datalogger Simulering i Proteus: 5 trinn
Hvordan lage fuktighet og temperatur sanntids datarekorder med Arduino UNO og SD-kort | DHT11 Datalogger Simulering i Proteus: Introduksjon: hei, dette er Liono Maker, her er YouTube-lenken. Vi lager kreative prosjekter med Arduino og jobber med innebygde systemer. Data-Logger: En datalogger (også datalogger eller dataregistrator) er en elektronisk enhet som registrerer data over tid
Hvordan bruke DS1307 Bruke Arduino: 7 trinn
Hvordan bruke DS1307 Bruke Arduino: DS1307 er en sanntidsklokke IC (RTC). Denne IC brukes til å gi tidsdata. Tildelt tid starter fra sekunder, minutt, timer, dager, dato, måned og år. Denne IC krever ytterligere eksterne komponenter som Crystal og 3,6V batterier. Krystall
Neopixel Ws2812 Rainbow LED-glød med M5stick-C - Kjører Rainbow på Neopixel Ws2812 Bruke M5stack M5stick C Bruke Arduino IDE: 5 trinn
Neopixel Ws2812 Rainbow LED-glød med M5stick-C | Running Rainbow på Neopixel Ws2812 Bruke M5stack M5stick C Bruke Arduino IDE: Hei folkens i denne instruksen, vi lærer hvordan du bruker neopixel ws2812 LED eller led strip eller led matrise eller led ring med m5stack m5stick-C utviklingstavle med Arduino IDE, og vi skal lage et regnbuemønster med den
Sanntids MPU-6050/A0 datalogging med Arduino og Android: 7 trinn (med bilder)
Sanntids MPU-6050/A0 datalogging med Arduino og Android: Jeg har vært interessert i å bruke Arduino for maskinlæring. Som et første trinn vil jeg bygge en sanntids (eller ganske nær den) datavisning og logger med en Android -enhet. Jeg vil fange akselerometerdata fra MPU-6050, så jeg designer
Sanntids hendelsesvarsler ved hjelp av NodeMCU (Arduino), Google Firebase og Laravel: 4 trinn (med bilder)
Sanntids hendelsesvarsler ved hjelp av NodeMCU (Arduino), Google Firebase og Laravel: Har du noen gang ønsket å bli varslet når det utføres en handling på nettstedet ditt, men e -post er ikke riktig passform? Vil du høre en lyd eller en bjelle hver gang du gjør et salg? Eller det er behov for din umiddelbare oppmerksomhet på grunn av en nødsituasjon