Um termômetro digital que exibe informações de temperatura e a umidade, estas lidas por um sensor e estampadas em um gráfico colorido, tudo isso em tempo real. Esse é nosso projeto de hoje, no qual explico sobre a utilização do display Oled serial, que se trata de um display 2c, que possibilita a impressão de dados com auxílio de um sensor AM2302 DHT22, usando um NodeMCU ESP8266.
Neste vídeo, portanto, temos o DHT22, um velho e conhecido medidor de temperatura e umidade, que envia os dados por ele coletados para serem impressos no display, que exibirá um gráfico colorido, como na foto acima. Veja a montagem no vídeo abaixo:
Display OLED 96” SSD 1331
No nosso exemplo, o display
utilizado foi um 0,96 polegada. É um display bem pequeno, ou seja, bastante compacto,
mas que tem ótima qualidade de imagem. Exibe informações sobre temperatura em
graus e umidade em porcentual.
Sensor de Umidade e Temperatura
AM2302 DHT22
Esse modelo de sensor, na
realidade, tem três pinos, ao invés dos quatro que são exibidos. Isso porque,
no número 2 temos o pino DATA, o qual a gente usa para mandar dados para o
ESP8266.
Montagem
No circuito temos o display exibindo
temperatura e umidade, o qual está ligado ao ESP8266, do tipo ESP12. O esquema
que temos na imagem abaixo não tem mistério, mas preste atenção para não errar
os pinos. No lado esquerdo mostro as devidas ligações entre o NodeMCU com o
display e com o sensor. Basta segui-las.
Bibliotecas
Adicione a seguinte biblioteca
“DHT sensor library” para comunicação com o sensor de umidade e temperatura.
Basta acessar “Sketch >>
Incluir Bibliotecas >> Gerenciar Bibliotecas...”
Agora, adicione a seguinte
biblioteca “Adafruit-GFX-Library-master”.
Basta acessar “Sketch >>
Incluir Bibliotecas >> Gerenciar Bibliotecas...”
Na sequência, adicione a
seguinte biblioteca “Adafruit Unified Sensor”.
Basta acessar “Sketch >>
Incluir Bibliotecas >> Gerenciar Bibliotecas...”
Por fim, adicione também a
biblioteca “Adafruit-SSD1331-OLED” para comunicação com o display oled.
Acesse o link e faça download da biblioteca.
Descompacte o arquivo e cole
na pasta de bibliotecas da IDE do arduino.
C:/Program Files
(x86)/Arduino/libraries
Código
Primeiramente vamos adicionar
as bibliotecas que serão utilizadas em nosso código.
#include <Adafruit_GFX.h> #include <Adafruit_SSD1331.h> //#include <SPI.h> #include <DHT.h>
Definições
Vemos abaixo as variáveis que
utilizaremos durante o programa e a instância dos objetos.
// pinagem para o NodeMCU ESP8266 #define sclk D5 #define mosi D7 #define cs D8 #define rst D3 #define dc D1 // definição das cores que serão utilizadas #define BLACK 0x0000 #define RED 0xF800 #define CYAN 0x07FF #define YELLOW 0xFFE0 #define WHITE 0xFFFF
Prosseguindo:
#define DHTPIN D6 // pino de dados do DHT será ligado no D6 do esp #define DHTTYPE DHT22 // tipo do sensor // construtor do objeto para comunicar com o sensor DHT dht(DHTPIN, DHTTYPE); // contrutor do objeto para comunicar com o display OLED Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, mosi, sclk, rst); //variáveis que armazenarão os valores lidos da umidade e temperatura int umidade = 0; int temperatura = 0; //variável que armazenará o valor da coordenada Y para desenharmos uma linha de exemplo //que varia os valores de 1 em 1 int linhaExemplo = 20; int fator = 1; //indicará se somaremos ou subtrairemos uma unidade na variável linhaExemplo
Continuando, tratamos do
posicionamento do gráfico:
//variável responsavel por contar o número de leituras realizadas e indicador do valor no eixo X int leituraAtual = 1; //definições do posicionamento dos eixos X e Y #define POS_X_GRAFICO 5 #define POS_Y_GRAFICO 1 #define ALTURA_GRAFICO 50 #define COMPRIMENTO_GRAFICO 90 //definição da coordenada onde escreveremos os dados de temperatura e umidade #define POS_X_DADOS 10 #define POS_Y_DADOS 54
Setup
Na função setup(), faremos a
inicialização da variável “dht”, que é responsável pela comunicação com o
sensor de umidade e temperatura, inicializaremos também a variável “display”
que utilizaremos para se comunicar com o display oled.
void setup(void) {
Serial.begin(9600);
//inicializa o objeto para comunicarmos com o sensor DHT
dht.begin();
//inicializa o objeto para comunicarmos com o displa OLED
display.begin();
Seguimos configurando algumas
características do display e para desenhar os eixos X e Y do gráfico:
//pinta a tela toda de preto display.fillScreen(BLACK); //os comandos a seguir irão desenhar as linhas dos eixos cartesianos na cor branca //drawFastVLine(x,y,width,color) --> linha vertical display.drawFastVLine(POS_X_GRAFICO,POS_Y_GRAFICO, ALTURA_GRAFICO,WHITE); //eixo Y //drawFastHLine(x,y,width,color) --> linha horizontal display.drawFastHLine(POS_X_GRAFICO,ALTURA_GRAFICO+1,COMPRIMENTO_GRAFICO,WHITE); //eixo X //desenha 2 pixels na tela bem no início do eixo Y para formar uma "seta" display.drawPixel(4,2,WHITE); display.drawPixel(6,2,WHITE); //desenha 2 pixels na tela bem no final do eixo X para formar uma "seta" display.drawPixel(POS_X_GRAFICO+COMPRIMENTO_GRAFICO-2,POS_Y_GRAFICO+ALTURA_GRAFICO-1,WHITE); display.drawPixel(POS_X_GRAFICO+COMPRIMENTO_GRAFICO-2,POS_Y_GRAFICO+ALTURA_GRAFICO+1,WHITE);
Agora vamos desenhar em tela
no lugar específico onde indicaremos o valor da Temperatura (T) e Umidade (U)
em tempo real.
//configura o tamnaho do texto que escreveremos em tela
display.setTextSize(1);
//configura a cor branca para o texto
display.setTextColor(WHITE);
//posiciona o cursor para escrita
display.setCursor(POS_X_DADOS, POS_Y_DADOS);
display.print("T: "); //indicando a temperatura
display.setCursor(POS_X_DADOS+35, POS_Y_DADOS);
display.print(" U: "); //indicando a umidade
}
Loop
Na função loop(), vamos
recuperar a umidade e temperatura lidas pelo sensor e escrever na tela no local
específico. A cada intervalo de 5 segundos o valor é lido do sensor e escrito
em tela.
void loop() {
//faz a leitura da umidade
umidade = dht.readHumidity();
Serial.println(umidade);
//faz a leitura da temperatura
temperatura = dht.readTemperature();
Serial.println(temperatura);
//limpa a área onde colocamos o valor da temperatura e da umidade
display.fillRect(POS_X_DADOS+15, POS_Y_DADOS, 20, 10, BLACK);
display.fillRect(POS_X_DADOS+55, POS_Y_DADOS, 30, 10, BLACK);
//reposiciona o cursor para escrever a temperatura
display.setCursor(POS_X_DADOS+15, POS_Y_DADOS);
display.setTextColor(RED);
display.print(temperatura);
display.print((char)247);
//reposiciona o cursor para escrever a umidade
display.setCursor(POS_X_DADOS+55, POS_Y_DADOS);
display.setTextColor(CYAN);
display.print(umidade);
display.print("%");
Vejamos abaixo como colocar os
pontos no gráfico de acordo com a leitura.
//mapeando o valor das variáveis para colocar no gráfico //necessário pois o display tem 64px de altura e separamos apenas 50 para o gráfico //umidade pode ser lida de 0-100 int temperaturaMepeada = map(temperatura,0,100,0,50); int umidadeMapeada = map(umidade,0,100,0,50); //desenha na tela o ponto referente aos valores lidos do sensor display.drawPixel(POS_X_GRAFICO+leituraAtual, ALTURA_GRAFICO-temperaturaMepeada, RED); display.drawPixel(POS_X_GRAFICO+leituraAtual, ALTURA_GRAFICO-umidadeMapeada, CYAN); //desenha na tela o ponto referente a nossa linha de exemplo que fica variando display.drawPixel(POS_X_GRAFICO+leituraAtual, ALTURA_GRAFICO-linhaExemplo, YELLOW); //aqui controlamos nossa linha de exemplo, quando chega no valor máximo decrementamos o valor //até um valor mínimo determinado (no nosso caso 10), e a partir daí, incrementa novamente if(linhaExemplo == 50) fator = -1; else if(linhaExemplo == 10) fator = 1; //soma o valor de linhaExemplo linhaExemplo += fator; //incrementa o contador de leituras realizadas leituraAtual++;
Por último vamos escrever
nossa lógica para limpar a tela do gráfico assim que atingir seu limite
//se a leitura chegar em 90 (número máximo do eixo X) então limparemos a área do gráfico para voltarmos a desenhar.
if(leituraAtual == 90)
{
//limpa a área toda do gráfico
display.fillRect(POS_X_GRAFICO+1, POS_Y_GRAFICO-1, COMPRIMENTO_GRAFICO, ALTURA_GRAFICO-1, BLACK);
leituraAtual = 1; //volta o contador de leitura para 1 (nova coordenada X)
//como limpamos a área do gráfico, temos que redesenhar os pontos da "seta"
display.drawPixel(6,2,WHITE);
display.drawPixel(POS_X_GRAFICO+COMPRIMENTO_GRAFICO-2,POS_Y_GRAFICO+ALTURA_GRAFICO-1,WHITE);
}
//intervalo de tempo para realizarmos nova leitura de dados
delay(5000);
}
Arquivos para download:










5 Comentários
IMPECÁVEL
ResponderExcluirLegal demais, parabéns pelo trabalho
ResponderExcluiresse display usa conexão spi?? tou usando o arduino micro e não estou conseguindo saber quais pinos servem pra isso , alguem poderia me ajudar..
ResponderExcluirola boa tarde estou enfrentando dificuldades em mostrar uma leitura analogica em um display oled de 128x32 vc poderia me ajudar? no serial e no diplay 16x2 mostra normal mas quando vou aplicar num display oled não da
ResponderExcluirBoa noite, estou tendo um problema na programação nesta parte :
ResponderExcluir"#define DHTPIN D6 // pino de dados do DHT será ligado no D6 do esp
#define DHTTYPE DHT22 // tipo do sensor"
dizendo que a variavel D6 não foi declarada !