Todo computador é equipado com um relógio interno de tempo real (Real Time Clock) que lhe permite saber a data. Os microcontroladores Arduino não possuem RTC. O módulo DS3231 dá ao Arduino a capacidade de calcular a data, o que lhe permite um controle mais preciso do tempo.
Material
- Computador
- Arduino UNO
- Cabo USB A Macho/B Macho
- Real Time Clock DS3231
Princípio de funcionamento
Um módulo de relógio de tempo real é normalmente equipado com um oscilador de quartzo que mede o tempo, e com uma bateria que permite manter o registro desta medição quando a fonte de alimentação principal está desligada.
Esquema
O módulo DS3231 utiliza comunicação I2C para fazer interface com o microcontrolador. As ligações são:
- SDA no pino A4
- SCL no pino A5
- VCC no pino 5V
- GND no pino GND
Código
Para comunicar com o módulo DS3231 usamos a biblioteca DS3231.h, que deve ser instalada no gerenciador de bibliotecas. Na primeira utilização do módulo ou quando a bateria é trocada, a hora e a data não estarão ajustadas. No código a seguir, é possível definir a data (incluindo a hora) introduzindo-a no monitor serial no formato YYMMDDwHHMMSSx. Depois de introduzi-la, reinicie a placa para que o módulo a leve em conta.
Com a data corretamente definida, pode recarregar o código suprimindo as partes setDate e getDateStuff.
//Libraries
#include <Wire.h>//https://www.arduino.cc/en/reference/wire
#include <DS3231.h>//https://github.com/NorthernWidget/DS3231
//Variables
byte Year ;
byte Month ;
byte Date ;
byte DoW ;
byte Hour ;
byte Minute ;
byte Second ;
bool Century = false;
bool h12 ;
bool PM ;
//Objects
DS3231 Clock;
void setup() {
//Init Serial USB
Serial.begin(9600);
Serial.println(F("Initialize System"));
Wire.begin();
}
void loop() {
setDate();//Comment once the date is set
readRTC();
}
void readRTC( ) { /* function readRTC */
////Read Real Time Clock
Serial.print(Clock.getYear(), DEC);
Serial.print("-");
Serial.print(Clock.getMonth(Century), DEC);
Serial.print("-");
Serial.print(Clock.getDate(), DEC);
Serial.print(" ");
Serial.print(Clock.getHour(h12, PM), DEC); //24-hr
Serial.print(":");
Serial.print(Clock.getMinute(), DEC);
Serial.print(":");
Serial.println(Clock.getSecond(), DEC);
delay(1000);
}
void setDate( ) { /* function setDate */
////Set Real Time Clock
if (Serial.available()) {
//int _start = millis();
GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second);
Clock.setClockMode(false); // set to 24h
Clock.setSecond(Second);
Clock.setMinute(Minute);
Clock.setHour(Hour);
Clock.setDate(Date);
Clock.setMonth(Month);
Clock.setYear(Year);
Clock.setDoW(DoW);
}
}
void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW, byte& Hour, byte& Minute, byte& Second) { /* function GetDateStuff */
////Get date data
// Call this if you notice something coming in on
// the serial port. The stuff coming in should be in
// the order YYMMDDwHHMMSS, with an 'x' at the end.
boolean GotString = false;
char InChar;
byte Temp1, Temp2;
char InString[20];
byte j = 0;
while (!GotString) {
if (Serial.available()) {
InChar = Serial.read();
InString[j] = InChar;
j += 1;
if (InChar == 'x') {
GotString = true;
}
}
}
Serial.println(InString);
// Read Year first
Temp1 = (byte)InString[0] - 48;
Temp2 = (byte)InString[1] - 48;
Year = Temp1 * 10 + Temp2;
// now month
Temp1 = (byte)InString[2] - 48;
Temp2 = (byte)InString[3] - 48;
Month = Temp1 * 10 + Temp2;
// now date
Temp1 = (byte)InString[4] - 48;
Temp2 = (byte)InString[5] - 48;
Day = Temp1 * 10 + Temp2;
// now Day of Week
DoW = (byte)InString[6] - 48;
// now Hour
Temp1 = (byte)InString[7] - 48;
Temp2 = (byte)InString[8] - 48;
Hour = Temp1 * 10 + Temp2;
// now Minute
Temp1 = (byte)InString[9] - 48;
Temp2 = (byte)InString[10] - 48;
Minute = Temp1 * 10 + Temp2;
// now Second
Temp1 = (byte)InString[11] - 48;
Temp2 = (byte)InString[12] - 48;
Second = Temp1 * 10 + Temp2;
}
Resultado
Depois de definir hora e data e de reinicializar a placa, a data é exibida a cada segundo. A função delay() foi adicionada para simplificar a visualização no monitor serial. Na prática, a função não é necessária quando se utiliza o módulo DS3231.
Aplicações
- Criar um despertador com o Arduino
Fontes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

