智能植物物联网:Arduino 与 Azure 构建连接温室
元件与材料
| Seeed Base Shield V2 | ×1 |
| Seeed Grove - 继电器 | ×1 |
| Seeed Grove - 温度传感器 | ×1 |
| Arduino UNO | ×1 |
| Helium Starter Kit (旧版) | ×1 |
应用与在线服务
- Microsoft Azure
- Microsoft Visual Studio 2015
项目简介
更新于 2019 中美青年创客大赛。园艺虽有趣,但许多人觉得麻烦。本文指导构建智能 IoT 植物监测系统:传感器数据经 Helium 网络上传 Azure IoT Hub,通过 Azure Functions 存入 Azure SQL,同时支持自动/远程控制浇水。整个流程无服务器,仅需 Azure Function 和 Arduino 代码。
步骤 1:准备元件
- Arduino UNO
- Seeed Grove Base Shield
- Helium Atom + Element + Arduino 扩展板
- 蠕动泵 (12V)
- 温湿度、土壤湿度、紫外光传感器
- Grove OLED 显示屏
步骤 2:搭建 Arduino + Helium + 传感器
在 Helium Network Dashboard 注册 Atom 和 Element(作为接入点)。连接所有传感器与 Helium Atom,接线完成后运行测试代码验证通信。代码每 60 秒采集一次湿度、光照、温度、湿度,通过 Helium 通道发送至云端,OLED 显示实时数值。土壤湿度低于阈值 (100) 自动触发继电器驱动水泵 5 秒。水泵需 12V,从电源适配器引出两线接继电器控制。
步骤 3:配置 Helium Hub 与 Azure IoT Hub
在 Azure 创建 IoT Hub (标准层或免费层),获取共享访问策略连接字符串 (RegistryReadWrite)。在 Helium Dashboard 创建连接,粘贴连接字符串自动配置 MQTT 主题。通过 helium-cli 测试从 Atom 发送消息到 Azure。
步骤 4:创建 Azure SQL 数据库
创建 SQL 数据库 (Basic 层),建表 SmartPlant 存储温度、湿度、土壤湿度、光照、时间戳。获取连接字符串备用。
步骤 5:创建 Azure Function App
新建 Function App (消费计划),添加应用设置 sqldb_connection 存放 SQL 连接串。创建 Event Hub 触发函数 (C#),解析 IoT Hub 消息 (Moisture, UVLight, Temperature, Humidity) 插入 SQL 表。再创建 HTTP 触发函数 (GET /api/smartplant) 查询最新 100 条记录返回 JSON,供前端调用。
步骤 6:前端 UI
开发简单 Android App 调用 HTTP API 显示四传感器数值,并可远程触发浇水。数据每 60 秒更新。Arduino 外壳封装后置于植物旁。
额外:Alexa 集成
可扩展语音控制查询植物状态。
代码
Arduino 主程序
#include "Arduino.h"
#include "Board.h"
#include "Helium.h"
#include "HeliumUtil.h"
#include
#include "Wire.h"
#include
#include
#define CHANNEL_NAME "Azure IoT App"
Helium helium(&atom_serial);
Channel channel(&helium);
int relay = 5;
void setDisplayToOriginalState() { SeeedGrayOled.init(SSD1327); }
void setup() {
Serial.begin(9600); pinMode(relay, OUTPUT); delay(150);
TH02.begin(); delay(100);
Serial.println("TH02_dev is available.\n");
helium.begin(HELIUM_BAUD_RATE);
helium_connect(&helium);
channel_create(&channel, CHANNEL_NAME);
Wire.begin();
}
void loop() {
int moisture=0, uvlight=0;
for(int i=0;i<32;i++) moisture+=analogRead(A0);
for(int i=0;i<32;i++) uvlight+=analogRead(A1);
float temper=TH02.ReadTemperature();
float humidity=TH02.ReadHumidity();
String dataString="Moisture="+String(moisture)+"&UVLight="+String(uvlight)+"&Temperature="+String(temper)+"&Humidity="+String(humidity);
char data[dataString.length()]; dataString.toCharArray(data, dataString.length());
channel_send(&channel, CHANNEL_NAME, data, strlen(data));
Serial.println(data);
setDisplayToOriginalState();
SeeedGrayOled.clearDisplay(); SeeedGrayOled.setNormalDisplay(); SeeedGrayOled.setVerticalMode();
SeeedGrayOled.setTextXY(0,0); SeeedGrayOled.putString(("Moisture: "+String(moisture)).c_str());
SeeedGrayOled.setTextXY(2,0); SeeedGrayOled.putString(("UVLight: "+String(uvlight)).c_str());
SeeedGrayOled.setTextXY(4,0); SeeedGrayOled.putString((String(temper)+" C").c_str());
SeeedGrayOled.setTextXY(6,0); SeeedGrayOled.putString(("Humid: "+String(humidity)).c_str());
if(moisture<100){ digitalWrite(relay,HIGH); delay(5000); digitalWrite(relay,LOW); }
delay(60000);
}
Azure Functions 代码片段
- Event Hub 触发插入 SQL (C#)
- HTTP GET 查询最新数据 (C#)
- HTTP GET 直接插入测试用 (C#)
完整代码请访问项目仓库:GitHub
原理图
Helium 架构将 IoT 设备直接连接到 Azure IoT Hub:
制造工艺