一心想瘦的胡某人 2024-03-25 18:23 采纳率: 50%
浏览 7
已结题

platformIO/arduino串口更新GIF图

环境:platformIO或arduino
单片机:ESP32或任意Arduino开发版
库文件:adafruit_SSD1306或U8g2等
上位机:python等
实现功能:在开发版原有已存在的gif图数据上继续通过串口USB添加gif图实现循环播放所有已存在的gif图

  • 写回答

18条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-25 18:23
    关注
    获得0.60元问题酬金
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析:
    1. 开发版原有的gif图数据是存储在何处?是否可以通过某个库文件读取?
    2. 如何通过串口USB从上位机读取新的gif图数据?
    3. 如何将已有的gif图和新读取的gif图进行循环播放? 解决方案:
    4. 开发版上的gif图数据可以存储在SD卡、Flash内存或者程序变量中。如果是存储在SD卡或者Flash中,可以使用SD卡库或者Flash库读取;如果是存储在程序变量中,则可以直接在代码中使用。 案例: 开发版上已有一张名为“test.gif”的gif图,存储在SD卡上。可以使用SD库读取该文件并进行播放。
    #include <Arduino.h>
    #include <SD.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define SCREEN_WIDTH 128 // OLED display width, in pixels
    #define SCREEN_HEIGHT 64 // OLED display height, in pixels
    #define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    File gifFile;
    void setup() {
      Serial.begin(115200);
      if (!SD.begin(5)) {
        Serial.println("SD Card initialization failed!");
      }
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    }
    void playGif(String gifName) {
      gifFile = SD.open(gifName);
      //...
      //播放gif图的代码
      //...
      gifFile.close();
    }
    void loop() {
      playGif("test.gif");
    }
    
    1. 在ESP32或Arduino上,可以使用Serial库读取串口USB发送的数据。在上位机上,可以使用Python的PySerial库发送数据。 ESP32或Arduino代码:
    void loop() {
      if (Serial.available() > 0) {
        String gifName = Serial.readString();
        //读取gifName并进行播放
      }
    }
    

    Python代码:

    import serial
    ser = serial.Serial('COM3', 115200)
    with open('new.gif', 'rb') as f:    # 读取新的gif文件
        data = f.read()
    ser.write(data)    # 向串口发送数据
    
    1. 实现循环播放所有已存在的gif图,可以使用一个列表存储所有的gif文件名,在播放完一个gif后切换到下一个gif进行播放。
    #include <Arduino.h>
    #include <SD.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define SCREEN_WIDTH 128 // OLED display width, in pixels
    #define SCREEN_HEIGHT 64 // OLED display height, in pixels
    #define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    File gifFile;
    String gifNames[] = {"test.gif", "new.gif", "another.gif"};
    int currentGif = 0;
    void setup() {
      Serial.begin(115200);
      if (!SD.begin(5)) {
        Serial.println("SD Card initialization failed!");
      }
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    }
    void playGif(String gifName) {
      gifFile = SD.open(gifName);
      //...
      //播放gif图的代码
      //...
      gifFile.close();
    }
    void loop() {
      if (Serial.available() > 0) {
        String gifName = Serial.readString();
        //读取新的gifName并添加到gifNames数组中
      }
      playGif(gifNames[currentGif]);
      currentGif = (currentGif + 1) % (sizeof(gifNames) / sizeof(gifNames[0]));
    }
    
    评论

报告相同问题?

问题事件

  • 系统已结题 4月2日
  • 赞助了问题酬金20元 3月25日
  • 创建了问题 3月25日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据