/*--------------------------------------------------------------------------1--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------本程序所引用库--------------------------------------------------------------------*/
#include <DHT.h> // 调用库文件DHT.h,允许使用DHT系列传感器(例如DHT11和DHT22)来测量温度和湿度
#include <SoftwareSerial.h>
/*--------------------------------------------------------------------------2--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------声明定义-----------------------------------------------------------------------*/
/*****************************< 常量声明 >*****************************/
// DHT温湿度 传感器型号
#define DHT_TYPE DHT22 // 注意型号,有DHT11 DHT22 DHT21等可以替换
#define MAX_TEMP 30 // 温度阈值
#define MIN_LDR_VALUE 200 // 光敏电阻阈值
/*****************************< 引脚定义 >*****************************/
const int PIR_Pin = 2; // 设置人体红外传感器的信号脚
const int DHT_Pin = 3; // DHT传感器的信号脚
const int LDR_Pin = A0; // 光敏电阻模块信号脚
const int LED1_Pin = 4; // 空调灯
const int LED2_Pin = 5; // 风扇灯
const int LED3_Pin = 6; // 灯
/*****************************< 变量定义 >*****************************/
bool PIR_State, Pre_PIR_State;
unsigned long Low_STime;
bool Resulet;
float Temperature_C;
char a;
int LDR_Value;
/*****************************< 对象声明 >*****************************/
DHT dht(DHT_Pin, DHT_TYPE); // 创建一个DHT对象,命名为dht,该对象可以调用DHT库里的函数
SoftwareSerial mySerial(10, 11); // RX, TX
/*--------------------------------------------------------------------------3--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------setup()程序初始化------------------------------------------------------------------*/
void setup() {
/******************************< 启动串口通讯 >******************************/
Serial.begin(9600); // 初始化串口通信,并设置波特率为9600
mySerial.begin(9600);
/******************************< 设置引脚模式 >******************************/
pinMode(PIR_Pin, INPUT); // 设置 引脚 为输入模式
pinMode(LED1_Pin, OUTPUT); // 设置 引脚 为输出模式
pinMode(LED2_Pin, OUTPUT); // 设置 引脚 为输出模式
pinMode(LED3_Pin, OUTPUT); // 设置 引脚 为输出模式
digitalWrite(LED1_Pin, LOW);
digitalWrite(LED2_Pin, LOW);
digitalWrite(LED3_Pin, LOW);
/**********************< 初始化DHT传感器,并确保可用性 >**********************/
dht.begin(); // 初始化对象dht
// 如果初始化之后,没有正确的数据,则报错进入死循环
if (isnan(dht.readHumidity()) || isnan(dht.readTemperature()) || isnan(dht.readTemperature(true))) { // 如果没有正确的数据,报错进入死循环
Serial.println(F("Failed to read from DHT sensor!"));
delay(5000);
} else {
Serial.println(F("DHT sensor OK!"));
}
}
/*--------------------------------------------------------------------------4--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------loop()基础循环体-------------------------------------------------------------------*/
void loop() {
// 通过DHT传感器得到温度数值,进行风扇判断
Temperature_C = dht.readTemperature(); // 默认摄氏度
if (Temperature_C > MAX_TEMP) {
digitalWrite(LED2_Pin, HIGH);
} else {
digitalWrite(LED2_Pin, LOW);
}
// 通过PIR判断人体存在,进行空调判断
Pre_PIR_State = PIR_State;
PIR_State = digitalRead(PIR_Pin); // 如果人体存在,但是没有明显移动,PIR_State会输出0,注意要设置为“可重复触发模式”(H)
if (Pre_PIR_State == 1 && PIR_State == 0) { // 检测到人体没有移动时,开始计时 ,目的是增加延时时间,减少误判的可能性
Low_STime = millis();
}
if (millis() - Low_STime > 5000) { // 如果持续5s没有检测到人体
Resulet = 0; // 则结果就是没人了
}
if (PIR_State) { // 如果持续检测到人体
Resulet = 1; // 那结果就是有人
}
if (Resulet) {
digitalWrite(LED1_Pin, HIGH);
} else {
digitalWrite(LED1_Pin, LOW);
}
if (mySerial.available()) {
a = mySerial.read();
}
if (a == '1') {
// 读取光敏电阻电压值,进行灯光判断
LDR_Value = analogRead(LDR_Pin); // 读取LDR_Pin的输入
if (LDR_Value < MIN_LDR_VALUE) {
digitalWrite(LED3_Pin, HIGH);
} else {
digitalWrite(LED3_Pin, LOW);
}
} else {
digitalWrite(LED3_Pin, LOW);
}
mySerial.print(Temperature_C);
mySerial.print(",");
mySerial.print(LDR_Value);
mySerial.print(",");
mySerial.println(Resulet);
delay(500);
}
/*--------------------------------------------------------------------------5--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------函数定义-----------------------------------------------------------------------*/