站内搜索
更多
魔法哔哔机
专业版

魔法哔哔机

简介

基于STM32的便携式解压小玩具!搭载1.9寸LCD显示,内置“答案之书”、“求签”、“艺术驱动器”、“吃什么“、”玩什么“等十余趣味玩法,支持动画GIF渲染、蜂鸣器音效、离线历史记录保存等。

简介:基于STM32的便携式解压小玩具!搭载1.9寸LCD显示,内置“答案之书”、“求签”、“艺术驱动器”、“吃什么“、”玩什么“等十余趣味玩法,支持动画GIF渲染、蜂鸣器音效、离线历史记录保存等。
星火计划2026
复刻成本:30

开源协议

GPL 3.0

(未经作者授权,禁止转载)
创建时间:2026-06-24 12:34:28更新时间:2026-07-25 18:14:16

描述

一、使用场景

魔法哔哔机宣传图.png

二、视频链接:

B站视频--详细功能演示及介绍 !!!点这里📺📺

三、项目简介 📖

本项目魔法哔哔机(Art_Board)是基于STM32F103C8T6的趣味艺术交互小玩具✨,搭载ST7789彩色屏幕+8MB W25Q64外部Flash,搭配三按键交互、电池电量检测、硬件PWM无源蜂鸣器;内置13类创意趣味功能,整体采用Arduino+FreeRTOS多任务架构开发,可玩性丰富。

图1 系统架构图

四、项目功能 🎮

  1. 内置13种趣味交互玩法:答案之书、随机起名、抽签、滚动骰子、出行/美食/影视/娱乐随机推荐、操作说明、历史记录、系统设置;
  2. 屏幕自定义功能:亮度调节🔆、一键静音🔇、画面翻转;
  3. 音频系统:内置《起风了》背景音乐,支持各类提示音效;
  4. 状态监测:实时采集锂电池电压,顶部状态栏直观展示剩余电量🔋;
  5. 资源烧录:配套串口工具,批量烧录字库、图标、动画、文本素材至外部Flash。
  6. 支持定制:所有图标、开机动画、文本素材都支持自定义。

五、项目参数 ⚙️

  • 主控:STM32F103C8T6,Cortex-M3内核72MHz,64KB内置Flash、20KB RAM;
  • 显示:ST7789 1.9寸 170×320 LCD,SPI1驱动,PWM背光可调;
  • 存储:W25Q64 8MB SPI Flash,存放全部图片、字库、文本、旋律资源;
  • 交互:3路独立按键,中断驱动+200ms软件去抖,支持长按连发;
  • 发声:PB6 TIM4硬件PWM驱动无源蜂鸣器,支持完整简谱旋律播放;
  • 电量:PA3 12位ADC分压采样,自动换算0~100%电量百分比;
  • 调度:FreeRTOS多任务并发,分为按键、显示、Flash烧录、电量、音乐五大常驻任务。

六、实物图🖼️

以下是每个功能的演示gif图,想看详细演示请跳转到B站演示视频链接
B站视频--功能演示及介绍 !!!点这里📺📺

1.答案之书📖

支持长按和短按,一直按住,默想问题,松开得到答案,就是这么简单😁

图2 答案之书功能实物演示

2.起名字📇

可以选择起一个字到四个字,帮大家在起名字的时候提供灵感👌

图3 起名字功能实物演示

3.艺术驱动器⚙️

可以生成各种富有艺术气息的句子,让普通人也能感受艺术的魅力,也能彻底打开脑洞,非常适合写作类,也可以拿来作为微信QQ个性签名

图4 艺术驱动器功能实物演示

4.求签🥠

图5 求签功能实物演示
每天出门都可以求一求签,来个上吉签岂不美哉。 签文在上,运势在下,下面是所有可能抽到的签,这些都是可以自定义的,只需要改txt文本,然后用工具烧录到外部Flash就可以了。
图6 抽签素材文本文件
如果你像作者一样运气太背,一上来就抽到下吉签,也不用担心,不用充值什么VIP,看什么广告,求什么大师,只需要再按一下,直到抽到你喜欢的签即可,哈哈哈哈,是不是很任性,注意这用于娱乐,切莫迷信。
图7 作者的bad luck

5.骰子🎲

还有摇骰子的功能,支持长按和短按,一直按就一直要,松开就停止。
作者温馨提示,仅供娱乐,不可赌博哟😊😊

