从实际生活出发,一个温度控制小项目。-Arduino中文社区 - Powered by Discuz! Archiver

ws9528 发表于 2018-10-24 13:19

从实际生活出发,一个温度控制小项目。

项目出发点:
冬天到了,家住西安这边农村,家里没有暖气,早上起床,房子内太冷(这个房间没有空调),导致孩子早上起床困难,上学容易迟到。

项目需求:
早上的时候能让房间温度达到事宜温度。其余时间不用管,因为都在被窝里面(有电热毯)。

项目方案:
在网上购买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-24 17:27

单片机菜鸟 发表于 2018-10-24 15:15
没有那种智能暖风机 可以判断温度吗

好像没有吧。没注意看。反正我是要玩,顺带着解决问题。即使有,估计也价格不低

ws9528 发表于 2018-10-26 20:52

本帖最后由 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电平,继电器模块闭合
}
}



kanhecs 发表于 2019-2-1 23:22

向大神学习中~

AZI1974 发表于 2019-9-5 08:40

向大神学习,能带上我不?

ws9528 发表于 2019-10-9 14:05

这个问题早已搞定了,现在已经可以通过手机远程控制了。在此感谢论坛中各路神仙的帮助

sting2k1 发表于 2019-11-12 07:03

ds1302准吗?过几天就不准了,半年后10分钟都有了。

ws9528 发表于 2019-11-24 18:06

sting2k1 发表于 2019-11-12 07:03
ds1302准吗?过几天就不准了,半年后10分钟都有了。

现在已经可以用代码直接获取网络服务器时间了。不用这个东东了。
页: [1]
查看完整版本: 从实际生活出发,一个温度控制小项目。