在工农业自动化控制系统中,实时时钟(RTC)是一个非常重要的功能。
比如农业的指定时间段自动浇水,每天8:00-9:00之间自动打开电磁阀浇水;
该功能需要控制器有RTC时钟,以及日历来确定执行输出来控制电磁阀的开/关;
RTC时钟的一个重要特点是控制器在断电后继续由电池供电,这就要求RTC模块的供电与处理器其他部分的供电分开,并且工作电流要很低,才能保证断电后时钟有足够长的时间维持时间。
以STM32F103处理器为例,该处理器有一个独立的VBAT引脚用于RTC模块功能,RTC模块的工作电流约为2uA左右,如果使用5mAh可充电纽扣电池供电,时钟保持时间可以达到208天.
另外,RTC时钟还需要低频32.768k晶振来提供时钟,以达到低功耗的目的,无源晶振一般可以达到30ppm左右的精度,一年的时间误差在15左右分钟。
有源晶振一般可以达到5ppm左右的精度;每年时间误差约2分钟;
ESP8266没有这样的RTC模块,如果通过I2C接口外接RTC芯片,会增加产品的成本,无法达到30元左右的售价。
但是ESP8266的优点是易于连接互联网,可以通过互联网自动校准时间。
因此,我通过软件设计了一个RTC时钟模块,正常的做法是写万年历的代码,计算秒,处理分、时、日的四舍五入以及闰年,月份和一系列问题;
ESP8266 提供了 mktime 和 localtime 两个函数,可以实现日历和时间戳的相互转换。
这两个函数的使用只需要计算秒数,然后转换为日历即可,而星期几则可以通过Caille公式由年月日计算出来;
云服务器的TCP服务器代码中,当收到控制器发来的心跳消息时,服务器会解析出消息中控制器当前的时间值并与服务器的时间进行比较,当差值超过某个值,然后服务器发送命令设置时间并校准控制器的时间。
在控制器的代码中,两个变量V225和V226用于记录校准时间的状态,其中V225在控制器上电后清零,并在服务器发出校准时间命令时设置为1接收到并执行修改时间的操作;
V226上电后清零,并在1s tik内累加到最大值,只有当控制器被服务器校准后,才会重新清零并继续累加。
用户可以在执行某些动作之前使用脚本编程来判断变量V225是否为1,以确保控制器时钟准确以进行自动化控制;
还可以判断V226超过一定值,执行输出,控制声光报警设备,以便在控制器无法获取正确时间时,即时报警提醒。
另外一个想法是,有些控制器无法联网自动校正时间,可以将时间戳保存在FLASH中,控制器断电重启后从FLASH中读取保存的时间戳继续计时,这样控制器重启时不会将时间重置为默认值,由于保存的时间戳之间的时间间隔加上断电时间而导致的断电。
问题是FLASH的擦除次数有限制,模块内置的FLASH只能擦除1000次左右。
如果时间戳以 1 小时为间隔保存,则 1000 次擦除将使控制器持续大约 41 天。
这显然是不可接受的。
以上是基于ESP6的简易可编程控制器自动云校准的RTC设计的详细内容。更多信息请关注PHP中文网其他相关文章!