项目介绍
本次活动我实现了云端控制LED的功能。本次的活动板卡是Arduino UNO R4 WiFi,这是一块集成了瑞萨电子RA4M1微处理器和乐鑫的ESP32-S3两颗处理器的Arduino UNO开发板,其中瑞萨电子RA4M1是主控,ESP32-S3用作主控和usb的桥接和蓝牙wifi应用的协处理,在必要的时候也可以通过特殊处理将ESP32-S3用作主控。
这块开发板的一大特色是板载了12*8的LED矩阵,本次的任务我实现的也是基于WiFi控制的LED矩阵。由于RA4M1管脚较多,且UNO真正引出的管脚并不多,所以板载LED矩阵并没有使用专用的LED驱动芯片,而是直接使用P003、P004、P011、P012、P013、P015、P204、P205、P206、P212、P213十一个管脚刷新驱动
这样带来的优点是节约管脚使用,但缺点是很难实现整体或分块的渐亮渐暗。
我原本的计划是云端调整亮度,并实现led的无极调光,尝试多次失败后我最终将项目制作成云端控制亮起led数量。
设计思路
代码整体逻辑较为简单,主要功能模块为WiFi和led阵列控制。
因为此块开发板的无线协处理MCU是ESP32S3,所以WiFi部分控制代码和单主控ESP32开发板几乎一致,基于SimpleWebServerWiFi代码修改而来。整体逻辑较为简单,在轮询中判断收到的事件末尾值即可:
if (currentLine.endsWith("GET /H")) {
digitalWrite(led, HIGH); // GET /H turns the LED on
bright=bright+1;
ledshow();
}
if (currentLine.endsWith("GET /L")) {
digitalWrite(led, LOW); // GET /L turns the LED off
bright=bright-1;
ledshow();
}
if (currentLine.endsWith("GET /S")) {
digitalWrite(led, LOW); // GET /L turns the LED off
bright=bright+12;
ledshow();
}
LED阵列控制是这块开发板较为有意思的点,因为是12*8单色LED矩阵,led的亮灭使用二维数组来储存
byte frame[8][12] = {
{ 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
实际代码中可用3个无符号数存储
const uint32_t sun[] = {
0x46220406,
0xe97e970,
0x60204462,
};
Arduino官方也为矩阵像素绘制设计了个方便上手的网页插件:https://ledmatrix-editor.arduino.cc/
本次作品中led阵列显示代码块逻辑为:基于WiFi获取到的led值,亮起对应数量的led。当led数量大于最多12*8=96颗后,led阵列显示太阳的图案。此代码块如下:
void ledshow(){
if (bright==0)
{
frame[0]=0x00000000;
frame[1]=0x00000000;
frame[2]=0x00000000;
matrix.loadFrame(frame);
} else if (bright<=32) {
frame[0]=0x80000000;
frame[1]=0x00000000;
frame[2]=0x00000000;
for (int i=1; i<bright; i++){
frame[0]=frame[0]|(frame[0]>>1);
}
// Serial.println(frame[0], BIN);
// Serial.println(frame[1], BIN);
// Serial.println(frame[2], BIN);
matrix.loadFrame(frame);
} else if (bright<=64){
frame[0]=0xFFFFFFFF;
frame[1]=0x80000000;
frame[2]=0x00000000;
for (int i=1; i<bright-32; i++){
frame[1]=frame[1]|(frame[1]>>1);
}
// Serial.println(frame[0], BIN);
// Serial.println(frame[1], BIN);
// Serial.println(frame[2], BIN);
matrix.loadFrame(frame);
} else if (bright<=96){
frame[0]=0xFFFFFFFF;
frame[1]=0xFFFFFFFF;
frame[2]=0x80000000;
for (int i=1; i<bright-64; i++){
frame[2]=frame[2]|(frame[2]>>1);
}
// Serial.println(frame[0], BIN);
// Serial.println(frame[1], BIN);
// Serial.println(frame[2], BIN);
matrix.loadFrame(frame);
} else{
matrix.loadFrame(sun);
}
}
最终实现效果如下:
开发板初始化完成后,会在串口输出开发板创建的网页IP,如图Host行显示为192.48.56.2
手机连接开发板网页后,有三个按钮,分别控制单颗亮起,单颗熄灭和亮起12颗LED。
随着led亮起的数量增加,阵列即将全部亮起
全部亮起后再增加LED数量,LED阵列会显示太阳的形状。
活动感想
感谢eetree和得捷电子举办这次活动,让我有机会体验Arduino的官方开发板,相比国内很多的第三方开发板,官方开发板对于板载硬件资源的资料和相关使用助手都准备的非常充分,可以做到小白无痛上手,希望以后国内的开发板也可以做到类似的资源丰富。