图8 骰子功能实物演示

6.去哪儿🛫

放假了,纠结去哪里旅游,它也可以帮你出主意,给你一个目的地,有时候可能有点夸张,比如它让作者去珠穆拉玛峰😥😥

图9 去哪儿功能实物演示

7.吃什么🍴

我个人觉得最实用的一个功能来了,作者每天到饭点就纠结吃什么,有了它,我从饭点前一个小时就可以按了,按到手抽筋,累了也就有胃口了,吃什么也想好了,一举两得,是不是很妙,作者最喜欢这个功能,就是为了这点醋才包这顿饺子哈哈哈。

图10 吃什么功能实物演示
而且不用担心它来来回回只会推荐那几个,下面是它的数据库的一部分,密密麻麻,我都不记得当时准备了多少,就算不够还可以继续添加,不过就是几个字符,占不了几个字节,我已经规划好了外部Flash的分配,留有余量。
图11 吃什么素材文本文件

8.看什么📺

有时候遇到剧荒怎么办,用它来翻一下牌子,看看今天看什么电影或者电视剧吧,作者要AI推荐了几百部经典的电影和电视剧,然后把它们存起来,要全部看完,不知道要看到什么时候去了。

图12 看什么功能实物演示

9.玩什么🎮

看电影看累了怎么办,想玩点什么游戏,但是又不知道玩什么,电子yanwei了,没关系,它来拯救你,我也存了几百款经典的游戏名,涉及各个方面,各种类型的,因为本人玩的游戏实在少,所以没加多少游戏名进去,有游戏爱好者可以多存点游戏名。注意这里是游戏名,也就推荐游戏,不提供游戏本身,资源有限,单片机被压榨完了。

固件大小:    约 60 KB / 64 KB(94%)
RAM 使用:    约 5 KB / 20 KB(25%)
外部 Flash:  约 55% 已用,约 3.6 MB 剩余
图13 玩什么功能实物演示

10.干什么👏

有时候实在太无聊,就可以让它指挥你去随机干点什么,扮演被机器代码控制的人,也类似于真心话大冒险里面的大冒险,素材可以自定义。

图14 干什么功能实物演示

11.操作说明和历史记录📄

图15 操作说明和历史记录功能实物演示
在操作说明界面会播放《起风了》bgm,也算是作者留的小彩蛋了。

12.设置⚙️

还可以设置屏幕亮度、蜂鸣器静音开关、屏幕翻转。

图16 设置功能实物演示

13.终极彩蛋🥚

当长按中间键3s,听到蜂鸣器滴得一声,进入彩蛋模式,所有的随机文本显示,都会变成“我喜欢你”,特别适合送给心上人当礼物,独属于电子工程师的浪漫。

图17 彩蛋功能演示

七、原理解析(硬件说明)🔧

整机硬件分为六大独立模块,布线采用双SPI总线互不干扰:

  1. 主控模块:STM32最小系统,保留SWD调试接口,上电重映射关闭JTAG,释放PB3/PB4用作按键;USB 5V经LDO稳压3.3V整机供电;
  2. 显示模块:SPI1驱动ST7789彩屏,PB11输出PWM信号调节背光,支持屏幕画面旋转切换;
  3. Flash存储模块:独立SPI2总线挂载W25Q64,存储全部UI素材与文字资源,分离总线避免抢占带宽;
  4. 按键模块:PB3/PB4/PB5上拉输入,下降沿中断触发,自带软件消抖,操作无延迟;
  5. 发声模块:TIM4硬件PWM生成音频方波,CPU零中断开销,音色干净;
  6. 电源检测模块:PA3 ADC采集电池分压电压,实时换算电量并在顶部状态栏展示。

八、软件架构 💻

程序流程图 📊
上电初始化全部外设与存储资源→加载本地配置参数→播放开机GIF动画→创建多任务并启动调度器;
按键任务实时监听输入,跳转对应UI界面;
显示任务循环渲染菜单与功能画面;
音乐任务按需加载、暂停背景音乐;
ADC定时刷新电量数据;
串口任务接收指令,完成Flash资源擦写。

因为用的MCU硬件资源确实有限,所有没用LVGL,自己手搓了个UI,要是用ESP32的话,那就不用担心这个了,直接上LVGL,至于为什么没用ESP32,主要是成本问题。
图18 程序流程图
图19 用户功能交互流程图

因为MCU的片上Flash存储有限,所有的图标和文本字库等都放到外部Flash芯片中,以下是外部8MBFlash芯片的布局

图20 Flash存储架构图
地址范围               大小      内容                         使用率
──────────────────────────────────────────────────────────────────
0x000000–0x0BAFFF     748 KB    GBK 16×16 点阵字库             100%
0x405000–0x5E0FFF    1683 KB    GBK 24×24 点阵字库              89%
0x600000–0x61EFFF     124 KB    菜单图标(13×66×66)+ 状态图标    87%
0x61F000–0x61F3FF       1 KB    speaker.bin(22×22 喇叭图标)    100%
0x61F400–0x61F7FF       1 KB    mute.bin(22×22 静音图标)       100%
0x620000–0x69FFFF     512 KB    开机 GIF 动画(100×100×28 帧)   85%
0x6B0000–0x6BFFFF      64 KB    二维码(170×170 RGB565)         89%
0x6C0000–0x6CFFFF      64 KB    answer_book.bin(答案之书)       14%
0x6D0000–0x6DFFFF      64 KB    art_driver.bin(艺术驱动器)      20%
0x6E0000–0x6EFFFF      64 KB    eat.bin(吃什么, 739 项)         14%
0x6F0000–0x6FFFFF      64 KB    do.bin(干什么, 1161 项)         56%
0x700000–0x70FFFF      64 KB    watch.bin(看什么, 700 项)       14%
0x710000–0x71FFFF      64 KB    play.bin(玩什么, 369 项)         8%
0x720000–0x72FFFF      64 KB    travel.bin(去哪儿, 342 项)       6%
0x730000–0x73FFFF      64 KB    lottery.bin(抽签, 12 签)         <1%
0x740000–0x743FFF      24 KB    dice1.bin(骰子 1, 100×100)      81%
0x746000–0x749FFF      24 KB    dice2.bin(骰子 2)               81%
0x74C000–0x74FFFF      24 KB    dice3.bin(骰子 3)               81%
0x752000–0x755FFF      24 KB    dice4.bin(骰子 4)               81%
0x758000–0x75BFFF      24 KB    dice5.bin(骰子 5)               81%
0x75E000–0x761FFF      24 KB    dice6.bin(骰子 6)               81%
0x764000–0x77DFFF     396 KB    dice_roll.bin(骰子动画, 8 帧)
0x7A0000–0x7A0FFF       4 KB    Config(屏幕翻转状态)              <1%
0x7A1000–0x7A1FFF       4 KB    History(最近 5 条记录)            9%
0x7A2000–0x7A23FF       1 KB    wind_rise.bin(《起风了》旋律)   100%
0x7A2400–0x7FFFFF     375 KB    (预留)                           —
──────────────────────────────────────────────────────────────────
总计: 8 MB (8192 KB), 已用约 55%, 剩余约 45% (~3.6 MB)

为了方便烧写图标字体文本等素材到外部Flash,我还做了一个专门用于外部Flash烧写的上位机软件工具(已经上传附录),通过串口配合STM32里面的程序,即可自动按上面Flash存储架构图中的位置自动烧写到对应的地址,方便之后程序去对应位置读取,不会出现乱码,操作简单,高效方便。

软件.png

软件.png

图21 图22 Flash烧录上位机界面

九、注意事项 ⚠️

  • W25Q64 Flash写入前必须先擦除对应扇区,直接烧录会导致素材错乱;
  • SPI1、SPI2总线功能分离,多任务同时读取Flash需错开时序,防止屏幕花屏;
  • PB3、PB4引脚默认复用JTAG调试功能,必须寄存器重映射才能作为按键使用;
  • 串口批量烧录Flash资源时保证供电稳定,中途断电会损坏外部全部素材;
  • 关闭蜂鸣器不能仅停用PWM通道,需将引脚拉低,否则会产生微弱电流杂音;
  • 电池分压电路电阻不可随意替换,阻值变动会造成电量计算偏差过大。

十、组装流程 🔨

下面那个是第一版,测试版最开始用来写代码测功能的,上面那个亮灯的是正式版,接了锂电池,还没装外壳👇

图23:焊接STM32主控、LCD屏幕、W25Q64存储芯片

