#include <Adafruit_ESP8266.h> // Use <WiFi.h> for ESP32
#include <PubSubClient.h>
#include <DHT.h>
#include <ArduinoJson.h>
#include <WiFi.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker settings
const char* mqtt_broker = "broker.mqttdashboard.com";
const char* mqtt_topic = "wokwi-weather";
const char* mqtt_client_id = "arduino-weather-demo"; // Changed to avoid conflict
const char* mqtt_user = "";
const char* mqtt_password = "";
// DHT Sensor setup
#define DHTPIN 21 // Pin where DHT22 is connected (GPIO 15)
#define DHTTYPE DHT22 // DHT22 sensor type
DHT dht(DHTPIN, DHTTYPE);
// WiFi and MQTT clients
WiFiClient espClient;
PubSubClient client(espClient);
// Variable to store the previous weather data
String prevWeather = "";
void setup() {
Serial.begin(115200); // Start serial communication
dht.begin(); // Initialize DHT sensor
// Connect to WiFi
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
// Connect to MQTT broker
client.setServer(mqtt_broker, 1883); // Default MQTT port
connectToMQTT();
}
void connectToMQTT() {
Serial.print("Connecting to MQTT server... ");
while (!client.connected()) {
if (client.connect(mqtt_client_id, mqtt_user, mqtt_password)) {
Serial.println("Connected!");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
connectToMQTT();
}
client.loop(); // Handle MQTT client tasks
// Read sensor data
Serial.print("Measuring weather conditions... ");
float temp = dht.readTemperature(); // Read temperature in Celsius
float humidity = dht.readHumidity(); // Read humidity in %
// Check if readings are valid
if (isnan(temp) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
delay(1000);
return;
}
// Create JSON object
StaticJsonDocument<200> doc;
doc["temp"] = temp;
doc["humidity"] = humidity;
// Serialize JSON to string
char message[256];
serializeJson(doc, message);
// Compare with previous message
String currentWeather = String(message);
if (currentWeather != prevWeather) {
Serial.println("Updated!");
Serial.print("Reporting to MQTT topic ");
Serial.print(mqtt_topic);
Serial.print(": ");
Serial.println(message);
// Publish the message
client.publish(mqtt_topic, message);
prevWeather = currentWeather;
} else {
Serial.println("No change");
}
delay(1000); // Wait 1 second before next reading
}