ArduinoUltraMega计时器的制作

电子说

1.3w人已加入

描述

第1步:第一步

Arduino

Arduino

Arduino

Arduino

Arduino

Arduino

Arduino

首先,我们需要设置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:计时器的诡计

Arduino

Arduino

Arduino

这里的挑战之一是比较“准时”和“关闭时间”随时了解当前时间。人们可以这样思考:

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日常计时器

Arduino

Arduino

Arduino

Arduino

此计时器是下一个计时器的基础。按照原理图安装电路,记住RTC和LCD共用相同的引脚(模拟4 SDA;模拟5 SCL)。

上传代码,记得添加库RTClib和LiquidCrystal_I2C。

您有3个按钮可以使用向上/向下按钮移动3个主页面,然后选择按钮进入和移动子菜单。

第一页显示消息和当前时间。

第二页是开/关界面,在这里您可以更改设定值。按选择按钮进入子菜单,箭头将放在每个项目的前面,按向上或向下按钮设置开启小时,分钟,秒和关闭小时,分钟,秒。按下选择按钮移动beetwen项目(仅限前进)最后一项是“后退”字符,如果按下,它将退出子菜单,现在您可以移动主页面。如果按下,箭头将放在第一个项目的前面。

第三页是保存设置。只需按下选择按钮,您的所有数据都将存储在eeprom上。消息“已保存!”将显示并自动重定向到主页面。

此计时器每天都会工作,如果出现电源故障或断开连接,将从eeprom恢复数据再次启动。

通过继电器,您可以控制设备。继电器通过高信号(5V)激活。

警告!小心继电器的最大负载!

步骤4:1定时器,可选日

Arduino

Arduino

Arduino

Arduino

此计时器适用于那些想要控制定时器激活日期的人。为此,我们将使用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每天接力

Arduino

Arduino

Arduino

Arduino

Arduino

Arduino

来自用户的另一个请求。此计时器能够通过单个输出在一天内控制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保存,因为您已经存储了值。如果你想研究定时器的代码,这也很有用。

正如你所看到的,可以按照逻辑添加更多的定时器,你可以使用“可选日”功能。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分