<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Esp32 on 飘逝的风</title><link>https://gameapp.club/tags/esp32/</link><description>Recent content in Esp32 on 飘逝的风</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Tue, 30 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://gameapp.club/tags/esp32/index.xml" rel="self" type="application/rss+xml"/><item><title>留住记忆：电子墨水相册折腾记</title><link>https://gameapp.club/post/2026-06-30-eink-photopainter/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate><guid>https://gameapp.club/post/2026-06-30-eink-photopainter/</guid><description>&lt;img src="https://gameapp.club/" alt="Featured image of post 留住记忆：电子墨水相册折腾记" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;我们拍了很多照片，往往它最高光的时刻就是按下快门的那一瞬间，此后便长眠于我们的手机或相机存储卡中。iPhone 的推荐时常给我惊喜和感动，把我尘封的记忆扰动，可是我们是否可以“让美好持续发生”？&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="初衷我就是想要"&gt;初衷：我就是想要
&lt;/h2&gt;&lt;p&gt;如我博客的副标题：那些岁月，如果不记录，就像风一样飘逝了，然后了无痕迹，仿佛未曾发生。&lt;/p&gt;
&lt;p&gt;我一直有个比较“强迫”的习惯，记录一些瞬间——不管未来用不用得上。这是我从大学到毕业不停买相机的原因，老实说拍照理论学了一通，但摄影水平有限。所幸生活并不全是艺术，真实的瞬间便足够回味。于是手机相册常常满满的，iCloud 得开通 2TB 会员才能容纳。&lt;/p&gt;
&lt;p&gt;我也时常分享一些有趣或有意义的照片给家人，当有了娃后，特别是当父母不在身边时，他们只能从我零星发的照片里看到孙辈，我在想我或许需要灵活的相册，我也不用那么主动和刻意的分享，有一个相册他们随时可以看到。你或许会说，这不是群相册、QQ 相册之流就可以解决的吗？遗憾的是老人上了年纪较难主动获取这些信息了，有了门槛效果就没有多大意义了。&lt;/p&gt;
&lt;p&gt;原本我还在想如何解决此问题，直到某天在 B 站看到 &lt;a class="link" href="https://www.bilibili.com/video/BV1KczbBXEeC" target="_blank" rel="noopener"
 &gt;老戴Donald 的这个视频&lt;/a&gt;。我毫不犹豫的下单了。&lt;/p&gt;
&lt;h2 id="硬件成品它不香"&gt;硬件：成品它不香
&lt;/h2&gt;&lt;p&gt;起初我打算买零散部件自己在家焊，再次锻炼一下金工能力，但挑选再三发现各个部件的组装成本远高于直接买成品硬件，于是就直接在微雪下单了一款。钱的差额是小事，主要担心缺少个别部件到时反复折腾等待快递就破坏了美妙的心情，当时时间还是五一放假前夕（没错，又拖更了很久），于是果断先成品折腾。
它是 ESP32-S3 7.3寸 E6 全彩色电子墨水屏，看画面显示效果还不错，诸位别被骗了，放大了看，颗粒度还是清晰的，毕竟 PPI 摆在那里。&lt;/p&gt;
&lt;p&gt;&lt;img alt="硬件成品" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/2026/06/eink-esp32.webp"&gt;&lt;/p&gt;
&lt;p&gt;当然我不是来带货的，直接买了成品降低了我折腾的乐趣，硬件咱就没得玩了。下单后第二天就到了，看了一下发货地深圳，果然，深圳速度～&lt;/p&gt;
&lt;h2 id="软件私人化定制"&gt;软件：私人化定制
&lt;/h2&gt;&lt;p&gt;收到货物后，官方给的固件集成了几个模式，还带了小智对话模式，我之前也折腾过小智机器人（见&lt;a class="link" href="https://gameapp.club/post/2025-05-04-xiaozhi-ai-bot/" target="_blank" rel="noopener"
 &gt;让你的小智AI机器人起飞&lt;/a&gt;），有种莫名的熟悉感。 但是带的相册功能和上面老戴的那种 Feel 就差一大截了，仅有图片轮播等基础玩法，既不文艺也不艺术。这一点都不慌，啥年代了，不就是写一些驱动、编译固件、刷机嘛？&lt;/p&gt;
