Projeto 39 - Display LCD como mostrador de temperatura

Básico - Projeto 39

Display LCD de temperatura

Objetivo

Neste projeto vamos demonstrar o uso de um LCD como mostrador de informações úteis aos usuários, como neste caso, a temperatura obtida através de um sensor de temperatura analógico (LM35). Também adicionaremos um  botão (push button) que quando acionado alterna a exibição da temperatura de Celsius para Fahrenheit.

Resultado de imagem para display lcd pinos soldados

Display LCD - Liquid Crystal Display, ou display de cristal líquido, são displays tipicamente utilizados em calculadoras, mostradores de dados e despertadores digitais.

A criação de projetos com base em displays LCD é muito simples, graças a um conjunto prontamente disponível de bibliotecas de código para LCDs. O IDE do Arduino vem com uma biblioteca desse tipo, a LiquidCrystal.h, que tem uma grande lista de recursos. Para saber como instalar e conhecer os comandos e recursos do display LCD leia: Controlando um display LCD.

Aplicação

Para fins didáticos e projetos com display de cristal líquido.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 830 pontos

Jumpers Kit cabos ligação macho / macho 1  
Display LCD

Display LCD 16X2 com pinos soldado

1

LCD que utilize o controlador HD44780  (veja na descrição ou datasheet do componente)

O display poderá ser de qualquer cor (fundo verde, azul ou vermelho)

Potenciômetro

Potenciômetro 1OK

1 Resultado de imagem para potenciômetro

O valor do potenciômetro aumenta quando giramos o eixo do componente na direção do polo negativo para o polo positivo.

Obs.: Se não possuir potenciômetro de 10KΩ você poderá utilizar um de outro valor, de 1kΩ até 100kΩ.

Push Button 

Push button 6X6X5mm

1  
  Sensor de Temperatura LM35  Sensor de Temperatura LM35  1  

Utilizamos um sensor, segundo o datasheet do fabricante, com faixa de temperatura de -55ºC  até +150ºC e incremento de
10mV/ºC, ou seja, cada vez que a temperatura ambiente aumenta 1ºC, o sensor aumenta em 10mV a tensão no pino de saída.

datasheet

Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.


Atenção

1. Neste projeto vamos utilizar um display LCD 16x2  com controlador HD44780, que se adapta aos mais diversos projetos com vários modelos de placas e microcontroladores. Este display possui 16 colunas por 2 linhas com backlight (luz de fundo) verde, azul ou vermelha e tem 16 pinos para a conexão. Atenção: Utilize um display LCD com os pinos soldados.

border:1px solid #000;

2. Preste muita atenção na montagem do dsiplay LCD. Observe que utilizamos os 6 primeiros pinos do LCD, pulamos os 4 próximos e então utilizamos mais 6pinos. Veja a tabela abaixo:

3. Cuidado para não ligar o sensor de temperatura invertido. Ele deve ficar com a face reta virada para frente, conforme a imagem abaixo, e a face arredondada virada para trás, de forma que o positivo fique ao lado esquerdo do sensor e o negativo ao lado esquerdo do sensor.

4. Monte o botão (push button) sem o resistor, pois através da programação vamos habilitar o resistor pull-up interno do arduino. Desta forma, quando o botão estiver pressionado, o Arduino retornará "LOW" ou "0". Assista o vídeo Arduino: Botão e Resistor de Pull Up Interno

5. Observe que nesse projeto o potenciômetro foi montado como um divisor de tensão, onde utilizamos os 3 terminais do componente:

Obs.: Ao girar o eixo do potenciômetro, o valor da tensão deverá aumentar do negativo para o positivo, ou seja, se a tensão do circuito for 5V, o potenciômetro irá variar de 0 a 5V.

No nosso exemplo, girando-se o eixo do potenciômetro no sentido horário, aumentamos a tensão na entrada do pino 3 do display e diminuímos o contraste dos caracteres com o back light (luz de fundo) até que não é mais possível visualizá-los. Fazendo o contrário, ou seja, diminuindo a tensão até o zero, teremos um contraste máximo entre os caracteres e a luz de fundo.

6. A montagem do nosso projeto foi realizada em um protoboard com linhas de alimentação não contínuas, onde acrescentamos jampers para a ligação. Verifique se o seu protoboard possui linhas de alimentação contínuas ou separadas.

Ligando o display LCD

Para visualizar o display funcionando, digite o código abaixo no ambiente de desenvolvimento IDE do Arduino. Faça a verificação e o upload:

