本帖最后由 glmyc 于 2014-12-15 20:34 编辑
/*洗手间自动控制程序
一、程序实现没有人进入洗手间
1.根据室外室内温度来判明天气是冬天还是夏天,根据温度开关窗户
2.如果室外温度超过26度,室内室外温度相差4度,湿度超过10%
自动打开排气扇降温,解决南方开空调后凉下来后关闭空调,过一段时间室内开始闷热。
3.室外温度低于15度时,关闭窗户
二、当有人进入洗手间时
1.打开电子马桶,对坐垫进行预热
2.自动根据室内亮度点亮灯光
3.自动关闭窗户
4.如果检测到有人坐到马桶上,自动打开排气扇
5.如果没有坐在马桶上,自动根据洗手间内有人时延时相关开关
6.人离开时,延时1分,用于马桶充水、延时照明、根据室外温度打开或关闭窗户
***********************************************
用一个MINI PRO来控制
用两个DHT11来测量室外(2脚)、室内温湿度(3脚)
用一个红外传感器感应是否有人进入(4脚)
用一个光敏传感器感应光线强度(5脚)
用一个超声波一检测是否有人坐马桶(5、6脚)
选用低电平(LOW)触发继电器
窗户推杆开关在8、9脚,风扇开关在10脚,灯开关在11脚
马桶开关在12脚、备用13脚
经使用一段时间,感觉非常方便
*/
#include <dht11.h>
dht11 DHT11;
dht11 DHT12;
#define DHT11PIN 2
#define DHT12PIN 3
#define InfraredSensor 4
#define Light 5
#define Trig 6
#define Echo 7
#define Windows1 8
#define Windows2 9
#define Lamp 11
#define ExhaustFan 10
#define Stool 12
#define Pin13 13
int outtemp, outhumi, intemp, inhumi;
float Get_SR05(int Trigpin , int Echopin) {
digitalWrite(Trigpin, LOW);
delayMicroseconds(2);
digitalWrite(Trigpin, HIGH);
delayMicroseconds(10);
digitalWrite(Trigpin, LOW);
float distan = pulseIn(Echopin, HIGH) / 58.00;
return distan;
}
void setup()
{
Serial.begin(9600);
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
pinMode(Light, INPUT);
pinMode(Windows1, OUTPUT);
pinMode(Windows2, OUTPUT);
pinMode(ExhaustFan, OUTPUT);
pinMode(Lamp, OUTPUT);
pinMode(Stool, OUTPUT);
pinMode(Pin13, OUTPUT);
// digitalWrite(Windows1, HIGH); //初始化各继电器模块
// digitalWrite(Windows2, HIGH);
digitalWrite(ExhaustFan, HIGH);
digitalWrite(Lamp, HIGH);
digitalWrite(Stool, HIGH);
digitalWrite(Pin13, HIGH);
}
void loop()
{
float distance; //超声波距离变量
int RL1 = digitalRead(InfraredSensor); //第一时间检测是否有人
delay(3300); //由于洗手间一般无人在里面时门是开着的,路过的人经测试需要3.3秒,不会启动自动装置
int RL2 = digitalRead(InfraredSensor); //第二时间检测是否有人
if (RL1 == RL2) { //如果第一、第二时间检测的结果相同
int chk1 = DHT11.read(DHT11PIN); //读取室外温湿度传感器
int chk2 = DHT12.read(DHT12PIN); //读取室内温湿度传感器
int Outtemp = DHT11.temperature; //读取室外温度
int Outhumi = DHT11.humidity; //读取室外湿度
int Intemp = DHT12.temperature; //读取室内温度
int Inhumi = DHT12.humidity; //读取室内湿度
if (RL1 == 0) { //如果洗手间内没有人
if (Outtemp < 15) { //如果室外温度低于17摄氏度
digitalWrite(Windows1, LOW); //关闭窗户
digitalWrite(Windows2, LOW); //关闭窗户
Serial.println("0.1 Windows Close");
//delay(10000);
} else {
if (Outtemp > 26) { //如果室外温度高于26摄氏度
//如果室内温度与室外温度相差超过4度或湿度相差超过10%
if ((Intemp - Outtemp) > 4 || (Inhumi - Outhumi) > 10) {
digitalWrite(Windows1, LOW); //关闭窗户
digitalWrite(Windows2, LOW); //关闭窗户
digitalWrite(ExhaustFan, LOW); //打开排气扇进行排气
delay(30000);
digitalWrite(Windows1, HIGH); //关闭窗户
digitalWrite(Windows2, HIGH); //关闭窗户
digitalWrite(ExhaustFan, HIGH); //打开排气扇进行排气
} else {
digitalWrite(Windows1, HIGH); //打开窗户(常态)
digitalWrite(Windows2, HIGH); //打开窗户(常态)
delay(30000);
}
} else {
//其它情况
digitalWrite(Windows1, HIGH); //打开窗户(常态)
digitalWrite(Windows2, HIGH); //打开窗户(常态)
digitalWrite(ExhaustFan, HIGH); //关闭排气扇
digitalWrite(Lamp, HIGH); //关闭灯
digitalWrite(Stool, HIGH); //关闭马桶
digitalWrite(Pin13, HIGH);//关闭13脚备用
delay(30000);
}
}
}
if (RL1 == 1 && RL2 == 1) { //如果洗手间有人
digitalWrite(Stool, LOW); //打开马桶电源预热坐垫
digitalWrite(Windows1, LOW); //关闭窗户
digitalWrite(Windows2, LOW); //关闭窗户
digitalWrite(Pin13, LOW); //打开13脚备用
if (Outtemp > 15) { //如果室外温度高于15度
digitalWrite(ExhaustFan, LOW); //打开排气扇进行排气
}
if (digitalRead(Light)) { //如果光线较旱黒
digitalWrite(Lamp, LOW); //打开灯光
}
int time_l = 0; //人在洗手间经过的时间
while (time_l < 100) {
float distance = Get_SR05(6, 7); //测出是否有人在坐马桶
if ((int)distance < 55) { //距离小于55CM时,认为有人坐马桶
digitalWrite(ExhaustFan, LOW); //打开排气扇进行排气
time_l = 0; //让时间不进行计量
delay(1000);
continue; //停1秒钟后返回循环
} else {
if (digitalRead(InfraredSensor)) { //如果检测到继续有人在洗手间
time_l = 0;
continue; //返回循环
} else {
time_l++;
delay(500); //加速循环
digitalWrite(ExhaustFan, HIGH); //关闭排气扇进行排气
}
}
}
digitalWrite(ExhaustFan, HIGH); //关闭所有用电开关
digitalWrite(Lamp, HIGH);
digitalWrite(Stool, HIGH);
digitalWrite(Pin13, HIGH);
}
}
} |