电子说
第1步:第一步
首先,我们需要设置LCD,RTC并清除arduinos eeprom。
-LCD lcd必须有一个地址,在代码的开头声明:
LiquidCrystal_I2C lcd(0x3F,16,2);//0x3F是我的lcd地址,也许不是你的地址!
如果您不知道地址,请使用实用程序“I2C扫描仪”。按如下方式连接你的液晶显示器:
-VCC到arduino 5V
-GND到arduino GND
-SDA到arduino模拟引脚4
-SCL到arduino模拟引脚5
上传代码并打开串口监视器,将显示地址。如果地址不同,则替换地址(0x3F)。
下载:
https://gist.github.com/tfeldmann/5411375
-RTC 我们将使用RTC 3231,但必须对编程时间进行编程。将RTClib-master添加到Arduino库中。转到文件/examples/RTClib/ds3231。上传代码。此草图根据您正在使用的计算机(编译代码时的正确性)获取日期和时间,并使用它来编程RTC。如果您的计算机时间设置不正确,您应该先修复它。然后你必须按上传按钮进行编译,然后立即上传。
警告!: 如果你编译然后再上传,时钟将是离开这段时间。然后打开串行监视器窗口以显示时间已设置。
按如下方式连接rtc:
-VCC到arduino 5V
-GND到arduino GND
-SDA到arduino模拟引脚4
-SCL到arduino模拟引脚5
如果你不知道,可以连接lcd和rtc同时到I2C总线(模拟4 SDA,模拟5 SCL)。
-EEPROM清除通常,eeprom值是255 x地址,我们需要将这些值设置为0. eeprom库已包含在您的arduino IDE中。
转到文件/示例/EEPROM/eeprom_clear。
上传代码并等待引脚13导通。您可以使用eeprom_read代码检查您的值。
观看视频!
本教程中使用的RTC和LCD库:
步骤2:计时器的诡计
这里的挑战之一是比较“准时”和“关闭时间”随时了解当前时间。人们可以这样思考:
if(now hour == on hour && now minute == on minute && now second == on second)
relay on
if(now hour == off hour && now minute == off minute && now second == off second)
relay off
这可能会有效,但是如果你的设定点是12 :30:00,你的设定点15:45:15,当前时间是13:00:00?好吧,你会等到第二天打开你的设备!或者如果你在12:30:00和15:45:15失去力量怎么办?同样的事情:等待触发设置。
如果你查看我以前的计时器,有很多if/else语句来控制继电器,因为时间是循环的,我们需要涵盖所有可能的情况。但要添加分钟和秒钟则是别的。所有值都可以高于或低于开/关设置或当前时间,并尝试比较它将是一团糟。
所以我想在军事时间或字符串数字从0到235959,和这就是这些计时器的诀窍。因此,我们将当前时间,设定值和关闭设定值转换为单个数字。
我将解释定时器的工作原理,因为更改设置和显示值等的界面可以是在我的多屏幕教学中学习。介绍中的链接。
首先,我们为计时器创建变量(开/关):
//------ First Timer
byte onhour1;
字节onmin1;
字节onsec1;
字节offhour1;
字节offmin1;
字节offsec1;
字节数据类型(0到255无符号)用于存储值。一个字节可以很容易地存储在eeprom(1个数据x地址)中,较大的数字将是59(分钟或秒)。我们从最初的eeprom值0开始,因为eeprom被清除了。其中()是eeprom地址。
void setup 。..。..。
//-------- eePROM读取值-------//
//------第一个定时器
onhour1 = EEPROM.read(0 );
onmin1 = EEPROM.read(1);
onsec1 = EEPROM.read(2);
offhour1 = EEPROM.read(3);
offmin1 = EEPROM.read(4);
offsec1 = EEPROM.read(5);
这些值可以更改和保存,稍后再进行按钮接口。
但是我们不能用字节进行数学运算(转换为单个数字),因为我们的较大数字将是235,959或int = 32,767(正数)或无符号int = 65,535。所以,unsigned long将是。
我们创建另一个变量来将字节转换为unsigned long。此外,使用的最终值:on_Time1和off_Time1
//------将第一个计时器转换为单个数字
无符号长整数on_Time1;
unsigned long on_hour1;
unsigned long on_min1;
unsigned long on_sec1;
unsigned long off_Time1;
unsigned long off_hour1;
unsigned long off_min1;
unsigned long off_sec1;
//-------将时钟转换为单个数字
unsigned long Time;
unsigned long Hour;
unsigned long Min;
unsigned long Sec;
转换在void循环中执行。对于当前时间,我们从库函数now(),hour,minute,second获取rtc中的值,并将此值分配给Hour,Min和Sec。 “时间”是小时* 10000的总和的结果; Min * 100和Sec。
示例:15:45:34 =(15 * 10000 + 45 * 100 + 34)= 154,534
//------- ------转换----------//
//---------将时钟时间转换为单个数字
Hour = now.hour();
Min = now.minute();
秒= now.second();
时间=(小时* 10000 +最小* 100 +秒* 1);
与开/关设置相同。这里我们从开头(字节)获取值并按如下方式分配这些值:
//--------将firt定时器开/关转换为单个数字
on_hour1 = onhour1;
on_min1 = onmin1;
on_sec1 = onsec1;
on_Time1 =(on_hour1 * 10000 + on_min1 * 100 + on_sec1);
off_hour1 = offhour1;
off_min1 = offmin1;
off_sec1 = offsec1;
off_Time1 =(off_hour1 * 10000 + off_min1 * 100 + off_sec1 );
最终结果是我们将要工作的3个变量:Time,on_Time1和off_Time1
现在是继电器功能。在这里,我们将“Time”与“on_Time1”和“off_Time1”进行比较以打开或关闭继电器。我们有3个主要的“if”语句:
1)if(onhour1 == offhour1 && onmin1 == offmin1 && onsec1 == offsec1){
digitalWrite(Relay,LOW); }
此语句是启用/禁用功能。我们使用字节值,因为这里我们不需要任何转换。如果所有值都相同,则继电器关闭。如果你改变,即使是一秒,计时器也会工作。
2)if(on_Time1
if(Time》 = on_Time1 && Time
digitalWrite(Relay,HIGH);
}
否则if(Time》 = off_Time1){
digitalWrite(Relay,LOW);
}
else {
digitalWrite(Relay,LOW);
}
}
3)if(on_Time1》 off_Time1){
if(Time》 = on_Time1 && Time 《= 235959 ){//开始
digitalWrite(Relay,HIGH);
}
否则if(Time
digitalWrite (接力,HIGH);
}
否则if(Time》 = off_Time1 && Time
digitalWrite(Relay,LOW);这两个函数涵盖了两种可能的设置:“开启时间”低于“关闭时间”和“开启时间”高于“关闭时间”。在每个设置中你可以找到3个以上的语句随时控制继电器。通过图形演示可以很容易地理解功能。观看图片!
使用按钮界面,我们可以更改值(开/关)并存储新的值。这是存储值的结构。正如我所说,我们将字节值存储在一个地址上。其中:
(地址,字节值)
EEPROM.write(0,onhour1);
EEPROM.write(1,onmin1);
EEPROM.write(2,onsec1);
EEPROM.write(3,offhour1);
EEPROM.write(4,offmin1);
EEPROM。 write(5,offsec1);
步骤3:1日常计时器
此计时器是下一个计时器的基础。按照原理图安装电路,记住RTC和LCD共用相同的引脚(模拟4 SDA;模拟5 SCL)。
上传代码,记得添加库RTClib和LiquidCrystal_I2C。
您有3个按钮可以使用向上/向下按钮移动3个主页面,然后选择按钮进入和移动子菜单。
第一页显示消息和当前时间。
第二页是开/关界面,在这里您可以更改设定值。按选择按钮进入子菜单,箭头将放在每个项目的前面,按向上或向下按钮设置开启小时,分钟,秒和关闭小时,分钟,秒。按下选择按钮移动beetwen项目(仅限前进)最后一项是“后退”字符,如果按下,它将退出子菜单,现在您可以移动主页面。如果按下,箭头将放在第一个项目的前面。
第三页是保存设置。只需按下选择按钮,您的所有数据都将存储在eeprom上。消息“已保存!”将显示并自动重定向到主页面。
此计时器每天都会工作,如果出现电源故障或断开连接,将从eeprom恢复数据再次启动。
通过继电器,您可以控制设备。继电器通过高信号(5V)激活。
警告!小心继电器的最大负载!
步骤4:1定时器,可选日
此计时器适用于那些想要控制定时器激活日期的人。为此,我们将使用RTC的函数“now.dayOfTheWeek()”,它的值可以是1到7;周一至周日。要为每个数字指定星期几,我们使用此(全局变量):
char daysOfTheWeek [7] [12] = {“Sunday”,“Monday”,“Tuesday”,“Wednesday” “,”星期四“,”星期五“,”星期六“};
要在液晶显示屏(主页)上显示:
lcd.print(daysOfTheWeek [now.dayOfTheWeek( )]);
我们需要新的变量来知道这一天是否被激活/禁用。所以:
//------星期几
布尔值Sun1;
布尔值Mon1;
布尔值Tue1;
布尔值Wed1;
布尔值Thu1;
布尔值Fri1;
布尔值Sat1;
我们使用布尔值(1或0)作为其他变量,我们从eeprom.Boolean中取值可以存储在1个地址中。最后使用的地址是5(offsec1),所以我们继续:
void setup 。..。.
Sun1 = EEPROM.read(6);
Mon1 = EEPROM.read(7);
Tue1 = EEPROM.read(8);
Wed1 = EEPROM.read(9);
Thu1 = EEPROM.read(10);
Fri1 = EEPROM.read(11);
Sat1 = EEPROM.read(12);
请记住,您的第一个值为0(eeprom clear)。因此0表示禁用,1表示启用日。
为了控制继电器,我们需要检查当天并检查当天是否启用/禁用计时器。
使用另一个开关函数,其中每个“case”将是“now.dayOfTheWeek()”的值(1到7)
//----每天的中继函数--- -//
switch(now.dayOfTheWeek()){//now.dayOfTheWeek值1到7,星期一到星期日
案例1://如果星期一
如果(Mon1 == 1){
First_Timer();
}
else {
digitalWrite(Relay1,LOW);
}
打破;
案例2://如果星期二
if(Tue1 == 1){
First_Timer();
}
else {
digitalWrite(Relay1,LOW);
}休息;
案例3:。..。..。依此类推。..。..
例如:如果今天是星期一(now.dayOfTheWeek()= 1),我们进入第一个案例。如果布尔值Mon1 == 1(启用日期),我们调用自定义函数“First_Timer()”,与前一个计时器相同的中继函数,现在作为自定义函数工作,所以我们不需要写它每个案例。如果我们输入0,则继电器功能将为低电平(禁用一天)。所以我们每天使用一个案例并跳过其他案例。
现在我们需要在界面上添加另一个屏幕来更改设置。
主页面显示当前日期和时间。
开/关设置的第二页。
这里我们介绍新页面,您可以选择激活继电器的日期,其工作方式与其他工作方式相同:箭头表示该项目,如果按下向上按钮,则会在当天放置1并启用。如果按下,您将输入0并且该日期将被禁用。
第四页保存设置,开/关时间和日期启用/禁用。要保存的结构:
EEPROM.write(0,onhour1);
EEPROM.write(1,onmin1);
EEPROM.write(2,onsec1);
EEPROM.write(3,offhour1);
EEPROM.write(4,offmin1);
EEPROM.write(5,offsec1);
EEPROM.write(6,Sun1);
EEPROM.write(7,Mon1);
EEPROM.write(8,Tue1);
EEPROM.write(9,Wed1);
EEPROM.write(10,Thu1);
EEPROM.write(11,Fri1);
EEPROM.write(12,Sat1);
步骤5:4个定时器1每天接力
来自用户的另一个请求。此计时器能够通过单个输出在一天内控制4个事件。没什么可说的,因为我们只为定时器2,3和4添加更多变量,也是移动设置的界面。我们继续从上次使用的地址读取和写入。
注意:小心不要与定时器重叠,因为它们中的任何一个都可以打开或关闭继电器。
所以,这里有3个定时器,界面很好。对于“简单”版本,您只需要更改“///////////“中的值。默认值为0。
开/关1,2,3,4 = 0-23
on/offmin1,2,3,4 = 0-59
on/offsec1,2,3,4 = 0-59
Day启用/禁用= 1表示启用0表示禁用。
“简单”计时器不需要eeprom保存,因为您已经存储了值。如果你想研究定时器的代码,这也很有用。
正如你所看到的,可以按照逻辑添加更多的定时器,你可以使用“可选日”功能。
全部0条评论
快来发表一下你的评论吧 !