/*--------------------------------------------------------------------------1--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------本程序所引用库--------------------------------------------------------------------*/
#include <DHT.h> // 调用库文件DHT.h,允许使用DHT系列传感器(例如DHT11和DHT22)来测量温度和湿度
/*--------------------------------------------------------------------------2--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------声明定义-----------------------------------------------------------------------*/
/*****************************< 常量声明 >*****************************/
// DHT温湿度 传感器型号
#define DHT_TYPE DHT22 // 注意型号,有DHT11 DHT22 DHT21等可以替换
#define MAX_TEMP 30 // 高温阈值
#define LDR_THRESHOLD 500 // 光照模拟值阈值
/*****************************< 引脚定义 >*****************************/
const int DHT_Pin = 2; // DHT传感器的信号脚
const int R_LED_Pin = 3; // 设置红LED引脚
const int B_LED_Pin = 4; // 设置蓝LED引脚
const int W_LED_Pin = 5; // 设置白LED引脚
const int LDR_Pin = A0; // 光敏电阻模块信号脚
/*****************************< 变量定义 >*****************************/
float Temperature_C; // 温度(℃)
int LDR_Value;
/*****************************< 对象声明 >*****************************/
DHT dht(DHT_Pin, DHT_TYPE); // 创建一个DHT对象,命名为dht,该对象可以调用DHT库里的函数
/*--------------------------------------------------------------------------3--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------setup()程序初始化------------------------------------------------------------------*/
void setup() {
/******************************< 启动串口通讯 >******************************/
Serial.begin(9600); // 初始化串口通信,并设置波特率为9600
/******************************< 设置引脚模式 >******************************/
pinMode(R_LED_Pin, OUTPUT); // 设置 引脚 为输出模式
pinMode(W_LED_Pin, OUTPUT); // 设置 引脚 为输出模式
pinMode(B_LED_Pin, OUTPUT); // 设置 引脚 为输出模式
/**********************< 初始化DHT传感器,并确保可用性 >**********************/
init_DHT11(1);
}
/*--------------------------------------------------------------------------4--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------loop()基础循环体-------------------------------------------------------------------*/
void loop() {
// 通过DHT传感器得到温度数值,并赋值给Temperature_C/F
Temperature_C = dht.readTemperature(); // 默认摄氏度
LDR_Value = analogRead(LDR_Pin); // 读取LDR_Pin的输入
Serial.print("温度:");
Serial.print(Temperature_C);
Serial.print("\t光照模拟读数:");
Serial.println(LDR_Value);
if (Temperature_C > MAX_TEMP) { // 温度过高
digitalWrite(R_LED_Pin, HIGH); // 开红灯
digitalWrite(B_LED_Pin, LOW); // 关红灯
} else {
digitalWrite(R_LED_Pin, LOW); // 关蓝灯
digitalWrite(B_LED_Pin, HIGH); // 开蓝灯
}
if (LDR_Value > LDR_THRESHOLD) { // 亮度过低
digitalWrite(W_LED_Pin, HIGH); // 打开LED
} else {
digitalWrite(W_LED_Pin, LOW); // 关闭LED
}
}
/*--------------------------------------------------------------------------5--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------函数定义-----------------------------------------------------------------------*/
/*****************************************************************************************************
* 函数:init_DHT11(bool DF)
* 作用:初始化DHT11传感器,检查传感器是否正常工作
* 参数:
* - DF: 标记决定因素(如果为 true,则在传感器初始化失败时进入死循环)
* 返回值:无
*****************************************************************************************************/
void init_DHT11(bool DF) {
// 将光标位置设置为屏幕上的指定坐标
dht.begin(); // 初始化对象dht
if (isnan(dht.readHumidity()) || isnan(dht.readTemperature()) || isnan(dht.readTemperature(true))) { // 如果没有正确的数据
if (DF) { // 如果标记决定因素,则进入死循环
while (1) {
Serial.print("DHT Failed!");
delay(1000);
}
Serial.print("DHT Failed!");
;
} else {
delay(1000); // 如果没有标记决定因素,能正常进入程序
}
} else {
Serial.print("DHT OK!");
delay(1000);
}
}