Appearance
Arduino UNO R4 WiFi 常见云平台通信示例文档
1. 简介
Arduino UNO R4 WiFi 板载 ESP32-S3 WiFi 模块,支持与多种云平台进行通信。本文将介绍几种常见的云平台连接方案,包括 Arduino IoT Cloud、阿里云、ThingSpeak 和 通用 MQTT Broker。
Arduino UNO R4 WiFi 采用双核架构设计,主控制器是 Renesas RA4M1(基于 48 MHz Arm Cortex-M4),负责运行主程序和外设控制;无线连接由独立的 Espressif ESP32-S3 模块处理,这种设计使得网络通信不占用主控资源,保证本地程序与物联网控制相互独立。
2. 云平台选择参考
| 云平台 | 适用场景 | 特点 |
|---|---|---|
| Arduino IoT Cloud | Arduino 生态入门 | 原生支持,配置简单,无需复杂网络代码 |
| 阿里云 IoT | 国内用户、企业级应用 | 功能完善,支持 Alink JSON 格式 |
| ThingSpeak | 数据可视化、教学演示 | 免费,内置图表展示,API 简单 |
| 通用 MQTT Broker | 灵活自建、Home Assistant 集成 | 开源免费,可自建 Mosquitto 或使用公共 Broker |
3. 云平台通用前提条件
3.1 软件准备
在 Arduino IDE 的库管理器中安装以下常用库:
| 库名称 | 用途 |
|---|---|
| WiFiS3 | UNO R4 WiFi 的 WiFi 驱动(核心自带,无需额外安装) |
| ArduinoMqttClient | MQTT 协议通信 |
| ArduinoIoTCloud | Arduino IoT Cloud 通信(使用 Cloud 时需安装) |
| AliyunIoTSDK | 阿里云 IoT 通信 |
3.2 硬件准备
| 部件 | 说明 |
|---|---|
| Arduino UNO R4 WiFi | 主控板 |
| DHT11 / SHT30 / LM35 | 温湿度传感器(可选) |
| USB Type-C 数据线 | 供电和程序下载 |
| WiFi 网络 | 2.4GHz 无线网络 |
4. Arduino IoT Cloud(原生支持)
Arduino UNO R4 WiFi 原生支持 Arduino IoT Cloud,无需编写复杂的网络代码即可创建仪表板,实现远程监控和控制。
4.1 操作步骤
注册 Arduino Cloud 账号:访问 Arduino Cloud 注册并登录。
创建 Thing:在 IoT Cloud 仪表板中创建一个新的物联网设备(Thing),配置 WiFi 网络信息(SSID 与密码)。
绑定设备:将物理硬件与云端 Thing 绑定,获取 Device ID 和 Secret Key。
定义变量:
- 输入变量(云端 → 设备):如
ledState,用于控制 LED 开关 - 输出变量(设备 → 云端):如
temperature,用于上传传感器数据
- 输入变量(云端 → 设备):如
创建仪表板:为变量添加可视化组件(图表、按钮、仪表盘)。
自动生成代码:平台会生成包含 WiFi 连接逻辑的 Arduino 代码框架。
4.2 示例代码框架
cpp
#include <Arduino.h>
#include "thingProperties.h" // 自动生成的云端变量定义
// 传感器对象(以 CO2 传感器为例)
SensirionI2cStcc4 sensor;
void setup() {
Serial.begin(115200);
Wire1.begin();
// 初始化传感器
sensor.begin(Wire1, STCC4_I2C_ADDR_64);
sensor.startContinuousMeasurement();
// 初始化云端连接
initProperties();
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}
void loop() {
// 必须定期调用,处理与云端的通信
ArduinoCloud.update();
// 读取传感器数据并赋值给云端变量
sensor.readMeasurement(co2Concentration, temperature, relativeHumidity, sensorStatus);
cO2 = co2Concentration;
hun = relativeHumidity;
temp = temperature;
delay(2000);
}
// 当云端 LED 变量变化时自动调用
void onLEDChange() {
if(lED) {
matrix.loadFrame(fullOn); // 点亮 LED 矩阵
} else {
matrix.loadFrame(fullOff); // 关闭 LED 矩阵
}
}代码说明:
thingProperties.h由 Arduino IoT Cloud 自动生成,包含云端变量定义和连接信息ArduinoCloud.update()必须放在loop()中定期执行,负责同步云端数据- 变量分为
READ_WRITE(可读可写,如 LED 控制)和READ_ONLY(只读,如传感器数据)两种模式
5. 阿里云 IoT 平台
阿里云 IoT 是国内常用的云平台,支持 MQTT 协议接入,适合需要稳定、企业级服务的用户。
5.1 云端配置
创建产品:在阿里云 IoT 平台创建产品,数据格式选择 Alink JSON,会自动创建好对应的 Topic。
创建设备:在产品下创建一个设备,获取以下信息:
ProductKey:产品密钥DeviceName:设备名称DeviceSecret:设备密钥
获取 MQTT 连接参数:在设备详情页获取 Broker 地址、端口、Client ID、用户名和密码。
5.2 示例代码
cpp
#include <WiFiS3.h>
#include <AliyunIoTSDK.h>
#include <DHT11.h>
// ========== WiFi 配置 ==========
#define WIFI_SSID "你的WiFi名称"
#define WIFI_PASSWD "你的WiFi密码"
// ========== 阿里云配置 ==========
#define PRODUCT_KEY "你的ProductKey"
#define DEVICE_NAME "你的DeviceName"
#define DEVICE_SECRET "你的DeviceSecret"
#define REGION_ID "cn-shanghai"
// ========== 传感器配置 ==========
#define DHTPIN 2
DHT11 dht11(DHTPIN);
WiFiClient espClient;
void setup() {
Serial.begin(115200);
// 连接 WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi 已连接!");
// 连接阿里云
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
Serial.println("阿里云连接成功!");
}
void loop() {
float temperature, humidity;
// 读取 DHT11 数据
int result = dht11.readTemperatureHumidity(temperature, humidity);
if (result == 0) {
// 上传数据到阿里云
AliyunIoTSDK::send("EnvironmentHumidity", humidity);
AliyunIoTSDK::send("EnvironmentTemperature", temperature);
Serial.print("温度: ");
Serial.print(temperature);
Serial.print("°C, 湿度: ");
Serial.print(humidity);
Serial.println("%");
} else {
Serial.println("传感器读取失败!");
}
AliyunIoTSDK::loop(); // 维持云端连接
delay(5000); // 每 5 秒采集一次
}代码说明:
AliyunIoTSDK::begin()初始化与阿里云的连接,参数包括 WiFi 客户端和云端认证信息AliyunIoTSDK::send()用于上报属性数据,第一个参数是属性标识符,第二个参数是值AliyunIoTSDK::loop()必须定期调用,用于维持 MQTT 连接和处理云端下发指令
注意:如果在阿里云平台上订阅了属性设置 Topic,还可以在 loop() 中处理云端下发的控制命令。
6. ThingSpeak 平台
ThingSpeak 是一个免费的数据可视化平台,适合教学演示和快速原型验证。
6.1 云端配置
- 注册 ThingSpeak 账号
- 创建新 Channel,添加两个字段:
temperature和humidity - 获取 Write API Key
6.2 示例代码
cpp
#include <WiFiS3.h>
#include <DHT11.h>
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
// ThingSpeak 配置
const char* server = "api.thingspeak.com";
String writeAPIKey = "你的WriteAPIKey";
const int updateInterval = 15000; // 15 秒更新一次
WiFiClient client;
DHT11 dht11(2);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi 已连接!");
}
void loop() {
float temp, hum;
if (dht11.readTemperatureHumidity(temp, hum) == 0) {
if (client.connect(server, 80)) {
String postStr = writeAPIKey;
postStr += "&field1=";
postStr += String(temp);
postStr += "&field2=";
postStr += String(hum);
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + writeAPIKey + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
Serial.println("数据已发送到 ThingSpeak!");
}
}
delay(updateInterval);
}7. 通用 MQTT Broker
MQTT 是最灵活的方案,可连接自建 Mosquitto、公共 Broker 或 Home Assistant。
7.1 示例代码(发布/订阅)
cpp
#include <WiFiS3.h>
#include <ArduinoMqttClient.h>
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
const char broker[] = "broker.hivemq.com"; // 公共 Broker
int port = 1883;
const char topic[] = "arduino/r4/test";
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
void setup() {
Serial.begin(115200);
// 连接 WiFi
while (WiFi.begin(ssid, password) != WL_CONNECTED) {
delay(1000);
}
// 连接 MQTT Broker
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT 连接失败!错误码: ");
Serial.println(mqttClient.connectError());
while (1);
}
// 订阅主题
mqttClient.subscribe(topic);
Serial.println("MQTT 已连接,等待消息...");
}
void loop() {
// 发送消息
mqttClient.beginMessage(topic);
mqttClient.print("Hello from UNO R4!");
mqttClient.endMessage();
// 检查接收到的消息
if (mqttClient.parseMessage()) {
String receivedTopic = mqttClient.messageTopic();
String payload = mqttClient.readString();
Serial.print("收到主题: ");
Serial.print(receivedTopic);
Serial.print(",消息: ");
Serial.println(payload);
}
mqttClient.poll();
delay(5000);
}公共 MQTT Broker 参考:
| Broker 地址 | 端口 | 说明 |
|---|---|---|
broker.hivemq.com | 1883 | 公共测试 Broker |
test.mosquitto.org | 1883 | Eclipse Mosquitto 公共测试 |
mqtt.eclipseprojects.io | 1883 | Eclipse 项目公共 Broker |
8. 常见问题排查
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| WiFi 连接失败 | SSID/密码错误 | 确认 WiFi 名称和密码,确保为 2.4GHz 网络 |
| MQTT 连接失败 | Broker 地址/端口错误 | 确认 Broker 地址和端口,检查防火墙 |
| 阿里云认证失败 | ProductKey/DeviceSecret 错误 | 在阿里云控制台重新复制认证信息 |
| 数据上传失败 | Topic 格式错误 | 阿里云需使用标准 Topic 格式 /sys/[ProductKey]/[DeviceName]/thing/event/property/post |
| 程序重启循环 | 软件重启在 R4 上不可用 | 使用硬件复位(GPIO 控制继电器)或代码中避免使用软件重启函数 |
9. 总结
| 云平台 | 难度 | 适用场景 |
|---|---|---|
| Arduino IoT Cloud | ⭐ 简单 | Arduino 生态快速入门,无需关心网络协议细节 |
| 阿里云 IoT | ⭐⭐⭐ 中等 | 国内用户、企业级应用,需要配置认证信息 |
| ThingSpeak | ⭐⭐ 简单 | 数据可视化、教学演示 |
| 通用 MQTT | ⭐⭐⭐ 中等 | 灵活自建,适合集成 Home Assistant 等开源平台 |
选择哪种方案取决于你的需求:如果追求快速上手,推荐 Arduino IoT Cloud;如果需要与企业系统集成,可选择阿里云;如果希望完全掌控数据流向,自建 MQTT Broker 是最灵活的方式。