Gebruik DS1307 en DS3231 Real-time klokmodules met Arduino: 3 stappe
Gebruik DS1307 en DS3231 Real-time klokmodules met Arduino: 3 stappe
Anonim
Gebruik DS1307 en DS3231 Real-time klokmodules met Arduino
Gebruik DS1307 en DS3231 Real-time klokmodules met Arduino
Gebruik DS1307 en DS3231 Real-time klokmodules met Arduino
Gebruik DS1307 en DS3231 Real-time klokmodules met Arduino

Ons ontvang steeds versoeke oor hoe om DS1307 en DS3231 real-time klokmodules met Arduino uit verskillende bronne te gebruik-dus dit is die eerste van 'n tweeledige handleiding oor hoe u dit moet gebruik. Vir hierdie Arduino-tutoriaal het ons twee intydse klokmodules om te gebruik, een gebaseer op die Maxim DS1307 (die vierkante module) en die DS3231 (die reghoekige module).

Daar is twee belangrikste verskille tussen die IC's op die real-time klokmodules, wat die akkuraatheid van die tydsberekening is. Die DS1307 wat in die eerste module gebruik word, werk baie goed, maar die eksterne temperatuur kan die frekwensie van die ossillatorbaan beïnvloed wat die interne teller van die DS1307 dryf.

Dit klink miskien na 'n probleem, maar dit sal gewoonlik lei tot ongeveer vyf minute per maand. Die DS3231 is baie akkurater, aangesien dit 'n interne ossillator het wat nie deur eksterne faktore beïnvloed word nie - en dus hoogstens tot 'n paar minute per jaar akkuraat is. As u 'n DS1307-module het- moenie sleg voel nie, dit is steeds 'n waardevolle bord en sal u goed dien. Met albei modules is 'n rugsteunbattery nodig.

Dit is 'n goeie idee om 'n nuwe CR2032 -battery te koop en dit by die module te pas. Behalwe dat hulle die tyd en datum byhou, bevat hierdie modules ook 'n klein EEPROM, 'n alarmfunksie (slegs DS3231) en die vermoë om 'n vierkantsgolf van verskillende frekwensies te genereer, wat almal 'n tweede tutoriaal sal wees.

Stap 1: Koppel u module aan 'n Arduino

Beide modules gebruik die I2C -bus, wat die verbinding baie maklik maak.

Eerstens moet u identifiseer watter penne op u Arduino of versoenbare borde vir die I2C -bus gebruik word - dit sal bekend staan as SDA (of data) en SCL (of klok). Op Arduino Uno of versoenbare borde is hierdie penne A4 en A5 vir data en klok; Op die Arduino Mega is die penne D20 en D21 vir data en klok; En as u 'n Pro Mini-versoenbaar gebruik, is die penne A4 en A5 vir data en klok, wat parallel is met die hoofpenne.

DS1307 module

As u die DS1307 -module het, moet u die drade aan die bord soldeer, of soldeer aan 'n paar inline -koppenne sodat u jumperdrade kan gebruik. Koppel dan die SCL- en SDA -penne aan u Arduino, en die Vcc -pen aan die 5V -pen en GND aan GND.

DS3231 module

Dit is maklik om hierdie module aan te sluit, aangesien kopstukke in die fabriek op die bord geïnstalleer is. U kan eenvoudig weer draaddrade van SCL en SDA na die Arduino en weer van die module se Vcc- en GND -penne na die 5V of 3.3. V en GND van u bord lei. Dit word egter aan die ander kant gedupliseer om u eie drade te soldeer. Beide hierdie modules het die vereiste optrekweerstands, dus u hoef nie u eie by te voeg nie. Soos alle toestelle wat aan die I2C -bus gekoppel is, probeer om die lengte van die SDA- en SCL -drade tot 'n minimum te beperk.

Stap 2: Lees en skryf die tyd uit u RTC -module

Nadat u u RTC -module opgestel het. voer die volgende skets in en laai dit op. Alhoewel die aantekeninge en funksies in die skets slegs na die DS3231 verwys, werk die kode ook met die DS1307.

