#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
// DHT22 sensor
#define DHTPIN 19
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Relay
#define RELAY 14
int relayState = LOW; // definir como padrão LOW
// WiFi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *mqtt_topic = "emqx/esp32/control";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char *topic, byte *payload, unsigned int length) {
// Ao receber uma mensagem de MQTT Broker
Serial.print("Message arrived in topic: ");
Serial.println(topic);
// converte payload em String
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message:");
Serial.println(message);
// Se a mensagem recebida estiver "ON" ligue o relay
if (message.equals("ON")) {
relayState = HIGH;
}
// Se a mensagem recebida estiver "OFF" desligue o relay
else if (message.equals("OFF")) {
relayState = LOW;
}
digitalWrite(RELAY, relayState);
}
void reconnect() {
// Este loop é chamado quando uma conexão falha ou é desconectada.
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
//Tenta conectar
if (client.connect("ESP32Client", mqtt_username, mqtt_password)) {
Serial.println("connected");
// Quando a conexão for bem-sucedida Inscreva-se no topic
client.subscribe(mqtt_topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Aguardar 5 segundos antes de tentar reconectar.
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, relayState);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the Wi-Fi network");
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
}
void loop() {
// Verifique a conexão MQTT
if (!client.connected()) {
reconnect();
}
// Esperando receber uma mensagem de MQTT Broker
client.loop();
// Leia os valores de temperatura e umidade de DHT22 sensor
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Crie uma payload enquanto aguarda comandos do MQTT.
String payload = "Temp: " + String(temperature) + ", Humd: " + String(humidity);
// Envie valores de temperatura e umidade para MQTT Broker
client.publish(mqtt_topic, payload.c_str());
//Aguarde 2 segundos antes de repetir
delay(3000);
}