Pessoal, hoje eu resolvi
mostrar aqui para vocês um projeto que, na verdade, fiz pra usar na minha
própria casa. Eu tenho um umidificador de ar e, ora ele deixa o ambiente seco
demais, ora deixa até o piso molhado ao redor dele. Foi, então, que pensei: uso
tanto o DHT em tudo, então, por que não fazer um controle automático de
umidade? Foi o que fiz e vou te passar neste vídeo: como fazer um ESP32 ler a
umidade e mostrá-la em um display Oled. Ainda, baseado na umidade, o ESP32 vai,
através do protocolo ESP-NOW, enviar sinal para um ESP8266 ligar ou desligar o
relé.
Uma dica é que, neste mesmo
projeto, como já mostrei em outros vídeos, você também pode ler a temperatura
do ambiente.
Loop
Neste fluxograma explicamos
cada passo do projeto:
1º - ESP32 lê a umidade.
2º - Mostra umidade no display
3º - Verifica umidade:
- Abaixo do limite inferior: envia
Sinal para o ESP8266 ligar o relé
- Acima do limite superior: envia
Sinal para o ESP8266 desligar o relé
ESP32 Pinout
Montagem
Demonstração
Na demonstração que temos no
vídeo, o Led está aceso porque a umidade está em 45%. Porém, quando eu sopro e
a umidade vai a 93%, esse Led apaga. Isso é apenas para mostrar que, quando a
umidade fica acima de 60%, o Led é apagado. Temos, então, o ESP8266 e o ESP32
montados sobre uma placa padrão. O ESP32 está conectado ao DHT e ao display
Oled.
Biblioteca SimpleDHT
Na IDE do Arduino vá em
Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale SimpleDHT
Biblioteca U8g2
Na IDE do Arduino vá em
Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale U8g2
ESP32_EspNow_Master.ino
Sugiro que, antes de fazer
este projeto, você assista este vídeo que eu já gravei de ESP-NOW: ESP32 COM PROTOCOLO ESP-NOW.
Para iniciar, aqui vamos
incluir as bibliotecas e fazer a definição dos pinos. Instanciamos o objeto
display, o objeto que realiza a leitura da umidade, apontamos o array que está
aguardando o MacAdress, e criamos a variável que guarda o valor da umidade.
#include <esp_now.h>
#include <WiFi.h>
#include <SimpleDHT.h>
#include <U8x8lib.h>
#define DHTPIN 4
#define MAX_HUMIDITY 60
#define MIN_HUMIDITY 50
#define INTERVAL 10000
#define ESPNOW_CHANNEL 1
//SDA = 21 e SCL = 22
U8X8_SSD1306_128X64_NONAME_SW_I2C display(SCL, SDA, U8X8_PIN_NONE);
uint8_t slaveMacAddress[] = {0x1A,0xFE,0x34,0xA5,0x90,0x69};
esp_now_peer_info_t slave;
//Objeto que realiza a leitura da umidade
SimpleDHT22 dht;
//Variável para guardarmos o valor da umidade
float humidity = 0;
ESP32_EspNow_Master.ino – setup
No Setup, tenho um alerta: se
você não der WiFi.disconnect o circuito fica instável, pois quando você faz
isso, ele limpa qualquer informação anterior que tinha na memória.
void setup() {
Serial.begin(115200);
WiFi.disconnect();
WiFi.mode(WIFI_STA);
setupDisplay();
setupESPNow();
setupSlave();
}
ESP32_EspNow_Master.ino – loop
No Loop, fazemos a leitura do
sensor e expomos os dados no display.
void loop() {
readSensor();
showOnDisplay();
verifyHumidity();
delay(INTERVAL);
}
ESP32_EspNow_Master.ino – setupDisplay
Aqui detalhamos as funções:
inicializamos o display e configuramos alguns parâmetros. Iniciamos o modo
powerSave e definimos a fonte a ser utilizada no display.
void setupDisplay(){
//inicializa o display e configura alguns parâmetros
display.begin();
display.setPowerSave(0); //modo powerSave (0-Off ? 1-On)
display.setFont(u8x8_font_torussansbold8_u); //fonte utilizada
}
ESP32_EspNow_Master.ino – setupESPNow
Determinamos aqui o que será
impresso no display em caso de inicialização bem sucedida ou com algum tipo de
erro. Neste último caso, após informar o seu estado, ele reinicia o ESP.
void setupESPNow() {
//Se a inicialização foi bem sucedida
if (esp_now_init() == ESP_OK) {
Serial.println("ESPNow Init Success");
}
//Se houve erro na inicialização
else {
Serial.println("ESPNow Init Failed");
ESP.restart();
}
}
ESP32_EspNow_Master.ino – setupSlave
Definimos aqui o canal, copiamos
o endereço do array para a estrutura do slave e adicionamos o slave.
void setupSlave(){
slave.channel = ESPNOW_CHANNEL;
//0 para não usar criptografia ou 1 para usar
slave.encrypt = 0;
//Copia o endereço do array para a estrutura do slave
memcpy(slave.peer_addr, slaveMacAddress, 6);
//Adiciona o slave
esp_now_add_peer(&slave);
}
ESP32_EspNow_Master.ino – sendRelayStatus
Passo aqui um argumento que é
o status do relé. Neste caso, especificamente, o meu era o Led. Ele exibe,
então, se a ação foi bem sucedida ou deu erro.
void sendRelayStatus(int relayStatus){
esp_err_t result = esp_now_send(slaveMacAddress, (uint8_t*)&relayStatus, 1);
Serial.print("Send Status: ");
if (result == ESP_OK) {
Serial.println("Success");
}
else {
Serial.println("Error");
}
}
ESP32_EspNow_Master.ino - verifyHumidity
Nesta fase é que verificamos
se a umidade está fora dos limites e informamos ao ESP8266 se o relé deve ficar
ligado ou desligado.
//Verifica se a umidade está fora dos limites e informa ao ESP8266
//se o relê deve ficar ligado ou desligado
void verifyHumidity(){
if(humidity > MAX_HUMIDITY)
{
Serial.println("Umidade máxima atingida, enviando sinal para desligar o relê");
sendRelayStatus(LOW);
}
else if(humidity < MIN_HUMIDITY)
{
Serial.println("Umidade mínima atingida, enviando sinal para ligar o relê");
sendRelayStatus(HIGH);
}
}
ESP32_EspNow_Master.ino – readSensor
Função responsável por
realizar a leitura da umidade.
//Função responsável por realizar a leitura
//da umidade
void readSensor(){
float h;
int status = dht.read2(DHTPIN, NULL, &h, NULL);
if (status == SimpleDHTErrSuccess) {
humidity = h;
}
}
ESP32_EspNow_Master.ino – showOnDisplay
Mostramos a umidade no display.
//Mostra a umidade no display
void showOnDisplay(){
String strHumdity = "HUMIDITY: " + String(humidity);
display.clearLine(0);
display.drawString(0, 0, strHumdity.c_str());
}
ESP8266_EspNow_Slave.ino
No Setup do ESP8266 ESP-Now,
temos uma nova biblioteca para incluir, as chamadas de funções, no entanto, são
iguais. Também colocamos a ESP8266WiFI.h e definimos o 5 como pino de relé.
extern "C" {
#include <espnow.h>
}
#include <ESP8266WiFi.h>
#define RELAY_PIN 5
ESP8266_EspNow_Slave.ino - setup
Colocamos o pino do relé como
saída e com sinal baixo. Resetamos, então, as configurações de WiFi e colocamos
em modo AP. Copiamos o endereço que aparece e colocamos no slaveMacAddress do
Master.
void setup() {
Serial.begin(115200);
//Coloca o pino do relê como saída e coloca com sinal baixo
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
//Reseta as configurações da WiFi
WiFi.disconnect();
//Coloca em modo AP
WiFi.mode(WIFI_AP);
setupESPNow();
//Copiar o endereço que aparece aqui e colocar
//no slaveMacAddress do Master
Serial.print("AP MAC: ");
Serial.println(WiFi.softAPmacAddress());
}
ESP8266_EspNow_Slave.ino – setupESPNow
Inicializamos o ESP-Now e registramos
a função que será executada quando novos dados chegarem.
void setupESPNow(){
//Inicializa o ESPNOW
if (esp_now_init()!=0) {
Serial.println("EspNow init failed");
ESP.restart();
}
//0=IDLE, 1=MASTER, 2=SLAVE and 3=MASTER+SLAVE
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
//Registra a função que será executada quando novos
//dados chegarem
esp_now_register_recv_cb(receiveCallback);
}
ESP8266_EspNow_Slave.ino –
receiveCallback
Prosseguindo, na função
Callback, definimos o relayStatus para receber o data[0].
//Função que será executada quando chegarem novos dados
void receiveCallback(uint8_t *mac, uint8_t *data, uint8_t len) {
int relayStatus = data[0];
digitalWrite(RELAY_PIN, relayStatus);
}
ESP8266_EspNow_Slave.ino - loop
Não temos nada para fazer no Loop
já que as informações são recebidas pelo receiveCallback automaticamente quando
novos dados chegam.
//Nada para fazer no loop já que as informações
//são recebidas pelo receiveCallback
//automaticamente quando novos dados chegam
void loop() {
}
Faça o download dos arquivos:








6 Comentários
show!! Baita Video, Parabéns!
ResponderExcluirFernando. Qual modelo de DHT utilizou, 11, 12 ou 22…?
ResponderExcluirMuito show de bola, uma duvida, eu posso substituir o esp32 por um esp8266?
ResponderExcluirachei no video :D
ExcluirOlá, Fernando! Muito bom o vídeo, como sempre. Eu preciso fazer algo bem parecido com essa sua montagem. A diferença é que ao invés de ler um DHT e tomar alguma decisão em cima deste valor, eu queria que o ESP32 funcionasse como um Access Point e recebesse comandos a partir de um celular Androir.. sem internet envolvida nisso tudo.. o celular conecta direto na rede wifi criada pelo AP do ESP32 e passa os comandos.. e o ESP32 repassa os comandos para os NodeMCUs via ESPNOW. Já viu ou tentou fazer algo parecido? Abraços!!
ResponderExcluirOlá bom dia Fernando tudo bem? Muito bom seus vídeos e seus ensinamentos. Me tire uma dúvida fiz certinho a configuração, mas no meu caso nos testes parece que o ESP32 quando liga fixa a umidade somente em um grau, se desligar e soprar o DHT ele muda quando ligo o ESP novamente fica na mesma unidade do momento da leitura, parece que o sistema não atualiza a umidade. Por gentileza se puder me ajudar agradeço.
ResponderExcluir