#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pin definitions
#define DHTPIN 15 // DHT22 data pin connected to GPIO 15
#define DHTTYPE DHT22 // Define the sensor type as DHT22
#define PIR_PIN 4 // PIR sensor connected to GPIO 4
#define RED_LED 16 // Red LED connected to GPIO 16
#define GREEN_LED 17 // Green LED connected to GPIO 17
#define BLUE_LED 18 // Blue LED connected to GPIO 18
#define BUZZER_PIN 19 // Buzzer connected to GPIO 19
// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE);
// Initialize LCD (I2C address 0x27 for Wokwi, change to 0x3F if needed)
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// Initialize serial monitor
Serial.begin(115200);
// Initialize DHT sensor
dht.begin();
// Initialize LCD with 16 columns and 2 rows
lcd.begin(16, 2);
lcd.backlight();
// Initialize PIR sensor, LEDs, and Buzzer
pinMode(PIR_PIN, INPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Start with LEDs and Buzzer off
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
// Display initial message on LCD
lcd.setCursor(0, 0);
lcd.print("Temp & Humidity");
delay(1000); // Delay to ensure initial message displays on Wokwi
}
void loop() {
// Read temperature and humidity from DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Check if reading is valid
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
lcd.setCursor(0, 0);
lcd.print("DHT Read Error! ");
} else {
// Print readings to Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" °C, Humidity: ");
Serial.print(humidity);
Serial.println(" %");
// Display on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print(" %");
}
// Read PIR sensor
int pirState = digitalRead(PIR_PIN);
if (pirState == HIGH) {
Serial.println("Motion detected!");
digitalWrite(BUZZER_PIN, HIGH); // Turn on buzzer
digitalWrite(RED_LED, HIGH); // Turn on red LED
delay(500); // Buzzer delay
digitalWrite(BUZZER_PIN, LOW); // Turn off buzzer
} else {
digitalWrite(RED_LED, LOW); // Turn off red LED
}
// Example LED indicators based on temperature (customize thresholds as needed)
if (temperature > 30) {
digitalWrite(GREEN_LED, HIGH); // High temperature, green LED on
digitalWrite(BLUE_LED, LOW); // Low temperature, blue LED off
} else {
digitalWrite(GREEN_LED, LOW); // High temperature, green LED off
digitalWrite(BLUE_LED, HIGH); // Low temperature, blue LED on
}
delay(1000); // Delay for stability
}