<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ESP8266 on Wentong's blog</title><link>https://wentong-wenz.hksa-stu.uk/tags/esp8266/</link><description>Recent content in ESP8266 on Wentong's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Tue, 26 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://wentong-wenz.hksa-stu.uk/tags/esp8266/index.xml" rel="self" type="application/rss+xml"/><item><title>學習筆記 01｜接腳功能</title><link>https://wentong-wenz.hksa-stu.uk/p/esp8266-pin-functions-01/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://wentong-wenz.hksa-stu.uk/p/esp8266-pin-functions-01/</guid><description>&lt;h2 id="標籤-vs-gpio-編號"&gt;標籤 vs GPIO 編號
&lt;/h2&gt;&lt;p&gt;NodeMCU 板子上印的是 &lt;code&gt;D0、D1、D2…&lt;/code&gt; 這類標籤，方便人眼辨識；
但在 Arduino IDE 寫程式時，晶片認的是 &lt;strong&gt;GPIO 編號&lt;/strong&gt;，兩者對應如下。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;標籤&lt;/th&gt;
 &lt;th style="text-align: center"&gt;GPIO&lt;/th&gt;
 &lt;th style="text-align: left"&gt;備註&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;16&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Deep Sleep 喚醒；不支援 PWM／I2C／中斷；板載狀態燈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;5&lt;/td&gt;
 &lt;td style="text-align: left"&gt;I2C SCL（推薦通用 IO）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D2&lt;/td&gt;
 &lt;td style="text-align: center"&gt;4&lt;/td&gt;
 &lt;td style="text-align: left"&gt;I2C SDA（推薦通用 IO）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D3&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;td style="text-align: left"&gt;⚠ 開機不可拉低（燒錄模式切換）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D4&lt;/td&gt;
 &lt;td style="text-align: center"&gt;2&lt;/td&gt;
 &lt;td style="text-align: left"&gt;⚠ 開機不可拉低（內接藍色 LED）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D5&lt;/td&gt;
 &lt;td style="text-align: center"&gt;14&lt;/td&gt;
 &lt;td style="text-align: left"&gt;SPI SCK&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D6&lt;/td&gt;
 &lt;td style="text-align: center"&gt;12&lt;/td&gt;
 &lt;td style="text-align: left"&gt;SPI MISO（接收感測器資料）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D7&lt;/td&gt;
 &lt;td style="text-align: center"&gt;13&lt;/td&gt;
 &lt;td style="text-align: left"&gt;SPI MOSI（發送命令給感測器）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D8&lt;/td&gt;
 &lt;td style="text-align: center"&gt;15&lt;/td&gt;
 &lt;td style="text-align: left"&gt;⚠ 開機必須拉低（SPI CS）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;A0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;ADC0&lt;/td&gt;
 &lt;td style="text-align: left"&gt;唯一類比輸入，範圍 0–3.3 V&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;img src="https://wentong-wenz.hksa-stu.uk/images/ard/NodeMCUv2.png" alt="NodeMCUv2.png" width="554"&gt;

 &lt;blockquote&gt;
 &lt;p&gt;詳細的 I2C / SPI 接腳功能說明請見 &lt;a class="link" href="https://wentong-wenz.hksa-stu.uk/p/esp8266-protocols-02/" &gt;學習筆記 02&lt;/a&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="特殊接腳速查"&gt;特殊接腳速查
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;電源&lt;/strong&gt;
&lt;code&gt;VIN&lt;/code&gt; 在 USB 供電時輸出 5 V；&lt;code&gt;3V3&lt;/code&gt; 供感測器使用。&lt;code&gt;GND&lt;/code&gt; 是所有設備的共同地，所有裝置都要接，否則訊號會亂跳。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UART（RX / TX）&lt;/strong&gt;
對應 GPIO 3 與 GPIO 1，負責燒錄與 Serial 監控。除非沒有其他腳位可用，否則不要當一般 IO。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EN（晶片總開關）&lt;/strong&gt;
板子已內建上拉電阻，平常不需要動。拉低再拉高可強制重啟；持續拉低則完全斷電，適合電池節電專案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RST&lt;/strong&gt;
短接 GND 即硬體重置，等同按下重開機。&lt;/p&gt;</description></item><item><title>學習筆記 02｜通訊協定</title><link>https://wentong-wenz.hksa-stu.uk/p/esp8266-protocols-02/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://wentong-wenz.hksa-stu.uk/p/esp8266-protocols-02/</guid><description>&lt;p&gt;接第一個感測器之前，你需要先選一種「溝通方式」——也就是通訊協定。
簡單整理如下，之後會各自說明。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;方案&lt;/th&gt;
 &lt;th style="text-align: center"&gt;優點&lt;/th&gt;
 &lt;th style="text-align: center"&gt;缺點&lt;/th&gt;
 &lt;th style="text-align: center"&gt;適用場景&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;數位訊號&lt;/td&gt;
 &lt;td style="text-align: center"&gt;簡單，非黑即白&lt;/td&gt;
 &lt;td style="text-align: center"&gt;只能傳開／關&lt;/td&gt;
 &lt;td style="text-align: center"&gt;按鈕、PIR 人體感應&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;類比訊號&lt;/td&gt;
 &lt;td style="text-align: center"&gt;直觀，不需協定&lt;/td&gt;
 &lt;td style="text-align: center"&gt;易受干擾；ESP8266 只有一組&lt;/td&gt;
 &lt;td style="text-align: center"&gt;可變電阻、光敏電阻&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;I2C&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;只需 2 根線，可接多個裝置&lt;/td&gt;
 &lt;td style="text-align: center"&gt;傳輸距離短（約 30 cm）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;溫濕度計、OLED 螢幕&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;SPI&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;速度極快&lt;/td&gt;
 &lt;td style="text-align: center"&gt;至少需要 4 根線&lt;/td&gt;
 &lt;td style="text-align: center"&gt;彩色 TFT 螢幕、SD 卡&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="i2c--省線的廣播系統"&gt;I2C — 省線的廣播系統
