Funpack3-5 基于Arduino UNO R4 WiFi的云端通讯工具
该项目使用了Arduino UNO R4 WiFi板卡,实现了使用mqtt通讯进行通信的设计,它的主要功能为:使用板卡上的esp32wifi/蓝牙模块进行联网,并用mqtt通讯的方式与手机实现数据通讯。
标签
嵌入式系统
Funpack活动
反正都一样
更新2025-01-15
14

image.png

项目介绍

这里是我参加Funpack第三季第五期活动的任务总结报告,我所完成的是任务一,通过网络连接到智能云端,尝试将设备模拟成可以控制的灯,远程端发送指令,将灯光开启关闭,或调整灯光的亮度,0到90%时,矩阵亮起逐渐变大的范围,90%以上时,灯板显示出太阳的图标。

大概步骤如下:

步骤 1: 安装 Arduino 并安装相关开发板资源

  1. 下载 Arduino IDE
  2. 安装 Arduino IDE
    • 运行下载的安装程序,按照提示完成 Arduino IDE 的安装。
  3. 添加开发板支持
    • 打开 Arduino IDE。
    • 进入“文件”>“首选项”(在 macOS 上是“Arduino”>“首选项”)。
    • 在“附加开发板管理器网址”字段中添加开发板的URL(如果需要)。
    • 进入“工具”>“开发板”>“开发板管理器”,搜索并安装所需的开发板。
  4. 安装相关库
    • 根据需要,通过“工具”>“管理库”搜索并安装网络通信和LED矩阵控制所需的库。

步骤 2: 查看开发板的相关示例程序

  1. 查看示例程序
    • 在 Arduino IDE 中,进入“文件”>“示例”菜单,浏览不同类别的示例程序。
  2. 重点查看网络连接通讯
    • 寻找与网络连接和通讯相关的示例,如“Ethernet”类别下的示例。
  3. 查看LED矩阵驱动示例
    • 根据你的LED矩阵型号,寻找相应的驱动示例程序。

步骤 3: 在示例程序的基础上进行修改,完成自己的项目

  1. 理解示例程序
    • 仔细阅读示例程序的代码和注释,理解其工作原理。
  2. 修改代码
    • 根据你的项目需求,对示例程序进行修改。
    • 例如,如果你需要控制12x8 LED矩阵,你可能需要调整引脚配置、数据发送方式等。
  3. 测试功能
    • 上传修改后的代码到开发板,并测试每个功能是否按预期工作。
  4. 调试和优化
    • 如果遇到问题,使用串口监视器进行调试,并根据需要优化代码。
  5. 完成项目
    • 一旦所有功能都经过测试并工作正常,你的项目就完成了。

硬件介绍

Arduino UNO R4 WiFi 是一款集成了瑞萨电子的 RA4M1 微处理器和乐鑫的 ESP32-S3 的开发板,它为创客提供了强大的处理能力和多样化的新外设。以下是它的主要特点:

  1. 处理能力:搭载瑞萨 RA4M1 微处理器,基于 Arm Cortex-M4 内核,运行频率为 48MHz,拥有 256kB 闪存和 32kB SRAM。
  2. 无线连接:集成 ESP32-S3,支持 Wi-Fi 和蓝牙功能,为项目提供无线连接能力。
  3. 兼容性:保持与 UNO 系列相同的外形尺寸和引脚排列,确保与现有扩展板的兼容性。
  4. 扩展功能:包括 12 位 DAC、CAN 总线和运算放大器等外设。
  5. 电压容差:支持更宽的输入电压范围,适合与电机、LED 灯带等执行器集成。
  6. HID 支持:可以通过 USB 模拟鼠标或键盘,发送按键和鼠标移动。
  7. Qwiic 连接器:支持 Qwiic I2C 连接器,方便连接 Qwiic 生态系统中的节点。
  8. RTC 支持:包括用于关闭电路板和保持内部实时时钟供电的引脚。
  9. LED 矩阵:板载 12x8 LED 矩阵,适合动画和传感器数据可视化项目。
  10. 错误诊断:包含错误捕获机制,提供运行时错误的详细解释和提示。
  11. 其他特性:包括段式 LCD 控制器、14 位 A/D 转换器、电容式触摸传感单元、全速 USB 2.0、CAN 2.0B 等。

Arduino UNO R4 WiFi 提供了强大的功能和灵活性,适合各个级别的创客探索和实现创意项目。

软件介绍

image.png

该开发版使用arduino的方式进行开发,先在软件的开发板管理器中下载该开发板的资源,编译器,配置文件等

image.png

示例程序中,提供了网络连接部分,可以参考

#include "WiFiS3.h"

#include <ArduinoMqttClient.h>

#include <ArduinoJson.h>
#include "Arduino_LED_Matrix.h" // Include the LED_Matrix library

ArduinoLEDMatrix matrix; // Create an instance of the ArduinoLEDMatrix class
uint8_t frame[8][12] = {

};
uint8_t frame10[8][12] = {

};
uint8_t frame20[8][12] = {

};
uint8_t frame30[8][12] = {

};
uint8_t frame40[8][12] = {

};
uint8_t frame50[8][12] = {

};
uint8_t frame60[8][12] = {

};
uint8_t frame70[8][12] = {

};
uint8_t frame80[8][12] = {

};
uint8_t frame90[8][12] = {

};
uint8_t frame100[8][12] = {

};
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);

// 设置WIFI
char ssid[] = "xiaomi14";
char pass[] = "15357898";
// 设置MQTT(EMQX)
char mqtt_user[] = "test";
char mqtt_pass[] = "test";
const char broker[] = "broker.emqx.io";
int port = 1883;
// 指定订阅主题(Arduino为信息接收方)
const char subscribe_topic[] = "testtopic_plz";

void setup() {
Serial.begin(115200);
matrix.begin();
matrix.clear();
while (!Serial) {
;
}
// 连接网络
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
Serial.print(".");
delay(5000);
}
Serial.println("You're connected to the network:");
Serial.println(WiFi.localIP());
Serial.println();
// 连接MQTT
mqttClient.setId("claentId12");//在我这里这个必须要加,不然直接连接错误
mqttClient.setUsernamePassword(mqtt_user, mqtt_pass);
Serial.print("Attempting to connect to the MQTT broker: ");
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1)
;
}
Serial.println("You're connected to the MQTT broker!");
// 订阅主题
mqttClient.onMessage(onMqttMessage);
mqttClient.subscribe(subscribe_topic);
}
void loop() {
// delay(10000);
// Serial.println("Hello EEWorld2!");
mqttClient.poll(); // 定期检查新消息
}

void onMqttMessage(int messageSize) {
// 读取消息内容
String message;
for (int i = 0; i < messageSize; i++) {
message += (char)mqttClient.read();
}
Serial.println("Received text message:");
Serial.println(message);

if (message == "on") {
matrix.renderBitmap(frame10, 8, 12);
} else if(message == "off"){
matrix.clear();
}else{
// 尝试将消息转换为数值
float value = message.toFloat();

// 检查转换是否成功
if (value == 0 && message != "0") {
// 如果转换结果为0但消息不是"0",则认为转换失败
Serial.println("Invalid number");
} else {
// 比较数值并打印相应的消息
if (value >= 0 && value < 10) {
matrix.renderBitmap(frame10, 8, 12);
}else if (value >= 10 && value < 20) {
matrix.renderBitmap(frame20, 8, 12);
}else if (value >= 20 && value < 30) {
matrix.renderBitmap(frame30, 8, 12);
}else if (value >= 30 && value < 40) {
matrix.renderBitmap(frame40, 8, 12);
}else if (value >= 40 && value < 50) {
matrix.renderBitmap(frame50, 8, 12);
}else if (value >= 50 && value < 60) {
matrix.renderBitmap(frame60, 8, 12);
}else if (value >= 60 && value < 70) {
matrix.renderBitmap(frame70, 8, 12);
}else if (value >= 70 && value < 80) {
matrix.renderBitmap(frame80, 8, 12);
}else if (value >= 80 && value < 90) {
matrix.renderBitmap(frame90, 8, 12);
}else if (value >= 90) {
matrix.renderBitmap(frame100, 8, 12);
}
}
}
// 解析 JSON 消息
// StaticJsonDocument<512> doc;
// DeserializationError error = deserializeJson(doc, message);
// // 检查解析是否成功
// if (error) {
// Serial.print("JSON parse failed: ");
// Serial.println(error.c_str());
// return;
// }
// // 打印 JSON 消息的内容
// Serial.println("Received JSON message:");
// serializeJsonPretty(doc, Serial);
}

上面的代码用于控制一个12x8的LED矩阵,并通过Wi-Fi连接到MQTT服务器接收消息来改变LED矩阵的显示。

  1. 包含库:引入了控制LED矩阵和MQTT通信所需的库。
  2. 定义LED矩阵帧:定义了多个二维数组,每个数组代表LED矩阵的一个帧,用于显示不同的图案。
  3. Wi-Fi和MQTT设置:设置了Wi-Fi网络名称(SSID)和密码,以及MQTT服务器的地址、端口、用户名和密码。
  4. 创建LED矩阵实例:创建了一个ArduinoLEDMatrix类的实例,用于控制LED矩阵。
  5. 设置函数(setup)
    • 初始化串口通信。
    • 初始化LED矩阵。
    • 连接到Wi-Fi网络。
    • 连接到MQTT服务器。
    • 订阅MQTT主题。
  6. 循环函数(loop)
    • 定期检查MQTT服务器是否有新消息。
  7. MQTT消息处理函数(onMqttMessage)
    • 当接收到MQTT消息时,根据消息内容控制LED矩阵显示不同的帧。
    • 如果消息是“on”,则显示一个特定的图案。
    • 如果消息是“off”,则清除LED矩阵。
    • 如果消息是数字,根据数字范围显示不同的帧。
  8. 注释掉的JSON解析部分:代码中还包含了一个注释掉的JSON解析部分,用于解析JSON格式的消息,但这部分代码目前没有被使用。

这段代码通过Wi-Fi连接到MQTT服务器,接收消息来控制LED矩阵的显示,实现了一个基于MQTT的LED矩阵控制项目。

效果展示

微信图片_20241231235217.jpg

当mqtt数值大于90%时,led矩阵显示太阳图样

总结

在本次活动中,学习了如何使用mqtt进行通讯。在过程中遇到的问题,通过百度搜索都能找到适合的答案,使自我得到了提升,感谢硬禾学堂平台。

附件下载
arduino 例程.zip
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号