#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// 定义DHT传感器类型和数据引脚
#define DHTPIN 17 // 连接DHT传感器的数据引脚
#define DHTTYPE DHT22 // DHT 22 (AM2302), DHT 11
// 定义LCD和I2C引脚
#define LCD_COLS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(0x27, LCD_COLS, LCD_ROWS); // 0x27是I2C地址,根据具体情况调整
// 定义LED和继电器引脚
const int redLED = 19;
const int blueLED = 18;
const int relay = 16;
// 定义温湿度报警阈值
const float tempThresholdHigh = 30.0;
const float tempThresholdLow = 25.0;
const float humidityThresholdHigh = 70.0;
const float humidityThresholdLow = 40.0;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// 初始化串口通信
Serial.begin(115200);
// 初始化DHT传感器
dht.begin();
// 初始化LCD
lcd.init();
lcd.backlight();
// 初始化LED和继电器
pinMode(redLED, OUTPUT);
pinMode(blueLED, OUTPUT);
pinMode(relay, OUTPUT);
// 初始状态:LED关闭,继电器关闭
digitalWrite(redLED, LOW);
digitalWrite(blueLED, LOW);
digitalWrite(relay, LOW);
}
void loop() {
// 等待传感器稳定
delay(2000);
// 读取温湿度数据
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查是否读取失败,读取失败时返回NAN(不是一个数字)
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 显示温湿度数据到LCD
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(" %");
// 检查温湿度是否超出阈值,并控制LED和继电器
if (temperature > tempThresholdHigh) {
digitalWrite(redLED, HIGH); // 高温报警,点亮红色LED
digitalWrite(relay, HIGH); // 激活继电器(例如,打开风扇)
} else if (temperature < tempThresholdLow) {
digitalWrite(blueLED, HIGH); // 低温报警,点亮蓝色LED
} else {
digitalWrite(redLED, LOW);
digitalWrite(blueLED, LOW);
digitalWrite(relay, LOW);
}
if (humidity > humidityThresholdHigh) {
digitalWrite(redLED, HIGH); // 高湿度报警,点亮红色LED(或同时激活)
} else if (humidity < humidityThresholdLow) {
// 在这个例子中,低湿度不触发报警,但可以根据需要添加逻辑
}
// 等待一段时间再读取
delay(2000);
}