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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7922|回复: 8

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

[复制链接]
发表于 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 | 显示全部楼层
没有那种智能暖风机 可以判断温度吗
 楼主| 发表于 2018-10-24 17:27 | 显示全部楼层
单片机菜鸟 发表于 2018-10-24 15:15
没有那种智能暖风机 可以判断温度吗

好像没有吧。没注意看。反正我是要玩,顺带着解决问题。即使有,估计也价格不低
 楼主| 发表于 2018-10-26 20:52 | 显示全部楼层
本帖最后由 ws9528 于 2018-10-26 21:03 编辑

以下是晚上加班写的代码,应当是没有问题的,明天开始组装测试
[mw_shl_code=c,true]#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电平,继电器模块闭合
  }
}[/mw_shl_code]



发表于 2019-2-1 23:22 | 显示全部楼层
向大神学习中~
发表于 2019-9-5 08:40 | 显示全部楼层
向大神学习,能带上我不?
 楼主| 发表于 2019-10-9 14:05 | 显示全部楼层
这个问题早已搞定了,现在已经可以通过手机远程控制了。在此感谢论坛中各路神仙的帮助
发表于 2019-11-12 07:03 | 显示全部楼层
ds1302准吗?过几天就不准了,半年后10分钟都有了。
 楼主| 发表于 2019-11-24 18:06 | 显示全部楼层
sting2k1 发表于 2019-11-12 07:03
ds1302准吗?过几天就不准了,半年后10分钟都有了。

现在已经可以用代码直接获取网络服务器时间了。不用这个东东了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:56 , Processed in 0.095564 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表