外壳设计采用卡扣的方式,不用螺丝就可以把盖子和外壳合上,外观很简洁美观

IMG_20260721_220851.jpg

图24:整机装入外壳,接入锂电池完成最终组装

装好外壳之后,就可以把面板装上去,面板背后有背胶,这里我做演示就没有撕掉背胶,正常组装就撕掉背胶贴上去就行了,只是贴好了就不能换面板了,本来我说想设计成那种支持切换面板的,但是有点小复杂,如果后面有结构设计这方面的大佬,可以尝试一下。

图25:安装面板

多亏了嘉立创面板打印,我一次性打了好几种不同风格的面板,好纠结最终用哪个面板哈哈哈😂😂😂

图26:各种风格的面板
图27:最终成品图

测试板也不能浪费了,也给它设计了个外壳,面板都是通用的,不用额外设计,测试板颜值比正式板要高是怎么回事hhh。

图28:测试板正面图
图29:测试板测试图
图30:测试板界面展示
如果大家要复刻的话,可以改成自己喜欢的面板😊😊这里推荐嘉立创面板打印!

十一、设备续航

锂电池我用的是800mAh的,尺寸也合适,因为作者没有测功耗仪器,只有一个简陋的测试模块,大概知道整个设备正常工作的电流是100ma左右,所以理论上满电大概能够用8个小时,实际大概7个小时左右。

图31:锂电池实物图
图32:正常使用电流功耗

当设备5s没有任何操作的时候,进入省电模式,三个按键任意一个都可以唤醒它,按键已配置为 EXTI 中断(PB3/PB4/PB5),天然支持 Stop 唤醒,关闭LCD的显示,STM32进入STOP模式,功耗从 ~20mA 降到 ~30µA,差 600 倍,唤醒后能恢复上下文(不用重启)。

模式	功耗	唤醒源	唤醒后
Sleep	~3 mA	任何中断	继续下一条指令
Stop	~30 µA	EXTI / RTC	复位时钟,从 ISR 继续
Standby	~3 µA	PA0-WKUP / RTC	等价于复位

正常模式下是80ma,五秒左右没有操作,进入休眠模式,可以看到电流到了0ma了,
可以看到我的这个电流检测模块都检测不到了,不知道是电流真的太小了,还是我这个模块不行。然后唤醒又有80ma左右了。

图33:休眠模式演示

充电电流1A左右,理论上充满48分钟,实际60分钟左右,充电过程蓝灯闪烁,充满亮绿灯。

图34:充电电流

十二、作者的话和项目的起源

我这个项目本来是想作为我的第一次技术变现,商业化的尝试,从前期的市场调研到后期的开发我都仔细思考过,市面上的竞品少,价格普遍都是70左右,个别甚至冲到100+,功能还没有我的多,所以我从一开始就冲着商业化、产品化去的,因此我在选型的时候就严格控制成本,我一开始是打算控制在20块钱内的,我放弃使用esp32,一个是太贵了,还有就是功耗太大了,最终发现大概整套下来,如果量产,大概能控制到30以内,但是一般的话30左右吧,还得花更多的时候货比三家,要确保供货稳定,至少要准备100套。但是后来发现我没有那么多时间去折腾,我不擅长做生意,我还有自己的工作,这个项目我都是下班空余时间完成的,一次次熬夜到凌晨,回头看真是一段痛苦但美妙的日子。
大家放心去复刻,不会太贵,只是要注意焊接,作者手残党一开始焊接的,屏幕死活不亮,差点放弃哈哈哈,最后各种排查,终于完成项目,非常感谢嘉立创星火计划,给我这么一次机会,不仅报销元器件,还支持3D外壳,和面板,全部都是免费。👍👍👍❤️❤️❤️

图35:作者的最初的项目灵感和规划

我采用的开发工具是vscode + platformio + git

图36:开发工具
图37:开发过程接线
整个项目从5月28日~7月25日历时两个月,已完成全部工作,这也算了呕心沥血的代表作了,一个人体验了产品开发的全流程。之后因为本人事务繁忙,我这个项目还有很大的优化空间,非常欢迎各位大佬来升级这个项目!👏👏👏

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
1
魔法哔哔机盖子.step
4
2
魔法哔哔机外壳.step
3

附件

序号文件名称下载次数
1
art_board.rar
10
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航