Skip to content

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 CloudArduino 生态入门原生支持,配置简单,无需复杂网络代码
阿里云 IoT国内用户、企业级应用功能完善,支持 Alink JSON 格式
ThingSpeak数据可视化、教学演示免费,内置图表展示,API 简单
通用 MQTT Broker灵活自建、Home Assistant 集成开源免费,可自建 Mosquitto 或使用公共 Broker

3. 云平台通用前提条件

3.1 软件准备

在 Arduino IDE 的库管理器中安装以下常用库:

库名称用途
WiFiS3UNO R4 WiFi 的 WiFi 驱动(核心自带,无需额外安装)
ArduinoMqttClientMQTT 协议通信
ArduinoIoTCloudArduino 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 操作步骤

  1. 注册 Arduino Cloud 账号:访问 Arduino Cloud 注册并登录。

  2. 创建 Thing:在 IoT Cloud 仪表板中创建一个新的物联网设备(Thing),配置 WiFi 网络信息(SSID 与密码)。

  3. 绑定设备:将物理硬件与云端 Thing 绑定,获取 Device IDSecret Key

  4. 定义变量

    • 输入变量(云端 → 设备):如 ledState,用于控制 LED 开关
    • 输出变量(设备 → 云端):如 temperature,用于上传传感器数据
  5. 创建仪表板:为变量添加可视化组件(图表、按钮、仪表盘)。

  6. 自动生成代码:平台会生成包含 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 云端配置

  1. 创建产品:在阿里云 IoT 平台创建产品,数据格式选择 Alink JSON,会自动创建好对应的 Topic。

  2. 创建设备:在产品下创建一个设备,获取以下信息:

    • ProductKey:产品密钥
    • DeviceName:设备名称
    • DeviceSecret:设备密钥
  3. 获取 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 云端配置

  1. 注册 ThingSpeak 账号
  2. 创建新 Channel,添加两个字段:temperaturehumidity
  3. 获取 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.com1883公共测试 Broker
test.mosquitto.org1883Eclipse Mosquitto 公共测试
mqtt.eclipseprojects.io1883Eclipse 项目公共 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 是最灵活的方式。