ShIoTiny:没有弹簧或实时的时钟,以及如何使用它



这篇文章是关于什么的

我们将继续介绍关于ShIoTiny的系列文章, 是一种基于ESP8266芯片的可视可编程控制器。

本文讨论ShIoTiny控制器中的实时时钟,时间同步以及如何使用节点来处理时钟。

ShIoTiny项目现场

该系列中的先前文章。

ShIoTiny:小型自动化,物联网或“假期前六个月”

ShIoTiny:绘图程序的节点,链接和事件或功能

ShIoTiny:湿室通风(示例项目)

ShIoTiny和周围的世界:将传感器连接到二进制输入,接触反弹和其他问题

ShIoTiny和世界:最小的模拟传感器或ADC

二进制固件,控制器电路和文档

参赛作品


今天我们谈论时间。 在哲学家争论这个问题已有数百年历史的意义上,与时间无关,在这场辩论中看不到终点。 关于我们在时钟上看到的时间,以及根据该时间去上班,上学或赶时间。

问题是ESP8266芯片和ShIoTiny控制器中的非易失性实时时钟丢失了。 ShIoTiny控制器的这种天生伤害完全是我的错。 但是已经完成了。

固件一见如故,公众对我对实时性的态度感到愤怒,就开始对这个缺陷oke之以鼻。

由于错误需要修复,而这次至少不能流血,因此,我去满足不断增加的固件用户的需求,并尽我所能。 即,我将节点添加到ShIoTiny控制器的固件中,这使实时操作或多或少地变得方便。

关于ShIoTiny手表


如前所述, ShIoTiny中没有“电池续航时间”。 但与此同时,从1970年1月1日开始实施倒计时。

这是同一时间,称为UNIX-time,以C / C ++语言存储在time_t类型的变量中,在32位系统中应于2038年1月19日结束。

但是不要害怕。 我认为到2038年,每个人都将有时间将time_t类型设置为64位,并且该问题将在未来的2,920亿年内得到解决。 好吧,我们还会提出其他建议。

请注意,有时也将time_t格式的时间称为timestamp,或者在俄语中称为timestamp

但是回到我们的控制器。 因此,其中有一个时钟,但是在关闭电源后该时钟将重置为0。 这得出了一个很简单的结论,即ShIoTiny控制器中计时的主要问题是在打开电源时需要同步控制器时钟。 剩下的纯属技术问题。

时间同步


NTP服务器是一种在Internet上同步时间的悠久方法。 第一个想法是制作一个与给定NTP服务器同步时间的节点。

但是,呼吸一点新鲜空气并思考我的南瓜,我意识到这种方法在意识形态上是错误的。

用户并不是想通过Internet上的ShIoTiny固件拉出控制器。 同步时间不仅可以从NTP服务器发送,还可以通过UDP多播发送,或者以已知的连接质量(通过MQTT)发送

因此,做出了一个重大决定-分离节点以从NTP服务器接收时间并设置系统时间。

总共开发了两个节点用于时间同步:用于从NTP服务器接收时间的节点NTP时间



和“ 设置时间”系统时钟安装节点



NTP服务器接收时间作为参数的节点将接收NTP服务器的名称或IP地址,并用逗号分隔从NTP服务器接收的时间段(以分钟为单位)。 默认情况下,每60分钟或1小时从NTP服务器请求时间。 在输出上,此节点将设置为0,直到时间同步或时间戳记是与服务器最后一次同步的结果。

系统时钟安装节点接收时间戳作为输入,并根据此标签设置系统时钟。

图中显示了用于将系统时钟与NTP服务器同步的最简单方案。



同步时间未设置,默认为60分钟。 该图显示了时间戳。

我注意到,在程序方案中,用于从NTP服务器接收时间的节点不能超过一个,而用于设置系统时间的节点也不能超过一个。

如果需要特殊的同步方案,则可以使用UDP-multicastMQTT 。 这些方案是完全相似的。

对于UDP多播同步,与图中大致相同。



对于通过MQTT进行同步(我当然不建议,但在极端情况下不建议这样做)。



