#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// ---------------- Wi-Fi Credentials ----------------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ---------------- MQTT Broker Settings ----------------
const char* mqtt_server = "mqtt.eclipseprojects.io";
const char* mqtt_topic = "esp32/sensor/data14";
WiFiClient espClient;
PubSubClient client(espClient);
// ---------------- Sensor Configuration ----------------
#define DHTPIN 4 // GPIO4 for DHT22 data
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
#define NTC_PIN 34 // Analog input pin for thermistor (NTC)
// ---------------- WiFi Connection Function ----------------
void connectWiFi() {
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
// ---------------- MQTT Connection Function ----------------
void connectMQTT() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("MQTT connected");
client.subscribe(mqtt_topic); // Optional if listening
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds...");
delay(5000);
}
}
}
// ---------------- MQTT Callback ----------------
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Incoming message [");
Serial.print(topic);
Serial.print("]: ");
for (unsigned int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
// ---------------- Setup ----------------
void setup() {
Serial.begin(115200);
dht.begin();
connectWiFi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
connectMQTT();
}
// ---------------- Loop ----------------
void loop() {
if (!client.connected()) {
connectMQTT();
}
client.loop();
// ----- Read DHT22 -----
float temp_dht = dht.readTemperature();
float hum_dht = dht.readHumidity();
// Check for failed read
if (isnan(temp_dht) || isnan(hum_dht)) {
Serial.println("Failed to read from DHT sensor!");
} else {
Serial.printf("DHT22 - Temp: %.2f °C, Humidity: %.2f %%\n", temp_dht, hum_dht);
}
// ----- Read NTC Sensor (Thermistor) -----
int analogValue = analogRead(NTC_PIN);
float voltage = analogValue * (3.3 / 4095.0); // Convert ADC to voltage
float temp_ntc = (voltage - 0.5) * 100.0; // Rough estimation
Serial.printf("NTC - Analog Temp (approx): %.2f °C\n", temp_ntc);
// ----- Publish Data -----
String payload = "{";
payload += "\"temp_dht\":" + String(temp_dht, 2) + ",";
payload += "\"humidity_dht\":" + String(hum_dht, 2) + ",";
payload += "\"temp_ntc\":" + String(temp_ntc, 2);
payload += "}";
client.publish(mqtt_topic, payload.c_str());
Serial.println("Published: " + payload);
delay(5000); // Delay between readings
}