查看: 1424|回复: 4

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

[复制链接]

该用户从未签到

发表于 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元

基本就这些吧。硬件在路上正在走。等到了,就动手弄。




  • TA的每日心情
    开心
    2019-3-15 00:28
  • 签到天数: 630 天

    [LV.9]以坛为家II

    发表于 2018-10-24 15:15 | 显示全部楼层
    没有那种智能暖风机 可以判断温度吗
    打赏作者鼓励一下!

    该用户从未签到

     楼主| 发表于 2018-10-24 17:27 | 显示全部楼层
    单片机菜鸟 发表于 2018-10-24 15:15
    没有那种智能暖风机 可以判断温度吗

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

    该用户从未签到

     楼主| 发表于 2018-10-26 20:52 | 显示全部楼层
    本帖最后由 ws9528 于 2018-10-26 21:03 编辑

    以下是晚上加班写的代码,应当是没有问题的,明天开始组装测试

    kittenblock中小学创客名师推荐的图形化编程软件

    #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;       //年 [1900 to  * ]
        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;  //年 [1900 to  * ]
        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;  //年 [1900 to  * ]
        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电平,继电器模块闭合
      }
    }




  • TA的每日心情
    开心
    2019-2-1 23:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-2-1 23:22 | 显示全部楼层
    向大神学习中~
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    有没人做过把arduino跟生物结合起来做课题的
    有没人做过把arduino跟生
    我想做一些这方面的有没有人做过可以稍微指点一下
    跪求,nano读两个软串口传感器,写入sd卡,一个读不到数
    跪求,nano读两个软串口传
    dfrobot的nano板,两个软串口连接攀藤pm2.5传感器和GPS ublox m8n,SPI连sd卡模块。
    Arduino2560/MegaPi与ROS机器人操作系统的连接
    Arduino2560/MegaPi与ROS
    大家好,我因为需要更多时间维系琐碎平凡的工作和生活,一段时间没有上Arduino论坛。
    atmegu328p开发板怎么做流水灯啊
    atmegu328p开发板怎么做流
    我是白小 求指点
    BuddyBlock 1.0.0 测试版发布,一款面向Arduino的图形化开发工...
    BuddyBlock 1.0.0 测试版
    BuddyBlock是一款面向Arduino图形化编程开发的集成开发工具,开发者可以通过积木模块
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表