Funpack3-5 Arduino UNO R4 WiFi 物联网灯板
该项目使用了Arduino UNO R4 WiFi,实现了物联网灯板创意项目的设计,它的主要功能为:利用 Arduino UNO R4 WiFi 开发板学习物联网开发,使用其板载的 12x8 LED矩阵, 实现一个接入智能家居平台可远程控制的物联网灯板。。
标签
Funpack活动
ESP32-S3
点灯
MQTT
乐鑫
FunPack3-5
Arduino UNO R4 WiFi
瑞萨电子 - RA4M1
鲜de芒果
更新2025-01-13
13

一、项目介绍

本项目是基于 Arduino UNO R4 WiFi 开发板实现的一个物联网灯板创意项目,旨在利用 Arduino UNO R4 WiFi 开发板学习物联网开发,使用其板载的 12x8 LED矩阵 实现一个接入智能家居平台可远程控制的物联网灯板。


1.1 硬件介绍

Arduino UNO R4 WiFi 将瑞萨电子的 RA4M1 微处理器与乐鑫的 ESP32-S3 相结合,为创客打造了一款一体化工具,具有增强的处理能力和多样化的全新外设。凭借其内置的 Wi-Fi® 和蓝牙®功能,UNO R4 WiFi 使制造商能够探索无限的创意可能性。此外,这款多功能板拥有方便的板载 12x8 LED 矩阵和 Qwiic 连接器,为各个级别的创客提供了无与伦比的灵活性和可能性。


1.2 功能概览

  • 远程控制通过网页界面/APP: 用户可以登录预设的网页或APP进行操作,通过WiFi实现对灯板的远程控制,实时观察灯光变化。
  • 多种灯光效果演示: 从简单的亮度变化(灯珠数量)到复杂的动态灯效,展示灯板的功能。
  • 数据反馈展示: 实时数据显示与更新,用户可以在界面上看到灯板的状态与亮度数据变化。控制灯光效果。


1.3 设计思路

模块化设计: 硬件与软件分离,便于升级和维护。

易用性: 即插即用,编写简易的配置程序。

扩展性: 支持多种传感器和控制方式,未来可扩展更多功能。


二、功能实现

2.1 软件流程图

  1. 系统上电开始运行,Arduino 初始化。
  2. 运行初始设置代码,包括设置引脚模式、初始化串口通信等。
  3. WiFi 连接与配置,设置 WiFi 参数(如SSID和密码),尝试连接到WiFi网络。
  4. 连接到MQTT服务器,并设置相关的订阅和发布主题。
  5. 系统进入主循环等待与处理消息。获取MQTT订阅主题消息 检查是否有新的MQTT消息到达,如果接收到的消息是灯板控制消息,按照消息内容更新灯板状态(如开/关,亮度等)。
  6. 将灯板的当前状态上传至MQTT服务器,以便其他设备或系统进行反馈和监视。
  7. 根据当前状态和接收到的控制消息,更新灯板的显示。


以上这些步骤构成了 Arduino UNO R4 WiFi物联网灯板 的主要流程。从初始化到主循环中处理消息,每一步都确保系统稳定运行并能及时响应用户控制。


2.2 实现过程

项目基于 VSCode  PlatformIO 插件建立工程,具体步骤不在此文详细展开,可查看PlatformIO 文档,使用 arduino-libraries/ArduinoMqttClient@^0.1.8 库进行 MQTT 通信。以下是实现过程中的关键代码说明。


2.2.1 Arduino 初始化

Arduino UNO R4 WiFi LED矩阵初始化,串口初始化。

// LED矩阵
ArduinoLEDMatrix matrix;
// LED 矩阵全灭
const uint32_t fullOff[] = {
0x00000000,
0x00000000,
0x00000000
};
// LED 矩阵帧映射
uint8_t frame[MATRIX_ROW][MATRIX_COL] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

// LED矩阵初始化
matrix.begin();
// 初始化串口
Serial.begin(115200);


2.2.2 WiFi 连接与配置

// 检查WIFI模块
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("WiFi模块通信失败!");
while (true);
}

// 连接到WIFI
Serial.print("尝试连接到 WIFI SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
Serial.print(".");
delay(5 * 1000);
}


2.2.3 连接MQTT

连接MQTT 成功后,订阅两个主题,分别用于灯板的开关控制和亮度(LED矩阵灯珠数量)控制。

// 连接MQTT
mqttClient.setUsernamePassword(mqtt_user, mqtt_pass);
Serial.print("尝试连接到MQTT服务器: ");
Serial.println(broker);
// 延时 2 秒,等待WIFI连接稳定后再进行MQTT连接,避免连接失败!
delay(2000);
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT 连接失败! ");
Serial.println(mqttClient.connectError());
while (1);
}

// 订阅主题
mqttClient.onMessage(onMqttMessage);
mqttClient.subscribe(switch_subscribe_topic);
mqttClient.subscribe(brightness_subscribe_topic);


2.2.4 灯板状态数据上报

// 汇报灯板状态
char msg[100] = {0};
sprintf(msg, "{\"state\": \"%s\", \"brightness\": %d}",
ledState ? STATE_ON : STATE_OFF, brightness);
mqttClient.beginMessage(publish_topic);
mqttClient.print(msg);
mqttClient.endMessage();


2.2.5 LED 灯板控制指令接收

if(0 == strcmp(switch_subscribe_topic, topic)) {
// 开关
if(0 == strcmp(STATE_ON, message.c_str())) {
if(false == ledState) {
// 需要更新板载LED状态到HA
isNeedReportState = true;
}
ledState = true;
} else {
if(true == ledState) {
// 需要更新板载LED状态到HA
isNeedReportState = true;
}
ledState = false;
}
setLightState();
} else if(0 == strcmp(brightness_subscribe_topic, topic)) {
// 亮度
uint8_t b = message.toInt();
if (brightness < 0 || brightness > 255) { // 范围校验
// do nothing...
return;
} else {
brightness = b;
setLightState();
isNeedReportState = true;
}
}


2.2.5 LED 灯板控制指令处理

/**
* 设置板载LED状态
*/
void setLightState() {
if (ledState) {
if(0 == brightness) {
brightness = 255;
}
// 控制矩阵点亮一定数量的LED灯
uint32_t result = map(brightness, BRIGHTNESS_MIN_VALUE, BRIGHTNESS_MAX_VALUE, 0, MATRIX_ROW * MATRIX_COL);
if(SHOW_SUN_THRESHOLD_PERCENT < (result / (MATRIX_ROW * MATRIX_COL)) * 100) {
Serial.println("show sun");
// 显示太阳图标
matrix.loadFrame(animation[animation_index ++]);
if(ANIMATION_FRAMES <= animation_index) {
animation_index = 0;
}
} else {
Serial.print("num of leds on: ");
Serial.println(result);
// for(int i = 0; i < MATRIX_COL; i ++) {
// for(int j = 0; j < MATRIX_COL; j ++) {

// }
// }
for(int i = 0; i < result; i ++) {
// *(((uint8_t *)frame) + i) = 1;
*(uint8_t *)(frame + i) = 1;
}
for(int i = 0; i < MATRIX_ROW; i ++) {
for(int j = 0; j < MATRIX_COL; j ++) {
Serial.print(frame[i][j]);
}
Serial.println();
}

matrix.renderBitmap(frame, MATRIX_ROW, MATRIX_COL);
}
} else {
matrix.loadFrame(fullOff);
}
}


2.3 HomeAssistant集成

MQTT 设备的发现将使人们能够在 HomeAssistant 方面只需要很少的配置工作就可以使用 MQTT 设备。配置是在设备本身和设备使用的主题上完成的。

MQTT 发现默认启用,但可以禁用。发现主题的前缀(默认:homeassistant)可以更改。配置详情请参阅 MQTT 选项部分


2.3.1 配置主题

 MQTT 发送配置主题后, HomeAssistant 会自动发现当前传感器。 当前任务中使用了一个板载LED矩阵,作为 HomeAssistant 中的 Light 组件。该组件在 HomeAssistant  仪表盘 中可以远程控制板载LED矩阵的开关和亮度(LED矩阵灯珠数量)。使用 MQTT 客户端向配置主题发送消息即可,配置主题如下:

// 灯板 主题
homeassistant/light/Funpack3-5-UNO-R4-WiFi/Funpack3-5-UNO-R4-WiFi-lamp-panel/config
// 灯板 消息
{
"name":"lamp-panel",
"device_class": "light",
"command_topic":"homeassistant/light/Funpack3-5-UNO-R4-WiFi-lamp-panel/switch",
"state_topic":"homeassistant/sensor/Funpack3-5-UNO-R4-WiFi/state",
"brightness_command_topic": "homeassistant/light/Funpack3-5-UNO-R4-WiFi-lamp-panel/brightness/set",
"brightness_state_topic": "homeassistant/sensor/Funpack3-5-UNO-R4-WiFi/state",
"state_value_template": "{{ value_json.state }}",
"brightness_value_template": "{{ value_json.brightness }}",
"unique_id":"Funpack3-5-UNO-R4-WiFi-lamp-panel",
"device":{
"identifiers":[
"Arduino UNO R4 WiFi"
],
"name":"UNO R4 WiFi",
"manufacturer": "Arduino",
"model": "UNO R4 WiFi",
"hw_version": "1.0"
}
}


三、功能展示

  1. 远程控制通过网页界面/APP: 用户可以登录预设的网页或APP进行操作,实时观察灯光变化。

  1. 多种灯光效果演示: 从简单的亮度(LED矩阵灯珠数量)变化到复杂的动态灯效,展示灯板的功能。
  2. 数据反馈展示: 实时数据显示与更新,用户可以在界面上看到灯板的状态变化。


四、总结

遇到的问题

  1. LED 矩阵中的单个LED无法支持PWM形式进行调光,因此只能通过点亮LED矩阵中的LED数量来实现整个灯板的亮度控制。
  2. 当控制亮度百分比大于90时,显示太阳图标。以整数形式计算百分比时,无法精确控制到大于90%的情况,例如:91%时仍然点亮87个灯珠。需要使用浮点数计算后,四舍五入取整才能精确到 91% 开始显示太阳图标。


心得体会

通过【Arduino UNO R4 WiFi 物联网灯板】项目,可以灵活实现家庭照明的智能控制,具备多样化的功能和简单易用的界面,充分展示了硬件与物联网技术的有效结合,提升了用户体验。同时,该项目具备高度定制性和扩展性,为未来的功能扩展和应用开发提供了便捷的途径,适合物联网应用及教育实践。


通过本项目,展示了 Arduino 在物联网中的应用潜力,为后续开发和扩展提供了基础。


最后感谢电子森林与得捷电子联合推出的 《Funpack》 系列活动,对于我来说是个很好的学习机会,理论结合实践。我们下期活动再见!


五、参考资料

附件下载
Arduino-Uno-R4-WiFi-Blink.zip
项目源码,PlatformIO工程
团队介绍
业余电子爱好者
团队成员
鲜de芒果
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号