改装米家1代屏幕挂灯,接入HomeKit

前言

我住的屋子床头没有插座也没有控制房间顶灯的开关,假如熄灯睡觉的话会让房间陷入一片漆黑.
所以很长一段时间里我都把米家屏幕挂灯的控制器放在床头,用于临时照明.

这就引发了另外一个问题,每次回家开电脑打开屏幕挂灯,我都得走到床头找到控制器开启屏幕挂灯.
在经历了多次麻烦后,我决定把这个屏幕挂灯接入HomeKit. 这样就可以用语音或者手机控制了.

资料搜集

在阅读了这篇拆解报告:MJ米家显示器挂灯MJGJD01YL后, 需要做的工作就很明确了.
大致分为以下几个步骤

  • 阅读手册,找到控制引脚
  • 拆除芯片,替换成ESP32
  • 编写代码,接入HomeKit
阅读更多

声明式 UI 架构下的生命周期演进:从内建属性到显式订阅

消失的“实体”: 从View到Composable/Widget

在原生Android开发的世界, 创建模版项目后就会得到一个MainActivity和activity_main.xml.
我们习惯了在MainActivity里去绑定ButtonText再设置各种属性. 他们都是内存中看得见,摸得着的View.
但是到了Flutter中, 得到的了却是main()函数和一堆StatelessWidgetStatefulWidget.
不仅仅是Flutter, 连Jetpack Compose也在向这种’声明式UI’靠拢.
Compose中同样找不到onResume(入口Activity除外),取而代之的而是层层嵌套的Composable函数

这种转变本质上是:我们不再持有 UI 的“句柄”,我们只持有“数据”。

正因为我们持有的只是数据,而数据本身是没有‘前后台’概念的(一个 String 字符串哪里知道自己是否在前台?)。所以,在声明式 UI 中寻找 onResume 本身就是一个伪命题。
只有当数据需要根据系统状态(如用户回来了)进行刷新时,我们才去主动询问系统。

生命周期演进图

阅读更多

联想拯救者 R720 键盘矩阵逆向

联想拯救者R720 键盘矩阵逆向

朋友托我帮他的R720笔记本改装成KVM.于是便有了此文.

键盘介绍

主流键盘基本上都是矩阵键盘.这种方式比较节省IO.这块R720也不例外.
R720的键盘一共有96个键,用矩阵键盘的方式,理论上需要(6+16=22)个IO.(其实还是挺多的)
为了避免鬼键,实际的接线比理想情况下复杂.
而且相较于很多DIY机械键盘的直来直去线路:
接线图
R720这块键盘的内部Wiring就显得很乱了:
R720
刚测出结果的时候,总感觉自己一定是弄错了什么地方.直到后来搜到了一款名叫Framework Laptop的笔记本,有着类似的KeyMap才放下心来.

阅读更多

ESP32 进阶开发杂谈:从异步请求、动图显示到资源OTA

前言

很多时候,我们从零开始构建一个ESP32项目,往往会掉进各种各样的“坑”里。

在之前的一些项目中(比如做个桌面像素小屏幕吧),我遇到过各种各样的问题:网络请求卡死主线程、屏幕显示太单调、休眠时PWM停转、以及每次只更新几张图片却要重刷整个固件的痛苦。

把这些坑踩平之后,我整理了四个在ESP32开发中非常实用的技巧。为了避免大家重蹈覆辙,也为了方便我自己日后查阅(Copy),这篇文章将把这些技术点汇总起来。

希望能给正在折腾ESP32的你提供一些灵感。

阅读更多

ESP32-C3 PlatformIO 'embed_txtfiles' 修复

前言

9.9元入手了一块ESP32-C3板子, 用来取代手上引脚不足的ESP8266.
但是编译时候总是失败,从Log上看是这一步出了错误.

1
2
3
4
5
prepare_file([".pio\build\esp32c3\lite.ttf.txt.o"], ["src\lite.ttf"])
Converting .pio\build\esp32c3\lite.ttf.txt.o
'xtensa-esp32-elf-objcopy' \xb2\xbb\xca\xc7\xc4ڲ\xbf\xbb\xf2\xcdⲿ\xc3\xfc\xc1Ҳ\xb2\xbb\xcaǿ\xc9\xd4\xcb\xd0еij\xcc\xd0\xf2
\xbb\xf2\xc5\xfa\xb4\xa6\xc0\xed\xceļ\xfe\xa1\xa3
*** [.pio\build\esp32c3\lite.ttf.txt.o] Error 1

