OLED 播放 GIF图片 Arduino

最近在玩硬件,发现没有什么能够便利生成AdruinoGIF库的工具,自己手搓了一个
2025.4.9:修复了添加工具连续添加出错的BUG,增加了数个GIF图在原装库中
ps:需求:单个资源挂csdn上了(0积分可以随便下哈)
GIF图
拆帧工具: GifSplitter
取模工具:Img2Lcd(支持批量取模很舒适)
库以及添加工具:https://github.com/caoshifan/Gifshow
GIF动图调整工具(可以不用):GIF Movie Gear
ps:有人需要库实现逻辑分析不,木有的话我就偷懒了(,,•﹏•,,)

目录

一、环境

二、具体实现

2.1 动图调整

2.2 拆帧

2.3 取模

2.4 集成到Adruino库

2.5 使用示例


一、环境

        软件:Adruino
        硬件:ssd1306驱动的oled屏128*64
                   (ps:如果你是其他驱动的,需要在源码里将初始化函数改一下)
        基本流程思路:调整你的GIF图---拆帧---取模---使用工具集成到库---打包导入Adruino库---使用。(调整,拆帧,取模算是常规操作了,熟悉的可以直接跳转后面)

二、具体实现

2.1 动图调整

        GIF Movie Gear导入GIF图后就在如下界面,界面下的每一帧都可以换位删除复制等等。如果有更进一步的需求,可以查阅相关资料。简单调整后点击左上角第三个图标保存即可。

2.2 拆帧

        打开GifSplitter,选择输入的GIF图,如果勾选"以文件名自动创建输出文件夹",会在图片路径下自动生成帧拆解文件,当然你也可以指定文件夹输出。
ps:注意背景色调整。若GIF为白色背景,需要将背景改为白色。如果为黑色背景白色画笔则保持默认黑色即可

点击开始分离会在你选择的目录下生成每一帧的图片类似如下:

2.3 取模

        打开Img2Lcd工具。打开之前文件夹的第一个.bmp文件
        注意几个参数设置,输出为C语言数组,灰度为单色,宽高128*64,左下方无需勾选,然后点击批量转换即可。

        转换完成后会生成一个Batch文件夹,其中就是我们需要的数组文件了。

2.4 集成到Adruino库

        打开下载的Gifshow文件夹,其中add_gif_Tool是添加工具,MyLibrary是Adruino库文件
        在MyLibrary/src/frames文件夹下,建立一个新的文件夹,文件名用来描述Gif图(注意全部小写),然后将batch文件夹下的.c文件全部拷贝到新建的文件夹下。我这里新建了一个bath文件夹,用来存放洗澡的Gif图。

        然后打开add_gif_Tool/dist文件夹下的“GIFManager.exe”应用程序(非windows系统可以运行win_ui.py文件,这个需要python环境。)
        点击选择GIF文件夹,路径指向Adruino库文件下你上一步新建的文件夹,然后点击更新库即可。

        完成更新后将MyLibrary文件夹压缩为.zip文件(必须是.zip啊不能是rar,7z啥的),然后打开Adruino,项目---导入库---添加.zip库添加即可。
  

2.5 使用示例

        导入库后,在文件---示例---MyLibrary---showgif使用示例

        主要使用方式如下:注意啊,BATH就是你之前新建的文件夹名称的全大写,然后烧录即可

myDisplay.show(DisplayModel::BATH);

ps:别忘了初始化哈,这是示例代码,懒得找的可以直接用这个,完事

#include <Arduino.h>
#include "MyLibrary.h"

// 定义 OLED 屏幕的尺寸和复位引脚
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1

// 初始化 MyLibrary
MyLibrary myDisplay(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_RESET);

void setup() {
    Serial.begin(115200);
    myDisplay.begin(); // 初始化屏幕
    myDisplay.setFrameDelay(20); // 设置每帧间隔时间(毫秒)
}

void loop() {
    static bool isSnow = true; // 交替播放 SNOW 和 BATH
    myDisplay.show(isSnow ? DisplayModel::DANCE : DisplayModel::BATH);
  
    isSnow = !isSnow;  // 切换模式

    for (int i = 0; i < 200; i++) {  // 播放 200 次帧动画后切换模式
        myDisplay.update();
        delay(50); // 防止过快刷新
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渊兮旷兮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值