#include <WiFi.h>
#include "AdafruitIO_WiFi.h"
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <LiquidCrystal.h>
// Adafruit IO credentials
#define IO_USERNAME "Ivan"
#define IO_KEY "aio_QMzQ92eHSoN0hRHBoVN63GRfTvce"
// Wi-Fi credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
// Hardware configuration
#define DHTPIN 23 // DHT22 data pin
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define LDR_PIN 34 // Photoresistor analog pin
#define BUZZER_PIN 27 // Buzzer pin (active buzzer)
#define RELAY_PIN 32 // Relay control pin
// Thresholds for alarm
const float TEMP_THRESHOLD = 30.0; // e.g., 30°C threshold for temperature
const float HUM_THRESHOLD = 80.0; // e.g., 80% threshold for humidity
// Initialize sensor and Adafruit IO
DHT dht(DHTPIN, DHTTYPE);
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
AdafruitIO_Feed *temperatureFeed = io.feed("temperature");
AdafruitIO_Feed *humidityFeed = io.feed("humidity");
// Initialize LCD (16x2) with specified interface pins
LiquidCrystal lcd(12, 13, 14, 15, 16, 17);
void setup() {
Serial.begin(115200);
// Initialize pins
pinMode(LDR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RELAY_PIN, LOW);
// Initialize LCD
lcd.begin(16, 2);
lcd.print("Connecting...");
// Start DHT sensor
dht.begin();
// Connect to Wi-Fi and Adafruit IO
Serial.print("Connecting to Adafruit IO...");
io.connect();
// Wait for connection to Adafruit IO
while(io.status() < AIO_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println(" Connected to Adafruit IO!");
lcd.clear();
lcd.print("IO Connected!");
delay(500);
}
void loop() {
// Maintain Adafruit IO connection
io.run();
// Read sensors
float temperature = dht.readTemperature(); // Celsius
float humidity = dht.readHumidity();
int lightValue = analogRead(LDR_PIN);
// Validate DHT readings
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT22 sensor!");
return; // skip sending if read failed
}
// Print readings to Serial (optional debugging/logging)
Serial.print("Temp: "); Serial.print(temperature); Serial.print(" °C, ");
Serial.print("Hum: "); Serial.print(humidity); Serial.print(" %, ");
Serial.print("Light: "); Serial.println(lightValue);
// Update LCD display
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature, 1); // one decimal place
lcd.print(" C "); // add spaces to overwrite any leftover chars
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity, 1);
lcd.print(" % ");
// Alarm conditions for buzzer and relay
if (temperature > TEMP_THRESHOLD || humidity > HUM_THRESHOLD) {
digitalWrite(BUZZER_PIN, HIGH); // activate buzzer
digitalWrite(RELAY_PIN, HIGH); // activate relay
} else {
digitalWrite(BUZZER_PIN, LOW); // deactivate buzzer
digitalWrite(RELAY_PIN, LOW); // deactivate relay
}
// Publish data to Adafruit IO feeds
temperatureFeed->save(temperature);
humidityFeed->save(humidity);
// Small delay to avoid flooding (publish roughly every 2 seconds)
delay(2000);
}