我希望现在通过ShIoTIny控制器的系统时钟同步,一切都可以了。 让我们继续进行接收和处理时间的节点。

现在几点


这个问题很简单,但有时很难回答。 毕竟,地球上每个点的时间都不同。 我们广阔的祖国包括从加里宁格勒到堪察加半岛的多达11个时区。

NTP服务器,取决于设置,可以返回与不同时区关联的时间戳。 通常,此时间戳与UTC (通用时间)相关。

但是通常我们需要控制器工作所在地区的当地时间。 怎么会在这里?

而且非常简单-为了获取ShIoTIny控制器的系统时钟的时间戳,开发了“ 获取时间”节点,您可以在其中将时区设置为相对于控制器的系统时钟的从12个小时到+12个小时的时间偏移。

假设我们从pool.ntp.org服务器获取时间并同步系统时钟,如前面的示例所示。 该服务器返回通用时间。 我们需要像托木斯克这样的本地人。 我知道托木斯克位于UTC + 7时区。 因此,让我们将时间接收单位设置为偏移+7或仅偏移7。如下图所示。



如果我们住在加拿大的艾伯塔省,那么工作时间将是-7个小时。 记住主要的事情- 在节点中设置时区,以小时为单位获取时间 。 并以相对于系统时钟时间的偏移量形式设置。 在时间接收单元的输出上设置时间戳。 可以有多个节点来获取电路上的时间。

检查时钟


机器以timestamps time_t的格式处理时间非常方便。 毕竟,这只是一个整数,表示相对于起点-1970年1月1日的秒数。 通过这种格式,您可以轻松地找到两个时间点之间的距离,计数周期等。 这只是整数的加法和减法。

但是人不是机器。 他对通常的时间表示形式(年,月,日,小时,分钟和秒的形式)更加满意。 这样我们人类就被安排了。

因此,引入了将时间戳转换为人所熟悉的时间变化单位的节点,反之亦然,从人可以理解的时间变化单位合成时间戳。 这些节点分别称为Split TimeSynth Time

下图清楚说明了所有这些工作原理。



我注意到,节点的“ 拆分时间”和“ 合成时间”的月份(月)和星期几(wday)从零开始计数。 几个月:1月0日,12月11日。 对于一周中的0-星期日,6-星期六。
其他输出:月中的天(day),年(年),小时(小时),分钟(分钟),秒(秒)-以通常的形式计算。 时,分,秒-从0到59。每月的日期-取决于从第一天到30日或31日,以及从2月到28或29日的月份。
好吧,一年-他是这一年。 现在2019。
我希望一切都清楚。

系统实例


为了不成问题,我将举一个使用手表的例子。 当然简化了。

假设我们有一个潮湿的房间要强制通风。 但并非总是如此,仅当湿度高于给定水平且仅在夜间时才如此。 晚上-以免白天被风扇的噪音打扰到人们。 好吧,这里我们是美容师,我们关心人。

让我们尝试实现这一点。



电路的所有部分都是我们熟悉的。 时间是从NTP服务器同步的。 不同步时,“ NTP时间”节点将返回0,并且禁用风扇启用继电器。 为此,顶层元素根据方案负责。

时间同步后,风扇的开/关由当前时间和湿度水平决定。 一旦湿度超过70%并且时间为23:0006:00 ,风扇将打开并且不会为房间通风。

当然,最好将实际项目中的时间和湿度常数替换为FLASH中存储的参数,并根据MQTT进行设置 。 是的,系统的当前状态(湿度水平,电流,时间,风扇状态)也不会影响在网络上发布以通过智能手机控制系统。 但这已经为您的想象力留出了空间。

结论


因此,我们更实时地介绍了我们的控制器。

我要感谢所有给我发来建设性批评和软件升级建议的人。 谢谢大家!

与往常一样,欢迎进行建设性的批评。 另外,欢迎提出意见和建议。

您可以像往常一样在评论中或通过邮件shiotiny@yandex.ru发送所有批评,评论,建议。

Source: https://habr.com/ru/post/zh-CN467545/


All Articles