#include <LiquidCrystal.h>
#include <DHT.h> // 调用库文件DHT.h,允许使用DHT系列传感器(例如DHT11和DHT22)来测量温度和湿度
#define DHT_TYPE DHT22 // 注意型号,有DHT11 DHT22 DHT21等可以替换
const int DHT_Pin = 2; // DHT传感器的信号脚
#define Buzzer 7 // 蜂鸣器连接到数字IO口7
#define Led 8 // LED连接到数字IO口8
float Humidity, Temperature_C;
LiquidCrystal lcd(12, 11, 6, 5, 4, 3); // LCD连接的接口
DHT dht(DHT_Pin, DHT_TYPE); // 创建一个DHT对象,命名为dht,该对象可以调用DHT库里的函数
void setup() {
pinMode(Buzzer, OUTPUT);
pinMode(Led, OUTPUT); // 设置控制LED和蜂鸣器的引脚为输出
Serial.begin(9600); // 启动串口通信
init_DHT11(1);
lcd.begin(16, 2); // 初始化LCD显示屏
lcd.print("DHT11 Thermometer"); // LCD初始显示内容
delay(500); // 延时,确保LCD显示
lcd.clear(); //清空屏幕
}
void loop() {
Humidity = dht.readHumidity();
Temperature_C = dht.readTemperature();
// 显示当前温度和湿度值
lcd.setCursor(0, 1); // 设置LCD显示位置
lcd.print("Humidity: ");
lcd.print(Humidity, 2); // 显示湿度
lcd.print("% ");
lcd.setCursor(0, 0); // 设置LCD显示位置
lcd.print("Temp: ");
lcd.print(Temperature_C, 2); // 显示温度
lcd.print("C");
// 湿度控制LED闪烁
if (Humidity >= 75) {
digitalWrite(Led, HIGH);
delay(Humidity * 10); // 湿度越高闪烁时间越长
digitalWrite(Led, LOW);
delay(Humidity * 5); // 湿度越高间隔时间越短
} else {
digitalWrite(Led, LOW);
}
// 温度控制蜂鸣器
if (Temperature_C > 24) {
tone(Buzzer, 1000, 500); // 发出频率为1000Hz、持续500ms的声音
} else {
noTone(Buzzer); // 停止发声
}
// 延时1秒
delay(1000);
}
void init_DHT11(bool DF) {
// 将光标位置设置为屏幕上的指定坐标
dht.begin(); // 初始化对象dht
if (isnan(dht.readHumidity()) || isnan(dht.readTemperature()) || isnan(dht.readTemperature(true))) { // 如果没有正确的数据
if (DF) { // 如果标记决定因素,则进入死循环
while (1) {
Serial.println("DHT Failed!");
delay(1000);
}
} else {
delay(1000); // 如果没有标记决定因素,能正常进入程序
}
} else {
Serial.println("DHT OK!");
delay(1000);
}
}