电子说
步骤1:解码无线信号
这是最大的障碍,我必须将这一阶段的全部功劳交给JeeLabs的Dominique Pierre,我使用了该代码(在Dominique的支持下)对我的所有传感器进行了解码。测试硬件很简单(并在JeeLabs网站上进行了说明)。这里要注意的一点是,最初我使用的是Arduino UNO,但是(如后所述)我转到了MEGA。出于测试和解码目的,任何一个都可以使用,我强烈建议您执行此步骤,然后再进行其他操作,以便您可以识别和验证接收到的信号是否来自传感器,并可以对其进行解释。我使用了一个简单的Excel电子表格来手动验证解码的信号并在开始任何气象站编码之前计算出校验和。
步骤2:硬件
除了RF无线电接收器外,我还使用了RTC –您可以使用以太网屏蔽和NTP,但是我觉得重点在于应该是日志记录而不是Internet/服务器端,如果使用RTC时网络中断,则可以“离线”完成。我也为一个传感器有限的朋友构建了该项目的变体,因此包括一个“车载”压力和温度传感器。您所使用的取决于您自己,稍后我会提供所有元素的示例代码。该示意图提供了已使用硬件的概述。我在Fritzing中构建,还创建了一个“ mini Shield”,该插槽插入MEGA的“端”,以太网屏蔽即在该端完成(如图中的白色所示)。该“防护罩”包括可选件的脚印和一些将来可选件的突围针。已尝试/测试的组合包括:
•用于Oregon Scientific传感器的RF接收器和RTC
•用于Cresta传感器,RTC和BMP085气压/温度传感器的RF接收器
•外部LM35温度传感器(防水和测量以及我们花园中溪流的温度)和外部溪流深度监控器(此处未详细说明,但使用安装在桥上的I2C超声波测距仪来评估溪流的高度–有趣的是,大雨时深度可能在30cm到150cm之间变化! )。但是,任何组合都可以使用,并且可以将代码修改为适当的日志/Web服务。
如上所示,示意图显示了屏蔽上的组件,不需要全部使用,但是可以使用选项如果想要的话。以太网屏蔽层也未显示,只需插入MEGA。
您需要的组件:
1。 Arduino MEGA 2560
2。以太网屏蔽(带有micro SD卡)
3。 RF 433MHz接收器(已使用Aurel RX-4M50RR30SF,从这里开始运行良好)
4。空中结果5。 DS3234 RTC中断模块
6。 LM35温度传感器(最多2个,可选)
7。 BMP085压力传感器(可选)
为了将Arduino和“盾牌”安装到标准Arduino外壳中,我不得不卸下了两个定位销,但是这些定位销很容易折断,并且不会影响到固定的安装位置。硬件。请注意,在PCB上,接收器模块位于PCB的下侧(有足够的空间),因此仍可以弹出存储卡而不会受到干扰。
我用433MHz的鞭状天线使设备看起来更整洁(未连接照片,但显示为安装在第二张照片的包装盒中)–不确定其响应是否比我的测试天线更好-一根电线;但是看起来更整洁并且更专业!
第3步:记录数据的代码
这是一个扩展步骤1的步骤,获取接收到的信号并解释这些信号以获得“真实”值。这些数据存储在全局变量中,因为数据在多个地方使用(即日志记录阶段和网页服务页面,第4步)。我通常使用整数来尽可能地节省内存并加快处理速度,在将值记录或“提供”到网络时,除以10可以得到小数点后一位。我还包括了最大值和最小值的触发器(如果在一年中的某个时刻断电,它们会在午夜存储在EEPROM中)。对于某些参数,还有触发器发送电子邮件(第5步)。我为那些需要验证的元素添加了校验和,因为偶尔会处理错误的数据并歪曲最大/最小数据。 Oregon Scientific信号的解码基于互联网上的信息以及此处的Cresta设备的信息。请注意,每个Oregon Scientific和Cresta设备的RF解码代码都不相同。这两个示例都包含在示例草图文件中。
第4步:Web服务代码
有这有两个关键要素。一种是直接从Arduino提供固定格式的页面,本质上是传感器读数,电池状态,Arduino状态等的列表。这对于“调试”这两个软件很有用,但也可以验证硬件是否按预期工作–例如,如果传感器由于超出范围或受到干扰而未被解码,则可以在“最新更新”详细信息上对其进行监视。第二个要素是提供更复杂的页面。编码的解决方案非常强大(我认为),因为它将从SD卡的根目录加载模板文件(以文本形式),并在该文件中找到“变量”(以打开和关闭~~表示),在投放到网页之前,将其替换为值。这意味着可以创建非常复杂的网页,而无需重新编码Arduino,也无需占用内存/资源,包括对外部文件的引用,例如.css文件,图像等,这些文件可以存储在您自己的网站上,而不是在网站上提供最初,该代码旨在在UNO上工作,但我需要为趋势图存储大数据数组(48个值x 13组) (请参见示例网页),尽管编译大小低于32k,但Arduino因内存“过载”而失败。..转到MEGA还允许添加附加功能(例如电子邮件,日出等),而不会出现问题。 。随意优化代码并将其压缩到UNO上。
示例文件(graphs.htm)在下面创建网页,并利用Google Charts api通过简单的超链接调用呈现图表。请注意,该代码仅适用于8.3命名文件(由于使用了SDFat),因此使用了.htm命名文件。要查看处理后的页面,只需键入Arduino IP代码:端口,然后输入/graphs.htm。
该代码还包括用于计算某些派生参数(例如云底高度和风寒)的数学方法。除正常页面交付外的URL:
•YourIP:Port/EEPROM –强制将当前的最大和最小(和下雨次数)记录到EEPROM中。在出于任何原因断电以确保维护年度数据之前执行此操作很有用。注意:每天午夜只对EEPROM写入一次。这可以延长Arduino EEPROM的寿命,并且由于我打算每天无限期供电,因此我认为每天就足够了。
•YourIP:Port/TIME&year&year&mo&day&hr&mi –尽管已使用RTC,但它似乎会浪费一段时间。此功能允许用户(通过Web)将RTC重置为“正确的时间”并更新夏令时的更改。
基本日志记录和服务器代码均基于此处的教程,并进行了修改以满足我的需要和更改为Arduino 1.0编译器。
库参考
•TimeLord库
•EEPROMWriteAnything库
•RTCLib库
•SDFat库(和以太网/SD卡教程)
步骤5:电子邮件代码
使用一个简单的网页客户端,我将一个URL称为php位于我网页上的脚本,用于通过电子邮件发送设置的电子邮件分发列表。同样,由于它是由Arduino托管的,因此我可以随时更改电子邮件的分发和内容。
气象台警报电子邮件php脚本:
《?php
//以下几行阅读了URL中的参数
$ TO =‘电子邮件地址1’;
$ TO。=‘,电子邮件地址2’;
$ FROM =‘您的电子邮件地址’;
$ SUBJECT =‘天气站点更新”;
$ TIME = $ _REQUEST [“ TIME”];
$ TEMPNOW = $ _REQUEST [“ TEMPNOW”];
$ WSNOW = $ _REQUEST [“ WSNOW”];
$ WDNOW = $ _REQUEST [“ WDNOW”];
$ RAIN = $ _REQUEST [“ RAIN”];
$ TEMPMAX = $ _REQUEST [“ TEMPMAX”];
$ TEMPMIN = $ _REQUEST [“ TEMPMIN” ];
$ WSMAX = $ _REQUEST [“ WSMAX”];
$ TRIGGER = $ _REQUEST [“ TRIGGER”];
$ MESSAGE =’来自气象站的消息
时间为‘。$ TIME 。 ’
-现在的温度是‘。$ TEMPNOW。 ’C
-现在的风速为‘。$ WSNOW。 “每小时deg
-今天下雨”。$ RAIN。 ’mm
-今天的最高温度是‘。$ TEMPMAX。 ’C
-今天的最低温度是‘。$ TEMPMIN。 ’C
-今天的最大风速为‘。$ WSMAX。 ’mph
由于‘。$ TRIGGER发送了电子邮件。 ’;
//这将发送消息
mail($ TO,$ SUBJECT,$ MESSAGE,“发件人:”。$ FROM);
?》
如果有,还会发出一封电子邮件
步骤6:已知限制和需要改进的地方
1。我遇到的最大问题是,在检查任何网页请求时,Arduino缺少对RF信号的解码。更改为Arduino 1.0会使情况变得更糟(似乎需要花费很多时间才能检查任何服务器请求)。为了克服这个问题,我只会在收到并解码了RF信号时检查互联网活动(这对我来说很有效,因为我有很多传感器,每隔几秒钟就会收到一个信号),或者每5秒通过关于mills()的检查。这在实践中可行(用户接收网页的最大延迟约为5秒钟,并且没有明显的阅读损失),但是我敢肯定有更好的方法可以做到这一点,例如软件中断? 》 2。有些编码很差(我可以更好地利用函数/过程,甚至可能更好地利用某些库工作(这超出了我的能力)),而且我敢肯定,有更有效的方法可以达到相同的目的。该代码可以正常工作,并且可以可靠地完成我的工作(运行几个月没有问题),但是欢迎任何改进/建议。
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !