推荐

百炼AI笔记 · 人工智能训练师考证

报考条件自测、人社备案评价机构、报名流程、技能提升补贴与上海居住证积分,一条路径看清。

站内搜索

输入关键词搜索文章、标签和短笔记。

↑↓ 选择 · Enter 打开 · Esc 关闭 · Ctrl/⌘ + K 随时搜索

ESP32 墨水屏金价牌(上):从点亮到把图片推过去


ESP32 墨水屏金价牌(下):仅靠 ESP32 自更新撞上的坑

墨抒颖注:这玩意其实买错显示屏了,廉价显示屏性能极其有限,用孱弱的ESP32也会多出来延时,想要做秒级的实时的,整个链路都得经得住才行。不过作为第一次的练手来说,到手不到一个小时弄好,已经比上学的时候快的惊人了,那会东西都要自己焊,一个大课才出这么个东西。现在直接买成品,装上驱动,AI处理报错,想好自己要什么然后直接告诉AI,验收即可。但是遇到一些比较难的问题,还是得看代码,深入进去才行。实际上第二天我就遇到了。

这块金价牌最后能稳定跑的方案,是 PC 抓数据、PIL 渲染成图,串口推给 ESP32,ESP32 只负责把图贴上。说白了 ESP32 就是个带串口的显示器。

这篇写从零点亮到能把图推过去这条路。ESP32 自己联网自更新那条路撞了内存墙,放下篇。

一、串口 & 硬件层

第一步先让电脑跟 ESP32 说上话,坑基本都在 Windows 串口这一套上。

# 坑 根因 解法
1 serial-mcp 连不上 MCP server CONNECTION_CLOSED,进程挂了 不依赖它,用 PowerShell / curl 直接探 COM 口
2 不知道 COM3 是不是 ESP32 需要先确认设备 Get-PnpDevice 查到 CH340(VID 1A86 / PID 7523)
3 打开 COM3 就把 ESP32 复位了 DTR/RTS 自动复位电路 脚本不能固定 sleep,要等 READY 握手
4 拒绝访问 打不开 COM3 Windows 串口独占 关掉串口监视器 / 其它占端口的程序
5 发的图丢了、屏幕白屏 setup 里清屏要 10~20s,期间不读串口 → 缓冲区溢出 setup 里不清屏,快速打印 READY

#3 和 #5 其实是同一个道理:硬件时序别猜,等信号。打开串口会触发 DTR/RTS 复位,所以上电后先等 ESP32 打出 READY 再发数据;setup 里也别干清屏这种要十几秒的活,不然串口缓冲区在它忙的时候就被灌爆了,图全丢。

二、GxEPD2 屏幕驱动

驱动用的 GxEPD2。这块屏只能全刷,这个得先认了。

试过用 nextPageBW 做局部快刷、想把秒级跳动刷出来,结果踩了索引 bug 加波形反转两个坑,整屏直接搞黑。所以秒级刷新别想了。金价本来就是分钟级变化,全刷够用。

三、数据源层(最大的坑区)

屏幕能亮了,接下来要数据。金价数据源是东方财富加新浪。这层坑最多,而且大多不在代码里,在环境上。

# 坑 根因 解法
7 CRYPT_E_REVOCATION_OFFLINE Windows schannel 撤销服务器离线 curl 加 --ssl-no-revoke
8 TLS 指纹:requests 被拒、curl 能通 东财风控按 TLS 指纹放行 curl、拦 Python urllib3(同 URL 同时刻 A/B 实测) 抓数全用 curl subprocess
9 东财 push2his(K线)被重置 该主机被风控 改用 push2(分时 trends2)+ 新浪日线
10 新浪日线返回完整历史 AU0 ~512KB、GC ~382KB(2008/2016 至今) PC 端无所谓;ESP32 会 OOM(见下篇)
11 matplotlib 崩 用 numpy 1.x 编译、环境是 numpy 2.0 弃 matplotlib,改用 PIL 画图(反而更可控)
12 中文渲染 PIL 需中文字体 用微软雅黑 msyh.ttc

#8 最要命。同一个 URL、同一时刻,curl 通、requests 被拒,对方风控是认 TLS 握手指纹的。Python 的 urllib3 指纹太标准,一眼就认出来。所以抓数据这条链路我全改成 subprocess 调 curl,不在 Python 里发 HTTP。

#11 算是意外:matplotlib 因为 numpy 版本对不上崩了,我干脆弃掉,直接用 PIL 画。反而更顺手,墨水屏就四级灰度,PIL 画像素直接得多。

四、显示效果 & 交互

图能推上去了,剩下就是让它看着像那么回事。

# 坑 根因 解法
13 WiFi 图标先是一堆圆环 drawCircle 画的是完整圆 手写弧线
14 又变成半圆 弧画了 180° 收到 120°(θ 210°~330°)才是 WiFi 扇形
15 灰度被误判成黑 rgb_to_planes 亮度计算 int16 溢出(255×587 超 int16 上限) 亮度改用 int32 计算

WiFi 图标这段挺逗的。先拿 drawCircle 画,出来一堆同心圆环;改成弧线,又成了半圆。最后才搞清楚,WiFi 那三根扇弧只占 120 度,从 210 到 330。#15 是 int16 溢出,255 乘 587 已经超了 int16 上限 32767,亮度全判成黑,换 int32 就好。

到这里

串口稳了、数据抓得动、图渲染对了、屏能全刷,这块牌子就能当串口显示器用了。PC 定时抓数渲染推图,后来 PC 侧还加了个托盘查看器,那是另一个话题。下一篇写 ESP32 自己联网自更新撞的内存墙。

最终效果

首次点亮成果

ESP32 墨水屏金价牌(上):从点亮到把图片推过去

推送图片成果

ESP32 墨水屏金价牌(上):从点亮到把图片推过去 配图 2

ESP32 墨水屏金价牌(下):仅靠 ESP32 自更新撞上的坑