/*******************************************************************************
*
*          Testando o Display LC 16 X 2
*            http://squids.com.br/arduino
*
*******************************************************************************/
//Carrega a biblioteca LiquidCrystal
#include <LiquidCrystal.h>

//Define os pinos que serão utilizados para ligação ao display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
//Define LCD 16 colunas por 2 linhas
lcd.begin(16, 2);

//Posiciona o cursor na coluna 0, linha 0;
lcd.setCursor(0,0);
//Envia o texto entre aspas para o LCD
lcd.print("Ola, meu nome e:");

//Posiciona o cursor na coluna 1, linha 1;
lcd.setCursor(1,1);
//Envia o texto entre aspas para o LCD
lcd.print("Squids Arduino");
}

void loop() {

} 

2. Se o display acender e mostrar os caracteres como na figura abaixo, a ligação está correta.

ATENÇÃO: Se o display acender e não mostrar os caracteres provavelmente é em função do contraste. Gire o eixo do potenciômetro no sentido anti-horário para aumentar o contraste. Se mesmo assim o display não mostrar os caracteres, corrija a montagem do circuito e/ou o código.

Comandos do display LCD para a biblioteca LiquidCrystal

No projeto vamos utilizar alguns comandos de controle do display LCD através da biblioteca LiquidCrystal que já vem embutida na IDE do Arduino. Para conhecer todos os comandos desta biblioteca, acesse o link: Comandos display LCD para biblioteca LiquidCrystal e LiquidCrystal Library (Arduino Reference).

Obs.: Para acessarmos uma biblioteca embutida na IDE do arduino, assim como, para acessarmos um biblioteca local através de um header file, utilizaremos a diretiva #include.

Código do Projeto (Sketch)

1) Faça o dowload e abra o arquivo projeto39.ino no IDE do Arduino: DOWNLOAD - projeto39.ino

Ou se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
*
*    Projeto 39 - Display LCD de Temperatura
*            http://squids.com.br/arduino
*
*******************************************************************************/
//Carrega a biblioteca LiquidCrystal
#include <LiquidCrystal.h>

//Define os pinos que serão utilizados para ligação ao display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int maxC=0, minC=0, maxF=0, minF=0;
int ini = 0;
const int buttonPin=8;

void setup() {
    lcd.begin(16, 2); // Define o display com 16 colunas e 2 linhas
    analogReference(INTERNAL);
    pinMode(buttonPin, INPUT_PULLUP);
    lcd.clear();
}

void loop() {
     int sensor = analogRead(0); // Lê a temperatura do sensor
    // Define a temperatura mínima incial
    if (ini==0) {
        minC = sensor * 0.1075268817204301; // Converte para Celsius
        minF = ((sensor * 0.1075268817204301) * 1.8)+32; // Converte para Fahrenheit
        ini = 1;
    }
    int buttonState = digitalRead(buttonPin); // Verifica se o botão foi pressionado
    delay(250);
    if (buttonState == 1) {
        lcd.clear();
        celsius(sensor);
    } else {
        lcd.clear();
        fahrenheit(sensor);
    }
}

