#include <PubSubClient.h>
#include <WiFi.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 5 // Definição dos pinos do sensor DHT22 e tipo do sensor
#define PIN_LEDH 2
#define PIN_LEDT 4
#define DHTTYPE DHT22
#define MSG_BUFFER_SIZE (50) // Tamanho do buffer para mensagens MQTT
const char* ssid = "Wokwi-GUEST"; // Informações da rede Wi-Fi e do servidor MQTT
const char* password = "";
const char* mqtt_server = "mqtt.flespi.io";
const char* mqtt_user = "louG7YN0IzOPxvc3vrwRI6ZURXN8Xwh6IzDFletUD7xYsAPLPbqm8d6P0HNL3TIz";
const char* mqtt_password = "";
char msg[MSG_BUFFER_SIZE]; // Buffers para armazenar mensagens
char lastMsg[MSG_BUFFER_SIZE];
DHT_Unified dht(DHTPIN, DHTTYPE); // Inicialização do sensor DHT22
uint32_t delayMS; // Delay para a leitura do sensor
WiFiClient espClient;
PubSubClient client(espClient);
String setVentilador; // Variáveis para armazenar configurações do venptilador e umidificador
String setUmidificador;
void setup_wifi() // Função para configurar a conexão Wi-Fi
{
delay(10);
Serial.println("");
Serial.print("Connecting");
Serial.println(ssid);
WiFi.begin(ssid,password,6); // Inicia a conexão Wi-Fi
while(WiFi.status()!= WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("Ip: ");
Serial.println(WiFi.localIP());
}
void reconnect() // Função para reconectar ao servidor MQTT
{
while(!client.connected()){
Serial.print("Waiting for MQTT connection...");
String clientId = "ESP32Client"; // Cria um ID de cliente único
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str(),mqtt_user,mqtt_password)){
Serial.println("Connected");
client.subscribe("Rubens-ventilador"); // Inscreve-se nos tópicos MQTT
client.subscribe("Rubens-umidificador");
}
else{
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println("Try again in 5s");
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) { // Função de callback chamada quando uma mensagem MQTT é recebida
Serial.print("Message received from topic: ");
Serial.print(topic);
String messageTemp;
for (int i = 0; i < length; i++) {
messageTemp += (char)message[i];
}
if (String(topic) == "Rubens-ventilador") {
setVentilador = messageTemp;
Serial.print("Setpoint -> Ventilador: ");
Serial.print(setVentilador);
Serial.println();
}
else if(String(topic)=="Rubens-umidificador"){
setUmidificador = messageTemp;
Serial.print("Setpoint -> Umidificador: ");
Serial.print(setUmidificador);
Serial.println();
}
}
void setup() {
setup_wifi();
client.setServer(mqtt_server,1883); // Configura o cliente MQTT com o servidor e define a função de callback
client.setCallback(callback);
Serial.begin(115200);
dht.begin();
Serial.println(F("SENSOR DHT22")); // Exibe informações sobre o sensor DHT22
sensor_t sensor;
dht.temperature().getSensor(&sensor);
Serial.println(F("---------------------"));
Serial.println(F("Temperature"));
Serial.print(F("Sensor: "));
Serial.println(sensor.name);
Serial.print(F("Maximum value: "));
Serial.print(sensor.max_value);
Serial.println(F("°C"));
Serial.print(F("Minimum value: "));
Serial.print(sensor.min_value);
Serial.println(F("°C"));
Serial.print(F("Resolution: "));
Serial.print(sensor.resolution);
Serial.println(F("°C"));
Serial.println(F("---------------------"));
dht.humidity().getSensor(&sensor); // Exibe informações sobre a umidade
Serial.println(F("---------------------"));
Serial.println(F("Umidade"));
Serial.print(F("Sensor: "));
Serial.println(sensor.name);
Serial.print(F("Maximum value: "));
Serial.print(sensor.max_value);
Serial.println(F("%"));
Serial.print(F("Minimum value:"));
Serial.print(sensor.min_value);
Serial.println(F("%"));
Serial.print(F("Resolution: "));
Serial.print(sensor.resolution);
Serial.println(F("%"));
Serial.println(F("---------------------"));
}
void loop() {
delay(2000);
sensors_event_t event;
dht.temperature().getEvent(&event); // Lê a temperatura do sensor DHT22
if(isnan(event.temperature)){
Serial.println(F("Reading error"));
}
else{
Serial.print(F("Temperature: "));
Serial.print(event.temperature);
Serial.println(F("°C"));
sprintf(msg,"%f",event.temperature);
client.publish("Temperature", msg); // Publica a temperatura no servidor MQTT
}
dht.humidity().getEvent(&event); // Lê a umidade do sensor DHT22
if(isnan(event.relative_humidity)){
Serial.println(F("Error in humidity reading!"));
}
else{
Serial.print(F("Umidade: "));
Serial.print(event.relative_humidity);
Serial.println(F("%"));
sprintf(msg,"%f",event.relative_humidity);
client.publish("Umidade", msg); // Publica a umidade no servidor MQTT
}
if(event.temperature>=setVentilador.toInt()){
Serial.println("Temperatura máxima atingida, enviando sinal para ligar o relê");
digitalWrite(PIN_LEDT, HIGH);
client.publish("ControleVentilador","1");
}
else{
Serial.println("Temperatura mínima atingida, enviando sinal para desligar o relê");
digitalWrite(PIN_LEDT, LOW);
client.publish("ControleVentilador","0");
}
if(event.relative_humidity<=setUmidificador.toInt()){
Serial.println("Umidade mínima atingida, enviando sinal para ligar o relê");
digitalWrite(PIN_LEDH, HIGH);
client.publish("ControleUmidade","1");
}
else{
Serial.println("Umidade máxima atingida, enviando sinal para desligar o relê");
digitalWrite(PIN_LEDH, LOW);
client.publish("ControleUmidade","0");
}
if(!client.connected()){
reconnect();
}
client.loop();
}