&lt;/h2&gt;&lt;p&gt;只需要 &lt;strong&gt;2 根線&lt;/strong&gt;就能連接多個設備。想像 ESP8266 是老闆，感測器是員工——
老闆用廣播對全場說話，每個員工都聽得到，但只有被點名的才會回應。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SCL（時鐘線）&lt;/strong&gt;：像指揮棒，控制傳輸節奏，告訴所有人「現在開始傳資料」。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SDA（數據線）&lt;/strong&gt;：實際傳送內容的線，例如「現在溫度 25°C」就從這裡走。&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;省腳位、接法簡單，速度中等。適合溫濕度計、小型螢幕等不需要高速傳輸的場景。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="spi--高速的點對點專線"&gt;SPI — 高速的點對點專線
&lt;/h2&gt;&lt;p&gt;通常需要 &lt;strong&gt;4 根線&lt;/strong&gt;，速度比 I2C 快很多，適合需要大量資料的裝置。
同樣是老闆與員工的關係，但改成一對一的專線通話。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SCK（時鐘線）&lt;/strong&gt;：同步傳輸節奏，與 I2C 的 SCL 功能相同。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MOSI（老闆說話線）&lt;/strong&gt;：Master Out Slave In，ESP8266 發送命令給感測器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MISO（員工回報線）&lt;/strong&gt;：Master In Slave Out，感測器把資料傳回 ESP8266。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CS（點名線）&lt;/strong&gt;：Chip Select。接了多個 SPI 裝置時，把某個裝置的 CS 拉低，
代表「我現在要跟你說話」，其餘裝置保持安靜。&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;速度極快，但佔用腳位較多。適合彩色螢幕、SD 卡讀卡機等高速場景。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>學習筆記 03｜第一個 Arduino 專案</title><link>https://wentong-wenz.hksa-stu.uk/p/esp8266-firstproject-03/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://wentong-wenz.hksa-stu.uk/p/esp8266-firstproject-03/</guid><description>&lt;p&gt;在真正寫出第一個有趣的專案之前，我卻誤碰了一個 Arduino IDE 的「硬規定」——它要求每個專案（在 Arduino 世界裡叫做 sketch）&lt;strong&gt;必須放在一個與主程式檔同名的資料夾裡&lt;/strong&gt;。雖然聽起來有點囉嗦，但這是 IDE 識別專案的方式，絕對不能偷懶把不同專案的檔案混在一起，否則 IDE 會把它們全部一起燒進板子裡。&lt;/p&gt;
&lt;p&gt;對於大型或模組化的專案，推薦的結構是：主 &lt;code&gt;.ino&lt;/code&gt; 檔只放最精簡的入口（&lt;code&gt;#include&lt;/code&gt;、&lt;code&gt;setup()&lt;/code&gt;、&lt;code&gt;loop()&lt;/code&gt;），實際的函式和類別分別寫在 &lt;code&gt;.h&lt;/code&gt;（宣告）和 &lt;code&gt;.cpp&lt;/code&gt;（實作）裡。這篇筆記的練習還用不到這個層次，但先建立這個概念對之後會很有幫助。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="從內建-led-開始最基本的呼吸燈"&gt;從內建 LED 開始：最基本的呼吸燈
&lt;/h2&gt;&lt;p&gt;第一個目標很單純：讓板子內建的 LED 像呼吸一樣緩慢亮起、再慢慢熄滅。&lt;/p&gt;
&lt;p&gt;這裡用到的是 PWM（Pulse Width Modulation，脈衝寬度調變）——簡單說，就是透過快速切換開關來模擬「介於全亮和全暗之間」的亮度。&lt;code&gt;analogWrite()&lt;/code&gt; 這個函式就是在控制這個數值，NodeMCU（ESP8266）上的 PWM 範圍預設是 0 到 1023。&lt;/p&gt;
&lt;p&gt;第一版程式碼很直觀：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;LEDU&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// GPIO 02 = D4 = 板子上的內建 LED
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// NodeMCU 內建 LED 是低電位觸發，也就是 0 是最亮，寫 1023 才是最暗。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEDU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1023&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEDU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 往 0 會越來越亮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1023&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEDU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;// 往 1023 則會越來越暗
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;但是跑起來之後，第一個感覺是：&lt;strong&gt;呼吸太慢了&lt;/strong&gt;。問了 AI 後算一下原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一次運行（0 → 1023，每次跳 5）：約 205 步&lt;/li&gt;
&lt;li&gt;每步延遲 30ms&lt;/li&gt;
&lt;li&gt;總耗時 205 × 30ms ≈ &lt;strong&gt;6.15 秒&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;後來也注意到另一個問題：&lt;strong&gt;方向寫錯了，全亮後不會變暗，反而又暗回去&lt;/strong&gt;。經過修正後，實現平滑呼吸：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;LEDU&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEDU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 由暗到亮
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1023&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEDU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 由亮到暗
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1023&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEDU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="關鍵修正"&gt;關鍵修正
&lt;/h2&gt;&lt;p&gt;寫入值越低，LED 越亮（因為 NodeMCU 是低電位觸發）。0 是最亮，1023 是最暗。&lt;/p&gt;
&lt;p&gt;為了讓呼吸燈看起來更自然，可以調整每次增減的步長：步長越小，呼吸越平滑但週期越長。&lt;/p&gt;</description></item><item><title>學習筆記 05｜電池&amp;充電器和馬達驅動板</title><link>https://wentong-wenz.hksa-stu.uk/p/esp8266-battery-motor-05/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://wentong-wenz.hksa-stu.uk/p/esp8266-battery-motor-05/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;本筆記僅包含電池、充電器與馬達驅動板相關資訊。WiFi 控制請參閱 &lt;a class="link" href="https://wentong-wenz.hksa-stu.uk/p/esp8266-wifi-intro-06/" &gt;學習筆記06_wifi&lt;/a&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="18650-電池"&gt;18650 電池
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;規格&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;額定電壓：3.7V DC&lt;/li&gt;
&lt;li&gt;額定容量：2200mAh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;使用警告&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;單顆 &amp;lt; 3.8V 或兩顆串聯 &amp;lt; 7.8V → &lt;strong&gt;接近過度放電，立即充電&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;過度放電會造成電池永久毀損&lt;/li&gt;
&lt;li&gt;請勿將電量耗盡（鋰電池無記憶效應）&lt;/li&gt;
&lt;li&gt;建議每 3~6 個月充電一次&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="18650-充電器"&gt;18650 充電器
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;相容電池型號&lt;/strong&gt; 14500 / 18650 / 21700 / 26650 / 18500 / 18350 / 17670 / 16340 / 10440&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LCD 電量對照表&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;顯示&lt;/th&gt;
 &lt;th&gt;對應電壓&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;閃爍（警告）&lt;/td&gt;
 &lt;td&gt;&amp;lt; 3.7V&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;25%&lt;/td&gt;
 &lt;td&gt;3.7V&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;50%&lt;/td&gt;
 &lt;td&gt;3.9V&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;75%&lt;/td&gt;
 &lt;td&gt;4.1V&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;100%&lt;/td&gt;
 &lt;td&gt;4.2–4.3V&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;規格&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;輸入：DC 5–8V / 1.2A（TYPE-C / USB，全球通用）&lt;/li&gt;
&lt;li&gt;每組輸出：4.2V ±1% / 400mA&lt;/li&gt;
&lt;li&gt;耗電：0.04W&lt;/li&gt;
&lt;li&gt;保存期限：10 年&lt;/li&gt;
&lt;li&gt;建議使用 &lt;strong&gt;1.5A 以上&lt;/strong&gt;的 USB 充電器，避免供電不足&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;TYPE-C 接頭注意事項&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;插入後避免搖晃，防止接觸不良&lt;/li&gt;
&lt;li&gt;不使用時只需拔除 USB 端，勿頻繁拔插充電器端&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="馬達驅動板l293d"&gt;馬達驅動板（L293D）
&lt;/h2&gt;&lt;h3 id="為何需要馬達驅動板"&gt;為何需要馬達驅動板
&lt;/h3&gt;&lt;p&gt;NodeMCU 本身輸出電流太小，無法直接驅動馬達。架構如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NodeMCU（小電流）→ 控制馬達驅動板 → 驅動板（大電流）→ 驅動馬達
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="供電架構搭配穩壓板"&gt;供電架構（搭配穩壓板）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;電源端&lt;/th&gt;
 &lt;th&gt;來源&lt;/th&gt;
 &lt;th&gt;用途&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;VM&lt;/td&gt;
 &lt;td&gt;兩顆 18650 串聯電壓（約 7.4V）&lt;/td&gt;
 &lt;td&gt;馬達電源&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;VIN&lt;/td&gt;
 &lt;td&gt;穩壓板穩壓後 5V&lt;/td&gt;
 &lt;td&gt;NodeMCU 控制電源&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;開關&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;控制 VIN&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;各排針功能&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;標示&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;G&lt;/td&gt;
 &lt;td&gt;接地&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;V&lt;/td&gt;
 &lt;td&gt;3.3V 電源排&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;D&lt;/td&gt;
 &lt;td&gt;數位信號&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AD&lt;/td&gt;
 &lt;td&gt;類比輸入&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="規格"&gt;規格
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;馬達擴展板&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;馬達電源：VM 4.5V～36V&lt;/li&gt;
&lt;li&gt;控制電源：VIN 4.5V～9V（最大 10V）&lt;/li&gt;
&lt;li&gt;驅動工作電流：≤ 1.2A&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;TT 馬達&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工作電壓&lt;/th&gt;
 &lt;th&gt;空載電流&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;6V&lt;/td&gt;
 &lt;td&gt;≤ 200mA&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3V&lt;/td&gt;
 &lt;td&gt;≤ 150mA&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="控制腳位對應"&gt;控制腳位對應
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;馬達&lt;/th&gt;
 &lt;th&gt;轉速（類比輸出 0～1023）&lt;/th&gt;
 &lt;th&gt;轉向（數位輸出 0/1）&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;A馬達&lt;/td&gt;
 &lt;td&gt;D1&lt;/td&gt;
 &lt;td&gt;D3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;B馬達&lt;/td&gt;
 &lt;td&gt;D2&lt;/td&gt;
 &lt;td&gt;D4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="智慧車實做注意事項"&gt;智慧車實做注意事項
&lt;/h2&gt;&lt;h3 id="程式燒錄前檢查"&gt;程式燒錄前檢查
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;確認&lt;mark&gt;穩壓板&lt;/mark&gt;安裝正確、電壓供應正確&lt;/li&gt;
&lt;li&gt;確認 NodeMCU V2 方向正確插入馬達擴展板（方向接反會毀損）&lt;/li&gt;
&lt;li&gt;馬達擴展板上的開關&lt;strong&gt;不使用&lt;/strong&gt;，全程以&lt;strong&gt;電池盒開關&lt;/strong&gt;控制電源&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;燒錄程式時&lt;strong&gt;必須打開電池盒開關供電&lt;/strong&gt;，避免電壓不穩導致燒錄或運作失敗&lt;/mark&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;擴展板開關僅控制 VIN，穩定性不如電池盒直接供電，因此全程不動擴展板開關。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="用三用電表量測注意"&gt;用三用電表量測注意
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;注意檔位與探棒正負極接法&lt;/li&gt;
&lt;li&gt;電池盒開蓋送電狀態下，探棒移動時勿碰觸擴展板排針（G、V、D、AD 等），避免短路毀損。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;前進一秒停一秒程式碼&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ino" data-lang="ino"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ESP8266 馬達控制程式 - 前進 1 秒、停止 1 秒循環
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 適用 NodeMCU v2 (ESP-12E)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;A_speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// A 馬達速度 (PWM)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;A_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;D3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// A 馬達方向
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;B_speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;D2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// B 馬達速度 (PWM)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;B_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;D4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// B 馬達方向
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;motorSpeed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 全速 (0~1023)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 設定腳位模式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A_speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B_speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 初始狀態：停止（方向設為前進預設值）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A_speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B_speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 前進 1 秒
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A_speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;motorSpeed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B_speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;motorSpeed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 停止 1 秒
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A_speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B_speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>學習筆記04｜LED 控制練習</title><link>https://wentong-wenz.hksa-stu.uk/p/esp8266-led-control-04/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://wentong-wenz.hksa-stu.uk/p/esp8266-led-control-04/</guid><description>&lt;p&gt;這份筆記記錄的是&lt;strong&gt;我自己的學習歷程，不是教學文件&lt;/strong&gt;——所以你不會在這裡看到完整的硬體規格說明或詳細的接線教學。因為我的背景偏軟體，對於線怎麼接、用了哪些器材筆記裡只會帶過，重心還是放在程式邏輯上。&lt;/p&gt;
&lt;p&gt;從上一篇用內建 LED 練習呼吸燈開始，這次進一步用麵包板接出 4 顆外接 LED，透過三個遞進的練習，把 LED 控制從最基本的「亮滅」玩到「隨機閃爍」，逐步熟悉用程式操作 ESP8266 的感覺。&lt;/p&gt;
&lt;p&gt;硬體部分簡單帶一下：每顆 LED 串聯一顆 220Ω 限流電阻（色碼：紅紅棕金），陽極（長腳）接 GPIO、陰極（短腳）經電阻接 GND。腳位用 D1、D2、D5、D6，建議避開 D0——它在開機時有特殊行為，容易造成不預期的現象。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ex02單向流動燈"&gt;Ex02：單向流動燈
&lt;/h2&gt;&lt;p&gt;讓 4 顆 LED 依序亮起再熄滅，形成單向流動的視覺效果，每顆間隔 500ms。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;leds&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="c1"&gt;// D1, D2, D5, D6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;邏輯很直接：用 &lt;code&gt;for&lt;/code&gt; 迴圈依序點亮每顆 LED、等 500ms、再熄滅，進入下一顆。&lt;/p&gt;
&lt;hr&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h2 id="ex03來回跑馬燈"&gt;Ex03：來回跑馬燈
&lt;/h2&gt;&lt;p&gt;在單向的基礎上，讓燈光來回跑——從左到右、再從右回左。這個練習還有一個進階要求：&lt;strong&gt;把延遲時間存成變數&lt;/strong&gt;，想改速度只需要動一個地方，不用在程式裡到處搜尋 &lt;code&gt;delay()&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ledPins&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="c1"&gt;// D1, D2, D5, D6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numLeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;delayTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numLeds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 往右跑（1 → 4）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numLeds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delayTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 往左跑（3 → 2，跳過頭尾避免重複亮）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numLeds&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delayTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;往回跑的迴圈從 &lt;code&gt;numLeds - 2&lt;/code&gt;（index 2，第三顆）跑到 &lt;code&gt;i &amp;gt; 0&lt;/code&gt;（index 1，第二顆）就停，頭尾兩顆刻意跳過。原因是它們已經分別在「往右」的末尾和「往左」的起頭各亮過一次——不跳過的話這兩顆會連亮兩次，視覺上會頓一下。&lt;/p&gt;
&lt;hr&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h2 id="ex04星星閃爍效果"&gt;Ex04：星星閃爍效果
&lt;/h2&gt;&lt;p&gt;這個練習加入 &lt;code&gt;random()&lt;/code&gt; 亂數函數，讓每顆 LED 每次拿到不同的 PWM 亮度值，模擬夜空星星隨機閃爍的效果。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ledPins&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="c1"&gt;// D1, D2, D5, D6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numLeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;analogWriteRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1023&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 明確設定 PWM 範圍為 0~1023
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numLeds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numLeds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;randomBrightness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 產生 0~1023 的隨機亮度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;analogWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;randomBrightness&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 更新頻率，數字越小閃爍越快
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;delay(100)&lt;/code&gt; 控制亮度更新的頻率，可以改成 50 或 200 感受一下視覺差異。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;這三個練習的核心是同一件事：&lt;strong&gt;用迴圈和變數讓程式碼更容易修改和擴充&lt;/strong&gt;。從寫死的數值，到抽出 &lt;code&gt;delayTime&lt;/code&gt;，再到讓亮度完全由亂數決定——每一步都在降低「想改一個參數要動多少地方」的成本。&lt;/p&gt;</description></item><item><title>學習筆記06｜wifi介紹</title><link>https://wentong-wenz.hksa-stu.uk/p/esp8266-wifi-intro-06/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://wentong-wenz.hksa-stu.uk/p/esp8266-wifi-intro-06/</guid><description>&lt;p&gt;關於 ESP8266 的網路功能，我們主要會使用 Arduino 環境內建的 &lt;code&gt;ESP8266WiFi.h&lt;/code&gt; 函式庫。它把&lt;u&gt;底層的 TCP/IP 與 WiFi 協定封裝成直觀的指令&lt;/u&gt;，讓你不用從零處理封包或射頻調變，就能讓 NodeMCU 連網或發射熱點。&lt;/p&gt;
&lt;p&gt;為了快速建立脈絡，這裡先用「流程思維」拆解這套函式庫的核心架構：&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-wifi-函式庫的兩種基本模式"&gt;🔑 WiFi 函式庫的兩種基本模式
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;模式&lt;/th&gt;
 &lt;th style="text-align: left"&gt;核心角色&lt;/th&gt;
 &lt;th style="text-align: left"&gt;適用情境&lt;/th&gt;
 &lt;th style="text-align: left"&gt;關鍵指令&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;STA&lt;/strong&gt;&lt;br&gt;(Station)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;客戶端 (Client)&lt;/strong&gt;&lt;br&gt;像「手機連 WiFi」&lt;/td&gt;
 &lt;td style="text-align: left"&gt;• 連接家中路由器&lt;br&gt;• 上傳數據至雲端&lt;br&gt;• 需要互聯網環境&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;WiFi.begin(ssid, pwd);&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;AP&lt;/strong&gt;&lt;br&gt;(Access Point)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;基地台 (Server)&lt;/strong&gt;&lt;br&gt;像「手機開熱點」&lt;/td&gt;
 &lt;td style="text-align: left"&gt;• &lt;strong&gt;本專案採用&lt;/strong&gt;&lt;br&gt;• 離線直連控制&lt;br&gt;• 無路由器環境&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;WiFi.softAP(ssid, pwd);&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;小提醒&lt;/strong&gt;：第三種模式為 STA+AP 混用。目前我們專注於 &lt;strong&gt;AP 模式&lt;/strong&gt;，讓智慧車成為獨立的控制中心。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="-深度解析如何理解這兩種模式"&gt;📖 深度解析：如何理解這兩種模式？
&lt;/h3&gt;&lt;h4 id="1-sta-模式主動加入者-the-joiner"&gt;1. STA 模式：主動加入者 (The Joiner)
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;生活類比&lt;/strong&gt;：就像你的&lt;strong&gt;手機連接家裡的 WiFi&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;運作邏輯&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;NodeMCU 是「客人」，必須知道路由器的名稱 (SSID) 和密碼。&lt;/li&gt;
&lt;li&gt;它會&lt;strong&gt;主動&lt;/strong&gt;去敲門請求連線。如果沒有路由器，它就無法運作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;優勢&lt;/strong&gt;：連上後可通往互聯網（例如接收來自世界各地的指令）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;電影院比喻&lt;/strong&gt;：NodeMCU 拿著票根（密碼）主動走到櫃台，驗票員（路由器）確認後才放行進入電影院（外部網路）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-ap-模式被動等待者-the-host"&gt;2. AP 模式：被動等待者 (The Host)
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;生活類比&lt;/strong&gt;：就像你的&lt;strong&gt;手機開啟個人熱點&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;運作邏輯&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;NodeMCU 是「主人」，自己發射 WiFi 訊號。&lt;/li&gt;
&lt;li&gt;它&lt;strong&gt;被動等待&lt;/strong&gt;你的手機來搜尋並連接它。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;優勢&lt;/strong&gt;：獨立運作，不依賴外部網路，適合近距離直接控制（如遙控車）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;開店比喻&lt;/strong&gt;：NodeMCU 開了一家店，掛上招牌 &amp;ldquo;CarWiFi&amp;rdquo;，坐在店裡等客人（手機）上門輸入密碼才能進來對話。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-常見開發流程無論-staap-都適用"&gt;🧩 常見開發流程（無論 STA/AP 都適用）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;引入與序列埠初始化&lt;/strong&gt;：&lt;code&gt;#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;/code&gt; + &lt;code&gt;Serial.begin(115200);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嘗試連線/建立熱點&lt;/strong&gt;：呼叫 &lt;code&gt;begin()&lt;/code&gt; 或 &lt;code&gt;softAP()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;等待連線就緒&lt;/strong&gt;：通常用 &lt;code&gt;while(WiFi.status() != WL_CONNECTED)&lt;/code&gt; 或檢查 &lt;code&gt;softAP&lt;/code&gt; 狀態&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;取得 IP 門牌&lt;/strong&gt;：&lt;code&gt;WiFi.localIP()&lt;/code&gt;（STA）或 &lt;code&gt;WiFi.softAPIP()&lt;/code&gt;（AP）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建立通訊端&lt;/strong&gt;：例如 &lt;code&gt;WiFiServer server(80);&lt;/code&gt; 用來監聽手機網頁發來的控制指令&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>學習筆記07｜用到的函式庫</title><link>https://wentong-wenz.hksa-stu.uk/p/esp8266-library-intro-07/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://wentong-wenz.hksa-stu.uk/p/esp8266-library-intro-07/</guid><description>&lt;p&gt;專案的主要架構。我們會先以介紹用到的函式庫為先，具體的筆記請看學習筆記08_專案程式碼（待撰寫）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;馬達模組 (Motor.h)&lt;/strong&gt;：專門寫 digitalWrite 那些控制接腳的程式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;網頁模組 (WebPages.h)&lt;/strong&gt;：專門放那一長串的 HTML 字串。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主程式 (Main.ino)&lt;/strong&gt;：只負責 WiFi.begin 和呼叫別人的功能。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="esp8266wifih-的主要作用"&gt;&amp;lt;ESP8266WiFi.h&amp;gt; 的主要作用
&lt;/h3&gt;&lt;p&gt;這是 ESP8266 官方提供的 WiFi 函式庫，讓 NodeMCU 可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;連上家裡的 WiFi（Station 模式）&lt;/li&gt;
&lt;li&gt;開啟自己的熱點（AP 模式）&lt;/li&gt;
&lt;li&gt;查詢 MAC 位址、訊號強度、IP 位址等&lt;/li&gt;
&lt;li&gt;處理 WiFi 連線狀態&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ino" data-lang="ino"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# include &amp;lt;ESP8266WiFi.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;softAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 開啟熱點
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 連線到路由器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 檢查 WiFi 狀態
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 取得目前 IP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;WL_CONNECTED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localIP&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="esp8266webserverh-的主要作用"&gt;&amp;lt;ESP8266WebServer.h&amp;gt; 的主要作用
&lt;/h3&gt;&lt;p&gt;這是用來在 ESP8266 上建立一個簡單網頁伺服器，讓你可以用手機或電腦的瀏覽器來控制智慧車。&lt;/p&gt;
&lt;p&gt;最核心的功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;建立網頁伺服器（通常 port 80）&lt;/li&gt;
&lt;li&gt;定義不同網址（/forward、/stop、/left&amp;hellip;）對應的處理函數&lt;/li&gt;
&lt;li&gt;回應 HTML 網頁或簡單的文字指令&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ino" data-lang="ino"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;ESP8266WiFi.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;ESP8266WebServer.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ssid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;你的WiFi名稱&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;你的WiFi密碼&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ESP8266WebServer&lt;/span&gt; &lt;span class="nf"&gt;server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;115200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ============= AP 模式 =============
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;softAP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;=== AP 模式已開啟 ===&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;熱點名稱: &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;連線密碼: &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;IP 位址: &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WiFi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;softAPIP&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handleRoot&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/forward&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handleForward&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/stop&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handleStop&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;WebServer 已啟動&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handleClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;handleRoot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;lt;h1&amp;gt;智慧車控制頁面&amp;lt;/h1&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;handleForward&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;text/plain&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;前進指令已接收&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;handleStop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;text/plain&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;已停止&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="websocketsserverh-引入優化的核心差異"&gt;&amp;lt;WebSocketsServer.h&amp;gt; 引入優化的核心差異
&lt;/h3&gt;&lt;p&gt;WebSocket 與傳統 HTTP 最大差別：&lt;strong&gt;一次連線就保持不斷線&lt;/strong&gt;（全雙工），手機和 ESP8266 可以&lt;strong&gt;隨時互相推訊息&lt;/strong&gt;，不需要每次都重新發請求，所以延遲極低（通常 &amp;lt; 30ms），按住按鈕就持續動作，像遊戲搖桿一樣。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;原先設計是基於「請求-響應」(Request-Response)模式，單向的發送命令，而 &lt;strong&gt;WebSocket&lt;/strong&gt; 協議則可以讓 NodeMCU 主動推訊息回手機（例如「馬達目前速度：700」或「電池低電警告」）。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>WiFi 遙控車：核心零件介紹與開發環境設定</title><link>https://wentong-wenz.hksa-stu.uk/p/wifi-car-core-parts/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>https://wentong-wenz.hksa-stu.uk/p/wifi-car-core-parts/</guid><description>&lt;p&gt;這份筆記偏向「踩坑記錄」性質，紀錄的是實際開發與學習過程中遇到問題、查資料、反覆確認才搞清楚的細節與背景知識，不是從頭到尾的零件清單介紹組裝教學。如果你也在做類似的 WiFi 小車專案，希望這些筆記能幫你少走幾段彎路。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="壹核心控制板nodemcu-v2esp-12e"&gt;壹、核心控制板：NodeMCU V2（ESP-12E）
&lt;/h2&gt;&lt;p&gt;這塊小板子是整台車的大腦，負責處理 WiFi 連線、接收感測器的資料，以及執行所有程式邏輯。&lt;/p&gt;
&lt;p&gt;我使用的型號是 &lt;strong&gt;NodeMCU 1.0（ESP-12E Module）V2 Amica 版&lt;/strong&gt;，也就是俗稱的「窄版」。核心晶片是 &lt;strong&gt;ESP8266&lt;/strong&gt;，單核心處理器，CPU 時脈 80 MHz，大約是傳統 Arduino Uno 的五倍速。內建 4 MB 的快閃記憶體（Flash），空間相當充裕，甚至可以在板子上架一個迷你網頁伺服器。可用的工作記憶體（Free Heap）約為 43 KB，對於控制小車的程式來說綽綽有餘。最重要的是，它內建 Wi-Fi 模組，開箱即可連接無線網路，這也是為什麼選它來做 WiFi 遙控車的主要原因。&lt;/p&gt;
&lt;img src="https://wentong-wenz.hksa-stu.uk/images/ard/NodeMCUv2.png" alt="NodeMCUv2.png" width="516"&gt;
&lt;h2 id="貳開發環境設定arduino-ide"&gt;貳、開發環境設定（Arduino IDE）
&lt;/h2&gt;&lt;p&gt;Arduino IDE 本來是為 Arduino 系列開發板設計的，要讓它支援 ESP8266，需要手動加入開發板套件。步驟如下：&lt;/p&gt;
&lt;p&gt;打開 Arduino IDE，依序點選「File」→「Preferences&amp;hellip;」可以更改配色與語言，欄位填入以下網址：&lt;code&gt;https://arduino.esp8266.com/stable/package_esp8266com_index.json&lt;/code&gt;，接著到「工具」→「開發板」→「開發板管理員」，搜尋 &lt;code&gt;esp8266 (By Community)&lt;/code&gt; 並安裝。安裝完成後，IDE 就能辨識 NodeMCU 了。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://wentong-wenz.hksa-stu.uk/images/ard/Perferences.png" alt="Preferences" width="363"&gt; &lt;img src="https://wentong-wenz.hksa-stu.uk/images/ard/Board.png" alt="Board" width="256"&gt;&lt;/p&gt;
&lt;p&gt;連接好開發板後，到「工具」選單確認以下設定都正確，否則可能無法上傳程式或程式行為異常：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;項目&lt;/th&gt;
 &lt;th&gt;設定值&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;開發板&lt;/td&gt;
 &lt;td&gt;NodeMCU 1.0 (ESP-12E Module)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Flash Size&lt;/td&gt;
 &lt;td&gt;4M (2M OTA)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CPU Frequency&lt;/td&gt;
 &lt;td&gt;80 MHz&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Upload Speed&lt;/td&gt;
 &lt;td&gt;115200&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="叁底層驅動l293d-馬達驅動擴展板"&gt;叁、底層驅動：L293D 馬達驅動擴展板
&lt;/h2&gt;&lt;p&gt;這塊擴展板是整台車的「肌肉」，負責實際驅動馬達轉動。因為 ESP8266 的輸出電流非常小，完全不足以驅動馬達，如果直接連接，輕則馬達不動，重則燒毀開發板。這塊擴展板內建 &lt;strong&gt;L293D 雙 H 橋驅動晶片&lt;/strong&gt;，原理是用 ESP8266 發出的微弱控制訊號，去「指揮」電池直接供電給馬達，實現「小電流控制大電流」的效果，同時保護核心板不受高電流衝擊。右下角標示的區域則是日後外接超音波測距、紅外線循跡等感測器的腳位。&lt;/p&gt;
&lt;img src="https://wentong-wenz.hksa-stu.uk/images/ard/L293D.png" alt="L293D" width="408"&gt;
&lt;h3 id="馬達腳位對應表"&gt;馬達腳位對應表
&lt;/h3&gt;&lt;p&gt;程式裡控制馬達轉速與方向時，需要對應正確的腳位。轉速透過 PWM 訊號控制（PWM 是一種藉由快速切換開關來模擬不同電壓、進而調控轉速的技術），方向則透過高低電位訊號決定正轉或反轉。如果反轉則將正負 A+、A- 交換、右側輪胎則是 B+、B- 交換。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;馬達&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;th&gt;擴展板標示腳位&lt;/th&gt;
 &lt;th&gt;拓展版接口&lt;/th&gt;
 &lt;th&gt;底層 GPIO&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;馬達 A&lt;/td&gt;
 &lt;td&gt;轉速&lt;/td&gt;
 &lt;td&gt;D1&lt;/td&gt;
 &lt;td&gt;A+&lt;/td&gt;
 &lt;td&gt;GPIO 5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;馬達 A&lt;/td&gt;
 &lt;td&gt;方向&lt;/td&gt;
 &lt;td&gt;D3&lt;/td&gt;
 &lt;td&gt;A-&lt;/td&gt;
 &lt;td&gt;GPIO 0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;馬達 B&lt;/td&gt;
 &lt;td&gt;轉速&lt;/td&gt;
 &lt;td&gt;D2&lt;/td&gt;
 &lt;td&gt;B+&lt;/td&gt;
 &lt;td&gt;GPIO 4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;馬達 B&lt;/td&gt;
 &lt;td&gt;方向&lt;/td&gt;
 &lt;td&gt;D4&lt;/td&gt;
 &lt;td&gt;B-&lt;/td&gt;
 &lt;td&gt;GPIO 2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="肆相關照片"&gt;肆、相關照片
&lt;/h2&gt;&lt;p&gt;使用的電池盒線的原因，還是有額外接穩壓板去分流。上面一條線接到擴展版的 &lt;code&gt;VIM&lt;/code&gt;。底下左右會有兩條插腳接到 &lt;code&gt;VM&lt;/code&gt; 和 &lt;code&gt;GND&lt;/code&gt; 。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;額外穩壓板&lt;/th&gt;
 &lt;th&gt;馬達接線視圖&lt;/th&gt;
 &lt;th&gt;馬達接線視圖&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img src="https://wentong-wenz.hksa-stu.uk/images/ard/整體.jpg" alt="" width="586"&gt;&lt;/td&gt;
 &lt;td&gt;&lt;img src="https://wentong-wenz.hksa-stu.uk/images/ard/RegB.jpg" alt="" width="544"&gt;&lt;/td&gt;
 &lt;td&gt;&lt;img src="https://wentong-wenz.hksa-stu.uk/images/ard/MDA.jpg" alt="" width="920"&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>WiFi 遙控車：補充資料</title><link>https://wentong-wenz.hksa-stu.uk/p/wifi-car-supplement/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>https://wentong-wenz.hksa-stu.uk/p/wifi-car-supplement/</guid><description>&lt;p&gt;一次將所有的圖片與資訊介紹塞在同一份文件，會讓人眼花撩亂，因此我將一部份重要，不影響學習的背景知識內容搬移到此。&lt;/p&gt;
