从实际生活出发,一个温度控制小项目。
项目出发点:冬天到了,家住西安这边农村,家里没有暖气,早上起床,房子内太冷(这个房间没有空调),导致孩子早上起床困难,上学容易迟到。
项目需求:
早上的时候能让房间温度达到事宜温度。其余时间不用管,因为都在被窝里面(有电热毯)。
项目方案:
在网上购买39.9元的暖风机,用Arduino来控制它的开关。当时间为早上6点到7点之间,并且DHT11的温度达到指定最低温度时打开继电器让暖风机开始加热室内温度,否则关闭。
用到的硬件:
1、暖风机 1个39.9元
2、Arduino 主板1个 20.5元
3、DS1302实时时钟模块 1个 1.8元
4、继电器 1个 9元 这里我用的是5V两路的,本意还想再控制加湿器。这里只用一路即可
5、DHT11温度模块 5元
基本就这些吧。硬件在路上正在走。等到了,就动手弄。
没有那种智能暖风机 可以判断温度吗 单片机菜鸟 发表于 2018-10-24 15:15
没有那种智能暖风机 可以判断温度吗
好像没有吧。没注意看。反正我是要玩,顺带着解决问题。即使有,估计也价格不低 本帖最后由 ws9528 于 2018-10-26 21:03 编辑
以下是晚上加班写的代码,应当是没有问题的,明天开始组装测试
#include <SoftwareSerial.h> //加载串口头文件
#include <time.h> //加载时间头文件
//DHT11
#include <dht11.h> //加载DHT11头文件
dht11 DHT11; //实例化DHT11
#define DHT11PIN 9 //定义DHT11针脚
//DS1302
#include <DS1302.h>
const int kCePin = 5;// 芯片使能 RST
const int kIoPin = 6; // 输入输出 DAT
const int kSclkPin = 7;// 串行时钟 CLK
DS1302 rtc(kCePin, kIoPin, kSclkPin);
//开关
const int KaiGuan = 2;
int KaiGuan_ZhuangTai = 0;
//继电器
int JiDianQi = 8; //管脚D3连接到继电器模块的信号脚
void setup() {
Serial.begin(9600); //设置软串口波特率
//校队时间
//rtc.writeProtect(false);//写保护
//rtc.halt(false); //停止
//Time t(2018, 10, 26, 17, 34, 50, Time::kSunday);//创建并写人世间
//rtc.time(t);
pinMode(JiDianQi, OUTPUT); //设置JiDianQi脚为输出状态
pinMode(KaiGuan, INPUT); //设置KaiGuan脚为输入状态
}
void loop() {
delay(2000);
//硬开关 打开 继电器自动暖风机开关打开加热自动
//硬开关 关闭 继电器打开暖风机开关打开加热打开
//暖风机开关 关闭 无论如何也不会加热
//冬季适宜居住的温度在19度到24度。
//当硬开关关闭,继电器长开 暖风机由其自身开关决定
KaiGuan_ZhuangTai = digitalRead(KaiGuan);
if (KaiGuan_ZhuangTai == HIGH) {
//Serial.println("自动控温打开");
//以下是对当前时间和设定时间1设定时间2的处理+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Time t = rtc.time();//从芯片中获取当前时间和日期。
struct tm DQSJ; //DQSJ当前时间声明tm结构体DQSJ。tm结构体定义在头文件time.h中
DQSJ.tm_year = t.yr; //年
DQSJ.tm_mon = t.mon; //月 [ 0 to 11 ]
DQSJ.tm_mday = t.date; //天 [ 1 to 31 ]
DQSJ.tm_hour = t.hr; //时 [ 0 to 23 ]
DQSJ.tm_min = t.min; //分 [ 0 to 59 ]
DQSJ.tm_sec = t.sec; //秒 [ 0 to 59 ]
Serial.print("当前时间:");Serial.print( DQSJ.tm_year);Serial.print( "-");Serial.print( DQSJ.tm_mon);Serial.print( "-");Serial.print( DQSJ.tm_mday);Serial.print( " ");Serial.print( DQSJ.tm_hour);Serial.print( ":");Serial.print( DQSJ.tm_min);Serial.print( ":");Serial.println( DQSJ.tm_sec);
struct tm SDSJ_1; //SDSJ_1设定时间 声明tm结构体SDSJ_1。tm结构体定义在头文件time.h中
SDSJ_1.tm_year = t.yr;//年
SDSJ_1.tm_mon = t.mon; //月 [ 0 to 11 ]
SDSJ_1.tm_mday = t.date; //天 [ 1 to 31 ]
SDSJ_1.tm_hour = 5; //时 [ 0 to 23 ]
SDSJ_1.tm_min = 50; //分 [ 0 to 59 ]
SDSJ_1.tm_sec = 0; //秒 [ 0 to 59 ]
Serial.print("设定时间:");Serial.print( SDSJ_1.tm_year);Serial.print( "-");Serial.print( SDSJ_1.tm_mon);Serial.print( "-");Serial.print( SDSJ_1.tm_mday);Serial.print( " ");Serial.print( SDSJ_1.tm_hour);Serial.print( ":");Serial.print( SDSJ_1.tm_min);Serial.print( ":");Serial.println( SDSJ_1.tm_sec);
struct tm SDSJ_2; //SDSJ_2设定时间 声明tm结构体SDSJ_2。tm结构体定义在头文件time.h中
SDSJ_2.tm_year = t.yr;//年
SDSJ_2.tm_mon = t.mon; //月 [ 0 to 11 ]
SDSJ_2.tm_mday = t.date; //天 [ 1 to 31 ]
SDSJ_2.tm_hour = 7; //时 [ 0 to 23 ]
SDSJ_2.tm_min = 0; //分 [ 0 to 59 ]
SDSJ_2.tm_sec = 0; //秒 [ 0 to 59 ]
Serial.print("设定时间:");Serial.print( SDSJ_2.tm_year);Serial.print( "-");Serial.print( SDSJ_2.tm_mon);Serial.print( "-");Serial.print( SDSJ_2.tm_mday);Serial.print( " ");Serial.print( SDSJ_2.tm_hour);Serial.print( ":");Serial.print( SDSJ_2.tm_min);Serial.print( ":");Serial.println( SDSJ_2.tm_sec);
//SDSJ_1.tm_wday=0; //周 [ 0 to 6 ]
//SDSJ_1.tm_yday=1; //天[ 0 to 365 ]
unsigned long DQMS = mktime(&DQSJ);//当前秒数;
unsigned long SDMS_1 = mktime(&SDSJ_1);//设定秒数;
unsigned long SDMS_2 = mktime(&SDSJ_2);//设定秒数;
Serial.print( "当前秒:");Serial.println( DQMS );
Serial.print( "设定秒1:");Serial.println( SDMS_1 );
Serial.print( "设定秒2:");Serial.println( SDMS_2 );
if(SDMS_2 >= DQMS && DQMS <= SDMS_1) {
digitalWrite(JiDianQi, LOW); //继电器0设置为高电平 上面那个 低电平 LOW 高电平 HIGH
Serial.println("自动控温打开未到设定时间范围");//判断 time.h 中的函数。作用是,将时间转换为自1970年1月1日以来持续时间的秒数
}
if(SDMS_2 <= DQMS && DQMS >= SDMS_1) {
digitalWrite(JiDianQi, LOW); //继电器0设置为高电平 上面那个 低电平 LOW 高电平 HIGH
Serial.println("自动控温打开超过设定时间范围");//判断 time.h 中的函数。作用是,将时间转换为自1970年1月1日以来持续时间的秒数
}
//以上是对当前时间和设定时间1设定时间2的处理+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(SDMS_2 >= DQMS && DQMS >= SDMS_1) {
Serial.println("自动控温打开正在设定时间范围");//判断 time.h 中的函数。作用是,将时间转换为自1970年1月1日以来持续时间的秒数
DHT11.read(DHT11PIN);//读取DHT11
double DHT11_SD = DHT11.humidity;//得到湿度
double DHT11_WD = DHT11.temperature;//得到温度
Serial.print( "当前温度:"); Serial.print( DHT11_WD); Serial.println( "℃");
Serial.print( "当前湿度:"); Serial.print( DHT11_SD); Serial.println( "%");
//**********以下是根据温度来控制继电器代码********************
if ( DHT11_WD < 19 ) { //如果当前温度小于19度 则打开继电器开始加热
digitalWrite(JiDianQi, HIGH); //继电器0设置为高电平 上面那个 低电平 LOW 高电平 HIGH
}
if (DHT11_WD > 24 ) { //如果当前温度大于24度 则关闭继电器停止加热
digitalWrite(JiDianQi, LOW); //继电器0设置为高电平 上面那个 低电平 LOW 高电平 HIGH
}
}
}
else {
Serial.println("自动控温关闭");
digitalWrite(JiDianQi, HIGH);//输出HIGH电平,继电器模块闭合
}
}
向大神学习中~ 向大神学习,能带上我不? 这个问题早已搞定了,现在已经可以通过手机远程控制了。在此感谢论坛中各路神仙的帮助 ds1302准吗?过几天就不准了,半年后10分钟都有了。 sting2k1 发表于 2019-11-12 07:03
ds1302准吗?过几天就不准了,半年后10分钟都有了。
现在已经可以用代码直接获取网络服务器时间了。不用这个东东了。
页:
[1]