Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


Controle Automático de Umidificador usando ESP32/8266


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:






Postar um comentário

6 Comentários

  1. Fernando. Qual modelo de DHT utilizou, 11, 12 ou 22…?

    ResponderExcluir
  2. Muito show de bola, uma duvida, eu posso substituir o esp32 por um esp8266?

    ResponderExcluir
  3. Olá, 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!!

    ResponderExcluir
  4. Olá 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