#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define DHTPIN 26 // DHT22 pin
#define DHTTYPE DHT22
#define THERMISTOR_PIN 34 // Analog input (simulate with potentiometer)
const char* ssid = "Wokwi-GUEST"; // WiFi credentials
const char* password = ""; // Leave blank for open network
const char* mqtt_server = "mqtt.eclipseprojects.io"; // MQTT broker address
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor
void setup_wifi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
}
void reconnect() {
// Loop until we're reconnected to the broker
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("Connected to MQTT Broker");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
setup_wifi(); // Connect to WiFi
client.setServer(mqtt_server, 1883); // Set MQTT broker address
}
void loop() {
if (!client.connected()) {
reconnect(); // Reconnect to MQTT broker if disconnected
}
client.loop(); // Ensure the connection stays alive
// Read sensor data
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int thermistorRaw = analogRead(THERMISTOR_PIN);
float thermistorTemp = map(thermistorRaw, 0, 4095, 10, 50); // Rough estimate of temperature from thermistor
// Check if sensor readings are valid
if (!isnan(temp) && !isnan(hum)) {
// Create payload string
String payload = String("{\"temperature\":") + temp +
",\"humidity\":" + hum +
",\"thermistor\":" + thermistorTemp + "}";
// Publish to MQTT topic
client.publish("iot/sensor/data", payload.c_str());
// Print payload to serial monitor for debugging
Serial.println(payload);
} else {
Serial.println("Failed to read from DHT sensor!");
}
// Delay for 3 seconds before taking new readings
delay(500);
}