首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >手把手教程:用 ESP32-C3+LVGL,三个小时从零搓出一个电子相册日历

手把手教程:用 ESP32-C3+LVGL,三个小时从零搓出一个电子相册日历

作者头像
爱学英语的程序媛
发布2026-09-15 11:41:39
发布2026-09-15 11:41:39
980
举报

哈喽大家好,我是小李。上周末闲来没事儿,去Trae的创造力大赛溜达了一圈,本来其实不太想去的,大周末的人太多了,但是看到有人在某书上发帖子说去签到可以领到一个牌,还可以自己捣鼓一些东西,也看了他们的作品,发现还挺有意思的,那我多少得去尝尝咸淡哈哈哈哈。

去签到完之后,我如愿的领到了那个牌子,然后去馆内溜达了一圈(本来想直接撤退的,因为我的目标达到了,但是想了一下,来都来了,得给点面子吧),现场的体验感其实一般,人非常多,每隔摊位前排队的人都一大堆,大家基本都是体验他们的产品,然后获得积分,然后使用积分去兑换一些周边之类的,我感觉没啥意思,逛了一圈就撤退了,全程耗时不到15分钟。

回来之后,因为周日还有其他的事情,所以一直没时间研究这个牌。

直到昨天上班的时候,看到他们的群里讨论,大家都做了很多非常好玩的小工具或者小游戏,心想:那我不也得试试看。

于是今天,说干就干。

早上打开电脑,很顺利的通过 USB 连接到了牌,然后根据官方文档中描述的内容,将官网的游戏写入到了牌上,整个过程不到10秒,非常顺利,写入之后重启设备牌就可以体验刚刚新写入的功能,还是非常方便的。

那光使用别人写好的多没意思啊。我就要自己写一个!

将官方仓库的代码拉下来之后,简单的看了一下框架,结合AI的分析,大概了解了整个仓库的内容。除了硬件相关的配置之外,它把整个通信和传输模块都是打通的,相当于我们要是开发的话只需要关注软件部分就可以。

那这下就好办了。

那我不如开发个日历,上面的背景图片使用我和好朋友的合影,每个月切换一张,听起来是不是非常有意思。

我直接把提示词甩给了AI,然后让他参考代码中的框架帮我实现,这里尽可能把提示词写的详细一点,这样一方面能防止AI随意发挥造成不必要的    token 消耗,另一方面,一次性说清楚也可以避免后续多次调整,影响整个项目的进度。

开发好之后接下来就是测试了。

因为只能到硬件上去测试,所以,接下来的一个问题:

我们怎么把这堆

山放到牌上?

官网写的很清楚,我们需要上传一系列的 Bin 文件,但是刚刚 AI 生成的代码默认全是 py 的,显然用不了,那接下来就面临着一个打包的问题。

如果你了解过一些嵌入式相关的知识的话,你应该知道这个工具:ESP-IDF

如果你不知道也没有关系,你直接在编译器中问 AI 就可以。

这里简单介绍一下它是干啥的

代码语言:javascript
复制
ESP-IDF 就是 ESP32 官方的嵌入式开发框架和构建工具链,负责把你的应用代码、底层驱动和系统功能组织起来,最后生成能在设备上运行的固件。

上面需要的本地固件就是通过这个环境来打包的。

那我们要是使用的话需要去官网下载并安装

地址给大家贴到这里:

代码语言:javascript
复制
https://dl.espressif.cn/dl/esp-idf/?idf=4.4

注意一定要选择正确的版本:5.5.3,代码仓库中也写了。

大家也可以使用下面的路径来安装

代码语言:javascript
复制
https://dl.espressif.cn/dl/idf-installer/esp-idf-tools-setup-offline-5.5.3.exe

这个是国内的镜像,我只用了不到两分钟就下好了

下好之后大家注意安装的时候路径短一点,例如:D:/esp, 路径越长越难容易出问题。

装好之后打开cmd直接查看版本信息是看不到的,需要先激活一下,使用下面的命令

代码语言:javascript
复制
D:\esp\Espressif\frameworks\esp-idf-v5.5.3\export.bat

激活好之后输入:

代码语言:javascript
复制
idf.py --version

就可以看到版本的信息了

看到版本信息之后说明环境就装好了,接下来我们开始打包

在目录文件夹下执行

代码语言:javascript
复制
idf.py build

打包好之后你会在 build 文件夹下看到我们刚刚打包好的 bin 文件。

此时,来到官网,连接设备之后,直接将这个 bin 文件写入。

写入之后,重启牌子:

居然黑屏了!而且还闪退

问题出在哪呢?

