#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#define DHTPIN 26
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define THERMISTOR_PIN 34 // Analog pin for thermistor
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "mqtt.eclipseprojects.io";
const int mqttPort = 1883;
const char* mqttTopic = "sensors/esp32";
WiFiClient espClient;
PubSubClient client(espClient);
void setupWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" connected.");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32Client")) {
Serial.println(" connected.");
} else {
Serial.print(" failed, rc=");
Serial.println(client.state());
delay(1000);
}
}
}
float readThermistorC() {
int analogValue = analogRead(THERMISTOR_PIN);
float voltage = analogValue * (3.3 / 4095.0);
float resistance = (3.3 * 10000.0 / voltage) - 10000.0;
float steinhart;
steinhart = resistance / 10000.0; // R/Ro
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= 3950.0; // 1/B * ln(R/Ro)
steinhart += 1.0 / (25.0 + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // Convert to °C
return steinhart;
}
void setup() {
Serial.begin(115200);
dht.begin();
setupWiFi();
client.setServer(mqttServer, mqttPort);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float dhtTemp = dht.readTemperature();
float dhtHum = dht.readHumidity();
float thermistorTemp = readThermistorC();
if (isnan(dhtTemp) || isnan(dhtHum)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Create JSON payload
String payload = "{";
payload += "\"dht22_temp\":" + String(dhtTemp, 1) + ",";
payload += "\"dht22_humidity\":" + String(dhtHum, 1) + ",";
payload += "\"thermistor_temp\":" + String(thermistorTemp, 1);
payload += "}";
client.publish(mqttTopic, payload.c_str());
Serial.println("Published: " + payload);
delay(5000); // Delay between publishes
}