
魔法哔哔机
简介
基于STM32的便携式解压小玩具!搭载1.9寸LCD显示,内置“答案之书”、“求签”、“艺术驱动器”、“吃什么“、”玩什么“等十余趣味玩法,支持动画GIF渲染、蜂鸣器音效、离线历史记录保存等。
简介:基于STM32的便携式解压小玩具!搭载1.9寸LCD显示,内置“答案之书”、“求签”、“艺术驱动器”、“吃什么“、”玩什么“等十余趣味玩法,支持动画GIF渲染、蜂鸣器音效、离线历史记录保存等。开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
一、使用场景

二、视频链接:
三、项目简介 📖
本项目魔法哔哔机(Art_Board)是基于STM32F103C8T6的趣味艺术交互小玩具✨,搭载ST7789彩色屏幕+8MB W25Q64外部Flash,搭配三按键交互、电池电量检测、硬件PWM无源蜂鸣器;内置13类创意趣味功能,整体采用Arduino+FreeRTOS多任务架构开发,可玩性丰富。
四、项目功能 🎮
- 内置13种趣味交互玩法:答案之书、随机起名、抽签、滚动骰子、出行/美食/影视/娱乐随机推荐、操作说明、历史记录、系统设置;
- 屏幕自定义功能:亮度调节🔆、一键静音🔇、画面翻转;
- 音频系统:内置《起风了》背景音乐,支持各类提示音效;
- 状态监测:实时采集锂电池电压,顶部状态栏直观展示剩余电量🔋;
- 资源烧录:配套串口工具,批量烧录字库、图标、动画、文本素材至外部Flash。
- 支持定制:所有图标、开机动画、文本素材都支持自定义。
五、项目参数 ⚙️
- 主控: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.起名字📇
可以选择起一个字到四个字,帮大家在起名字的时候提供灵感👌
3.艺术驱动器⚙️
可以生成各种富有艺术气息的句子,让普通人也能感受艺术的魅力,也能彻底打开脑洞,非常适合写作类,也可以拿来作为微信QQ个性签名。
4.求签🥠
5.骰子🎲
还有摇骰子的功能,支持长按和短按,一直按就一直要,松开就停止。
作者温馨提示,仅供娱乐,不可赌博哟😊😊
6.去哪儿🛫
放假了,纠结去哪里旅游,它也可以帮你出主意,给你一个目的地,有时候可能有点夸张,比如它让作者去珠穆拉玛峰😥😥
7.吃什么🍴
我个人觉得最实用的一个功能来了,作者每天到饭点就纠结吃什么,有了它,我从饭点前一个小时就可以按了,按到手抽筋,累了也就有胃口了,吃什么也想好了,一举两得,是不是很妙,作者最喜欢这个功能,就是为了这点醋才包这顿饺子哈哈哈。
8.看什么📺
有时候遇到剧荒怎么办,用它来翻一下牌子,看看今天看什么电影或者电视剧吧,作者要AI推荐了几百部经典的电影和电视剧,然后把它们存起来,要全部看完,不知道要看到什么时候去了。
9.玩什么🎮
看电影看累了怎么办,想玩点什么游戏,但是又不知道玩什么,电子yanwei了,没关系,它来拯救你,我也存了几百款经典的游戏名,涉及各个方面,各种类型的,因为本人玩的游戏实在少,所以没加多少游戏名进去,有游戏爱好者可以多存点游戏名。注意这里是游戏名,也就推荐游戏,不提供游戏本身,资源有限,单片机被压榨完了。
固件大小: 约 60 KB / 64 KB(94%)
RAM 使用: 约 5 KB / 20 KB(25%)
外部 Flash: 约 55% 已用,约 3.6 MB 剩余
10.干什么👏
有时候实在太无聊,就可以让它指挥你去随机干点什么,扮演被机器代码控制的人,也类似于真心话大冒险里面的大冒险,素材可以自定义。
11.操作说明和历史记录📄
12.设置⚙️
还可以设置屏幕亮度、蜂鸣器静音开关、屏幕翻转。
13.终极彩蛋🥚
当长按中间键3s,听到蜂鸣器滴得一声,进入彩蛋模式,所有的随机文本显示,都会变成“我喜欢你”,特别适合送给心上人当礼物,独属于电子工程师的浪漫。
七、原理解析(硬件说明)🔧
整机硬件分为六大独立模块,布线采用双SPI总线互不干扰:
- 主控模块:STM32最小系统,保留SWD调试接口,上电重映射关闭JTAG,释放PB3/PB4用作按键;USB 5V经LDO稳压3.3V整机供电;
- 显示模块:SPI1驱动ST7789彩屏,PB11输出PWM信号调节背光,支持屏幕画面旋转切换;
- Flash存储模块:独立SPI2总线挂载W25Q64,存储全部UI素材与文字资源,分离总线避免抢占带宽;
- 按键模块:PB3/PB4/PB5上拉输入,下降沿中断触发,自带软件消抖,操作无延迟;
- 发声模块:TIM4硬件PWM生成音频方波,CPU零中断开销,音色干净;
- 电源检测模块:PA3 ADC采集电池分压电压,实时换算电量并在顶部状态栏展示。
八、软件架构 💻
程序流程图 📊
上电初始化全部外设与存储资源→加载本地配置参数→播放开机GIF动画→创建多任务并启动调度器;
按键任务实时监听输入,跳转对应UI界面;
显示任务循环渲染菜单与功能画面;
音乐任务按需加载、暂停背景音乐;
ADC定时刷新电量数据;
串口任务接收指令,完成Flash资源擦写。
因为用的MCU硬件资源确实有限,所有没用LVGL,自己手搓了个UI,要是用ESP32的话,那就不用担心这个了,直接上LVGL,至于为什么没用ESP32,主要是成本问题。
因为MCU的片上Flash存储有限,所有的图标和文本字库等都放到外部Flash芯片中,以下是外部8MBFlash芯片的布局
地址范围 大小 内容 使用率
──────────────────────────────────────────────────────────────────
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存储架构图中的位置自动烧写到对应的地址,方便之后程序去对应位置读取,不会出现乱码,操作简单,高效方便。


