本帖最后由 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]
|