Arduino UNO R4 WiFi其内置的ESP32-S3模块,让远程控制变得简单。无论是通过简单的网页服务器、官方的Arduino IoT Cloud,还是专业的MQTT协议,您都可以灵活地将物理设备连接到网络,实现智能控制。更重要Arduino UNO R4 WiFi双核架构设计(保证本地程序与物联网控制相独立):板载两个主要处理器。主控制器是 Renesas RA4M1(基于48 MHz Arm Cortex-M4),负责运行您的Arduino主程序和外设控制。无线(WiFi与蓝牙)连接则由独立的 Espressif ESP32-S3 模块处理,提供Wi-Fi和蓝牙功能,这种设计使得网络通信不占用主控资源。除了传统的I/O引脚,该板还提供了12x8 LED矩阵、Qwiic连接器(用于快速连接I2C传感器)以及CAN总线等,为创建交互式远程控制项目提供了便利。更重要的是Arduino UNO R4 WiFi原生支持 Arduino IoT Cloud,这是一个允许您无需编写复杂的网络代码即可创建设备仪表板、实现远程监控和控制的云服务,本次通过Cloud远程控制Arduino UNO R4 WiFi开发板。
1.Arduino Cloud账号与平台准备
在开始之前,你需要注册并登录 Arduino Cloud 账户。
创建 Thing:在 IoT Cloud 仪表板中创建一个新的物联网设备(Thing)。
添加网络:配置 Wi-Fi 网络信息(SSID 与密码),让设备能够联网。
2.需要连接设备Thing与代码关联
将物理硬件Arduino UNO R4 WiFi与云端设备Thing进行绑定,重点需要Device ID和Secret Key。
选择板卡:在云平台上选择 ESP32 开发板型号。
自动生成代码:平台会生成一个包含 Wi-Fi 连接逻辑的 Arduino 代码框架。
3.Variables变量与 Dashboard 配置
这是核心环节,定义你想要监控或控制的“变量”(Variables)。
添加变量:比如 temperature(温度),ledState(LED 开关)。
设置 UI:为这些变量创建可视化组件(如图表、按钮)放置在 Dashboard 上。
4.代码上传与云端交互
将代码烧录到 ESP32,完成数据的双向流动。
监测数据:打开 Serial Monitor,查看传感器数据是否成功上传。
远程控制:通过 Dashboard 的按钮控制硬件(如点亮 LED)。
程序代码分析:
/*
Sketch generated by the Arduino IoT Cloud Thing “Untitled”
https://create.arduino.cc/cloud/things/77630aad-6f85-455c-8b86-b4e91e51d785
Arduino IoT Cloud Variables description
The following variables are automatically generated and updated when changes are made to the Thing
int cO2; // 云端变量:二氧化碳浓度(来自传感器)
float hun; // 云端变量:相对湿度(来自传感器)
float temp; // 云端变量:温度(来自传感器)
bool lED; // 云端变量:LED开关状态(从云端控制)
Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
which are called when their values are changed from the Dashboard.
These functions are generated with the Thing and added at the end of this sketch.
*/
// 引入 Arduino LED 矩阵库,用于控制板载的12x8 LED点阵屏
#include “Arduino_LED_Matrix.h”
ArduinoLEDMatrix matrix; // 创建LED矩阵对象
// 定义两个帧(图案)数据:全亮和全灭
const uint32_t fullOn[] = {
0xffffffff, // 所有LED点亮
0xffffffff,
0xffffffff
};
const uint32_t fullOff[] = {
0x00000000, // 所有LED熄灭
0x00000000,
0x00000000
};
// 引入Arduino基础库
#include <Arduino.h>
// 引入Sensirion STCC4 CO2传感器的驱动库
#include <SensirionI2cStcc4.h>
// 引入I2C通信库
#include <Wire.h>
// 宏定义:确保使用我们定义的NO_ERROR(值为0),避免与其他库冲突
#ifdef NO_ERROR
#undef NO_ERROR
#endif
#define NO_ERROR 0
// 创建传感器对象
SensirionI2cStcc4 sensor;
// 用于存储错误信息的字符串
static char errorMessage[64];
// 用于存储函数返回的错误码
static int16_t error;
// 局部变量,用于存储传感器读出的原始数据
int16_t co2Concentration = 0;
float temperature = 0.0;
float relativeHumidity = 0.0;
uint16_t sensorStatus = 0;
// 辅助函数:用于打印64位的序列号(十六进制格式)
void PrintUint64(uint64_t& value) {
Serial.print("0x");
Serial.print((uint32_t)(value >> 32), HEX);
Serial.print((uint32_t)(value & 0xFFFFFFFF), HEX);
}
// 引入由Arduino IoT Cloud自动生成的“事物属性”文件,其中定义了云端变量和连接信息
#include “thingProperties.h”
// 初始化函数,只在设备上电或复位后运行一次
void setup() {
// 初始化LED矩阵
matrix.begin();
// 初始化串口通信,用于调试输出,波特率115200
Serial.begin(115200);
while (!Serial) {
delay(100); // 等待串口就绪(对于有USB-CDC的板子很重要)
}
// 初始化I2C总线(使用Wire1,例如在Nano RP2040 Connect上)
Wire1.begin();
// 将传感器连接到I2C总线,并指定其地址(0x64)
sensor.begin(Wire1, STCC4_I2C_ADDR_64);
// 变量用于存储传感器信息
uint32_t productId = 0;
uint64_t serialNumber = 0;
// 步骤1:先停止传感器的连续测量模式(确保从已知状态开始)
error = sensor.stopContinuousMeasurement();
if (error != NO_ERROR) {
Serial.print("Error trying to execute stopContinuousMeasurement(): ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
return; // 如果出错,停止初始化
}
// 步骤2:读取传感器的产品ID和序列号,验证连接是否正常
error = sensor.getProductId(productId, serialNumber);
if (error != NO_ERROR) {
Serial.print("Error trying to execute getProductId(): ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
return;
}
// 打印传感器信息到串口监视器
Serial.print("productId: ");
Serial.print(productId);
Serial.print("\\t");
Serial.print("serialNumber: ");
PrintUint64(serialNumber);
Serial.println();
// 步骤3:启动传感器的连续测量模式,之后可以定期读取数据
error = sensor.startContinuousMeasurement();
if (error != NO_ERROR) {
Serial.print("Error trying to execute startContinuousMeasurement(): ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
return;
}
// 初始化在 thingProperties.h 中定义的云端变量和连接参数
initProperties();
// 连接到 Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
// 设置调试信息级别 (0-4,数字越大信息越详细,默认0只显示错误)
setDebugMessageLevel(2);
// 打印当前的网络和云连接状态信息
ArduinoCloud.printDebugInfo();
}
// 主循环函数,会重复不断地执行
void loop() {
// 必须定期调用,处理与云端的通信(上传变量、接收回调)
ArduinoCloud.update();
// 您的其他代码可以放在这里
// 从传感器读取一次测量数据
error = sensor.readMeasurement(co2Concentration, temperature,
relativeHumidity, sensorStatus);
if (error != NO_ERROR) {
// 读取失败可能是由于I2C时钟偏移导致,建议延迟150ms后重试一次
Serial.print(
"Error trying to execute readMeasurement() (retry in 150ms): ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
delay(150);
// 重试读取
error = sensor.readMeasurement(co2Concentration, temperature,
relativeHumidity, sensorStatus);
if (error != NO_ERROR) {
Serial.print("Error trying to execute readMeasurement() after "
"additional delay: ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
return; // 如果重试也失败,跳过本次循环
}
}
// 将读取到的传感器数据,赋值给对应的云端变量。
// ArduinoCloud.update() 会自动将这些新值同步到云端仪表板。
cO2 = co2Concentration;
hun = relativeHumidity;
temp = temperature;
// 注意:这里没有延时,loop会尽可能快地运行。
// 对于传感器读取,STCC4的连续模式推荐读取间隔为2秒,可能需要添加 delay(2000)。
}
/*
由于 LED 在云端被定义为 READ_WRITE(可读可写)变量,
当云端的仪表板改变 LED 的值时,onLEDChange() 会自动被调用。
此函数由 Arduino IoT Cloud 代码生成器自动生成框架。
*/
void onLEDChange() {
// 在此添加您的代码,以响应 LED 状态的改变
if(lED) // 如果云端发送的 lED 值为 true(开)
matrix.loadFrame(fullOn); // 加载全亮帧到LED矩阵
else // 如果云端发送的 lED 值为 false(关)
matrix.loadFrame(fullOff); // 加载全灭帧到LED矩阵
}
硬件连接图:
Arduino UNO R4 WiF通过QWIIC连接二氧化碳传感器相关演示:见EEWORLD论坛链接:https://bbs.eeworld.com.cn/thread-1334753-1-1.html
本期结论:通过Arduino UNO R4 WiF与Arduino IoT Cloud的嵌入式程序,实现了一个环境监测设备。核心功能是采集环境数据并上传到云端,同时接收云端指令控制本地设备。整个系统形成了一个从物理感知到云端监控,再到远程控制执行的完整闭环。


