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 ""; } } |
Nenhum comentário:
Postar um comentário