LORA的物联网网关软件编写的一个程序的风格和自由评论鼓励增强和重用。软件发布在这里在GitHub上,也附在下面。
在目前的软件版本,唯一的改变需要适应网关软件的新用户是更新aio_account .h文件中所描述的步骤:<strong>网络仪表板</strong>。所有其他的变化配置网关为新用户或位置是通过LCD用户界面和认证文件在SD记忆卡中所描述的步骤:<strong>物联网网关的SD记忆卡的认证文件</strong>。
在软件体系结构的概述,在这一步,但是,一个详细的了解,最好是通过软件实现的代码和注释来完成。
.............................................................................................................................
安装程序
设置代码初始化用于网关的各种Arduino引脚,初始化SD卡和LCD,然后调用一系列初始化例程。
eepromread()
第一次网关软件运行在一个Arduino Mega,默认设置是wrtiien,然后读取EEPROM如下:
-
时区为东海岸的美国
-
白天在储蓄=
-
压力校准偏移= 0.36
-
所有的站名设置为“站”
-
温度单位为华氏
-
液晶显示模式=最后一站的温度
-
活动站数= 1
如果软件已在arduino mega之前运行,设置保存到EEPROM恢复以前。在启动LCD将显示如果设置从EEPROM或如果未找到数据和设置初始化恢复。
rfm95initialize()
执行硬复位的劳拉无线电。初始化的无线电频率915兆赫和集TX功率+23 dBm(虽然TX不被网关使用)。在未来的软件发布的频率和功率可配置的用户界面,通过LCD。
ethernetinitialize()
初始化以太网接口。网关的IP地址被分配预计通过DHCP,并显示IP地址分配。
readgatewaydata()
读temboo和谷歌认证数据从SD卡。
sendstatus()
发送短信通知所有零数据验证temboo和谷歌Gmail的认证工作。
spreadsheetupdate()
发送一个电子表格更新行全零数据到谷歌表谷歌驱动验证temboo和谷歌驱动器认证工作。
aioconnect()
连接到Adafruit IO MQTT经纪人核实Adafruit IO认证工作。
.............................................................................................................................
主程序循环
主程序<strong>loop()</strong>执行以下功能每通过一次循环:
——检查<strong>功能</strong>按钮被按下如果是的话,叫function()执行LCD菜单例程。
——检查<strong>systemtimeupdate()</strong>看一秒的过去了自从上次通过环-如果是,做到以下几点:
--<u>执行事件循环外时间</u>执行特定的功能,在一个给定的二每一分钟。两个函数执行的每一分钟:
----在每分钟零秒,平adafruitio MQTT经纪人。
----在50秒每分钟更新的液晶2线如果在固定站或循环站显示模式。
——<u>执行基于时间的事件循环内</u>执行特定的功能,在一个给定的每分钟每小时。下面的函数的执行:
----每10分钟:
--------发布的数据输入,AdafruitIO。
--------检查看看是否要发送一个警报需要。
----在过去的一个小时2分钟,将每小时数据更新谷歌驱动器。
----在过去的3分钟时间,使用网络时间协议(NTP)更新系统时间。
----在过去的4分钟时间,检查adafruitio MQTT连接;如果下来,尝试重新连接。
----在过去的一个小时30分钟了,发短信通知。
----在过去的40分钟时间,把劳拉无线电。在劳拉无线电将冻结天的时间跨度,重新初始化电台每小时似乎解决和网关不否则影响性能的问题。
——<u>检查劳拉电台接收到一个数据包从一个远程站</u>-如果是,获得数据包的处理。
——<u>更新2线的液晶</u>显示模式,如果在最后一站站新数据已收到。
.............................................................................................................................
中断服务程序(ISR)
劳拉物联网网关软件使用一个ISR连接到<strong>功能</strong>按钮开关。为了中断中断执行主程序循环<strong>功能</strong>是按下时才能进入液晶显示主菜单功能。中断是在执行液晶主功能菜单的禁用。在退出LCD主功能菜单和返回主程序循环,NTP更新为正确恢复系统时间保持不在网关执行液晶主功能菜单的运行。
.............................................................................................................................
rfm95w劳拉无线电例程
getradiopacket()
“一旦无线分组已由劳拉无线电接收。读取数据包到远程站的数据阵列,并增加了RSSI和接触时间对阵列。
checkalerts()
从主程序循环每十分钟来检查如果失去联系,高湿度和低电池警报需要发送。
.............................................................................................................................
temboo例程
sendstatus()
生成通知消息被发送到电子邮件,短信网关的MnO。默认情况下,软件发送的第一个四活动站的温度和湿度。修改这个函数改变通知消息的内容。
sendalert()
建立失去联系,高湿度和低电池警报消息,电子邮件的MnO邮件短信网关。修改这个函数改变警报消息的内容。
sendemail()
通过temboo编舞的Gmail发送电子邮件Temboo网站生成的代码。
spreadsheetupdate()
建立电子表格的更新是通过temboo追加排舞蹈添加一行数据在谷歌驱动器的谷歌表送。修改这个函数改变站和数据发送到谷歌表。
sendspreadsheetupdate()
代码生成的temboo网站添加一行数据在谷歌驱动谷歌表。
.............................................................................................................................
计时例程
systemtimeupdate()
数秒时间保持和维护当地的本地化的时代。更新液晶线1 HH:MM:SS 24小时制时间显示。
ntptimeupdate()
“每小时从主循环程序和LCD菜单功能后,同步本地时间网关。电话<strong>getntptime()</strong>获取当前时代、定位时代时区和日光储蓄的偏移量,并更新网关本地时间。显示本地日期和时间在一个成功的NTP更新。
.............................................................................................................................
EEPROM例程
EEPROM例程初始化、读、写EEPROM数据结构如下。的eepromex。H <strong>readblock()</strong>和<strong>updateblock()</strong>函数用于读取和写入EEPROM的数据结构。保持生活的<strong>updateblock()</strong> EEPROM,功能检查,如果一个字节的EEPROM改变了之前写的那个字节。
在未来,额外的参数需要持久性可以很容易地添加到数据结构。
typedef struct {
int版本;
长timezoneoffset;
长daylightsavings;
浮presscal;
煤焦站[ max_stations ] [ 10 ];
int stationhumithreshold [ max_stations ];
字节stationalert [ max_stations ];
字节setbacklight;
字节字节stationdisplaymode
华氏;
.............................................................................................................................
液晶/按钮菜单例程
枚举(enum)是用于索引的液晶显示主菜单项。枚举中的第一个条目是“start_functions”和最后一项是“end_functions”。这些条目书立的菜单项,使菜单项被添加而不需要显式跟踪菜单项的数目。对于start_functions和end_functions测试确定的开始和结束时,分别对菜单项列表的菜单项的数目之间。
enum {
start_functions,
set_back_light,
set_display_mode,
display_rssi,
display_batt,
set_alerts,
set_humi_thres,
set_number_stations,
set_station_names,
set_daylight_savings,
set_time_zone,
set_press_sensor_cal,
set_degrees_f_c,
end_functions
};
当<strong>函数</strong>执行时,通过对一段时间(1)环<strong>function()</strong>。而在这个循环中的四个按钮开关监测。
<strong>函数</strong>执行<strong>function()</strong>原因退出并返回到主回路
<strong>进入</strong>原因显示菜单项来执行
<strong>起</strong>原因显示的菜单项增加到下一个菜单项
<strong>下降</strong>原因显示的菜单项递减到下一菜单项
在进入<strong>function()</strong>每个时间<strong>了</strong>或<strong>下</strong>压,<strong>functiondisplay()</strong>,开关/案例基于菜单项从以上的列举,来显示菜单项。同样,当<strong>进入</strong>时,<strong>functionexecute()</strong>,开关/案例基础上的菜单项从以上列举,称为直接的程序执行相应的菜单项的功能。
用这种结构是一个简单的物质添加或删除主菜单项。一个类似的结构来实现菜单选择选项在主菜单的选项,例如,看看如何显示模式菜单是使用一个枚举显示模式和<strong>dodisplaymode()</strong>功能。
(责任编辑:admin)