资讯详情

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

本帖最后由 ws9528 于 2018-10-26 21:03 编辑

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

[mw_shl_code=c,true]#include //加载串口头文件

#include //加载时间头文件

//DHT11

#include //加载DHT11头文件

dht11 DHT11; //实例化DHT11

#define DHT11PIN 9 //定义DHT11针脚

//DS1302

#include

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; //管脚D33连接到继电器模块的信号脚

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 ]

SDJ_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]

标签: dht11温度过高关闭继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台