In acest articol vom folosi modulul DS3231. Acesta este un RTC (Real Time Clock), sau, mai pe romaneste, Ceas de Timp Real.
Conectarea la Arduino se face prin interfata I2C, asta inseamna ca vom folosi doar 2 fire de conexiune.
Se conecteaza SDA si SCL de la modul la echivalentele lor de placuta Arduino. Alimentarea modulului se face cu 5V.
Modulul initial vine neprogramat si de aceea va trebui ca ora si data sa o programam noi. Pentru acest lucru vom folosi libraria DS1307RTC (chiar daca scrie ca este pentru chip-ul DS1307 putem programa si chip-urile DS3231). Aceasta librarie se poate descarca de pe acest site. Pe langa libraria precedenta vom avea nevoie si de libraria Time, aceasta putand fi descarcata de aici.
Modulul arata ca in pozele de mai jos:
Iar sketch-ul pentru programarea acestui modul se poate gasi in Arduino la meniul Fisier > Exemple > DS1307RTC > SetTime.
Acest sketch este si mai jos:
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
const char *monthName[12] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
tmElements_t tm;
void setup() {
bool parse=false;
bool config=false;
// get the date and time the compiler was run
if (getDate(__DATE__) && getTime(__TIME__)) {
parse = true;
// and configure the RTC with this info
if (RTC.write(tm)) {
config = true;
}
}
Serial.begin(9600);
while (!Serial) ; // wait for Arduino Serial Monitor
delay(200);
if (parse && config) {
Serial.print("DS1307 configured Time=");
Serial.print(__TIME__);
Serial.print(", Date=");
Serial.println(__DATE__);
} else if (parse) {
Serial.println("DS1307 Communication Error :-{");
Serial.println("Please check your circuitry");
} else {
Serial.print("Could not parse info from the compiler, Time=\"");
Serial.print(__TIME__);
Serial.print("\", Date=\"");
Serial.print(__DATE__);
Serial.println("\"");
}
}
void loop() {
}
bool getTime(const char *str)
{
int Hour, Min, Sec;
if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
tm.Hour = Hour;
tm.Minute = Min;
tm.Second = Sec;
return true;
}
bool getDate(const char *str)
{
char Month[12];
int Day, Year;
uint8_t monthIndex;
if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
for (monthIndex = 0; monthIndex < 12; monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0) break;
}
if (monthIndex >= 12) return false;
tm.Day = Day;
tm.Month = monthIndex + 1;
tm.Year = CalendarYrToTm(Year);
return true;
}
Pentru a verifica daca modulul a fost programat corect vom folosi un alt sketch tot din exemplele cu care vine libraria. Acest sketch poate fi incarcat accesand din Arduino meniul Fisier > Exemple > DS1307RTC > ReadTest.
Rezultatele vor fi afisate in terminalul serial.
Acest sketch va fi postat si mai jos:
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
void setup() {
Serial.begin(9600);
while (!Serial) ; // wait for serial
delay(200);
Serial.println("DS1307RTC Read Test");
Serial.println("-------------------");
}
void loop() {
tmElements_t tm;
if (RTC.read(tm)) {
Serial.print("Ok, Time = ");
print2digits(tm.Hour);
Serial.write(':');
print2digits(tm.Minute);
Serial.write(':');
print2digits(tm.Second);
Serial.print(", Date (D/M/Y) = ");
Serial.print(tm.Day);
Serial.write('/');
Serial.print(tm.Month);
Serial.write('/');
Serial.print(tmYearToCalendar(tm.Year));
Serial.println();
} else {
if (RTC.chipPresent()) {
Serial.println("The DS1307 is stopped. Please run the SetTime");
Serial.println("example to initialize the time and begin running.");
Serial.println();
} else {
Serial.println("DS1307 read error! Please check the circuitry.");
Serial.println();
}
delay(9000);
}
delay(1000);
}
void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}
Am facut montajul pe breadboard pentru a vedea cum functioneaza:
Apoi am rulat ultimul sketch si am deschis terminalul serial pentru a vedea daca se afiseaza ora si data corect:
Observand ca data si ora sunt cele corecte am scos modulul de pe placuta de test, am asteptat un minut apoi am reconectat modulul in circuit si am verificat iarasi terminalul serial pentru a vedea daca data si ora s-au pastrat:
Lasa un comentariu