注意:本教程可能已过时,请到此处获取更新版本。
该项目展示了如何将MKR FOX 1200和一堆 I2C 传感器变成一个简单的电池供电气象站。
我们将使用:
该项目的硬件连接非常简单:所有传感器都使用 I2C 接口并在 3.3V 下运行。
它们需要来自 MKR FOX 1200 的四根线:GND、3.3V、引脚 11 上的 SDA 和引脚 12 上的 SCL。相同的四个连接可以与三个传感器并联共享,因为它们每个都有一个特定的 I2C 地址,因此相关的库和函数将负责区分它们中的每一个。
整个项目可以由两节AA或AAA碱性电池串联产生3V并接线到板上的螺丝接线端子块供电。
由于 Sigfox 网络每天最多可以发送 140 条消息,因此我们将优化读数并以紧凑的二进制格式发送数据。
数据打包很重要,因为您可以发送的消息的最大大小为 12 个字节。一个浮点数占用 4 个字节,所以我们需要将我们的读数打包成一些更小的表示形式。
浮点格式非常宽(您可以表示大到 3.402823e+38 (!) 的数字),我们不需要整个数据空间;然后我们可以决定安全限制(基于我们将要部署站点的位置)并在后端恢复原始表示。
我们将使用两种云服务:
使用FirstConfiguration 示例提供的 PAC 和 ID 在 Sigfox 后端注册您的开发板(如果您已经为之前的项目做过,可以跳过)。
两者都需要配置为相互交谈并以正确的格式解释数据。在 Thingspeak 上注册并创建几个频道。配置如下图所示。
我们配置的第一个通道将接收原始数据(readChannelID
),而第二个将收集重新缩放的数据(writeChannelID
)。
是时候使用 Arduino Create Editor 上传草图了。默认草图允许您在现场部署之前广泛测试所有基础架构。
记得声明:
oneshot = false
当您确信所有后端基础架构设置正确时。草图等待串口,所以我们现在不会启动它。相反,打开SigFox 后端并配置回调:
单击设备类型->列表-> 右键单击您的电路板,然后单击编辑。
点击左侧菜单中的回调:
你会看到这样的窗口:
点击窗口右上角的新建按钮:
选择自定义回调:
相关配置报告如下。确保回调设置为:
DATA/UPLINK
URL
GET
作为自定义有效负载,设置:
status::uint:8 temp1::int:16:little-endian temp2::int:16:little-endian press::uint:16:little-endian hum::uint:16:little-endian light::uint:16:little-endian lastMsg::uint:8
这代表了我们在草图中打包的结构。我们为每个字段分配了一个变量,因此我们可以在 HTTP 回调中引用它们。
作为 URL 模式,设置:
https://api.thingspeak.com/update?api_key=XXXXXXXXXXXX&field1={customData#temp1}&field2={customData#press}&field3={customData#temp2}&field4={customData#hum}&field5={customData#light}&field6={customData#status}&field7={customData#lastMsg}
配置完成后,您的窗口应如下所示:
请记住将 API 密钥更改为api_key
Thingspeak 提供的Write API Key
密钥Channel1
。
保存并退出。我们现在可以打开串口并观察正在发送的第一条消息。万岁!
我们配置的设置会将我们的数据路由到 Thingspeak 后端,但它们仍然是原始格式;要重新转换它们,让我们使用带有此代码段的Thingspeak 分析工具
% TODO - Replace the [] with channel ID to read data from:
readChannelID = [];
% TODO - Enter the Read API Key between the '' below:
readAPIKey = 'T6UK7XO6A4H2AGT7';
% TODO - Replace the [] with channel ID to write data to:
writeChannelID = [];
% TODO - Enter the Write API Key between the '' below:
writeAPIKey = 'XU4TGY261P6B5USN';
%% Read Data %%
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
%% Analyze Data %%
INT16_t_MAX = 32767;
UINT16_t_MAX = 65536;
analyzedData.('Temperature1') = data.('Temperature1') / INT16_t_MAX * 120 ;
analyzedData.('Temperature2') = data.('Temperature2') / INT16_t_MAX * 120 ;
analyzedData.('Pressure') = data.('Pressure') / UINT16_t_MAX * 200000 ;
analyzedData.('Light') = data.('Light') / UINT16_t_MAX * 100000 ;
analyzedData.('Humidity') = data.('Humidity') / UINT16_t_MAX * 110 ;
%% Write Data %%
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
%% Schedule action: React -> every 10 minutes
通过用我们自己的替换通道 ID,我们最终可以将原始数据转换回实际值。请记住使用React每 10 分钟安排一次分析操作,否则将永远不会执行!
我们终于有了精彩的图表。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !