0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ArduinoUltraMega计时器的制作

454398 来源:wv 2019-09-20 09:16 次阅读

第1步:第一步

ArduinoUltraMega计时器的制作

首先,我们需要设置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保存,因为您已经存储了值。如果你想研究定时器的代码,这也很有用。

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

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

    关注

    187

    文章

    6461

    浏览量

    186571
收藏 人收藏

    评论

    相关推荐

    单个 MSP430™ 计时器模块的多时基应用说明

    电子发烧友网站提供《单个 MSP430™ 计时器模块的多时基应用说明.pdf》资料免费下载
    发表于 09-13 11:09 0次下载
    单个 MSP430™ <b class='flag-5'>计时器</b>模块的多时基应用说明

    MSPM0-高级控制计时器有助于实现更好的控制和更好的数字输出

    电子发烧友网站提供《MSPM0-高级控制计时器有助于实现更好的控制和更好的数字输出.pdf》资料免费下载
    发表于 08-28 11:30 0次下载
    MSPM0-高级控制<b class='flag-5'>计时器</b>有助于实现更好的控制和更好的数字输出

    用于电源门控的TPL5110毫微功耗系统计时器数据表

    电子发烧友网站提供《用于电源门控的TPL5110毫微功耗系统计时器数据表.pdf》资料免费下载
    发表于 08-23 11:26 0次下载
    用于电源门控的TPL5110毫微功耗系统<b class='flag-5'>计时器</b>数据表

    用于电源门控应用的TPL5111毫微功耗系统计时器数据表

    电子发烧友网站提供《用于电源门控应用的TPL5111毫微功耗系统计时器数据表.pdf》资料免费下载
    发表于 08-23 11:25 0次下载
    用于电源门控应用的TPL5111毫微功耗系统<b class='flag-5'>计时器</b>数据表

    TLC555-Q1 LinCMOS™计时器数据表

    电子发烧友网站提供《TLC555-Q1 LinCMOS™计时器数据表.pdf》资料免费下载
    发表于 08-23 11:19 0次下载
    TLC555-Q1 LinCMOS™<b class='flag-5'>计时器</b>数据表

    TLC555 LinCMOS™技术计时器数据表

    电子发烧友网站提供《TLC555 LinCMOS™技术计时器数据表.pdf》资料免费下载
    发表于 08-20 11:15 0次下载
    TLC555 LinCMOS™技术<b class='flag-5'>计时器</b>数据表

    LMC555 CMOS计时器数据表

    电子发烧友网站提供《LMC555 CMOS计时器数据表.pdf》资料免费下载
    发表于 08-20 09:16 0次下载
    LMC555 CMOS<b class='flag-5'>计时器</b>数据表

    spi_flash期间的计时器中断导致崩溃怎么解决?

    这是我遇到的 SDK 中的一个小错误 (esp_iot_sdk_v0.9.5_b1): 我在 Timer1 上使用计时器中断: ets_frc_timer1_intr_attach
    发表于 07-12 11:54

    TLE986x如何定期重新启动计时器

    我在模式 0-13 位定时模式下运行 T3。 达到溢出时,计时器停止。 请问如何定期重新启动计时器
    发表于 07-03 07:13

    双路精密计时器选购指南:准确选择,高效工作

    在快节奏的现代生活中,准确的时间管理对于个人和团队的成功至关重要。双路精密计时器作为一种高效的计时工具,受到了越来越多人的青睐。那么,如何选购一款适合自己的双路精密计时器呢?本文将为您提供一份详尽
    的头像 发表于 06-26 16:06 316次阅读

    SNx5DPHY440SS CSI-2/DSI DPHY 重计时器数据表

    电子发烧友网站提供《SNx5DPHY440SS CSI-2/DSI DPHY 重计时器数据表.pdf》资料免费下载
    发表于 06-25 11:07 0次下载
    SNx5DPHY440SS CSI-2/DSI DPHY 重<b class='flag-5'>计时器</b>数据表

    带看门狗计时器的TPS382x电压监视数据表

    电子发烧友网站提供《带看门狗计时器的TPS382x电压监视数据表.pdf》资料免费下载
    发表于 03-25 09:52 0次下载
    带看门狗<b class='flag-5'>计时器</b>的TPS382x电压监视<b class='flag-5'>器</b>数据表

    具有可编程复位延迟功能的 TPS3430 窗口看门狗计时器数据表

    电子发烧友网站提供《具有可编程复位延迟功能的 TPS3430 窗口看门狗计时器数据表.pdf》资料免费下载
    发表于 03-13 14:42 2次下载
    具有可编程复位延迟功能的 TPS3430 窗口看门狗<b class='flag-5'>计时器</b>数据表

    具有使能功能的 TPS3431 标准可编程监视计时器数据表

    电子发烧友网站提供《具有使能功能的 TPS3431 标准可编程监视计时器数据表.pdf》资料免费下载
    发表于 03-13 14:31 0次下载
    具有使能功能的 TPS3431 标准可编程监视<b class='flag-5'>器</b><b class='flag-5'>计时器</b>数据表

    ModusToolbox™生成时如何调用systick计时器ISR?

    我无法理解当项目由 ModusToolbox™生成时如何调用 systick 计时器 ISR。 通常,当您设置系统计时器并启用其中断时,系统会直接从中断向量调用 Systick_Handler。 我
    发表于 01-18 09:16