墨抒颖注:这玩意其实买错显示屏了,廉价显示屏性能极其有限,用孱弱的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。这块屏只能全刷,这个得先认了。
试过用 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 自己联网自更新撞的内存墙。