#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <DHT_U.h>
// 定义引脚连接
#define DHTPIN 2 // DHT22传感器连接到数字引脚2
#define DHTTYPE DHT22 // DHT传感器类型为DHT22
#define BUZZER_PIN 13 // 蜂鸣器连接到数字引脚13
// 初始化DHT库
DHT_Unified dht(DHTPIN, DHTTYPE);
// 初始化LCD,地址0x27,16列2行
LiquidCrystal_I2C lcd(0x27, 16, 2);
// 报警阈值设置
const float TEMP_THRESHOLD = 30.0; // 温度阈值(℃)
const float HUMIDITY_THRESHOLD = 70.0; // 湿度阈值(%)
// 蜂鸣器控制变量
unsigned long previousMillis = 0; // 存储上次蜂鸣器状态改变时间
const long interval = 500; // 蜂鸣器状态改变间隔(毫秒)
bool buzzerState = LOW; // 蜂鸣器当前状态
void setup() {
// 初始化串口通信
Serial.begin(9600);
// 初始化DHT传感器
dht.begin();
Serial.println("DHT22传感器初始化成功");
// 初始化LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Temp: --.-C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ---%");
// 设置蜂鸣器引脚为输出模式
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
Serial.println("系统初始化完成");
}
void loop() {
// 读取温湿度数据
sensors_event_t event;
dht.temperature().getEvent(&event);
float temperature = event.temperature;
dht.humidity().getEvent(&event);
float humidity = event.relative_humidity;
// 检查数据有效性
if (isnan(temperature) || isnan(humidity)) {
Serial.println("无法读取温湿度数据!");
updateLCD("Temp: ERR C", "Humidity: ERR%");
delay(2000);
return;
}
// 更新LCD显示
char tempStr[16];
char humStr[16];
snprintf(tempStr, sizeof(tempStr), "Temp: %.1fC", temperature);
snprintf(humStr, sizeof(humStr), "Humidity: %.0f%%", humidity);
updateLCD(tempStr, humStr);
// 串口输出调试信息
Serial.print("温度: ");
Serial.print(temperature);
Serial.print(" °C, 湿度: ");
Serial.print(humidity);
Serial.println(" %");
// 检查是否需要触发报警
checkAlarm(temperature, humidity);
// 延时2秒,避免频繁读取传感器
delay(2000);
}
// 更新LCD显示内容
void updateLCD(const char* line1, const char* line2) {
lcd.setCursor(0, 0);
lcd.print(" "); // 清空第一行
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(" "); // 清空第二行
lcd.setCursor(0, 1);
lcd.print(line2);
}
// 检查温湿度是否超过阈值并控制蜂鸣器
void checkAlarm(float temperature, float humidity) {
bool alarmTriggered = (temperature > TEMP_THRESHOLD) || (humidity > HUMIDITY_THRESHOLD);
if (alarmTriggered) {
// 闪烁LCD背光
lcd.noBacklight();
delay(100);
lcd.backlight();
// 控制蜂鸣器间歇鸣响
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
buzzerState = !buzzerState;
digitalWrite(BUZZER_PIN, buzzerState);
}
} else {
// 关闭蜂鸣器
digitalWrite(BUZZER_PIN, LOW);
buzzerState = LOW;
}
}