Chaosgoo | ESP32, IoT & Hardware DIY Blog

这是一个个人维护的技术博客,主要分享和记录 ESP32、嵌入式系统以及硬件 DIY 相关的原创项目与学习笔记。

序言:坚持原创硬件实战与嵌入式开发的初心

为什么会有 Chaosgoo 技术博客?

在信息碎片化、AI 生成内容泛滥的时代,深度、硬核且具有真实开发温度的技术笔记变得愈发珍贵。作为一名沉浸在嵌入式开发与硬件 DIY 领域的独立开发者,我深知从零到一构建一个硬件项目的艰辛。

Chaosgoo 的诞生,并非为了追求流量,而是为了给自己的折腾历程留下一份纯净、严谨且可追溯的技术档案。

阅读更多

在 M5Stack Cardputer 上实现远程桌面串流(基于 H.264)

This article is also available in the following language: English.
背景

几年前,我曾试过在 ESP32 上实现串流操作
当时硬件搭建在面包板上,一快 1.14 寸的屏幕分辨率为 240x135,主控是初代 ESP32。
文章较为详细地描述了实现细节。

时隔五年,我决定重新制作一次,将硬件环境迁移到 M5Stack 家的 Cardputer。

M5Stack Cardputer H264 Streaming

阅读更多
Android 进阶:如何在安卓中实现像 LVGL 一样的"实体"Border?

Android 进阶:如何在安卓中实现像 LVGL 一样的"实体"Border?

做嵌入式的时候用过 LVGL,它的样式系统给我留下了深刻印象。LVGL 的 Border 是”实体”的——会占据布局空间,把内容往里挤。

安卓这边就没这么痛快了。ShapeDrawableMaterialCardView 的边框更像是”装饰品”,想让边框、圆角、内边距各自独立可控?原生组件做起来挺别扭。

所以我干脆手搓了一个 BorderFrameLayout,把 LVGL 那套逻辑搬过来。
BorderFrameLayout层级示意图
图中不同的颜色代表真实占用的空间。
绿色代表Border, 红色代表内部Padding, 蓝色代表Child可使用空间.

阅读更多

ESP-IDF 插件:用 embed_txtfiles 优雅地在固件里“塞”文件

0x00 背景

最近在翻看 GSC (Google Search Console) 的搜索关键词时,发现 esp-idf embed-txtfiles 这个词的出现频率高得惊人。看来大家在搞 ESP32 开发的时候,都被“如何在固件里优雅地放一个文件”这个问题困扰过。

在此之前,我为了实现一些功能(比如之前的那个桌面像素小屏幕),曾傻乎乎地把图片全转成了巨大的 C 数组(.h 文件)。结果可想而知:代码文件膨胀到几万行,IDE 索引卡死,每次微调一个像素都要重新编译半天,简直是灾难

不管是 HTTPS 的根证书、前端 HTML 页面,还是简单的配置文件,如果全都写成巨大的 const char[] 硬编码到代码里,那工程维护简直是自我折磨。今天就拿着我那块斥 9.9 元巨资买回来的 ESP32-C3 演示一下如何用 ESP-IDF 里的这个黑科技优雅地填坑

embed_textfiles

阅读更多
屏幕不够,算法来凑(二):ESP32 单色屏上的 Ditherpunk 实战

屏幕不够,算法来凑(二):ESP32 单色屏上的 Ditherpunk 实战

0x00 序

上一篇文章中,我们在浏览器中通过 JavaScript 模拟了各种抖动算法的视觉效果。虽然原理通透了,但真正的挑战在于硬件端:如何在资源受限的嵌入式设备上复现这些效果?

本文将记录我基于 ESP32-S3 和一块 1.54 寸 ST7305 单色屏的实战过程,探讨如何在单片机上实现从基础的阈值法到复杂的误差扩散等多种图像处理算法。

阅读更多
屏幕不够,算法来凑(一):Ditherpunk 抖动算法原理与 JS 实时演示

屏幕不够,算法来凑(一):Ditherpunk 抖动算法原理与 JS 实时演示

背景

在嵌入式开发领域,我们经常会遇到色彩位数极低的显示设备:

  • 经典的 SSD1306 (0.96寸 OLED),仅支持黑白两色。
  • 电子墨水屏 (E-Ink),通常只有黑白,且刷新率极低。

如果直接将 24 位真彩图片进行量化处理,其结果往往如同烧焦的木炭,细节丢失殆尽。但若引入 抖动算法(Dithering),这些 1-Bit 屏幕便能模拟出细腻的灰度感。

此前我曾尝试用 Rust 实现过一个版本,但作为博客演示,使用 JavaScript 与 Canvas 在浏览器中直接进行仿真最为直观。本文将介绍几种主流抖动算法的原理及其 JS 实现。


阅读更多

告别AT指令:ESP32通过PPPoS驱动4G模块上网

前言

在之前的文章中,我们都是利用ESP32自带的WiFi进行网络连接。但在户外或者没有WiFi覆盖的角落,想要让设备联网,就得请出“4G模块”了。

air780eg_modem

通常大家驱动4G模块(比如SIM800, Air724, EC20等)最原始的方法是用UART发送AT指令。
比如 AT+HTTPINITAT+HTTPPARA… 这种方式不仅繁琐,而且解析返回字符串简直是噩梦,写出来的代码全是状态机,一旦模块吐点乱码,程序直接暴毙。手动解析AT指令简直是坏文明!

为了优雅地使用4G模块,我决定使用 PPPoS(Point-to-Point Protocol over Serial)。
简单来说,就是把串口“伪装”成一个网卡。这样底层的TCP/IP协议栈(LwIP)就能直接接管网络,我们写上层代码时,完全不用关心是在用WiFi还是4G,直接调标准的Socket接口就完事了。

So Fragrant

阅读更多