此外并没有任何提示了.

阅读更多

ESP32并口屏幕和串口屏幕下帧率的对比

前言

在嵌入式开发中,屏幕刷新率是用户体验的“第一生命线”。我一直好奇,为了追求高帧率,我们是应该把 60MHz 的 SPI“优化到极致”,还是应该直接“升维打击”,采用 8 位并口?为了搞清楚这个问题,我决定自费购买硬件来进行一次“原始对决”

阅读更多

在LVGL中实现可变字体(Variable Font)-第三章

前言

(2025年11月 重制版说明):
这篇文章的初版我曾发布于第三方平台(简书+Bilibili),并累计获得了50,000+ 次阅读 和大量开发者的反馈。
为了提供更好的阅读体验,我对文章排版和部分内容进行了优化,并将其独家发布在此个人博客

第二章中介绍了如何在ESP32上运行LVGL,现在终于可以开始奔着第一章文章末尾的效果去了.

阅读更多

在LVGL中实现可变字体(Variable Font)-第二章

前言

(2025年11月 重制版说明):
这篇文章的初版我曾发布于第三方平台(简书+Bilibili),并累计获得了50,000+ 次阅读 和大量开发者的反馈。
为了提供更好的阅读体验,我对文章排版和部分内容进行了优化,并将其独家发布在此个人博客

我们在第一章中已经实现了模拟器环境下可变字体字重的设置.

是时候掏出你吃灰已久的ESP32了.

本文会使用PlatformIO创建一个全新的项目,直到显示出现上篇文章末尾的动图为止.
如遇到问题,可参考常见问题内解答.

阅读更多

在LVGL中实现可变字体(Variable Font)-第一章

前言

(2025年11月 重制版说明):
这篇文章的初版我曾发布于第三方平台(简书+Bilibili),并累计获得了50,000+ 次阅读 和大量开发者的反馈。
为了提供更好的阅读体验,我对文章排版和部分内容进行了优化,并将其独家发布在此个人博客

不知道多久前看到了MIUI更新了”动态字体系统“功能,不过当时没太在意(毕竟我用的也不是MIUI,哈哈哈,不过确实挺方便的),演示视频里面展示了随意调节字体粗细的功能,后来知道这个参数叫做字重(zhong第四声).

阅读更多

复刻 Stack Overflow 愚人节“神作”:3 键机械键盘实战指南

背景

2021 年愚人节,Stack Overflow 搞了一个非常有意思的彩蛋:限制用户的复制次数,并“推销”了一款只有三个键的定制键盘。

这个小巧精致的键盘激发了我的创作欲。思考了一下,实现逻辑其实非常简单,基本上把我之前做的“原神自动弹琴装置”稍加修改即可,核心代码甚至在百行以内。
键盘 by StackOverflow

随后我打开 KiCad 直接开干,从原理图到 3D 渲染一气呵成。

阅读更多

让你的ESP32显示一张公网图片吧

让你的ESP32显示一张公网图片吧

这篇文章写于 4 年前,但其核心原理(手动解析 HTTP 报文)在今天依然完全有效。请注意,AsyncTCP-esphome 库现在可能已有更新版本,但本教程中关于‘onData’分块处理和‘Content-Length’解析的逻辑,是您理解嵌入式网络编程的基础。

众所周知,ESP32它是能联网的,而配上屏幕,它就可以显示一张图片,那么它可以显示一张互联网上的图片吗?当然可以!
虽然之前已经做过了视频的传输,而视频不过是很多图片的集合,但是那篇文章中的传输都是建立在局域网之中,通信建立在Socket上。
而这次要突破局域网,使用HTTP协议来传输数据,所以会比之前复杂一些。

阅读更多

ESP32-串流显示

让你的ESP32试试串流吧

(2025 年 11 月更新)这篇文章写于 5 年前,但它至今仍是我流量最高的文章之一。
它所展示的‘PC 到 ESP32 实时串流’的核心原理——即‘Python 抓帧/编码’ + ‘自定义 TCP 协议’ + ‘ESP32 解码/DMA 渲染’——这个架构在今天依然极具参考价值。

header-preview
既然有了屏幕,又有了网络,那岂不是可以串流了!

阅读更多