打造电池供电的 MKR FOX 1200 气象站
组件与物料
| 组件 | 数量 |
|---|---|
| Arduino MKR Fox 1200 | 1 |
| SparkFun 大气传感器模块 - BME280 | 1 |
| TSL2561 数字光照度传感器 | 1 |
| HTU21D 温湿度传感器 | 1 |
应用与在线服务
- Arduino Web Editor
- ThingSpeak API
- Sigfox 后台
项目简介
注意:本教程可能已过时,请参考最新版本。
本项目演示如何将 MKR FOX 1200 与多个 I2C 传感器结合,打造一个简易的电池供电气象站。
使用的传感器
- 板载温度传感器(精度较低,±1°C)
- HTU21D I2C 传感器测量湿度
- Bosch BMP280 测量气压和精确温度
- TSL2561 光照传感器测量光照度
硬件连接
硬件连接非常简单:所有传感器均使用 I2C 接口,工作电压 3.3V。只需从 MKR FOX 1200 引出四根线:GND、3.3V、SDA(引脚 11)和 SCL(引脚 12)。由于每个传感器拥有唯一的 I2C 地址,三个传感器可并联共享这四根线,由库函数自动区分。
整个系统可由两节串联的 AA 或 AAA 碱性电池(3V)通过板载螺丝端子供电。
Sigfox 数据封装
Sigfox 网络每天最多发送 140 条消息,单条消息最大 12 字节。为充分利用带宽,我们将读数压缩为紧凑的二进制格式。float 类型占 4 字节,超出限制,因此需根据部署环境设定安全量程,在后端还原真实数值。
云服务配置
使用两个云服务:
- Sigfox 后台
- ThingSpeak
使用 FirstConfiguration 示例提供的 PAC 和 ID 在 Sigfox 后台注册开发板(若已注册可跳过)。两者需相互配置以正确解析数据。在 ThingSpeak 创建两个通道:readChannelID 接收原始数据,writeChannelID 存储还原后的数据。
Sigfox 回调配置
- 进入 DEVICE TYPE → LIST,右键开发板选择 Edit
- 左侧菜单点击 CALLBACKS → New → 选择 Custom callback
- 设置关键参数:
- TYPE:
DATA/UPLINK - Channel:
URL - Http method:
GET
- TYPE:
- Custom Payload 设为:
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 - URL Pattern 设为:
将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_key替换为 ThingSpeak Channel1 的 Write API Key。
保存后打开串口,即可观测首条消息发送成功。
从原始数据到图表展示
配置完成后数据已路由至 ThingSpeak,但仍为原始格式。利用 ThingSpeak 分析工具(MATLAB 代码)将数据还原:
% 替换为你的通道 ID 和 API Key
readChannelID = []; readAPIKey = 'T6UK7XO6A4H2AGT7';
writeChannelID = []; writeAPIKey = 'XU4TGY261P6B5USN';
%% 读取数据
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
%% 数据还原
INT16_MAX = 32767; UINT16_MAX = 65536;
analyzedData.('Temperature1') = data.('Temperature1') / INT16_MAX * 120;
analyzedData.('Temperature2') = data.('Temperature2') / INT16_MAX * 120;
analyzedData.('Pressure') = data.('Pressure') / UINT16_MAX * 200000;
analyzedData.('Light') = data.('Light') / UINT16_MAX * 100000;
analyzedData.('Humidity') = data.('Humidity') / UINT16_MAX * 110;
%% 写入还原后的数据
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
%% 设置 React 每 10 分钟执行一次
替换通道 ID 后,在 React 中设置每 10 分钟触发一次分析,即可获得温度、气压、湿度、光照的实时图表。
代码
完整代码请参考项目仓库:WeatherMonitor
制造工艺
- 树莓派自制气象站:每日邮件推送温湿雨数据
- 树莓派气象站:Sense HAT 环境数据采集与 Dropbox 自动上传
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- K30 CO₂ 传感器:室内空气质量实时监测
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- 紧凑型气象站:Arduino Nano + ESP8266 双核方案 (BMP280 + OLED/Nokia 双屏)
- DIY 数字身高仪:Arduino Nano + VL53L0X 激光测距 + OLED 显示
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- Arduino Cloud 传感器塔:温度、动作与气体监测
- 高精度空气质量监测仪:Sharp GP2Y1010AU0F 粉尘传感器 + Arduino Nano
- Arduino Nano 多传感器气象站:BMP280 + DHT11 + GUVA-S12SD + DS3231 + OLED
- 基于 Arduino 与 DSM501A 传感器的空气质量监测仪