Display Nokia 5110 com DHT11 e Arduino
No post anterior, falamos do famoso sensor de temperatura DHT11, um componente barato e muito fácil de usar. Neste post, vamos mostrar como você pode usar o display lcd Nokia 5110 com o DHT11, mostrando as informações de temperatura e umidade na tela.
Conexão do display Nokia 5110 com DHT11 e Arduino
Na imagem abaixo temos uma placa Arduino Uno, onde conectamos o display nos pinos digitais de 8 a 12, e o sensor de temperatura e umidade DHT11 no pino analógico 1:
Atenção ao pino de backlight, onde temos um resistor para limitar a corrente e evitar danos ao display. Usei um de 330 ohms que nos meus testes foram suficientes, mas você pode usar outros valores de acordo com os resistores que tiver em mãos.
Basicamente eu juntei os 2 post que eu fiz sobre o assunto, e, ao invés de mandar o resultado para o monitor serial, estou enviando para o display, gerando o resultado abaixo:
O display Nokia é um display bem interessante para esse tipo de montagem. Ele possui backlight e além disso é gráfico, ou seja, você pode mostrar nesse display tanto texto como gráficos.
O controlador do Nokia 5110 é o PCD8544. Maiores informações você encontra no datasheet.
Carregue o programa abaixo no Arduino, que usa as bibliotecas Adafruit_GFX e Adafruit_PCD8544.
No programa usei 4 variáveis para armazenamento dos valores máximo e mínimo de temperatura e umidade, mostrando-as no final da tela. Usei também a função da biblioteca (display.drawRect) para desenho da borda.
//Programa : Display Nokia 5110 e sensor de temperatura DHT11 //Autor : Arduino e Cia #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <dht.h> #define dht_dpin A1 //Pino DATA do Sensor ligado na porta Analogica A1 dht DHT; // pin 8 - Serial clock out (SCLK) // pin 9 - Serial data out (DIN) // pin 10 - Data/Command select (D/C) // pin 11 - LCD chip select (CS/CE) // pin 12 - LCD reset (RST) Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12); // Variáveis que guardam a temperatura máxima e mínima int maxtemp = -100,mintemp = 100; // Variáveis que guardam a umidade máxima e mínima int maxhum = -100, minhum = 100; int temperatura,umidade; static unsigned char PROGMEM grau[] = { B00001100, B00010010, B00001100, B00000000,}; //Array simbolo grau void setup() { Serial.begin(9600); display.begin(); display.setContrast(50); //Ajusta o contraste do display display.clearDisplay(); //Apaga o buffer e o display display.setTextSize(1); //Seta o tamanho do texto display.drawRect(0,0, 84,48, BLACK); //Desenha o retangulo da borda display.drawRect(1,1, 82,46, BLACK); //Desenha o retangulo da borda display.display(); } void loop() { DHT.read11(dht_dpin); //Lê as informações do sensor temperatura = DHT.temperature; umidade = DHT.humidity; //Armazena a temperatura máxima na variável maxtemp if(temperatura > maxtemp) {maxtemp = temperatura;} //Armazena a temperatura minima na variável mintemp if(temperatura < mintemp) {mintemp = temperatura;} //Armazena a umidade máxima na variável maxhum if(umidade > maxhum) {maxhum = umidade;} //Armazena a umidade minima na variável minhum if(umidade < minhum) {minhum = umidade;} display.setTextColor(BLACK,WHITE); //Seta a cor do texto display.setCursor(3,5); //Seta a posição do cursor display.print("Temp : "); display.print(temperatura); //Desenha o simbolo do grau na posicao 56,5 display.drawBitmap(56,5, grau, 8, 4, BLACK); display.setCursor(65,5); display.println("C"); display.setCursor(3,13); display.print("Umid : "); display.print(umidade); display.println(" %\n"); display.setCursor(3,24); display.print("Max:"); display.print(maxtemp); display.drawBitmap(37,24, grau, 8, 4, BLACK); display.setCursor(46,24); display.print("C/"); display.print(maxhum); display.println(" %"); display.setCursor(3,32); display.print("Min:"); display.print(mintemp); display.drawBitmap(37,32, grau, 8, 4, BLACK); display.setCursor(46,32); display.print("C/"); display.print(minhum); display.println(" %"); display.display(); delay(2000); //Aduarda 2 segundos e reinicia o processo }
Por ser um display gráfico, você consegue posicionar os caracteres no pixel desejado, não ficando restrito ao espaço de um caracter. Repare nas linhas contendo “display.setCursor”, onde se pode usar qualquer valor para posicionar o texto no display e evitar as bordas.
Gostou? Confira outros posts com display Nokia 5110 aqui mesmo no Arduino e Cia!
Olá,é possível utilizar os displays LCDs mais atuais de smartphones em Arduino? IPhone,galaxy S3 ou otros,tablets…
esses já são mais caros mano!!!
Ola Arthur ! Possível é. Complicado é arrumar os datasheets dos displays para fazer isso, já que cada fabricante de celular não faz muita questão de divulgar essa informação. O display Nokia 5110 permite a ligação ao Arduino usando poucos pinos, o que facilita bastante o trabalho. Já outros displays de celular tem vários pinos, tornando difícil a tarefa de descobrir a função de cada um e provavelmente exigindo a utilização de um circuito auxiliar. Mas não é uma tarefa impossível. Abraço !
e tem outra coisa!! esses displays tem cabo flat entao meio dificil implementar!!!!
Ola, estou enfrentando alguns erros na hora da compilação, vários erros parecidos com este: C:Program FilesArduinolibrariesRobot_ControlArduinoRobot.cpp:18: error: 'MUXA' was not declared in this scope, poderia me ajudar?
Boa noite Bruno !
É com algum programa ou biblioteca específica ?
também encontrei o mesmo problema do Bruno… como resolver?
Bom dia Leandro. Você também está tendo problema na hora de compilar ? Pode me dar mais informações sobre o erro ? Abraço !
O problema parece ser na biblioteca do LCD… seria possível você compartilhar o arquivo da biblioteca q vc esta utilizando? Segue abaixo alguns dos erros
In file included from sketch_feb23f.ino:1:
C:UsersPublicDocumentsDocumentsArduinolibrariesPCD8544/Adafruit_GFX.h:11: error: stray '302' in program
C:UsersPublicDocumentsDocumentsArduinolibrariesPCD8544/Adafruit_GFX.h:11: error: stray '267' in program
C:UsersPublicDocumentsDocumentsArduinolibrariesPCD8544/Adafruit_GFX.h:242: error: stray '@' in program
C:UsersPublicDocumentsDocumentsArduinolibrariesPCD8544/Adafruit_GFX.h:725: error: expected unqualified-id before '<' token
Boa tarde Leandro,
Eu usei nos posts essa biblioteca da Adafruit :
https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library
Veja se funciona, por favor.
Abraço.
Ola Arthur, muito bom esse posto.
Pode ria me ajudar com uma programaçao para esse sensor.
Gostaria de fazer um set point de temperatura e umidade.(quando atingir uma certa temperatura ative uma saida.Quando reparar o erro deslia a saida).
Desde ja agradeço.
Boa noite,
Seria apenas uma saída ? Com qual faixa de temperatura você iria trabalhar para acionar a saída ?
Abraço !
BOA NOITE GALERA DO ARDUINO E CIA.
TBM SOU BEM INTERESSADO EM PROJETOS COM ARDUINO.
TENTEI COMPILAR E ESTA APARECENDO OS SEGUINTES ERROS.
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp: In constructor 'RobotControl::RobotControl()':
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:8: error: 'LCD_CS' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:8: error: 'DC_LCD' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:8: error: 'RST_LCD' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp: In member function 'void RobotControl::begin()':
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:18: error: 'MUXA' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:18: error: 'MUXB' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:18: error: 'MUXC' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:18: error: 'MUXD' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:19: error: 'MUX_IN' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:22: error: 'BUZZ' was not declared in this scope
PODEM ME AJUDAR.
DESDE JÁ AGRADECO A TODOS VCS.
Bom dia Fábio,
Isso parece ser erro de biblioteca…. foi instalada corretamente ?
Abraço !
mesmo erro alguém conseguiu solucionar?
Boa tarde Guilherme,
Qual erro está apresentando ?
Abraço.
Esse erro aqui:
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp: In constructor 'RobotControl::RobotControl()':
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:8: error: 'LCD_CS' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:8: error: 'DC_LCD' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:8: error: 'RST_LCD' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp: In member function 'void RobotControl::begin()':
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:18: error: 'MUXA' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:18: error: 'MUXB' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:18: error: 'MUXC' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:18: error: 'MUXD' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:19: error: 'MUX_IN' was not declared in this scope
C:Program Files (x86)ArduinolibrariesRobot_ControlArduinoRobot.cpp:22: error: 'BUZZ' was not declared in this scope
Boa tarde Guilherme,
Esse erro apareceu quando você compilou o programa desse post ?
Abraço.
sim!!!
entra na pasta da bilbioteca Robot_Control e renomeia os arquivos que os erros acabam
Alguém me ajude!!!
Estou com problema no código na hora de compilar diz:
Display_Nokia.ino:27:35: error: variable 'grau' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
Erro compilando.
Estou fazendo este projeto na hora de compilar aparece este erro:
Arduino: 1.6.0 (Windows 8), Placa:"Arduino Uno"
Display_Nokia.ino:27:35: error: variable 'grau' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
Erro compilando.
Não consigo sair deste ponto! oque devo fazer?
Boa noite Marcos,
Eu testei aqui e com a versão 1.6.0 da IDE apresenta esse erro. Tentei corrigir mexendo na biblioteca mas gerou um monte de outros erros.
Como solução temporária, recomendo usar a versão 1.0.5 da IDE, que compilou o programa normalmente.
Abraço !
Para solucionar o erro Display_Nokia.ino:27:35: error: variable 'grau' must be const in order to be put into read-only section by means of '__attribute__((progmem))
Basta alterar a linha 27: static unsigned char PROGMEM grau[] =
Para: const static unsigned char PROGMEM grau[] =
Funciona normal o código em qualquer versão da IDE
Como faço para apagar todas as informações do display? Utilizei o display.clearDisplay() porem ele só apagou as bordas, queria apagar todas as informações, e então mostrar só a temperatura por 4s, depois a umidade, e então voltar as informações gerais. Obrgdo
Oi Pedro,
Qual display você está utilizando ? O azul ? Eu fiz uns testes e ele apaga totalmente o display.
Abraço.
Olá amigo, parabéns pelo projeto. Gostaria se possivel da sua ajuda. gostaria de saber como posso mostrar uma variavel analógica na tela. estou utilizando a mesma biblioteca que vc. seria o valor de um sensor de corrente, com formato ( 2,45 A) por ex.
Bom dia Alan,
Obrigado. Você está lendo o valor de uma porta analógica, correto ? Crie uma variável e faça a leitura do valor:
valor_sensor = analogRead(porta_analogica)
Depois, exiba na tela normalmente, como eu fiz com os outros valores:
display.print(porta_analogica)
Abraço !
Consegui chegar ate aqui! Como falei, gostaria de mostrar o valor na tela
#include
#include
#include
// pin 8 – Serial clock out (SCLK)
// pin 9 – Serial data out (DIN)
// pin 10 – Data/Command select (D/C)
// pin 11 – LCD chip select (CS/CE)
// pin 12 – LCD reset (RST)
int sensorPin = A0;
int sensorValue_aux = 0;
float sensorValue = 0;
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
void setup()
{
Serial.begin(9600);
display.begin();
display.setContrast(50); //Ajusta o contraste do display
display.clearDisplay(); //Apaga o buffer e o display
display.setTextSize(1); //Seta o tamanho do texto
display.drawRect(0,0, 84,48, BLACK); //Desenha o retangulo da borda
display.drawRect(1,1, 82,46, BLACK); //Desenha o retangulo da borda
display.setTextColor(BLACK); //Seta a cor do texto
display.setCursor(0 ,0); //Seta a posição do cursor
display.display();
}
void loop()
{
for(int i=514; i>0; i–)
{
sensorValue_aux = (analogRead(sensorPin) – 514);
sensorValue += pow(sensorValue_aux, 2);
}
sensorValue = (sqrt(sensorValue / 514)) * 33,00 / 1024;
display.setTextColor(BLACK); //Seta a cor do texto
display.setCursor(5,3); //Seta a posição do cursor
display.print(sensorValue);
display.print(" A ");
// mostra o resultado no terminal
Serial.println(sensorValue,2);
sensorValue =0;
delay(500);
}
Só queria que um desenho aparece-se , depois de acionar um botão, alguém pode me socorrer????? :/
Querido amigo. Gostei muito do seu artigo e fiz, funciona bem com o Arduino 1.8.13. Infelizmente, os valores não mostram um sinal de menos. Como eu só entendia um pouco sobre programação, você poderia escrever para exibir o sinal de menos também?
Atenciosamente, um velho radioamador, HA5ALP Janos
Esta é uma tradução do GOOGLE.
Boa noite Imrik!
Tudo bem? Interessante isso, pq aqui no Brasil geralmente não temos valores negativos de temperatura na maior parte do país. 🙂
Consegue me enviar uma foto do que está acontecendo com o seu display? Gostaria de ver essa questão do sinal de menos que não está aparecendo.
Saudações!
Adilson