&lt;h3 id="改造一迁移-inktime"&gt;改造一：迁移 InkTime
&lt;/h3&gt;&lt;p&gt;人家已经开源了&lt;a class="link" href="https://github.com/dai-hongtao/InkTime" target="_blank" rel="noopener"
 &gt;InkTime&lt;/a&gt;，让 AI “借鉴”一下是很快的。我先在原固件上添加了一个新模式，将 InkTime 的代码集成进去。老戴的模式中特别亮点的就是 AI 根据图片的内容评分和打标签，而我是不想将大量图片做贡献给云端大厂们作训练素材的。“众所周知”，我有一台 Mac Mini M4，这正是它发挥的时候。用 LMStudio 再召唤 qwen3.5 9B，效果已经不错了。虽然说处理一张图片大概要 50-90 秒，但这个设备功耗极低，又保障了隐私，咱们就忍着点，图不出户才是最重要的：）
&lt;img alt="LMStudio" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/2026/06/lmstudio-qwen3.5-9b.webp"&gt;
迁移完可以用了，测试了一下效果，图片筛选和文案看了后表示满意：
&lt;img alt="InkTime 效果" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/2026/06/eink-example.webp"&gt;&lt;/p&gt;
&lt;p&gt;不过原来的架构是这样的：
&lt;img alt="InkTime原架构" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/2026/06/inktime-arch.webp"&gt;&lt;/p&gt;
&lt;p&gt;这里有一个比较严重的问题，server 需要绑定在 NAS 侧获取图片再渲染，这样就不方便我们将电子相框带到外面去时也可以查看图片。所以我们需要调整架构，使图片处理在内网，图片分享拉取在外网：
&lt;img alt="云端一体架构" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/2026/06/eink-cloudpull-mode.webp"&gt;&lt;/p&gt;
&lt;p&gt;当然我们的服务在拉取图片时需要支持身份认证，这里我让服务返回了 COS 的预签名链接，使相框固件拿到链接后便可直接安全拉取，保护隐私。&lt;/p&gt;
&lt;h3 id="改造二支持-iphone-相册追踪"&gt;改造二：支持 iPhone 相册追踪
&lt;/h3&gt;&lt;p&gt;原项目中假定了我们 NAS 中的图片都需要分享和唤起，它负责可以扫描某个目录进行处理。而我还有一个场景就是最近发生的事情（照片），隔几天会冒出来让你回忆下。我希望我可以将某些有意义的照片放到可被追踪的相簿中，我家人也可以随时分享它觉得有意义的照片，当满足一定条件，它会自动出现在相框中。这显然是 iPhone 共享相簿擅长的场景，怎么整合进来呢？&lt;/p&gt;
&lt;p&gt;“众所周知”（你现在应该知道了），我有一台 Mac Mini M4。我找到一个开源软件，用 &lt;code&gt;osxphotos&lt;/code&gt; 将 macOS 照片 app 中的 iCloud 共享相簿导出到本地目录，再通过 rsync 同步到我们的图片处理服务中（调用 VLM 识图及筛选），这个功能我是放在 NAS 上的。为了能够比较及时的感知到相簿的变化，可通过 launchd 定时后台同步。&lt;/p&gt;
&lt;p&gt;然后我们的图片处理服务负责监听目录下的文件变化，有新文件过来就会交给VLM进一步处理。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;这些工具我都设计为一个个小仓库，方便后续的维护和扩展。本来想整理一下放 GitHub 的，但现在 AI 时代，如果你要折腾也很容易搞定，有需要的朋友欢迎给我留言。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="改造三丰富-ai-生图"&gt;改造三：丰富 AI 生图
&lt;/h3&gt;&lt;p&gt;我家娃年幼无知，沉迷奥特曼打怪兽，所以给小智扩展了一下，让它对接国内几个图像生成和编辑的模型，这里我先选择火山引擎豆包的模型(seedream 5.0/4.5)，因为免费额度比较高，而且效果也不错，最重要的是速度还比较快。于是我在娃面前说，帮我生成迪迦在大海中对战一个章鱼怪兽，在一小会等待之后，屏幕忽闪忽闪刷新后，一张让娃兴奋的图片出现了。
&lt;img alt="小智语音绘图" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/2026/06/xiaozhi-draw.webp"&gt;&lt;/p&gt;
&lt;p&gt;因为支持了编辑能力，我们还可以让它继续修改，在小智 AI 的帮助下，娃也可以自己通过描述来定制自己想要的图片了。我看着他好奇又开心的样子，或许科技本该让人如此愉悦。&lt;/p&gt;
&lt;h2 id="思考ai-擅长做你自己才是大脑"&gt;思考：AI 擅长做，你自己才是大脑
&lt;/h2&gt;&lt;p&gt;在当前阶段，AI去实现功能已经很快捷了，并且基本你只要描述清楚了，做出来返工都比较少。这并不意味着你就废了，以这个项目为例，有几点可以值得聊聊的。&lt;/p&gt;
&lt;h3 id="云控"&gt;云控
&lt;/h3&gt;&lt;p&gt;原来固件中有一些配置，它是放在 SD 卡中再加载的，这样不方便调整。在几次拆卡读卡后，我便难以忍受了。我把配置重新梳理了一下，让 SD 卡中只有最基本的配置，只要达到联网能力和找到我们的 API 即可，其它都通过网络拉取。同时为了减少 SD 卡的读取，WiFi 等 SSID 信息我们直接保存到 ESP32 的 NVS 中。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;wifi_ssid&amp;#34;: &amp;#34;wifi1;wifi2&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;wifi_password&amp;#34;: &amp;#34;password1;password2&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;wifi_override&amp;#34;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;publish_service_url&amp;#34;: &amp;#34;https://example.com&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;publish_device_id&amp;#34;: &amp;#34;device-001&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;publish_token&amp;#34;: &amp;#34;token-001&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不过这样运行中当前到底跑的是什么配置，最新配置是否生效了呢？我们不妨来下个调试界面：
&lt;img alt="调试界面" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/2026/06/debug-ui.webp"&gt;&lt;/p&gt;
&lt;h3 id="通用图片展示框"&gt;通用图片展示框
&lt;/h3&gt;&lt;p&gt;既然我们已经在云端进行渲染和图片管理，有这样一套统一的管理和展示逻辑，那么也不再局限于只展示我们特定照片了。有云端 API 后，我让 AI 将其创建了一个skill，然后我们可以随时将要展示的信息让各个 Agent 可以调用在它上面呈现。&lt;/p&gt;
&lt;p&gt;我想最近关注 Token 消耗比较多，到底订阅的套餐被我们薅了多少本回来呢？
&lt;img alt="Token周消耗监控" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/2026/06/token-weekly.webp"&gt;&lt;/p&gt;
&lt;p&gt;当每天早上醒来时，看到你的 Token 用量，是不是又有冲动继续折腾 AI 了呢？
&lt;img alt="电子相框上的Token监控" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/2026/06/eink-token-usage.webp"&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;这个 Token 统计支持多机汇总，使用了开源方案 openusage。当时看界面不错，支持的 Agent 比较多，于是给它扩展了一下多机汇总的 Hub 功能，作者很给力也很认真 Review &lt;a class="link" href="https://github.com/janekbaraniewski/openusage/pull/139" target="_blank" rel="noopener"
 &gt;PR&lt;/a&gt;，已经合入了。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="后记"&gt;后记
&lt;/h2&gt;&lt;p&gt;当然还有不少折腾的细节，限于篇幅不再展开了。这个项目当前比较稳定运行，一个相框静静放在那里，时不时有一些小惊喜。我在想是放在每天出入的门口，家庭的温馨程度能否+1。&lt;/p&gt;
&lt;p&gt;但从技术上，还是有些遗憾：涉及部分硬件的事情，时常要烧录固件再测试，为了降低调试成本，除了给项目的核心功能添加完善的测试用例外，我尝试在本地搭建一个模拟器，希望打通全流程这样 AI 可以自闭环。遗憾的是因为过往经验较少，加上这里的电路等还没研究清楚，这个想法最终没有成功。&lt;/p&gt;
&lt;p&gt;如果你有更好的点子，欢迎留言交流。如果你懂上面的硬件模拟，欢迎指导我一下，谢谢。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;我是个爱折腾技术的工程师，也乐于分享。欢迎点赞、关注、分享，更欢迎一起探讨技术问题，共同学习，共同进步。为了获得更及时的文章推送，欢迎关注我的公众号：爱折腾的风&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="扫码关注公众号" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://img.gameapp.club/images/qrcode_weixin.jpg"&gt;&lt;/p&gt;</description></item></channel></rss>