#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#define GreenLED 18
#define RedLED 19
#define Light 4
#define BTN_PIN 13
#define PIR_PIN 23 // PIR sensor pin
#define DHT2PIN 17
#define DHT1PIN 16 // Digital pin connected to the DHT sensor
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht1(DHT1PIN, DHTTYPE);
DHT dht2(DHT2PIN, DHTTYPE);
volatile bool pirTriggered = false;
volatile bool buttonPressed = false;
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C LCD address
void IRAM_ATTR handlePIR() {
pirTriggered = true;
}
void IRAM_ATTR handleButton() {
buttonPressed = true;
}
void setup() {
Serial.begin(115200);
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
Serial.println(F("DHTxx test!"));
lcd.setCursor(0, 1);
lcd.print("DHTxx test!");
dht1.begin();
dht2.begin();
pinMode(BTN_PIN, INPUT_PULLDOWN);
pinMode(PIR_PIN, INPUT);
pinMode(GreenLED, OUTPUT);
pinMode(RedLED, OUTPUT);
pinMode(Light, OUTPUT);
digitalWrite(GreenLED, LOW);
digitalWrite(RedLED, LOW);
digitalWrite(Light, LOW);
attachInterrupt(digitalPinToInterrupt(PIR_PIN), handlePIR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BTN_PIN), handleButton, RISING);
delay(1000); // Delay for setup
lcd.clear();
}
void loop() {
static int pirState = LOW;
static int LightState = LOW;
// Handle PIR sensor interrupt
if (pirTriggered) {
pirTriggered = false;
int pirValue = digitalRead(PIR_PIN);
if (pirValue == HIGH && pirState == LOW) {
Serial.println("Motion detected!");
// lcd.setCursor(0, 0);
//lcd.print("Initializing...");
LightState = HIGH;
pirState = HIGH;
} else if (pirValue == LOW && pirState == HIGH) {
Serial.println("Motion ended!");
//lcd.setCursor(0, 0);
//lcd.print("Initializing...");
LightState = LOW;
pirState = LOW;
}
}
// Handle button interrupt
if (buttonPressed) {
buttonPressed = false;
LightState = !LightState;
}
// Update light state
digitalWrite(Light, LightState);
// Read and process sensor data every 2 seconds
static unsigned long lastReadTime = 0;
if (millis() - lastReadTime > 2000) {
lastReadTime = millis();
float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
float f1 = dht1.readTemperature(true);
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
float f2 = dht2.readTemperature(true);
if (isnan(h1) || isnan(t1) || isnan(f1) || isnan(h2) || isnan(t2) || isnan(f2)) {
Serial.println(F("Failed to read from at least one DHT sensor!"));
return;
}
float hic1 = dht1.computeHeatIndex(t1, h1, false);
float hic2 = dht2.computeHeatIndex(t2, h2, false);
Serial.println("**Sensor 1**");
Serial.print(F("Humidity: "));
Serial.print(h1);
lcd.setCursor(0, 0);
lcd.print("H1:");
lcd.print(h1, 1);
Serial.print(F("% Temperature: "));
Serial.print(t1);
lcd.setCursor(9, 0);
lcd.print("T1:");
lcd.print(t1, 1);
Serial.print(F("°C Feels like:"));
Serial.print(hic1);
Serial.println(F("°C "));
Serial.println("**Sensor 2**");
Serial.print(F("Humidity: "));
Serial.print(h2);
lcd.setCursor(0, 1);
lcd.print("H2:");
lcd.print(h2, 1);
Serial.print(F("% Temperature: "));
Serial.print(t2);
lcd.setCursor(9, 1);
lcd.print("H2:");
lcd.print(h2, 1);
Serial.print(F("°C Feels like:"));
Serial.print(hic2);
Serial.println(F("°C "));
if (h1 > 50 || t1 > 25 || h1 < 40 || t1 < 20) {
digitalWrite(GreenLED, LOW);
digitalWrite(RedLED, HIGH);
} else {
digitalWrite(GreenLED, HIGH);
digitalWrite(RedLED, LOW);
}
}
}