#sluit "Wire.h" in #define DS3231_I2C_ADDRESS 0x68 // Skakel normale desimale getalle om in binêre gekodeerde desimale greep decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Skakel binêre gekodeerde desimale om na normale desimale getalle byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } ongeldige opstelling () {Wire.begin (); Serial.begin (9600); // stel die aanvanklike tyd hier in: // DS3231 sekondes, minute, ure, dag, datum, maand, jaar // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte sekonde, byte minuut, byte uur, byte dayOfWeek, byte dayOfMonth, byte maand, byte jaar) {// stel tyd- en datumdata in op DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // stel die volgende invoer in om te begin by die sekondêre register Wire.write (decToBcd (tweede)); // stel sekondes Wire.write (decToBcd (minuut)); // stel minute Wire.write (decToBcd (uur)); // stel ure Wire.write (decToBcd (dayOfWeek)); // stel weekdag (1 = Sondag, 7 = Saterdag) Wire.write (decToBcd (dayOfMonth)); // stel datum (1 tot 31) Wire.write (decToBcd (maand)); // stel maand Wire.write (decToBcd (jaar)); // stel jaar (0 tot 99) Wire.endTransmission (); } leegte lees DS3231time (byte *tweede, byte *minuut, byte *uur, byte *dagOfWeek, byte *dagOfMaand, byte *maand, byte *jaar) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // stel DS3231 registerwyser op 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // versoek sewe grepe data van DS3231 vanaf register 00h *second = 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 displayTime () {byte sekonde, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar; // haal data op van DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // stuur dit na die seriële monitor Serial.print (uur, DEC); // verander die greep veranderlike na 'n desimale getal wanneer dit Serial.print (":") vertoon word; if (minuut <10) {Serial.print ("0"); } Serial.print (minuut, DEC); Serial.print (":"); as (tweede <10) {Serial.print ("0"); } Serial.print (tweede, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (maand, DEC); Serial.print ("/"); Serial.print (jaar, DEC); Serial.print ("Dag van die week:"); switch (dayOfWeek) {saak 1: Serial.println ("Sondag"); breek; saak 2: Serial.println ("Maandag"); breek; saak 3: Serial.println ("Dinsdag"); breek; saak 4: Serial.println ("Woensdag"); breek; saak 5: Serial.println ("Donderdag"); breek; saak 6: Serial.println ("Vrydag"); breek; saak 7: Serial.println ("Saterdag"); breek; }} leemte -lus () {displayTime (); // die real-time klokdata op die seriële monitor vertoon, vertraging (1000); // elke sekonde }

Daar kan baie kode wees, maar dit verdeel goed in hanteerbare dele.

Dit bevat eers die Wire -biblioteek, wat gebruik word vir I2C -buskommunikasie, gevolg deur die busadres vir die RTC as 0x68 te definieer. Dit word gevolg deur twee funksies wat desimale getalle na BCD (binêre gekodeerde desimale) omskakel en omgekeerd. Dit is nodig aangesien die RTC IC's in BCD werk, nie desimaal nie.

Die funksie setDS3231time () word gebruik om die klok in te stel. Dit is baie maklik om dit te gebruik; voeg eenvoudig die waardes van jaar tot tweede in, en die RTC sal vanaf daardie tyd begin. As u byvoorbeeld die volgende datum en tyd wil stel - Woensdag 26 November 2014 en 21:42 en 30 sekondes - gebruik u:

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

Stap 3:

Let daarop dat die tyd met behulp van 24-uur tyd ingestel is, en die vierde parameter is die 'dag van die week'. Dit val tussen 1 en 7, wat onderskeidelik Sondag tot Saterdag is. Hierdie parameters is bytewaardes as u u eie veranderlikes vervang.

Sodra u die funksie uitgevoer het, is dit raadsaam om dit voor te stel met // en u kode weer op te laai, sodat dit nie die tyd sal herstel as die krag gesluit is of die mikrokontroleerder herstel is nie. Die lees van die tyd van u RTC is net so eenvoudig; die proses kan eintlik netjies binne die funksie displayTime () gevolg word. U sal sewe byte veranderlikes moet definieer om die data van die RTC te stoor, en dit word dan in die funksie readDS3231time () ingevoeg. As u veranderlikes byvoorbeeld is:

grepe sekonde, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar;

… u sou hulle verfris met die huidige data van die RTC deur die volgende te gebruik:

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

Dan kan u die veranderlikes gebruik, soos u dit goedvind, van die stuur van die tyd en datum na die seriële monitor soos die voorbeeldskets doen - tot die omskakeling van die data in 'n geskikte vorm vir allerhande uitvoertoestelle.

Net om te kyk of alles werk, voer die gepaste tyd en datum in die demonstrasie -skets in, laai dit op, lewer kommentaar op die funksie setDS3231time () en laai dit weer op. Maak dan die seriële monitor oop, en u moet 'n lopende weergawe van die huidige tyd en datum kry.

Vanaf hierdie tydstip het u nou die sagtewaregereedskap om data in te stel en dit uit u intydse klokmodule op te haal, en ons hoop dat u 'n begrip het van hoe u hierdie goedkoop modules kan gebruik.

U kan meer leer oor die spesifieke real-time klok-IC's op die webwerf van die vervaardiger-DS1307 en DS3231.

Hierdie pos word deur pmdway.com aan u gebring - alles vir vervaardigers en elektronika -entoesiaste, met gratis aflewering wêreldwyd.