Termômetro e relógio com TM1637 e DS1307

Posted by

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.

Diagrama esquemático do display de temperatura e horário
Diagrama esquemático do display de temperatura e horário

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.

TM1637 + DS1307 + NTC montados na protoboard
TM1637 + DS1307 + NTC montados na protoboard

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.

Display TM1637 monstrando temperatura
Display mostrando 25ºC
Display mostrando horário
Display mostrando horário

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

O seu endereço de email não será publicado. Campos obrigatórios marcados com *