Vamos implementar um relógio e termômetro de display LED com DS1307 e TM1637. Ele mostrará a temperatura e o tempo alternadamente em um display de 7 segmentos de 4 dígitos controlado pelo Arduino.
Nós falamos sobre o controlador de relógio em tempo real (RTC) CI DS1307 aqui. Ele é capaz de manter hora, minuto, segundo, dia, mês e ano (incluindo bissexto) mesmo quando não há energia. Isso se deve à presença de uma bateria CR2032 a bordo. Ele se comunica com o Arduino via i2c.
O TM1637 é um chip capaz de controlar displays de 7 segmentos de até quatro dígitos usando apenas dois pinos digitais do Arduino. Então a temperatura será lida por meio de um termistor NTC, que vimos aqui.
O diagrama esquemático é visto abaixo. Observe que o driver de LED TM1637 usa apenas os pinos 2 e 3 (pode ser qualquer pino), o DS1307 usa i2c (pinos A4 e A5 do Arduino) e o NTC usa o pino analógico A0.
A montagem do circuito na bancada resultou na imagem abaixo. Observe que montei o NTC e seu resistor em série em uma pequena placa perfurada.
O código
O código pode ser copiado abaixo. Observe que você tem que (apenas uma vez) definir o relógio RTC, veja o link acima (o artigo completo sobre ele) para ver como fazer isso. Eu tive que inventar minha própria maneira de lidar com um problema: não consegui encontrar uma maneira de mostrar um int (a temperatura) e um char (a letra “c”).
#include <Arduino.h>
#include <TM1637Display.h>
//Load RTC DS1307's library
#include <DS1307.h>
// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
//Random comment
//i2c ports in Arduino UNO
DS1307 rtc(A4, A5);
char* hour;
char* minute;
int hourint;
int minuteint;
int hourminute;
const uint8_t cletter[] = {
SEG_A | SEG_D | SEG_E | SEG_F //Letter 'C'
};
TM1637Display display(CLK, DIO);
// Thermistor pin
const int pinThermistor = A0;
// thermistor parameters
const double beta = 3950.0;
const double r0 = 10000.0;
const double t0 = 273.0 + 25.0;
const double rx = r0 * exp(-beta/t0);
// circuit parameters
const double vcc = 4.92;
const double R = 9810.0;
// Number of samples
const int nsamples = 5;
long currenttime;
long oldtime= 0;
int sweepcounter;
void setup() {
// put your setup code here, to run once:
rtc.halt(false);
//Serial.begin(9600);
display.clear();
Serial.begin(9600);
}
void loop() {
currenttime= micros();
if(currenttime - oldtime >= 100000){
oldtime= micros();
sweepcounter++;
if(sweepcounter == 1){
hour = strtok(rtc.getTimeStr(), ":");
//Serial.print("hour= ");
//Serial.println(hour);
minute= strtok(NULL, ":");
//Serial.print("minute= ");
//Serial.println(minute);
hourint= atoi(hour)*100; //to integer conversion
minuteint= atoi(minute);
hourminute= hourint + minuteint;
display.setBrightness(0x0f);
if(sweepcounter == 1){
display.clear();
}
display.showNumberDecEx(hourminute, 0x40, false);
// how to show the dots in the middle: https://forum.arduino.cc/t/how-to-show-the-two-dots-on-4-digit-7-segments-display/592130/2
Serial.println("passou no 1");
}else if(sweepcounter == 50){
// Read the sensor a couple of times
int sum = 0;
for (int i = 0; i < nsamples; i++) {
sum += analogRead(pinThermistor);
delay (5);
}
// Thermistor resistance
double v = (vcc*sum)/(nsamples*1024.0);
double rt = (vcc*R)/v - R;
// Temperature calculations (celsius)
double t = beta / log(rt/rx);
int tempcelsius= t-273.0;
display.showNumberDecEx(tempcelsius, false, 1, 3);
display.setSegments(cletter, 1, 3); //Letter 'C'
Serial.println("passou no 50");
}else if(sweepcounter == 70){
sweepcounter= 0;
Serial.println("passou no 70");
}else{
}
}
}
O que eu fiz foi primeiro mostrar a temperatura (um int) e imediatamente depois mostrar a letra “c”:
display.showNumberDecEx(tempcelsius, false, 1, 3);
display.setSegments(cletter, 1, 3); //Letter 'C'
Dessa forma, as coisas ocorrem uma após a outra e dá ao usuário a impressão de estarem acontecendo ao mesmo tempo. Outra coisa digna de nota é a leitura do termistor NTC: ele usou equações do meu post anterior aqui.
O resultado final
O resultado final está nas fotos e no vídeo abaixo, o tempo é exibido por 5 segundos e depois a temperatura é exibida por 2 segundos.
Para finalizar
Hoje em dia, implementar um relógio digital não é nada difícil. O Arduino tem várias maneiras, controladores e displays diferentes para fazer isso.
Você quer replicar esse relógio em casa? Obtenha o controlador LED TM1637, o termistor NTC e o RTC DS1307 dos meus links de afiliados Aliexpress.
Deixe um comentário