&lt;h3 id="一-esp-12e這個型號代表什麼"&gt;一、 「ESP-12E」這個型號代表什麼？
&lt;/h3&gt;&lt;p&gt;型號裡的 &lt;strong&gt;12&lt;/strong&gt; 代表這是安信可（AI-Thinker）模組家族中引腳最豐富、也最成熟穩定的版本。後面的 &lt;strong&gt;E（Enhanced，增強版）&lt;/strong&gt; 則表示它在舊版基礎上做了幾項改良：底部增加了額外的 SPI 腳位、通過了 FCC/CE 等國際電磁相容認證，還加上了金屬屏蔽罩，讓 WiFi 訊號更穩定、抗干擾能力更好。&lt;/p&gt;
&lt;h3 id="二序列埠監控器的波特率設定"&gt;二、序列埠監控器的波特率設定
&lt;/h3&gt;&lt;p&gt;序列埠監控器（Serial Monitor）是開發過程中最常用的除錯工具，可以即時看到板子傳回來的文字訊息。它有個常被忽略的設定：&lt;strong&gt;波特率（Baud Rate）&lt;/strong&gt;，也就是電腦與開發板之間的「說話速度」。雙方速度必須一致，否則收到的訊息會變成一堆亂碼。&lt;/p&gt;
&lt;p&gt;ESP8266 開機時會自動輸出一段系統除錯資訊（Boot log），這段資訊預設就是以 115200 的速率傳送。為了讓所有訊息都能正常顯示，請將監控器右下角的波特率統一設為 &lt;strong&gt;115200 baud&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="三flash-size-選項的意義"&gt;三、Flash Size 選項的意義
&lt;/h3&gt;&lt;p&gt;這些選項主要是在決定如何分配 ESP8266 (NodeMCU) 身上那塊 &lt;strong&gt;4MB 的快閃記憶體 (Flash Memory)&lt;/strong&gt;。這 4MB 的空間會被切分成三個主要部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;程式碼區 (Sketch)&lt;/strong&gt;：存放你寫好的程式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OTA 區 (Over-the-Air)&lt;/strong&gt;：用來存放透過無線網路更新時暫存的韌體。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;檔案系統區 (FS, File System)&lt;/strong&gt;：用來存放資料檔案（例如 HTML、圖片或設定檔），通常使用 LittleFS 或 SPIFFS。&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;選項&lt;/th&gt;
 &lt;th&gt;適用情境&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;FS:2MB OTA:~1019KB&lt;/strong&gt; (目前選擇)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;最平衡的選擇&lt;/strong&gt;。適合大多數需要存一點資料且有無線更新需求的人。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;FS:3MB OTA:~512KB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;資料優先&lt;/strong&gt;。如果需要存很多檔案，但程式碼非常精簡（小於 512KB），選這個。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;FS:1MB OTA:~1019KB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;標準配置&lt;/strong&gt;。如果 2MB FS 太多，可以縮減 FS 以確保程式運作空間更充裕。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;FS:none OTA:~1019KB&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;純程式使用&lt;/strong&gt;。不打算在開發板上存任何檔案，只執行程式碼。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item></channel></rss>