九、注意事项 ⚠️
- W25Q64 Flash写入前必须先擦除对应扇区,直接烧录会导致素材错乱;
- SPI1、SPI2总线功能分离,多任务同时读取Flash需错开时序,防止屏幕花屏;
- PB3、PB4引脚默认复用JTAG调试功能,必须寄存器重映射才能作为按键使用;
- 串口批量烧录Flash资源时保证供电稳定,中途断电会损坏外部全部素材;
- 关闭蜂鸣器不能仅停用PWM通道,需将引脚拉低,否则会产生微弱电流杂音;
- 电池分压电路电阻不可随意替换,阻值变动会造成电量计算偏差过大。
十、组装流程 🔨
下面那个是第一版,测试版最开始用来写代码测功能的,上面那个亮灯的是正式版,接了锂电池,还没装外壳👇
外壳设计采用卡扣的方式,不用螺丝就可以把盖子和外壳合上,外观很简洁美观

装好外壳之后,就可以把面板装上去,面板背后有背胶,这里我做演示就没有撕掉背胶,正常组装就撕掉背胶贴上去就行了,只是贴好了就不能换面板了,本来我说想设计成那种支持切换面板的,但是有点小复杂,如果后面有结构设计这方面的大佬,可以尝试一下。
多亏了嘉立创面板打印,我一次性打了好几种不同风格的面板,好纠结最终用哪个面板哈哈哈😂😂😂
测试板也不能浪费了,也给它设计了个外壳,面板都是通用的,不用额外设计,测试板颜值比正式板要高是怎么回事hhh。
十一、设备续航
锂电池我用的是800mAh的,尺寸也合适,因为作者没有测功耗仪器,只有一个简陋的测试模块,大概知道整个设备正常工作的电流是100ma左右,所以理论上满电大概能够用8个小时,实际大概7个小时左右。
当设备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左右了。
充电电流1A左右,理论上充满48分钟,实际60分钟左右,充电过程蓝灯闪烁,充满亮绿灯。
十二、作者的话和项目的起源
我这个项目本来是想作为我的第一次技术变现,商业化的尝试,从前期的市场调研到后期的开发我都仔细思考过,市面上的竞品少,价格普遍都是70左右,个别甚至冲到100+,功能还没有我的多,所以我从一开始就冲着商业化、产品化去的,因此我在选型的时候就严格控制成本,我一开始是打算控制在20块钱内的,我放弃使用esp32,一个是太贵了,还有就是功耗太大了,最终发现大概整套下来,如果量产,大概能控制到30以内,但是一般的话30左右吧,还得花更多的时候货比三家,要确保供货稳定,至少要准备100套。但是后来发现我没有那么多时间去折腾,我不擅长做生意,我还有自己的工作,这个项目我都是下班空余时间完成的,一次次熬夜到凌晨,回头看真是一段痛苦但美妙的日子。
大家放心去复刻,不会太贵,只是要注意焊接,作者手残党一开始焊接的,屏幕死活不亮,差点放弃哈哈哈,最后各种排查,终于完成项目,非常感谢嘉立创星火计划,给我这么一次机会,不仅报销元器件,还支持3D外壳,和面板,全部都是免费。👍👍👍❤️❤️❤️
我采用的开发工具是vscode + platformio + git
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










