Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


Automação ESP32 e DHT22



Pessoal, hoje eu trago para vocês um exemplo que eu uso na prática no meu CPD, que é utilizar o ESP32 para monitorar a temperatura e a umidade. Vou, então, te mostrar como fazer a leitura de temperatura e umidade através do sensor DHT22 e enviar os valores para o Firebase. Utilizamos também o App Fernando K para visualizar os gráficos.





RECURSOS USADOS

  • ESP32
  • Protoboard
  • Jumpers
  • DHT22
  • Smartphone com AppFernandoK





MONTAGEM





BIBLIOTECAS

Biblioteca SimpleDHT

Na IDE do Arduino vá em Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale SimpleDHT



Biblioteca GFX Library

Na IDE do Arduino vá em Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale Adafruit GFX Library



Biblioteca ST7735

Na IDE do Arduino vá em Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale Adafruit ST7735 and ST7789 library



Biblioteca Firebase

IOXhop_FirebaseESP32:


Descompacte na pasta de libs do arduino IDE
(C:\Users\<SEU_USUARIO>\Documents\Arduino\libraries)


Biblioteca ArduinoJson

Na sua Arduino IDE vá em:
Sketch -> Incluir biblioteca -> Gerenciar bibliotecas
Pesquise por: arduinojson
Procure pela biblioteca descrita como: ArduinoJson by Benoit Blanchon


Selecione a versão 5.13.3


E clique em instalar





FLUXOGRAMA





CÓDIGO

Declarações e variáveis

#include <WiFi.h> //Lib WiFi
#include <SimpleDHT.h> //Lib DHT
#include <IOXhop_FirebaseESP32.h> //Lib Firebase
#include <ArduinoJson.h> //Lib para a manipulação de Json
#include <Adafruit_GFX.h> //Lib Display
#include <Adafruit_ST7735.h> //Lib Display
#include <Fonts/FreeSans9pt7b.h> //Lib Display

#define FIREBASE_HOST "xxxxxxxxxx.firebaseio.com" // URL da base de dados fornecido pelo Firebase para a conexão http
#define FIREBASE_AUTH "" // Autenticação (no caso não estamos usando)

#define DHTPIN 26 //Pino onde o DHT está ligado
#define INTERVAL 5000 //Intervalo entre cada leitura do sensor

//SSID e senha da rede WiFi onde o esp32 irá se conectar 
#define SSID "SSID"
#define PASSWORD "PASSWORD"

//Pinos do display
#define DISPLAY_DC 12 //A0
#define DISPLAY_CS 13 //CS
#define DISPLAY_MOSI 14 //SDA
#define DISPLAY_CLK 27 //SCK
#define DISPLAY_RST 0

#define ROW_HEIGHT 18 //Altura da linha de texto que vamos usar no display
#define DISPLAY_WIDTH 160 //Largura do display
#define LEFT_MARGIN 9 //Margem para distanciar o texto do canto do display

//Objeto responsável pelo display
Adafruit_ST7735 display = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST);

//Objeto que realiza a leitura da umidade e temperatura
SimpleDHT22 dht;

//Variáveis que vão guardar o valor da temperatura e umidade
float temperature, humidity;

//Marca quando foi feita a última leitura
uint32_t lastTimeRead = 0;


Setup

void setup()
{
  Serial.begin(115200);
  
  //Inicializa o display
  setupDisplay();

  //Inicializa a conexão com a rede WiFi
  setupWiFi();

  //Inicializa a lib do Firebase
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}


setupDisplay

//Inicialização do display
void setupDisplay()
{
  //Inicializa o display
  display.initR(INITR_BLACKTAB);
  //Rotaciona o conteúdo mostrado
  display.setRotation(3);
  //Configura a fonte do texto
  display.setFont(&FreeSans9pt7b);
  //Pinta a tela toda de preto
  display.fillScreen(ST77XX_BLACK);
  //Configura e mostra o texto da umidade
  display.setCursor(LEFT_MARGIN, ROW_HEIGHT);
  display.setTextColor(ST77XX_CYAN);
  display.print("Humidity:");
  //Configura e mostra o texto da temperatura na quarta linha
  display.setCursor(LEFT_MARGIN, 4*ROW_HEIGHT);
  display.setTextColor(ST77XX_RED);
  display.print("Temperature:");
}


setupWiFi

//Conexão com a rede WiFi
void setupWiFi()
{
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);

  //Tenta conectar à rede que possui este SSID e senha
  WiFi.begin(SSID, PASSWORD);
  Serial.println("");

  //Enquanto não estiver conectado à rede WiFi
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }

  //Se chegou aqui está conectado
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(SSID);

  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}


