#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// Rede Wi-Fi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Configurações do MQTT
const char* mqttServer = "mqtt3.thingspeak.com";
const int mqttPort = 1883;
const char* mqttclient = "MQUpDh0qFAsTNi8mNBgmGyE";
const char* mqttUser = "MQUpDh0qFAsTNi8mNBgmGyE"; // Substitua
const char* mqttPassword = "UZ4vQFGWdp+Lrl2eGCA1At04"; // Substitua
const char* mqttTopic = "channels/2664977/publish"; // Substitua
// Definições do DHT
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Definições do sensor de nível de água
#define TRIGGER_PIN 5
#define ECHO_PIN 18
// Inicialização do cliente MQTT
WiFiClient wifiClient;
PubSubClient client(wifiClient);
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
connectWiFi();
client.setServer(mqttServer, mqttPort);
}
void connectWiFi() {
Serial.println("Conectando ao WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Conectado ao WiFi!");
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("Conectando ao MQTT...");
if (client.connect(mqttclient, mqttUser, mqttPassword)) {
Serial.println(" Conectado ao MQTT!");
} else {
Serial.print("Falha na conexão, rc=");
Serial.print(client.state());
delay(2000);
}
}
}
void loop() {
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
// Leitura do sensor DHT
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Falha ao ler do sensor DHT!");
return;
}
// Leitura do sensor de nível de água
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = (duration * 0.034) / 2; // Calcula a distância em cm
// Verifica se a leitura da distância é válida
if (distance <= 0 || distance >= 400) {
Serial.println("Falha ao medir a distância!");
return;
}
// Cria o payload com os dados de temperatura, umidade e nível de água
String payload = "field1=" + String(t) + "&field2=" + String(h) + "&field3=" + String(distance);
// Envia os dados para o ThingSpeak via MQTT
client.publish(mqttTopic, payload.c_str());
// Exibe os dados no Serial Monitor
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" °C, Umidade: ");
Serial.print(h);
Serial.print(" %, Nível de água: ");
Serial.print(distance);
Serial.println(" cm");
// Aguarda 2 segundos antes de enviar novos dados
delay(2000);
}