#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;
}
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);
}
//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:");
}
//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());
}
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;
}
}
//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;
}
}
//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);
}
//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();
}