#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <WiFi.h>
#include "DHT.h"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Adafruit IO details
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "inusha"
#define AIO_KEY "aio_lcuR04ND7llb3JFvMckdyGjAKX8J"
// Pins
#define DHTPIN 14
#define LEDPIN 2
#define DHTTYPE DHT22
// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE);
// WiFi and MQTT clients
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// MQTT feeds
Adafruit_MQTT_Publish humidityFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidity");
Adafruit_MQTT_Publish temperatureFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Publish actuatorFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/actuator");
Adafruit_MQTT_Subscribe actuatorControl = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/actuator");
// Track current LED state
int currentLEDState = LOW;
void connectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected!");
}
void connectMQTT() {
while (mqtt.connect() != 0) {
Serial.println("MQTT connection failed. Retrying...");
delay(5000);
}
Serial.println("MQTT connected!");
}
void setup() {
Serial.begin(115200);
pinMode(LEDPIN, OUTPUT);
digitalWrite(LEDPIN, LOW);
dht.begin();
connectWiFi();
mqtt.subscribe(&actuatorControl);
}
void loop() {
// Reconnect MQTT if needed
if (!mqtt.connected()) {
connectMQTT();
}
mqtt.processPackets(1000);
// Read sensor data
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Publish sensor data
if (!isnan(humidity)) {
humidityFeed.publish(humidity);
Serial.print("Humidity: ");
Serial.println(humidity);
}
if (!isnan(temperature)) {
temperatureFeed.publish(temperature);
Serial.print("Temperature: ");
Serial.println(temperature);
}
// Control actuator based on feed
Adafruit_MQTT_Subscribe *subscription;
if (subscription == &actuatorControl) {
Serial.print("Received actuator value: ");
Serial.println((char *)actuatorControl.lastread);
}
while ((subscription = mqtt.readSubscription(1000))) {
Serial.println("inside sub");
if (subscription == &actuatorControl) {
int receivedState = atoi((char *)actuatorControl.lastread);
Serial.println(receivedState);
// Only update if state has changed
if (receivedState != currentLEDState) {
currentLEDState = receivedState;
digitalWrite(LEDPIN, currentLEDState);
// Publish the current state back to Adafruit IO
actuatorFeed.publish(String(currentLEDState).c_str());
Serial.println(currentLEDState ? "LED ON" : "LED OFF");
}
}
}
delay(2000); // Delay for stability
}