Alteração 35.1 – Termômetro com display de 7-segmentos

Este experimento é uma mistura do experimento anterior, que demonstra o uso de um display de 7 segmentos com Arduino, e do experimento 29, que implementa um termômetro com o LM35DZ.

Material adicional:

  • Circuito integrado LM35DZ (termômetro digital analógico).

O esquema consiste apenas em acrescentar o LM35, que será conectado a uma entrada analógica. Mudamos para a entrada A3, já que o display está usando as primeiras três entradas analógicas como saídas digitais:

Uma possível implementação com o protoboard está ilustrada abaixo:

Para simplificar o programa e facilitar o reuso, transferimos o mapeamento dos dígitos e segmentos para uma biblioteca local (chamamos de seven_segment_display.h) contendo o código abaixo:

static int digit[10][7] = {
    {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW},
    {LOW, HIGH,HIGH,LOW, LOW, LOW, LOW},
    {HIGH,HIGH,LOW, HIGH,HIGH,LOW, HIGH},
    {HIGH,HIGH,HIGH,HIGH,LOW, LOW, HIGH},
    {LOW, HIGH,HIGH,LOW, LOW, HIGH,HIGH},
    {HIGH,LOW, HIGH,HIGH,LOW, HIGH,HIGH},
    {HIGH,LOW, HIGH,HIGH,HIGH,HIGH,HIGH}, 
    {HIGH,HIGH,HIGH,LOW, LOW, LOW, LOW}, 
    {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH}, 
    {HIGH,HIGH,HIGH,HIGH,LOW, HIGH,HIGH}
};

const int DISPLAY_LEDS = 7;
const int DISPLAY_DIGITS = 10;

void showNumber(int* disp, int dig) {
    for(int i = 0; i < DISPLAY_LEDS; i++) {
        digitalWrite(disp[i], digit[dig][i]);
    }
}

Para criar o arquivo, clique na seta que fica abaixo do ícone do monitor serial(canto superior direito do IDE do Arduino) e selecione “New Tab”, depois escolha o nome (seven_segment_display.h) e grave.

Para usar é preciso apenas incluir o arquivo no código-fonte principal usando #include, e chamar a função showNumber() passando como argumento o display e o dígito a exibir. No programa abaixo criamos uma função exibir que recebe o número e mostra nos dois displays. Chamamos a função exibir assim que lemos a temperatura a cada 2 segundos:

#include "seven_segment_display.h"

#define TERMOMETRO A3

int unidades[] = {14, 15, 2, 3, 4, 5, 6};
int dezenas[] = {7, 8, 9, 10, 11, 12, 16};
 
void setup() {
    for(int i = 0; i < DISPLAY_LEDS; i++) {
        pinMode(dezenas[i], OUTPUT);
        pinMode(unidades[i], OUTPUT);
    }
    // Usando a referência interna de 1,1V para maior precisão
    analogReference(INTERNAL);
}

void exibir(int numero) {
    showNumber(unidades, numero % 10);
    showNumber(dezenas, numero / 10);
}

void loop() {
    int leitura = analogRead(TERMOMETRO);
    float volts = (leitura / 1024.0) * 1.1;
    float celsius = (volts) * 100.0;
 
    int temperatura = (int) round(celsius); // arredonda
    exibir(temperatura);
 
    delay(2000);
}

Este programa possui uma diferença em relação ao utilizado no experimento 29. Em vez de usar a referência padrão de 5V para leituras analógicas (via analogRead), usamos a referência interna calibrada do Arduino através do comando

analogReference(INTERNAL);

Isto significa que o valor 0 a 1024 não corresponde mais a 0 a 5V, mas a 0 a 1,1V. Isto permite maior precisão na leitura. Assim, para obter a tensão entre o terminal central e GND, dividimos o valor lido por 1024 e depois multiplicamos por 1,1V. Cada grau Celsius corresponde a 0,01 V de diferença, então multiplicamos por 100 para obter a temperatura.

Leave a Reply

Your email address will not be published. Required fields are marked *