Loop

void loop()
{
  //Tempo em millissegundos desde o boot do esp
  unsigned long now = millis();

  //Se passou o intervalo desde a última leitura
  if(now - lastTimeRead > INTERVAL)
  {
    //Faz a leitura do sensor
    readSensor();

    //Mostra no display
    showOnDisplay();

    //Envia para o Firebase
    sendToFirebase();

    //Marca quando ocorreu a última leitura
    lastTimeRead = now;
  }
}


readSensor

//Realiza a leitura da temperatura e umidade
void readSensor()
{
  float t, h;
  //Coloca o valor lido da temperatura em t e da umidade em h
  int status = dht.read2(DHTPIN, &t, &h, NULL);
 
  //Se a leitura foi bem sucedida
  if (status == SimpleDHTErrSuccess) {
    //Os valores foram lidos corretamente, então é seguro colocar nas variáveis
    temperature = t;
    humidity = h;
  }
}


showOnDisplay

//Mostra a umidade no display
void showOnDisplay()
{
  //Strings que serão exibidas no display
  String strHumidity = String(humidity) + "%";
  String strTemperature = String(temperature) + "C";

  //Limpa o texto da umidade anterior
  display.fillRect(0, ROW_HEIGHT + 5, DISPLAY_WIDTH, ROW_HEIGHT, ST77XX_BLACK);
  //Posiciona o cursor na segunda linha
  display.setCursor(LEFT_MARGIN, 2*ROW_HEIGHT);
  //Configura a cor do texto como ciano
  display.setTextColor(ST77XX_CYAN);
  //Mostra a String da umidade
  display.println(strHumidity);
  //Limpa o texto da temperatura anterior
  display.fillRect(0, 4*ROW_HEIGHT + 5, DISPLAY_WIDTH, ROW_HEIGHT, ST77XX_BLACK);
  //Posiciona o cursor na quinta linha
  display.setCursor(LEFT_MARGIN, 5*ROW_HEIGHT);
  //Configura a cor do texto como vermelho
  display.setTextColor(ST77XX_RED);
  //Mostra a String da temperatura
  display.println(strTemperature);
}


sendToFirebase

//Envia a temperatura e umidade para o Firebase
void sendToFirebase()
{
  //Buffer para a criação dos jsons
  StaticJsonBuffer<150> jsonBufferSensor; 
  StaticJsonBuffer<50> jsonBufferTimestamp;
  //Criamos o objeto json que será enviado
  JsonObject& sensorData = jsonBufferSensor.createObject(); 
  sensorData["T"] = temperature; //Inserimos os atributo de temperatura
  sensorData["H"] = humidity; //Inserimos os atributo de umidade
  //Criamos o objeto json referente ao timestamp (Json auxiliar)
  JsonObject& timestamp = jsonBufferTimestamp.createObject();
  //Marcamos como um valor que o server do Firebase irá preencher com o timestamp
  timestamp[".sv"] = "timestamp"; 
  //Inserimos o json referente ao timestamp no json que será enviado
  sensorData["timestamp"] = timestamp; 
  //Enviamos o json sensorData para o Firebase no path /History
  Firebase.push("/History", sensorData);
  //Limpamos os buffers dos jsons
  jsonBufferTimestamp.clear();
  jsonBufferSensor.clear();
}




FIREBASE



Digite o nome do projeto e clique em “Continuar”


Desative a opção Analytics já que não vamos utilizar neste exemplo.










APP FERNANDO K




Adicione nome para a conexão e adicione dataBaseURL (o mesmo em FIREBASE_HOST do .ino) e clique em “Add”


A conexão aparecerá na lista. Clique nela.






Clique uma vez em cada botão que acabou de criar. Cada botão irá criar um gráfico.


Se tudo ocorreu bem uma mensagem como esta será exibida no terminal. Arraste o terminal para o lado esquerdo.


Um gráfico com os os dados da temperatura será exibido.


Arraste novamente para a esquerda e será exibido o gráfico com os dados da umidade.






FAÇA O DOWNLOAD DOS ARQUIVOS

PDF

INO

Postar um comentário

2 Comentários

  1. Parabéns Fernando. Copiei e executei seu projeto. Funcionou de primeira! Conectou de primeira no firebase, no aplicativo e compilação. Achei que tinha feito coisa errada de tão perfeito que foi! huahuahua. Só alterei para DHT11 que é o que eu tenho aqui e removi as libs/funções de display pois não tenho o HW. Show! Muito obrigado mesmo!!!

    ResponderExcluir
  2. obrigado professor! Ótima aula! Parabens!

    ResponderExcluir