如果不确定的话,我们就先换成官网的游戏,看看装好之后怎么样?

这里一步一步排查就可以,如果官网的游戏能安装,且能正常运行的话,就说明是我们 bin 文件有问题。

尝试了官网的游戏果然可以。

那我们已经断定就是 bin 文件有问题

直接把官网的写入日志复制下来全部丢给 AI,让它帮你分析。

结果它说我们没有按照要求上传 bin 文件,理论上来讲要上传三个,但是我只上传了一个

那直接重新上传就可以。

上传好之后,重启牌子,我们可以看到下面的界面

这里,我们来到了 FoloToy 初始的页面,这些功能我们没写啊,它们是哪来的?

其实就是仓库里的。

我们可以获取设备的电量信息,可以记时,可以查看按钮的状态等等

右下角的 calendar 就是我们刚刚写好上传上来的,但是点击的时候:

怎么没反应?

这里大家第一时间想到的肯定是看日志。

那这个日志从哪来?

idf 这个工具早就想到你会问这个问题了

它们直接内置了一个叫 monitor 的模块,启动这个进程之后,你就可以看到详细的日志

代码语言:javascript
复制
idf.py monitor

你点击 calendar 这个按钮的时候,把后台的输出全部复制下来给AI,让它根据问题去改

反复对话了三四轮吧,它最终修复了这个问题。

再次打包之后上传,发现终于可以使用了,但是这样式有点丑啊

那就再让它改

改了几次之后看着还可以

但是有一个问题,这个背景图能不能换呢?

当然可以!

但是我们不能上传图片格式的文件

需要把它转换成 LVGL 格式的文件,相当于是数组,官方的代码仓库中也明确写了只支持这种

而且,图片的大小也最好是 240*320 px 的,因为就那么大点屏幕,我们总归要在分辨率和尺寸之间取其一的。

代码语言:javascript
复制
https://www.photopea.com/

上面这个是替换图片尺寸的

代码语言:javascript
复制
https://lvgl.io/tools/imageconverter

这个是转换图片格式的。

转换好之后,我们将生成的.c文件放到项目目录下

这里需要注意,文件的名称不能有中文。

修改好之后,直接让AI把背景图替换了就行

给大家看一下最后的效果

是不是感觉还不错。

最后,还有一个小小的知识

这块板子它其实是支持音频的,但是你要上传的格式必须是 RTTTL 格式的

上传好之后就会播放这段音频

那什么是RTTTL格式的乐谱呢,每一个参数又代表什么意思?

代码语言:javascript
复制
RTTTL 是一种用纯文本格式存储简单旋律的规范,全称是 Ring Tone Text Transfer Language(铃声文本传输语言)。它最早由诺基亚开发用于传输手机铃声,但因为格式简单、体积小巧,非常适合在嵌入式设备上驱动蜂鸣器播放音乐

下面就是一段乐谱

代码语言:javascript
复制
fifth: d=4,o=5,b=125: 8g5, 2c7, 1b7, 8f.6, d

第一部分是名字,就是为了方便识别乐谱的,最长不能超过10个字符

第二部分是默认参数

第三部分,也是最关键的一部分,指的是音符的序列

这块板子现在具有的能力大概有以下几个:

代码语言:javascript
复制
1、240x320 屏幕
2、UP / DOWN / OK 三个实体按键
3、音频播放 + 录音
4、电池电量读取
5、内部 Flash / NVS 可做掉电保存
6、ESP32-C3,无 PSRAM
7、当前仓库里 没有现成 RTC / Wi‑Fi / 触摸 / 文件系统能力封装

基于上述模块,你还可以实现下面的一些小功能:

代码语言:javascript
复制
1、倒计时 / 番茄钟
三键非常合适
可加提示音
可记住上次时长
这是这块板子最顺手的应用之一
2、习惯打卡 / 每日签到
用 NVS 保存记录
屏幕展示日历或连续打卡天数
三键切换日期、确认打卡
3、待办清单 / 今日计划
每页显示 3-5 条
UP/DOWN 切换,
OK 完成
非常适合小屏和三键
4、离线课程表 / 日程提醒
用固定时间块或简单日期模型
展示今天/本周安排
不依赖联网也能很好用
5、记分牌 / 计数器
比如双人计分、习惯计数、库存计数
界面简单,操作直接
很适合三键设备
6、录音便签 / 语音卡片
录一小段语音,回放
每条便签用标题 + 时长
但要注意 Flash 空间和录音缓存

而且你只需要告诉AI你想要做一个怎样的工具,并且把四个按键的逻辑简单的描述一下就可以。

好啦,本期文章就到这里了,感谢大家的阅读,我们下期再见~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档