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(); } 50>150>
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.
2 Comentários
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!!!
ResponderExcluirobrigado professor! Ótima aula! Parabens!
ResponderExcluir