#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN1 2
#define DHTPIN2 3
#define DHTTYPE DHT22
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
float t1, h1, t2, h2;
bool showSensor1 = true;
unsigned long lastSwitch = 0;
unsigned long lastRead = 0;
String heatLevel(float hi){
if(hi < 80) return "SAFE";
if(hi < 90) return "CAUTION";
if(hi < 105) return "EXTREME";
if(hi < 130) return "DANGER";
return "EX DANGER";
}
void setup() {
lcd.init();
lcd.backlight();
dht1.begin();
dht2.begin();
}
void loop() {
unsigned long now = millis();
// Read sensors every 3 seconds
if(now - lastRead > 3000){
t1 = dht1.readTemperature(true);
h1 = dht1.readHumidity();
delay(1000); // sensor offset
t2 = dht2.readTemperature(true);
h2 = dht2.readHumidity();
lastRead = now;
}
// Switch displayed sensor every 2 seconds
if(now - lastSwitch > 2000){
showSensor1 = !showSensor1;
lastSwitch = now;
float avgTemp = (t1 + t2) / 2.0;
float avgHum = (h1 + h2) / 2.0;
float heatIndex = dht1.computeHeatIndex(avgTemp, avgHum);
// Row 1 (sensor temp + humidity)
lcd.setCursor(0,0);
if(showSensor1){
lcd.print("S1 ");
lcd.print(t1,1);
lcd.print("F ");
lcd.print(h1,0);
lcd.print("% ");
}
else{
lcd.print("S2 ");
lcd.print(t2,1);
lcd.print("F ");
lcd.print(h2,0);
lcd.print("% ");
}
// Row 2 averages
lcd.setCursor(0,1);
lcd.print("AVG ");
lcd.print(avgTemp,1);
lcd.print("F ");
lcd.print(avgHum,0);
lcd.print("% ");
// Row 3 heat index value
lcd.setCursor(0,2);
lcd.print("HI ");
lcd.print(heatIndex,1);
lcd.print("F ");
// Row 4 heat safety level
lcd.setCursor(0,3);
lcd.print(heatLevel(heatIndex));
lcd.print(" ");
}
}