1 de março de 2022

Relógio e Temperatura no Arduino - RTC DS3231

Quando é necessário que o projeto tenha um controle de data/hora, utilizamos o circuito RTC (Real-time clock).


O módulo DS3231 possui uma bateria externa para manter o relógio em atividade quando o circuito estiver desligado e um sensor de temperatura ambiente integrado.

A comunicação com o microcontrolador é através do protocolo I2C.

 
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*---------------------------------------------------------
  Programa : RTC DS3231
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 19/02/2022
  ---------------------------------------------------------*/
#include <DS3231.h> //https://github.com/jarzebski/Arduino-DS3231

DS3231 rtc;
RTCDateTime dt;

void setup () {
  //Inicializa a comunicação serial
  Serial.begin(115200);

  //Inicializa o módulo RTC DS3231
  rtc.begin();

  //Mensagem inicial
  Serial.println("RTC DS3231  -  www.efeitonerd.com.br");
  Serial.println("Para ajustar o RTC informe a data e hora no formato dd/MM/yyyy HH:mm:ss");
  delay(1000);
}

void loop () {
  String strSerial = "";

  //Recebe a string da serial para ajuste de data/hora
  while (Serial.available() > 0) {
    strSerial += Serial.readString();
    delay(10);
  }
  if (strSerial.length() == 19) {
    setRTC(strSerial);
  }

  //Retorna os valores atuais do RTC para a variável dt
  dt = rtc.getDateTime();

  //Exibe os valores atuais
  Serial.println("\nValores atuais do RTC:");

  //Formato Data/Hora
  char str[20];
  sprintf(str, "%02d/%02d/%04d %02d:%02d:%02d", dt.day, dt.month, dt.year, dt.hour, dt.minute, dt.second);
  Serial.print("\t- Data/hora: ");
  Serial.println(str);

  //Formato data extenso
  Serial.print("\t- Data extenso: ");
  Serial.print(getStrWeekday(dt.dayOfWeek));
  Serial.print(", ");
  Serial.print(dt.day);
  Serial.print(" de ");
  Serial.print(getStrMonth(dt.month));
  Serial.print(" de ");
  Serial.println(dt.year);

  //Temperatura
  Serial.print("\t- Temperatura: ");
  Serial.print(rtc.readTemperature());
  Serial.println("º");

  delay(3000);
}

void setRTC(String dateTime) {
  //Formato: dd/MM/yyyy HH:mm:ss  (Ex.: 19/02/2022 07:30:00)
  int year = dateTime.substring(6, 10).toInt();
  int month = dateTime.substring(3, 5).toInt();
  int day = dateTime.substring(0, 2).toInt();
  int hour = dateTime.substring(11, 13).toInt();
  int minute = dateTime.substring(14, 16).toInt();
  int second = dateTime.substring(17, 19).toInt();
  Serial.println("\nAjustando data/hora...");
  rtc.setDateTime(year, month, day, hour, minute, second);
  Serial.println("OK!");
}

String getStrWeekday(int dayOfWeek) {
  switch (dayOfWeek) {
    case 1:
      return "Segunda-feira";
      break;
    case 2:
      return "Terca-feira";
      break;
    case 3:
      return "Quarta-feira";
      break;
    case 4:
      return "Quinta-feira";
      break;
    case 5:
      return "Sexta-feira";
      break;
    case 6:
      return "Sabado";
      break;
    case 7:
      return "Domingo";
      break;
    default:
      return "";
  }
}

String getStrMonth(int month) {
  switch (month) {
    case 1:
      return "Janeiro";
      break;
    case 2:
      return "Fevereiro";
      break;
    case 3:
      return "Marco";
      break;
    case 4:
      return "Abril";
      break;
    case 5:
      return "Maio";
      break;
    case 6:
      return "Junho";
      break;
    case 7:
      return "Julho";
      break;
    case 8:
      return "Agosto";
      break;
    case 9:
      return "Setembro";
      break;
    case 10:
      return "Outubro";
      break;
    case 11:
      return "Novembro";
      break;
    case 12:
      return "Dezembro";
      break;
    default:
      return "";
  }
}

4 comentários:

  1. Qual a melhor versao do Arduino para iniciante,lembrando que eu tenho UNO . Eu ainda nem consegui fazer funcionar o Dsplay LquidCristal_12.h. Alguem pode explicar para mim como fazer

    ResponderExcluir
    Respostas
    1. Bom dia! Os modelos Uno e Nano são ótimos! Eles possuem os recursos necessários para o aprendizado!

      Excluir
  2. Notei que as entrada A4 e A5 é mais usada mas não consegui entender como fica assim : o Display liga no A4 e A5 ,mas por outras caisas pede essa mesma entrada por exemplo relogio RTC como resolver?

    ResponderExcluir
    Respostas
    1. Bom dia! As entradas A4 e A5 no Arduino Uno são as que possui a comunicação com protocolo I2C, que é o utilizado nesse módulo RTC. É possível utilizar mais de um periférico, através do endereço do protocolo. Dê umas pesquisada sobre comunicação I2C. Abraços!

      Excluir