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
    +关注

    关注

    191

    文章

    6535

    浏览量

    197701
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞萨RA系列FSP库开发实战指南之IWDT独立看门狗定时简介和功能框图剖析

    IWDT(Independent Watchdog Timer)由一个14位的向下计数组成,用于从应用程序中的意外错误中恢复。应用程序必须在允许的计数窗口内进行刷新计时器,如果允许计数下溢或者是在有效刷新周期外刷新的话,IW
    的头像 发表于 05-26 16:03 127次阅读
    瑞萨RA系列FSP库开发实战指南之IWDT独立看门狗定时<b class='flag-5'>器</b>简介和功能框图剖析

    求助,关于LPC546XX CTIMER 配置问题求解

    channels 0-1: Input capture CTIMER1 channels 2-3: Timeout interrupts 我需要在同一计时器上使用匹配寄存添加计时器溢出检测。我的做法是使用通道
    发表于 04-20 07:38

    客户案例分享 | 毫秒定胜负,这款赛事级连接守护成绩公正

    体育赛事计时器竞技体育中,毫秒决胜负赛事计时器,捍卫成绩公正它通过高速摄影与信号同步精准保障赛事结果不偏不倚而高可靠的电源和信号连接便是赛事计时器稳定电气连接的关键体育赛事
    的头像 发表于 04-07 19:58 192次阅读
    客户案例分享 | 毫秒定胜负,这款赛事级连接<b class='flag-5'>器</b>守护成绩公正

    Linux内核的“心跳”:jiffies如何为系统计时

    在 Linux 内核的世界里,有一个默默工作的 "计时器"——jiffies。它不像我们手机上的时钟那样显示年月日,却掌控着内核中绝大多数时间相关的操作:从进程调度到设备驱动的定时检查,都离不开它的身影。
    的头像 发表于 02-04 16:27 989次阅读
    Linux内核的“心跳”:jiffies如何为系统<b class='flag-5'>计时</b>?

    “喂狗”的艺术:看门狗不叫,才是系统好

    程序的。现实里的狗会追飞盘,PLC里的看门狗追的是跑飞的程序。 本质上是一个计时器,用于监控程序的运行状态。主程序在正常运行时,需要定期“喂狗”(即重置计时器)。一旦程序跑飞或陷入死循环,导致无法及时喂狗,看门狗计时器
    的头像 发表于 11-25 10:50 524次阅读
    “喂狗”的艺术:看门狗不叫,才是系统好

    TE Connectivity RAST 2.5标准计时器压接连接:家用电器连接的可靠解决方案

    TE Connectivity (TE) RAST 2.5标准计时器压接连接设计用于轻松可靠地连接家用电器和洗衣机应用。该连接采用薄型设计,压接版本非常适合用于双绝缘电线和PVC管密封式电线
    的头像 发表于 11-04 09:16 936次阅读

    耐电痕化指数测定仪:滴液计时器设置与终点判据的深度解读

    一、滴液计时器:模拟环境的“节奏控制”​ 耐电痕化测试的核心是复刻绝缘材料在潮湿污染环境中的劣化过程,滴液计时器则是把控这一过程节奏的关键。其设置本质是对自然环境中“污染物累积速率” 的科学模拟
    的头像 发表于 10-16 09:46 534次阅读
    耐电痕化指数测定仪:滴液<b class='flag-5'>计时器</b>设置与终点判据的深度解读

    计数计时器频率表转速表

    测量仪仪器仪表
    西安同步电子科技有限公司
    发布于 :2025年10月13日 19:32:57

    MIC1551/53 IttyBitty RC定时/振荡技术解析与应用指南

    支持稳定(振荡)运行,具有用于低功耗关断的芯片选择/复位(CS)输入。这些Microchip计时器/振荡器具有2.7V至5.5V宽工作电压范围、低电源电流和快速输出响应,非常适用于消费电子、工业控制和仪器仪表中的便携式、电池供电和计时
    的头像 发表于 09-29 09:47 1269次阅读
    MIC1551/53 IttyBitty RC定时<b class='flag-5'>器</b>/振荡<b class='flag-5'>器</b>技术解析与应用指南

    TPS36-Q1汽车级超低功耗精密监控技术解析

    Texas Instruments TPS36-Q1超低功耗(典型值为 250nA)监控是具有可编程窗口看门狗计时器的精密电压监控。TPS36-Q1支持用于欠压监控的宽阈值电平,在额定温度范围内
    的头像 发表于 08-25 10:08 1031次阅读
    TPS36-Q1汽车级超低功耗精密监控<b class='flag-5'>器</b>技术解析

    TPS36-Q1超低功耗精密监控技术解析

    Texas Instruments TPS36-Q1超低功耗(典型值为 250nA)监控是具有可编程窗口看门狗计时器的精密电压监控。TPS36-Q1支持用于欠压监控的宽阈值电平,在额定温度范围内
    的头像 发表于 08-22 14:48 1098次阅读
    TPS36-Q1超低功耗精密监控<b class='flag-5'>器</b>技术解析

    零知开源——基于STM32F407VET6零知增强板的四路独立计时器

    本帖最后由 PCB56242069 于 2025-7-1 11:24 编辑 项目概述本教程将指导你如何使用STM32F407VET6零知增强板实现一个功能强大的四路独立计时器。每个计时器可以
    发表于 07-01 10:31

    零知开源——基于STM32F407VET6零知增强板的四路独立计时器

    本教程介绍基于STM32F407VET6零知增强板的四路独立计时器实现方案。项目采用TFT显示屏、蜂鸣器和按钮构建交互系统,支持各计时器独立控制(开始/暂停/重置)和智能报警(4小时及以上每小时触发
    的头像 发表于 07-01 10:13 1707次阅读
    零知开源——基于STM32F407VET6零知增强板的四路独立<b class='flag-5'>计时器</b>

    基于STM32F407VET6零知增强板的四路独立计时器

    计时器
    PCB56242069
    发布于 :2025年07月01日 09:41:44

    纳祥科技客户案例 | 集计时、照明、装饰于一体的电子沙漏计时器方案

    传统沙漏作为计时工具,虽具备仪式感,但存在功能单一、无法实时调整具体定时等局限性。应客户需求,纳祥科技推出了结合LED显示、重力感应、低功耗等技术的电子沙漏计时器方案,实现传统沙漏的美学与现代
    的头像 发表于 06-13 16:32 1149次阅读
    纳祥科技客户案例 | 集<b class='flag-5'>计时</b>、照明、装饰于一体的电子沙漏<b class='flag-5'>计时器</b>方案