Arduino MKR1000 + DHT11 双节点 MQTT 物联网演示:接入 Samsung ARTIK Cloud
项目架构概览
本项目构建了一个 双节点 MQTT 物联网系统,演示「传感器节点 → 云端规则引擎 → 执行器节点」的完整闭环:
- 节点 A(传感器端):MKR1000 + DHT11 → 采集温湿度 → MQTT over TLS (8883) 发布至 ARTIK Cloud
- 节点 B(执行器端):MKR1000 + 红/黄 LED → 订阅 ARTIK Cloud Actions 主题 (1883) → 根据云端规则点亮 LED
- 云端:Samsung ARTIK Cloud(已停止服务,架构可迁移至 AWS IoT / Azure IoT / ThingsBoard 等)
硬件清单(每节点)
| 组件 | 数量 | 说明 |
|---|---|---|
| Arduino MKR1000 | 2 | 内置 WiFi (ATECC508A 加密芯片) |
| DHT11 温湿度传感器 | 1 | 仅节点 A 使用,接 D2 |
| LED (红/黄) | 各1 | 仅节点 B 使用,接 D11/D13,串联 220Ω |
核心软件栈
- WiFi101 - MKR1000 WiFi 驱动
- MQTT Client (Joel Gaehwiler) - 轻量级 MQTT 客户端
- ArduinoJson (v5/v6) - JSON 序列化/反序列化
- DHT sensor library - 温湿度读取
关键配置参数(需替换为实际值)
// WiFi
const char* _SSID = "YOUR_WIFI_SSID";
const char* _PASSWORD = "YOUR_WIFI_PASS";
// ARTIK Cloud 设备凭证(每个设备唯一)
// 节点 A (Sensor)
char mqttCloudUsername[] = "SENSOR_DEVICE_ID";
char mqttCloudPassword[] = "SENSOR_DEVICE_TOKEN";
char mqttCloudDataOut[] = "/v1.1/messages/SENSOR_DEVICE_ID";
// 节点 B (Actor)
char mqttCloudUsername[] = "ACTOR_DEVICE_ID";
char mqttCloudPassword[] = "ACTOR_DEVICE_TOKEN";
char mqttCloudActionsIn[] = "/v1.1/actions/ACTOR_DEVICE_ID";
节点 A:传感器固件逻辑
数据采集与发布
void getNextSample(float* T, float* H) {
delay(2000); // DHT11 最低 1-2s 采样间隔
*H = dht.readHumidity();
*T = dht.readTemperature();
}
void sendToArtikCloud(float t, float h) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["temperature"] = t;
root["humidity"] = h;
root.printTo(buf, sizeof(buf));
mqttCloudClient.publish(mqttCloudDataOut, buf);
}
主循环
- WiFi 自动重连
- MQTT keep-alive 与重连
- 每 15 秒采集一次并发布(演示用,实际建议 5-15 分钟)
- 演示代码运行 10 次循环后自动退出(
if(++n>10) exit(0))
节点 B:执行器固件逻辑
动作解析与执行
void parseBuffer(String payload) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(payload);
int ledRed = root["actions"][0]["parameters"]["led_red"];
int ledYellow = root["actions"][0]["parameters"]["led_yellow"];
// 红灯:带延时关闭防抖
if (ledRed == 1) { digitalWrite(LED_RED_PIN, HIGH); savedRedTime = millis(); }
else if (millis() - savedRedTime > RED_DELAY) digitalWrite(LED_RED_PIN, LOW);
// 黄灯:同理
if (ledYellow == 1) { digitalWrite(LED_YELLOW_PIN, HIGH); savedYellowTime = millis(); }
else if (millis() - savedYellowTime > YELLOW_DELAY) digitalWrite(LED_YELLOW_PIN, LOW);
}
ARTIK Cloud 规则引擎配置(4 条规则)
| 条件 (IF) | 动作 (THEN) |
|---|---|
| 温度 > 32°C 且 湿度 > 34% | 红灯=ON, 黄灯=ON |
| 温度 > 32°C 且 湿度 < 35% | 红灯=ON, 黄灯=OFF |
| 温度 < 33°C 且 湿度 > 34% | 红灯=OFF, 黄灯=ON |
| 温度 < 33°C 且 湿度 < 35% | 红灯=OFF, 黄灯=OFF |
注:阈值仅为演示,实际部署需根据应用场景校准。规则引擎在云端评估,下发 Actions 至 Actor 设备。
迁移指南:ARTIK Cloud 停服后的替代方案
Samsung ARTIK Cloud 已于 2020 年停止服务。以下是零代码/少量代码迁移路径:
方案一:ThingsBoard (开源、自托管)
- 设备配置文件定义遥测键
temperature/humidity - 规则链节点:
Script Filter判断阈值 →RPC Call下发setLed指令 - MQTT 主题:
v1/devices/me/telemetry/v1/devices/me/rpc/request/+
方案二:AWS IoT Core + Rules Engine
- Thing 影子存储期望/报告状态
- SQL 规则:
SELECT * FROM 'sensor/data' WHERE temperature > 32 AND humidity > 34 - 动作:Republish 至
actor/cmd,Lambda 处理复杂逻辑
方案三:本地 MQTT Broker (Mosquitto/EMQX) + Node-RED
- 完全离线、低延迟、数据主权
- Node-RED 流程节点可视化编排规则,Dashboard 实时看板
安全性最佳实践
- TLS 1.2 强制:MKR1000 ATECC508A 硬件加速,Sensor 节点用 883 端口,Actor 节点演示用 1883 明文(生产必须改 8883)
- 设备认证:每设备唯一 Device ID + Token,定期轮换
- 最小权限:Sensor 仅发布,Actor 仅订阅,主题隔离
- 固件签名与 OTA:利用 Arduino OTA 或自定义 Bootloader 保证固件完整性
性能与功耗优化
- MKR1000 深度睡眠电流 ~100μA,配合
WiFiLowPower.mode(WIFI_LOW_POWER) - DHT11 间歇供电(GPIO 控制 MOSFET)
- MQTT Keep Alive 设为 60-300s,减少心跳包
- 批量上报:累积多条样本打包发送(需云端支持)
完整双节点固件代码(artik_dht11_sensor.ino / artik_led_actor.ino)请参考项目附件。迁移至现代 IoT 平台时,仅需修改 MQTT 服务器地址、端口、主题格式与 JSON 负载结构,核心采集/执行逻辑复用度极高。
制造工艺
- DHT11 温湿度传感器项目:LED 指示与压电蜂鸣器报警
- DIY 蓝牙控制 Arduino 间谍小车
- FlickMote:基于手势的智能家居红外遥控器
- DIY Arduino TV-B-Gone:万能关机遥控器
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- Arduino 项目优化供电方案:从按键开关到电池监测与数据记录
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 从零构建智能 Arduino 四足机器人:完整指南
- Blynk + Arduino 读取 DHT11 温湿度数据教程
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- Arduino MKR1000 开发板详解:引脚定义、Wi-Fi/加密芯片、供电方式与上手指南