#include "DHT.h"
#include <LiquidCrystal_I2C.h>
// 引脚与仿真图完全匹配
#define DHTPIN 4 // DHT22数据引脚(图中D4)
#define DHTTYPE DHT22
#define LED_PIN 7 // 报警LED控制引脚(图中D7)
// I2C LCD1602 地址0x27 1602屏
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
// 热指数高温报警阈值32℃
const float HI_THRESHOLD = 32.0;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // 上电LED熄灭,和截图一致
dht.begin();
lcd.init();
lcd.backlight();
// 开机串口输出学校、班级、姓名信息
Serial.println("================================");
Serial.println("恩施职业技术学院信息工程学院");
Serial.println("DHT22温湿度检测与报警系统");
Serial.println("班级 24110306 姓名 李婷");
Serial.println("================================\n");
Serial.println("正在读取传感器数据...");
}
void loop() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// 判断传感器接线故障
if (isnan(temp) || isnan(hum)) {
lcd.clear();
lcd.print("DHT22 ERROR!");
Serial.println("传感器接线故障,读取失败");
delay(2000);
return;
}
// 计算摄氏热指数
float heatIndex = dht.computeHeatIndex(temp, hum, false);
bool isAlarm = heatIndex > HI_THRESHOLD;
// LED报警控制
if (isAlarm) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
// LCD第一行:T:0.2°C H:36.0% 带温度符号无乱码
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print((char)223); // 输出°符号
lcd.print("C H:");
lcd.print(hum, 1);
lcd.print("%");
// LCD第二行:HI:-2.8°C OK / HI:39.1°C ALARM!
lcd.setCursor(0, 1);
lcd.print("HI:");
lcd.print(heatIndex, 1);
lcd.print((char)223); // 输出°符号
lcd.print("C ");
if (isAlarm) {
lcd.print("ALARM!");
} else {
lcd.print("OK");
}
// 串口打印完整温湿度、热指数、报警状态
Serial.print("湿度: ");
Serial.print(hum);
Serial.print(" %RH | 温度: ");
Serial.print(temp);
Serial.print(" °C / ");
Serial.print(temp * 9 / 5 + 32);
Serial.print(" °F | 热指数: ");
Serial.print(heatIndex);
Serial.print(" °C / ");
Serial.print(heatIndex * 9 / 5 + 32);
Serial.print(" °F | 报警: ");
Serial.println(isAlarm ? "ALARM" : "OK");
delay(2000);
}