当前位置: 首页 > news >正文

OLED 播放 GIF图片 Adruino

最近在玩硬件,发现没有什么能够便利生成AdruinoGIF库的工具,自己手搓了一个
ps:需求:打包版度盘链接,单个资源还在审核,通过后会更新进去
GIF图
拆帧工具:GifSplitter
取模工具:Img2Lcd(支持批量取模很舒适)
库以及添加工具:https://github.com/caoshifan/Gifshow
GIF动图调整工具(可以不用):GIF Movie Gear

目录

一、环境

二、具体实现

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); // 防止过快刷新
    }
}

相关文章:

  • QT高效文件I/O编程--实用指南与最佳实践
  • 基于Spring Boot的网上购物商城系统的设计与实现(LW+源码+讲解)
  • c++:封装红黑树实现map与set
  • NVM安装速通使用手册(Windows版)NVM管理node版本命令手册 NVM使用手册
  • openmmlab介绍 一下
  • 大模型在原发性肺脓肿预测及治疗方案制定中的应用研究
  • Nuxt出现Error: Failed to download template from registry
  • 347 前k个高频元素
  • cli命令编写
  • OpenGL(三)管线介绍和三角形绘制
  • C++特殊类的设计
  • 二叉树相关算法实现:判断子树与单值二叉树
  • 线程未关闭导致资源泄漏
  • Halcon找圆心
  • c++some
  • 如何为你的github开源项目选择合适的开源协议?
  • Go 1.24 新特性解析:泛型类型别名、弱指针与终结器改进
  • HTTP抓包Websocket抓包(Fiddler)
  • tar包部署rabbitMQ
  • 进阶版孟德尔随机化方法!遗传变异聚类+异质性检验,避免水平多效性带来的假阳性结果(PCMR)
  • 媒体:“重病老人银行取款身亡”涉事家属称已和解,银行将支付十万
  • 丹麦外交大臣拉斯穆森将访华
  • 中国乒协坚决抵制恶意造谣,刘国梁21日将前往多哈参加国际乒联会议
  • 3年多来俄乌要首次直接对话?能谈得拢吗?
  • 冰雹造成车损能赔吗?如何理赔?机构答疑
  • 风雨天涯梦——《袁保龄公牍》发微