26 maio 2013

Display LCD Nokia 5110 e Sensor de temperatura DHT11

Como comentei no post anterior, segue esquema do circuito usando o display lcd Nokia 5110 junto com o sensor de temperatura e umidade DHT11, que você pode adquirir na FilipeFlop.

lcd nokia 5110 e dht11 arduino
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 :

LCD Nokia 5110 Arduino e DHT11



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//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
 }

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.

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.

29 comentários:

  1. Olá,é possível utilizar os displays LCDs mais atuais de smartphones em Arduino? IPhone,galaxy S3 ou otros,tablets...

    ResponderExcluir
  2. 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 !

    ResponderExcluir
    Respostas
    1. e tem outra coisa!! esses displays tem cabo flat entao meio dificil implementar!!!!

      Excluir
  3. Ola, estou enfrentando alguns erros na hora da compilação, vários erros parecidos com este: C:\Program Files\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXA' was not declared in this scope, poderia me ajudar?

    ResponderExcluir
    Respostas
    1. Boa noite Bruno !

      É com algum programa ou biblioteca específica ?

      Excluir
  4. também encontrei o mesmo problema do Bruno... como resolver?

    ResponderExcluir
    Respostas
    1. Bom dia Leandro. Você também está tendo problema na hora de compilar ? Pode me dar mais informações sobre o erro ? Abraço !

      Excluir
    2. 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:\Users\Public\Documents\Documents\Arduino\libraries\PCD8544/Adafruit_GFX.h:11: error: stray '\302' in program
      C:\Users\Public\Documents\Documents\Arduino\libraries\PCD8544/Adafruit_GFX.h:11: error: stray '\267' in program
      C:\Users\Public\Documents\Documents\Arduino\libraries\PCD8544/Adafruit_GFX.h:242: error: stray '@' in program

      C:\Users\Public\Documents\Documents\Arduino\libraries\PCD8544/Adafruit_GFX.h:725: error: expected unqualified-id before '<' token

      Excluir
    3. 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.

      Excluir
  5. 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.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Seria apenas uma saída ? Com qual faixa de temperatura você iria trabalhar para acionar a saída ?

      Abraço !

      Excluir
  6. 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)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp: In constructor 'RobotControl::RobotControl()':
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'LCD_CS' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'DC_LCD' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'RST_LCD' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp: In member function 'void RobotControl::begin()':
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXA' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXB' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXC' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXD' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:19: error: 'MUX_IN' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:22: error: 'BUZZ' was not declared in this scope

    PODEM ME AJUDAR.
    DESDE JÁ AGRADECO A TODOS VCS.

    ResponderExcluir
    Respostas
    1. Bom dia Fábio,

      Isso parece ser erro de biblioteca.... foi instalada corretamente ?

      Abraço !

      Excluir
  7. mesmo erro alguém conseguiu solucionar?

    ResponderExcluir
    Respostas
    1. Boa tarde Guilherme,

      Qual erro está apresentando ?

      Abraço.

      Excluir
  8. Esse erro aqui:

    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp: In constructor 'RobotControl::RobotControl()':
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'LCD_CS' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'DC_LCD' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: 'RST_LCD' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp: In member function 'void RobotControl::begin()':
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXA' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXB' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXC' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: 'MUXD' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:19: error: 'MUX_IN' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:22: error: 'BUZZ' was not declared in this scope

    ResponderExcluir
    Respostas
    1. Boa tarde Guilherme,

      Esse erro apareceu quando você compilou o programa desse post ?

      Abraço.

      Excluir
  9. entra na pasta da bilbioteca Robot_Control\ e renomeia os arquivos que os erros acabam

    ResponderExcluir
  10. 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.

    ResponderExcluir
  11. 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?

    ResponderExcluir
    Respostas
    1. 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 !

      Excluir
  12. 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

    ResponderExcluir
  13. 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

    ResponderExcluir
    Respostas
    1. Oi Pedro,

      Qual display você está utilizando ? O azul ? Eu fiz uns testes e ele apaga totalmente o display.

      Abraço.

      Excluir
  14. 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.

    ResponderExcluir
    Respostas
    1. 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 !

      Excluir
  15. 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);

    }

    ResponderExcluir