void celsius(int sensor) {
    lcd.setCursor(0,0);
    int temp = sensor * 0.1075268817204301; // Converte para Celsius
    lcd.print(temp);
    lcd.write(B11011111); // Símbolo de grau
    lcd.print("C ");
    if (temp>maxC) {maxC=temp;}
    if (tempmaxF) {maxF=temp;}
    if (temp

Vídeo

Como o projeto deve funcionar

1. Ao executar o programa, a temperatura atual em Celsius será exibida na linha de cima do LCD.

2. A linha de baixo exibirá a temperatura máxima e a mínima, registradas desde que o Arduino foi ligado ou o programa reiniciado.

3. Ao pressionar e manter o botão (push button) pressionado, será alterada a escala de temperatura de Celsius para Ferenheit.

4. Soltando o botão, a escala de temperatura volta para Celsius.

5. Para resetar os valores máximo e mínimo de temperaturas, basta desligar o arduino ou reiniciar o programa pela IDE.

Explicando o Código do Projeto

1. Primeiro definimos e declaramos as constantes e as variáveis do projeto.

1.1. Observe que utilizamos as constantes e variáveis tipo inteiro "int". Veja na tabela abaixo as diferenças nos tipos de constantes e variáveis:

Tipo Valores Válidos para Variáveis e Constantes
char letras e símbolos: 'a', 'b', 'H', '^', '*','1','0'
int de -32767 até 32767 (apenas números inteiros)
float de -3.4 x 1038 até +3.4 x 10+38com até 6 dígitos de precisão (2 casas depois da vírgula)
double de -1.7 x 10308 até +1.7 x 10+308com até 10 dígitos de precisão

1.2. Através do comando #include incluímos o "header file" LiquidCrystal.h para ser compilado junto ao sketch (não utilize ponto e vírgula no final de uma diretiva #include).

1.2.1. A diretiva #include é utilizada para incluir bibliotecas externas em um sketch. Isso dá ao programador acesso a um grande grupo de bibliotecas C padrão (grupos de funções pré definidas) e também bibliotecas específicas para o Arduino. Como exemplo, vamos obter a biblioteca LiquidCrystal.h já embutida na IDE do Arduino.

1.2.2. A biblioteca LiquidCrystal.h já vem incluída no IDE do Arduino e contém todos os comandos e recursos para controlar um display LCD.

1.2.3. Observe que utilizamos <> para incluirmos a biblioteca LiquidCrystal.h. Por padrão e uma boa prática de programação, utilizaremos <> para incluirmos bibliotecas internas do Arduino e aspas para bibliotecas locais (""). Ex:

Biblioteca interna do Arduino: #include

Biblioteca local (projeto 35) : #include "notas.h"

1.3.  Através da instrução LiquidCrystal lcd(12, 11, 5, 4, 3, 2); a biblioteca do LCD faz com que o programa do Arduino saiba que ao dar o comando LiquidCrystal lcd iremos utilizar um display, e faremos a comunicação utilizando os seguintes pinos do Arduino: 12, 11, 5, 4, 3, conforme mostra a tabela abaixo:

1.4. Definimos as variáveis tipo inteiro maxC, minC, maxF e minF como zero.

1.5. Definimos a variável tipo inteiro ini igual a zero. Esta variável irá identificar se o programa foi iniciado ou reiniciado, servindo para registrar os primeiros valores das temperaturas máximo e mínimo.

1.6. Declaramos a constante tipo inteiro buttonPin como 8, referindo-se à conexão do push button com a porta digital 8 do Arduino.

2. Através da estrutura void setup(), definimos:

2.1. Através da instrução lcd.begin(16,2); a biblioteca do LCD informa ao Arduino que será utilizado um display com 16 colunas e 2 linhas.

2.2. O comando analogReference(INTERNAL) configura a tensão de referência usada para entrada analógica. Desta forma, alteramos o valor de tensão máximo que pode entrar nas portas analógicas de 5V para 1,1V. Portanto, se a tensão máxima de leitura ficar definida como 1,1V, poderemos calibrar nosso sensor para ler no máximo 110ºC (1100mV), pois sabemos que o incremento do LM35 que utilizamos é de 10mV/ºC, conforme informações do fabricante - veja na tabela de componentes. - Arduino Reference.

2.2.1. Utilize INTERNAL para Arduino UNO, INTERNAL1 para Ardino Mega. Não utilize o comando analogReference() para o Arduino Leonardo.

2.2.2. A função analogReference(INTERNAL) foi utilizada neste caso para aumentar a resolução de leitura do sensor, sendo que o mesmo lê no máximo 150ºC, conforme informações do fabricante. Portanto, 110ºC para uma tensão máxima de 1,1V é mais adequada para a leitura do que 500ºC para uma tensão máxima de 5V, o que não é percebida pelo sensor que só consegue ler até 150º.

2.2.3. Atenção: Quando você utiliza a função analogReference(INTERNAL) a tensão de referência será alterada para todas as portas analógicas. Desta forma, se você utilizar outros componentes analógicos junto com o sensor LM35, os mesmos poderão não funcionar ou ler dados na tensão modificada. Sendo assim, recomendamos que não utilize a função analogReference(INTERNAL) quando usar outros componentes que utilizem portas analógicas do Arduino.

2.3. Definimos a porta digital referente à variável buttonPin como entrada do controlador Arduino (INPUT_PULLUP) conectadas aos botões (push buttons).

2.2.1. INPUT_PULLUP habilita o resistor pull-up interno do Arduino, eliminando a necessidade de colocarmos um resistor de 10K ligado ao VCC (5V).

Obs.: Os resistores pull-up e pull-down garantem um nível lógico estável quando por exemplo uma tecla não está pressionada. Geralmente utiliza-se um resistor de 10KΩ para esse propósito. A seguir é exibida a ligação desses resistores no circuito para leitura de tecla do botão:

Entradas-e-Saídas-digitais-Arduino-pull-up-pull-down

Atenção: Neste projeto não precisamos do resistor de 10K pois vamos habilitar o resitor pull-up interno do Arduino através da programação - veja o projeto Projeto 02b - Led apaga com push button pressionado (pull-up interno do Arduino).

2.3. O comando lcd.clear() limpa a tela do display LCD.

3. Através da estrutura void loop(), obtemos:

3.1. Através da expressão int sensor = analogRead(0) é feita a leitura do sensor LM35 através da porta analógica A0 e registrada na variável sensor. Esta leitura é realizada pelo ADC do Arduino (Analog to Digital Convert, ou, Conversor de analógico para digitar) resultando em valores de 0 a 1023, ou seja, 210 = 1024 valores inteiros (referente à resolução de 10 bits do ADC para controladores Arduino UNO, Mega e Leonardo). Portanto, se a tensão máxima for equivalente à 1,1V, teremos como leitura 1023 e a mínima zero.

3.2. A estrutura condicional IF verifica se a variável ini=0, ou seja, se o programa foi reiniciado:

3.2.1. Se sim, o programa irá fazer a leitura do sensor LM35 e registrar nas variáveis minC e minF os valores em graus Celsius e Fahrenheit, sendo:

3.2.1.1. Para calcular o valor das variável minC e minF, primeiro precisamos obter o índice de conversão dos valores lidos no ADC do Arduino para temperatura. Como o valor máximo lido será de 110ºC (tensão máxima de 1,1V recebida na porta analógica) equivale ao valor máximo lido no ADC, que é 1023. Logo, utilizando a regra de três determinamos que o índice de conversão é igual a 110/1023, ou seja 0.1075268817204301. Portanto:

3.2.1.2. A variável minC será igual ao valor de sensor multiplicado pelo índice de conversão, ou seja, minC = sensor * 0.1075268817204301. Desta forma determinamos o valor da temperatura em graus Celsius.

3.2.1.3. Para o cálculo da temperatura em Fahrenheit, utilizaremos da mesma forma o índice de conversão para determinar o valor em ºC. Para converter graus Celsius em Fahrenheit utilizaremos a fórmula:

Portanto, F = (sensor * 0.1075268817204301 * 9/5) + 32 => minF = (sensor * 0.1075268817204301 * 1.8 ) + 32.

3.2.1.4. Observe que definimos variáveis globais minC, minF, maxC e maxF como variáveis tipo inteiro. Se desejar visualizar os valores com 2 casas decimais, substitua int por float na definição das variáveis.

3.2.1.5. Define-se a variável ini = 1, ou seja, indicamos que o programa não foi reiniciado. Somente quando desligamos e ligamos o Arduino, ou reiniciamos o programa, a variável voltará a ser zero.

3.3. Através da expressão int buttonState = digitalRead(buttonPin) verificamos se o botão foi acionado. Se sim, a variável buttonState será igual a zero (LOW) -  para botão montado com resistor pull-up.

3.4. Através da função delay(250); o programa espera 250ms. Isto é necessário para o programa reconhecer se o botão foi acionado ou não.

3.5. Através da estrutura condicional IF verifica-se:

3.5.1. Se o botão não foi acionado ou seja, buttonState igual a 1 (HIGH), limpa-se tela do display através do comando lcd.clear() e chama a função celsius(sensor).

3.5.2. Se o botão foi acionado ou seja, buttonState igual a 0 (LOW), limpa-se tela do display através do comando lcd.clear() e chama a função fahreinhet(sensor).

4. Através da estrutura void celsius(int sensor), obtemos:

 4.1. O comando lcd.setCursor(0,0); indica que a posição para imprimir o próximo caractere é a origem do display, ou seja, coluna 0 e linha 0.

Imagem relacionada

4.2. Definimos o valor da temperatura em graus Celsius, variável local temp, utilizando-se o fator de conversão 0.1075268817204301.

4.3. Imprimimos na tela do display o valor da temperatura (variável temp) + o símbolo º + C.

 4.4. A expressão if (temp>maxC) {maxC=temp;} irá manter registrado na variável maxC o valor maior lido. Este valor será alterado quando o Arduino for reinicializado.

4.5. A expressão if (temp irá manter registrado na variável minC o menor valor lido. Este valor será alterado quando o Arduino for reinicializado.

4.6. Imprimimos na tela do display os valores máximo e mínimo lidos:

5. Através da estrutura void fahrenheit(int sensor), obtemos:

5. De forma similar à função celsius(sensor), definimos os valores das temperaturas em Fahrenheit:

Desafios

Com base neste projeto, resolva o seguinte desafio:  Desafio 20

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores