Funpack S3-5WIFI控制的LED阵列
该项目使用了Arduino UNO R4 WiFi,实现了基于WIFI的LED阵列控制的设计,它的主要功能为:网页端控制led亮起数量,当数量超过led最大数量时,led显示太阳图案。
标签
嵌入式系统
Arduino
Funpack活动
ESP32
LED阵列
Lucheni
更新2025-01-13
139

项目介绍

本次活动我实现了云端控制LED的功能。本次的活动板卡是Arduino UNO R4 WiFi,这是一块集成了瑞萨电子RA4M1微处理器和乐鑫的ESP32-S3两颗处理器的Arduino UNO开发板,其中瑞萨电子RA4M1是主控,ESP32-S3用作主控和usb的桥接和蓝牙wifi应用的协处理,在必要的时候也可以通过特殊处理将ESP32-S3用作主控。

这块开发板的一大特色是板载了12*8LED矩阵,本次的任务我实现的也是基于WiFi控制的LED矩阵。由于RA4M1管脚较多,且UNO真正引出的管脚并不多,所以板载LED矩阵并没有使用专用的LED驱动芯片,而是直接使用P003P004P011P012P013P015P204P205P206P212P213十一个管脚刷新驱动

这样带来的优点是节约管脚使用,但缺点是很难实现整体或分块的渐亮渐暗。

我原本的计划是云端调整亮度,并实现led的无极调光,尝试多次失败后我最终将项目制作成云端控制亮起led数量。

 

设计思路

代码整体逻辑较为简单,主要功能模块为WiFiled阵列控制。

因为此块开发板的无线协处理MCUESP32S3,所以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的官方开发板,相比国内很多的第三方开发板,官方开发板对于板载硬件资源的资料和相关使用助手都准备的非常充分,可以做到小白无痛上手,希望以后国内的开发板也可以做到类似的资源丰富。

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