<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ESP32 &#8211; mylogs.cn</title>
	<atom:link href="https://mylogs.cn/tag/esp32/feed/" rel="self" type="application/rss+xml" />
	<link>https://mylogs.cn</link>
	<description>发现、记录、分享</description>
	<lastBuildDate>Mon, 10 Aug 2026 17:31:27 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>15 美元 ESP32 小黄屏，把看天气这件事从手机里搬出来</title>
		<link>https://mylogs.cn/esp32-cheap-yellow-display-weather-dashboard/</link>
		
		<dc:creator><![CDATA[steve, zhang]]></dc:creator>
		<pubDate>Mon, 10 Aug 2026 17:31:11 +0000</pubDate>
				<category><![CDATA[科技]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[ESPHome]]></category>
		<category><![CDATA[Home Assistant]]></category>
		<category><![CDATA[创客]]></category>
		<category><![CDATA[天气]]></category>
		<category><![CDATA[智能家居]]></category>
		<guid isPermaLink="false">https://mylogs.cn/esp32-cheap-yellow-display-weather-dashboard/</guid>

					<description><![CDATA[掏出手机、解锁、翻到天气应用——只为看一眼今天会不会下雨，这套动作对某些人来说实在太啰嗦。How-To Gee [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">掏出手机、解锁、翻到天气应用——只为看一眼今天会不会下雨，这套动作对某些人来说实在太啰嗦。How-To Geek 作者 Adam Davidson 干脆用一块不到 15 美元的 ESP32 开发板做了个桌面天气屏，抬眼就能看完所有关心的数据，而且显示什么完全由自己决定。</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7cf36423002&quot;}" data-wp-interactive="core/image" data-wp-key="6a7cf36423002" class="wp-block-image size-large aligncenter wp-lightbox-container"><img fetchpriority="high" decoding="async" width="1200" height="675" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://mylogs.cn/wp-content/uploads/2026/08/01eca6a83e71f141c281b81c6d897228_header.webp" alt="15 美元 ESP32 小黄屏，把看天气这件事从手机里搬出来" class="wp-image-4346" style="max-width:100%;height:auto;" srcset="https://mylogs.cn/wp-content/uploads/2026/08/01eca6a83e71f141c281b81c6d897228_header.webp 1200w, https://mylogs.cn/wp-content/uploads/2026/08/01eca6a83e71f141c281b81c6d897228_header-300x169.webp 300w, https://mylogs.cn/wp-content/uploads/2026/08/01eca6a83e71f141c281b81c6d897228_header-1024x576.webp 1024w, https://mylogs.cn/wp-content/uploads/2026/08/01eca6a83e71f141c281b81c6d897228_header-768x432.webp 768w" sizes="(max-width: 1200px) 100vw, 1200px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">图片来源：Adam Davidson / How-To Geek</figcaption></figure>





<p class="wp-block-paragraph">促使他动手的直接原因，是手机上再没有一款称心的天气应用。他真正喜欢过的只有 Dark Sky，界面出色，更关键的是超本地化预报极其准确——应用说几分钟后要下雨，往往就真的下了。苹果收购 Dark Sky 后把部分功能并入自带天气应用，随后彻底关停了这款产品。在他看来，苹果自带的天气应用达不到原来的水准。他甚至自制过一个 iPhone 天气小组件，用 AI 生成一张表现当前天气状况的图像，来替代系统自带组件。</p>



<p class="wp-block-paragraph">但问题的核心不在于应用好不好用，而在于天气这类信息本来就应该一眼扫到，而不是层层点进去才能看到。</p>



<h2 class="wp-block-heading">主角：那块「廉价黄屏」</h2>



<p class="wp-block-paragraph">他选中的硬件叫 ESP32-2432S028R。这串型号不好记，但由于板子是黄色的、带屏幕、还便宜，创客圈给它起了个更好记的外号：Cheap Yellow Display，简称 CYD，直译过来就是「廉价黄屏」。</p>



<p class="wp-block-paragraph">CYD 是一块自带一切的开发板，核心是带 Wi-Fi 和蓝牙的 ESP32-WROOM-32 模块。它和普通 ESP32 开发板最大的区别，在于集成了一块 2.8 英寸 TFT 触摸屏，分辨率 240×320，表面覆盖电阻式触控层。因为所有部件都在同一块板子上，整套东西不需要接线、焊接，也不用面包板。</p>



<p class="wp-block-paragraph">出厂时板子上可能带一些基础演示程序，但要让它真正干活，得自己刷入固件。这恰恰是它受欢迎的原因之一：硬件是通用的，用途完全由使用者定义。另一个原因就更直白了——15 美元甚至更低的价格，正是 CYD 里那个 C 的由来。</p>



<h2 class="wp-block-heading">三件套：ESPHome、LVGL 和 Home Assistant</h2>



<p class="wp-block-paragraph">屏幕虽小，塞下一屏天气信息绰绰有余。真正需要解决的是两件事：怎么把数据送到板子上，以及怎么让它把数据画出来。整套方案由三个部分拼成。</p>



<ul class="wp-block-list"><li>ESPHome 负责固件。使用者只需写一个描述设备行为的 YAML 文本文件，ESPHome 会把它编译成可用固件，省去了自己写 C++ 代码的麻烦。</li><li>LVGL 负责画面。这个图形库的作用是接管渲染，使用者不必逐个计算像素坐标，只要描述想在屏幕上看到什么即可。ESPHome 内置了对 LVGL 的支持，因此一个 YAML 文件就能同时搞定 Wi-Fi 配置、触摸屏设置，以及天气图标和由温度、风速等数值组成的信息网格。</li><li>Home Assistant 负责供数。他原本就配置了一个天气实体，数据来自 Met.no，可以提供当前天气状况、气温、风速、室外露点等信息。</li></ul>



<p class="wp-block-paragraph">除此之外，他还接入了一些自定义传感器，其中包括一个室内露点传感器——它并非真实硬件，而是根据家中智能设备上报的温湿度读数推算出来的。借助 ESPHome，任何一个传感器数值更新时，新数据都会通过网络推送到 CYD，屏幕上显示的因此始终是 Home Assistant 里最新的读数。</p>



<h2 class="wp-block-heading">比手机好用在哪儿</h2>



<p class="wp-block-paragraph">这块屏被放在他的家庭办公室，也就是他工作日待得最久的地方。抬头一眼，当前天气尽收眼底，不需要掏手机，也不需要找应用。</p>



<p class="wp-block-paragraph">更实际的好处是显示内容可以完全自定义。手机上的天气应用不会告诉使用者家里的室内露点是多少，而把它和室外露点摆在一起对比，在冬天相当有用——两者一比就知道，此刻开窗究竟能降低室内湿度，还是关着窗更划算。</p>



<p class="wp-block-paragraph">目前唯一没做完的是外壳。他打算给 CYD 配一个 3D 打印的壳子，因为裸板放在桌上确实有点名副其实的「便宜又黄」。按他的说法，这或许正好成了自己入手一台 3D 打印机的借口。</p>



<p class="wp-block-paragraph">这个项目的出发点其实很简单：既然手机上的天气应用根本没在用，那就换个能瞬间看到结果的形式。花费不到 15 美元，问题就解决了。有些时候，与其等一款称心的产品出现，不如自己动手做一个。</p>



<p class="has-small-font-size wp-block-paragraph">来源：How-To Geek</p>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>十美元让老车库门变智能</title>
		<link>https://mylogs.cn/%e5%8d%81%e7%be%8e%e5%85%83%e8%ae%a9%e8%80%81%e8%bd%a6%e5%ba%93%e9%97%a8%e5%8f%98%e6%99%ba%e8%83%bd/</link>
					<comments>https://mylogs.cn/%e5%8d%81%e7%be%8e%e5%85%83%e8%ae%a9%e8%80%81%e8%bd%a6%e5%ba%93%e9%97%a8%e5%8f%98%e6%99%ba%e8%83%bd/#respond</comments>
		
		<dc:creator><![CDATA[steve, zhang]]></dc:creator>
		<pubDate>Sun, 09 Aug 2026 09:20:32 +0000</pubDate>
				<category><![CDATA[经验与技巧]]></category>
		<category><![CDATA[DIY 教程]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[Home Assistant]]></category>
		<category><![CDATA[智能家居]]></category>
		<category><![CDATA[车库门]]></category>
		<guid isPermaLink="false">https://mylogs.cn/%e5%8d%81%e7%be%8e%e5%85%83%e8%ae%a9%e8%80%81%e8%bd%a6%e5%ba%93%e9%97%a8%e5%8f%98%e6%99%ba%e8%83%bd/</guid>

					<description><![CDATA[老车库门没法远程开，DIY 套件不到 20 美元 市面上的智能车库门套件动辄上百元，而用一块 ESP32 开发 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">老车库门没法远程开，DIY 套件不到 20 美元</h2>



<p class="wp-block-paragraph">市面上的智能车库门套件动辄上百元，而用一块 ESP32 开发板和继电器模块，总成本可压到 20 美元以内，还能接入 Home Assistant 实现语音控制和状态提醒。一位 How-To Geek 撰稿人实测了这套方案。</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7cf36424271&quot;}" data-wp-interactive="core/image" data-wp-key="6a7cf36424271" class="wp-block-image size-large aligncenter wp-lightbox-container"><img decoding="async" width="1200" height="675" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://mylogs.cn/wp-content/uploads/2026/08/0c19274438a3333a153d6f29db1e8e2f_header.webp" alt="十美元让老车库门变智能" class="wp-image-4174" style="max-width:100%;height:auto;" srcset="https://mylogs.cn/wp-content/uploads/2026/08/0c19274438a3333a153d6f29db1e8e2f_header.webp 1200w, https://mylogs.cn/wp-content/uploads/2026/08/0c19274438a3333a153d6f29db1e8e2f_header-300x169.webp 300w, https://mylogs.cn/wp-content/uploads/2026/08/0c19274438a3333a153d6f29db1e8e2f_header-1024x576.webp 1024w, https://mylogs.cn/wp-content/uploads/2026/08/0c19274438a3333a153d6f29db1e8e2f_header-768x432.webp 768w" sizes="(max-width: 1200px) 100vw, 1200px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">图片来源：How-To Geek</figcaption></figure>





<h2 class="wp-block-heading">一、准备元件</h2>



<ol class="wp-block-list"><li>继电器模块（用于控制开门信号）。</li><li>几根连接线。</li><li>ESP32 开发板，文中用的是 Seeed XIAO ESP32-C3，约 5 美元。</li><li>一个 USB 充电器给板子供电。</li><li>接触传感器，用于上报门已开或已关的状态。</li></ol>



<p class="wp-block-paragraph">这些元件加总不到 20 美元，其中开发板约占一半，继电器和传感器都很便宜；USB 充电器多数人家已有，可再省一笔。</p>



<h2 class="wp-block-heading">二、确认车库 opener 可改造</h2>



<ol class="wp-block-list"><li>先断开车库门电源，安全第一，全程只动低压部分。</li><li>找到墙上控制按钮（wall button）背后的两个低压端子。</li><li>确认原理：这两个端子短暂接通，opener 就会触发开关门。多数机型兼容，但少数采用专有编码信号，无法直接接，需先查说明书确认。</li></ol>



<h2 class="wp-block-heading">三、接线与刷写</h2>



<ol class="wp-block-list"><li>把继电器的「公共端（Common）」和「常开（NO）」接到墙控的两个低压端子上，相当于用继电器代替手指按按钮。</li><li>继电器与 ESP32 相连：若为 3.3V 逻辑可直接连；若是 5V，需加晶体管或电平转换模块。</li><li>给 ESP32 刷 ESPHome 固件，配置文件用 YAML 编写（不会写可让 AI 生成），刷完先单独测试能否正常触发开门。</li><li>把接触传感器装在门轨上，回报实际开关状态。</li></ol>



<h2 class="wp-block-heading">四、接入 Home Assistant</h2>



<p class="wp-block-paragraph">在 Home Assistant 里建自动化：门开超过 15 分钟推送告警；或绑定语音助手直接说「开门」。整体比买成品套件省下 80–100 美元。</p>



<p class="wp-block-paragraph">注意事项：操作涉及强电环境，接线前务必断电，仅在低压端子作业；ESP32 仅靠 USB 供电，不要接入 opener 的强电回路。所有低压信号线用绝缘端子固定，防止松动短路。不确定兼容性不要硬接，避免损坏 opener。</p>



<p class="wp-block-paragraph">来源：How-To Geek</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mylogs.cn/%e5%8d%81%e7%be%8e%e5%85%83%e8%ae%a9%e8%80%81%e8%bd%a6%e5%ba%93%e9%97%a8%e5%8f%98%e6%99%ba%e8%83%bd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>8 美元单片机，从零训出一个 32 万参数模型</title>
		<link>https://mylogs.cn/train-transformer-from-scratch-on-8-dollar-esp32-s3/</link>
					<comments>https://mylogs.cn/train-transformer-from-scratch-on-8-dollar-esp32-s3/#respond</comments>
		
		<dc:creator><![CDATA[steve, zhang]]></dc:creator>
		<pubDate>Wed, 05 Aug 2026 07:18:19 +0000</pubDate>
				<category><![CDATA[科技]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[Transformer]]></category>
		<category><![CDATA[小模型]]></category>
		<category><![CDATA[嵌入式开发]]></category>
		<category><![CDATA[开源项目]]></category>
		<category><![CDATA[边缘AI]]></category>
		<guid isPermaLink="false">https://mylogs.cn/train-transformer-from-scratch-on-8-dollar-esp32-s3/</guid>

					<description><![CDATA[训练一个模型必须要有显卡或者数据中心，这几乎是行业默认的常识。一个名为 Qapla&#8217; 的开源项目给 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">训练一个模型必须要有显卡或者数据中心，这几乎是行业默认的常识。一个名为 Qapla&#8217; 的开源项目给出了另一种答案：一块八美元的 ESP32-S3 单片机，也能从零训练出一个 Transformer。</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a7cf364256b4&quot;}" data-wp-interactive="core/image" data-wp-key="6a7cf364256b4" class="wp-block-image size-large aligncenter wp-lightbox-container"><img decoding="async" width="1200" height="600" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://mylogs.cn/wp-content/uploads/2026/08/e75fe424cbe87aba2abb426900b166a3_header.webp" alt="8 美元单片机，从零训出一个 32 万参数模型" class="wp-image-3646" style="max-width:100%;height:auto;" srcset="https://mylogs.cn/wp-content/uploads/2026/08/e75fe424cbe87aba2abb426900b166a3_header.webp 1200w, https://mylogs.cn/wp-content/uploads/2026/08/e75fe424cbe87aba2abb426900b166a3_header-300x150.webp 300w, https://mylogs.cn/wp-content/uploads/2026/08/e75fe424cbe87aba2abb426900b166a3_header-1024x512.webp 1024w, https://mylogs.cn/wp-content/uploads/2026/08/e75fe424cbe87aba2abb426900b166a3_header-768x384.webp 768w" sizes="(max-width: 1200px) 100vw, 1200px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">图片来源：GitHub / Carloscodix/qapla 项目页</figcaption></figure>





<p class="wp-block-paragraph">这里的关键词是「训练」，不是「运行」。前向传播、反向传播、权重更新，整个学习循环全部发生在芯片内部。</p>



<h2 class="wp-block-heading">和以往的边缘 AI 项目差在哪</h2>



<p class="wp-block-paragraph">边缘 AI 并不新鲜。TinyML 在单片机上做推理已有多年，社区把安德烈·卡帕西（Andrej Karpathy）的极简项目 llama2.c 移植到 ESP32 上，跑起了约 26 万参数的 Transformer；最近还有项目在同样八美元的 ESP32-S3 上跑起了将近 2900 万参数的模型。</p>



<p class="wp-block-paragraph">作者指出，这些工作都很出色，但它们有一个共同点——都是推理。模型诞生在别处，在显卡或数据中心上用数据训练好、量化，然后才被装进芯片里运行。用项目作者的比喻说，大脑是在外面煮熟了端上来的。</p>



<p class="wp-block-paragraph">Qapla&#8217; 想回答的是另一个问题：如果模型根本没法在外面诞生，会怎么样？</p>



<p class="wp-block-paragraph">作者举了两个设想中的场景：一个螺栓固定在田间农机上的传感器，需要学习<strong>这一台</strong>机器的正常振动特征——它和世界上任何其他机器都不一样——从而在出故障前发现异常、安排检修；或者一块地里的传感器，学习<strong>这片</strong>土壤如何变干，它的土质、日照和排水情况，在作物受影响之前预测何时需要灌溉。这些场景里，数据在设备装上去之前根本不存在，没有人能预先训练它，芯片只能在原地独自学习。</p>



<h2 class="wp-block-heading">为什么选了克林贡语</h2>



<p class="wp-block-paragraph">手头没有农机可供实验，作者就用唯一现成的对象来测试芯片的真实学习能力：语言。</p>



<p class="wp-block-paragraph">在单片机里训练，规则和数据中心完全不同。ESP32-S3 只有几 MB 的 RAM/PSRAM，而不是几十 GB，这直接锁死了模型规模——量级是几十万参数而非几百万。这么小的模型能学会一门语言的<strong>结构</strong>（构词方式、音位组合规则、部分语法），但学不会整门语言的深层语义，所以任务必须裁到与模型相称。同时，小模型不需要海量文本，需要的是紧凑、干净、结构清晰，并且在版权上没有麻烦的语料。</p>



<p class="wp-block-paragraph">三个约束叠加，问题就变得具体了：哪种语言同时满足这些条件？作者的答案是克林贡语。</p>



<p class="wp-block-paragraph">这个选择工程考量多过极客趣味。克林贡语由语言学家马克·奥克兰（Marc Okrand）在 1984 年创造，是一门有系统音系、语法和形态的人造语言，采用不常见的宾语—动词—主语语序，构词后缀规则严格。也就是说，它有真实的结构可供学习，这正好能证明小模型是真的在学规律，而不是在死记噪声。同时它字母表很小，按字符处理只有约 30 个符号，模型可以做得足够小；社区还有一部开源许可的词典 boQwI&#8217;，语料不涉及版权风险。</p>



<p class="wp-block-paragraph">作者也把丑话说在前面：这不是口袋版 ChatGPT，它不聊天、不答题、不推理，学到的是语言的<strong>形状</strong>而不是意义；它产出的克林贡语在语义上并不完美；它不快，训练要花好几个小时，甚至好几天。</p>



<h2 class="wp-block-heading">一颗芯片里的完整训练循环</h2>



<p class="wp-block-paragraph">在 ESP32-S3 内部完成的步骤包括：权重随机初始化、读取并切分语料、前向传播、交叉熵损失计算、反向传播（导数全部手写）、权重更新（带 0.9 动量的 SGD 加余弦学习率）、把检查点存入 LittleFS 闪存，以及用学到的权重生成文本。芯片之外要做的事：没有。</p>



<p class="wp-block-paragraph">架构本身没有新意，是一个微型但完整的 Transformer：单个模块、单头因果注意力、权重绑定、ReLU 前馈网络和层归一化，按字符工作，词表约 31 个符号，上下文 32 个字符，总计约 319,000 个参数。</p>



<p class="wp-block-paragraph">这里没有 PyTorch，也没有自动求导，前向传播的每一个导数都用 C 显式写出。为确认没写错，每个梯度都与前向传播的中心差分做了对比，最差相对误差为 1.07e-08，而阈值是 1e-4；内核还先用 ESP-IDF 构建并在 QEMU 的 xtensa 模拟环境中跑通，然后才烧进真实硅片。这两项检查都放在仓库的 tests/ 目录里，可以自行复现。</p>



<p class="wp-block-paragraph">作者强调，真正的难点不是参数量，而是内存。31.9 万参数「只」占约 1.3 MB，但训练不只是放下权重：同一时刻内存里还要有等量大小的梯度副本、一份优化器动量、一份最优模型备份，加上反向传播需要的全部中间激活值，再加上语料本身——加起来是芯片 PSRAM 里的好几 MB。这就是推理与训练的本质差别，也是这个项目与其他边缘 AI 项目的分野。</p>



<h2 class="wp-block-heading">跑出来的数字</h2>



<p class="wp-block-paragraph">全部训练在芯片内完成，供电靠一个手机充电器。参数约 319,000 个，词表 31 个字符，上下文 32 个字符，优化器为带动量（0.9）的 SGD 加余弦学习率，共 5000 步，耗时约两天，硬件是 ESP32-S3 N16R8 搭配一块 SH1106 OLED 屏。</p>



<p class="wp-block-paragraph">损失下降过程如屏幕上所显示：第 1495 步批次损失 2.193、移动平均 2.137；第 2549 步为 1.982 与 2.035；第 4905 步为 1.996 与 1.871。作者提醒，真正该看的是移动平均——单个批次的损失取决于抽到哪些句子，波动很大，而平均值在稳步下降。芯片最终收在约 1.87。</p>



<p class="wp-block-paragraph">模型吐出的文本长这样：</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">hIngan motlh puS ruq tuq DujDaq SISwI&#8217; nge&#8217;vI&#8217;</p>
</blockquote>



<p class="wp-block-paragraph">&gt;</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">vIn SuvwI&#8217; yIvwI&#8217; qarghtaHvIS SIchoH</p>
</blockquote>



<p class="wp-block-paragraph">不算完全通顺的克林贡语，但形态学值得一看：SuvwI&#8217; 意为「战士」，由词根 Suv（战斗）加后缀 -wI&#8217;（做某事的人）构成，是一个构造正确的真实词汇；DujDaq 意为「在船上」，由 Duj（船）加处所后缀 -Daq 构成；qarghtaHvIS 带有复合后缀 -taHvIS（表示「当……时」，持续体加状语），位置分毫不差；hIngan 距离 tlhIngan——也就是「克林贡」这个词本身——只差两个字母。</p>



<p class="wp-block-paragraph">其余一些词构造合规但并不存在。没有人给模型任何规则、语法标签或形态切分，喂进去的只是逐字符的原始文本，它从中捕捉到了足够的规律，把词根和后缀重组成站得住脚的形状。作者也坦承，仅凭两个样本无法判断其中多少是真正的泛化、多少是语料的统计回声，「一个用小语料训练的 31.9 万参数模型，预期就是二者兼有」。</p>



<h2 class="wp-block-heading">想自己试的话</h2>



<p class="wp-block-paragraph">语料 corpus/klingon.txt 已随仓库提供，采用 Apache 2.0 许可，可用 corpus/build_corpus.py 重新生成，克隆下来就能跑。不过作者认为更有意思的实验不是重复他的，而是把这套东西对准自己的文本：用 tools/gen_header.py 把任意文本转成头文件，再用 PlatformIO 执行 pio run -t upload 烧录，然后用 pio device monitor 看着损失实时下降。</p>



<p class="wp-block-paragraph">硬件需要一块带 PSRAM 的 ESP32-S3（型号 N16R8），一块通过 I2C 连接的 SH1106 OLED 屏（可选，但作者说少了它就少了一半乐趣）。芯片从随机权重开始训练，会定期保存训练损失移动平均最低的检查点；中途拔电，上次存档之后学到的东西就没了，跑完再拔，「大脑」还在。</p>



<p class="wp-block-paragraph">需要提醒的是：这真的要花好几个小时，很多个小时，甚至好几天。用作者的话说，这不是 bug，而是重点所在——它慢，但它确实能跑通。</p>



<p class="wp-block-paragraph">项目代码采用 Apache 2.0 许可开源。作者表示，接下来真正有意思的部分，是把这套引擎推到极限，去处理一门有真实使用者、语料远大于克林贡语的真实小语种。</p>



<p class="has-small-font-size wp-block-paragraph">来源：GitHub / Qapla&#8217; 项目主页（经 Hacker News）</p>

]]></content:encoded>
					
					<wfw:commentRss>https://mylogs.cn/train-transformer-from-scratch-on-8-dollar-esp32-s3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
