在 M5Stack Cardputer 上实现远程桌面串流(基于 H.264)
几年前,我曾试过在 ESP32 上实现串流操作。
当时硬件搭建在面包板上,一快 1.14 寸的屏幕分辨率为 240x135,主控是初代 ESP32。
文章较为详细地描述了实现细节。
时隔五年,我决定重新制作一次,将硬件环境迁移到 M5Stack 家的 Cardputer。

几年前,我曾试过在 ESP32 上实现串流操作。
当时硬件搭建在面包板上,一快 1.14 寸的屏幕分辨率为 240x135,主控是初代 ESP32。
文章较为详细地描述了实现细节。
时隔五年,我决定重新制作一次,将硬件环境迁移到 M5Stack 家的 Cardputer。

最近在翻看 GSC (Google Search Console) 的搜索关键词时,发现 esp-idf embed-txtfiles 这个词的出现频率高得惊人。看来大家在搞 ESP32 开发的时候,都被“如何在固件里优雅地放一个文件”这个问题困扰过。
在此之前,我为了实现一些功能(比如之前的那个桌面像素小屏幕),曾傻乎乎地把图片全转成了巨大的 C 数组(.h 文件)。结果可想而知:代码文件膨胀到几万行,IDE 索引卡死,每次微调一个像素都要重新编译半天,简直是灾难。
不管是 HTTPS 的根证书、前端 HTML 页面,还是简单的配置文件,如果全都写成巨大的 const char[] 硬编码到代码里,那工程维护简直是自我折磨。今天就拿着我那块斥 9.9 元巨资买回来的 ESP32-C3 演示一下如何用 ESP-IDF 里的这个黑科技优雅地填坑。

在上一篇文章中,我们在浏览器中通过 JavaScript 模拟了各种抖动算法的视觉效果。虽然原理通透了,但真正的挑战在于硬件端:如何在资源受限的嵌入式设备上复现这些效果?
本文将记录我基于 ESP32-S3 和一块 1.54 寸 ST7305 单色屏的实战过程,探讨如何在单片机上实现从基础的阈值法到复杂的误差扩散等多种图像处理算法。
在之前的文章中,我们都是利用ESP32自带的WiFi进行网络连接。但在户外或者没有WiFi覆盖的角落,想要让设备联网,就得请出“4G模块”了。

通常大家驱动4G模块(比如SIM800, Air724, EC20等)最原始的方法是用UART发送AT指令。
比如 AT+HTTPINIT、AT+HTTPPARA… 这种方式不仅繁琐,而且解析返回字符串简直是噩梦,写出来的代码全是状态机,一旦模块吐点乱码,程序直接暴毙。手动解析AT指令简直是坏文明!
为了优雅地使用4G模块,我决定使用 PPPoS(Point-to-Point Protocol over Serial)。
简单来说,就是把串口“伪装”成一个网卡。这样底层的TCP/IP协议栈(LwIP)就能直接接管网络,我们写上层代码时,完全不用关心是在用WiFi还是4G,直接调标准的Socket接口就完事了。

我住的屋子床头没有插座也没有控制房间顶灯的开关,假如熄灯睡觉的话会让房间陷入一片漆黑.
所以很长一段时间里我都把米家屏幕挂灯的控制器放在床头,用于临时照明.
这就引发了另外一个问题,每次回家开电脑打开屏幕挂灯,我都得走到床头找到控制器开启屏幕挂灯.
在经历了多次麻烦后,我决定把这个屏幕挂灯接入HomeKit. 这样就可以用语音或者手机控制了.
在阅读了这篇拆解报告:MJ米家显示器挂灯MJGJD01YL后, 需要做的工作就很明确了.
大致分为以下几个步骤
很多时候,我们从零开始构建一个ESP32项目,往往会掉进各种各样的“坑”里。
在之前的一些项目中(比如做个桌面像素小屏幕吧),我遇到过各种各样的问题:网络请求卡死主线程、屏幕显示太单调、休眠时PWM停转、以及每次只更新几张图片却要重刷整个固件的痛苦。
把这些坑踩平之后,我整理了四个在ESP32开发中非常实用的技巧。为了避免大家重蹈覆辙,也为了方便我自己日后查阅(Copy),这篇文章将把这些技术点汇总起来。
希望能给正在折腾ESP32的你提供一些灵感。
9.9元入手了一块ESP32-C3板子, 用来取代手上引脚不足的ESP8266.
但是编译时候总是失败,从Log上看是这一步出了错误.
1 | prepare_file([".pio\build\esp32c3\lite.ttf.txt.o"], ["src\lite.ttf"]) |
此外并没有任何提示了.