2026年1月25日 星期日

讀取 Arduino IDE 序列埠監控窗輸入,ESP32 使用程式碼 reset (software reset)

Demo 影片:




效果:

在 Arduino IDE 序列埠監控窗(Serial Monitor)輸入字串,ESP32 開發板上的程式讀取字串,當輸入字串為 RST,則執行 Reset,重啟開發板。

  • 使用 Serial.readStringUntil() 讀取字串,並設定讀取到換行字元(\n)時停止,所以序列埠監控窗(Serial Monitor)須設定送出訊息時,加上 New Line。
    等待 serial data,預設 Timeout 為 1000ms (1秒),所以若送出訊息時,選擇 No Line Ending,過了1秒 Timeout,仍會結束讀取,繼續執行後面程式。
  • Serial Monitor 和程式的 baud rate 需相同,這邊設為 115200
  • 使用 ESP.restart() 進行 Reset
    • software reset of the chip (對晶片進行軟體重設)
    • execution of the program stops (程式執行停止)
    • both CPUs are reset (兩個 CPU 都將被重設)
    • the application is loaded by the bootloader and starts execution again (應用程式由啟動引導程式載入並重新開始執行)
  • 使用 esp_reset_reason() 取得最近一次 Reset  的原因
  • 執行結果


程式碼:

void setup() {

  Serial.begin(115200);  //設定 baud rate

  // 獲取最近一次重置的原因
  esp_reset_reason_t reason = esp_reset_reason();

  Serial.println("========================================");
  Serial.print("系統啟動... 重置原因代碼: ");
  Serial.println(reason);

  switch (reason) {
    case ESP_RST_UNKNOWN:
      Serial.println("原因: Reset reason can not be determined. (無法確定重置原因)");
      break;
    case ESP_RST_POWERON:
      Serial.println("原因: Reset due to power-on event. (因開機事件而重設)");
      break;
    case ESP_RST_EXT:
      Serial.println("原因: Reset by external pin. (透過外部引腳,不適用於 ESP32)");
      break;
    case ESP_RST_SW:
      Serial.println("原因: Software reset via esp_restart. (軟體重置:透過調用 esp_restart 觸發)");
      break;
    case ESP_RST_PANIC:
      Serial.println("原因: Software reset due to exception/panic. (異常重置:系統崩潰或程式碼運行錯誤)");
      break;
    case ESP_RST_INT_WDT:
      Serial.println("原因: Reset due to interrupt watchdog. (中斷看門狗重置:中斷服務例程 ISR 受到長時間阻斷,即 IWDT 逾時)。IWDT:Independent Watchdog Timer");
      break;
    case ESP_RST_TASK_WDT:
      Serial.println("原因: Reset due to task watchdog. (任務看門狗重置:某個 FreeRTOS 任務未及時餵狗)");
      break;
    case ESP_RST_WDT:
      Serial.println("原因: Reset due to other watchdogs. (其他看門狗重置:包括 RTC 看門狗等硬體計時器)");
      break;
    case ESP_RST_DEEPSLEEP:
      Serial.println("原因: Reset after exiting deep sleep mode. (深睡喚醒重置:系統從深度睡眠模式中恢復)");
      break;
    case ESP_RST_BROWNOUT:
      Serial.println("原因: Brownout reset (software or hardware). (欠壓重置:供電電壓不穩定導致)");
      break;
    case ESP_RST_SDIO:
      Serial.println("原因: Reset over SDIO. (SDIO 重置:透過 SDIO 接口發送的復位指令)");
      break;
    case ESP_RST_USB:
      Serial.println("原因: Reset by USB peripheral. (USB 重置:由 USB 設備接口觸發的重置)");
      break;
    case ESP_RST_JTAG:
      Serial.println("原因: Reset by JTAG. (JTAG 重置:調試器通過 JTAG 觸發)");
      break;
    case ESP_RST_EFUSE:
      Serial.println("原因: Reset due to efuse error. (eFuse 錯誤重置:檢測到硬件 eFuse 數據損壞)");
      break;
    case ESP_RST_PWR_GLITCH:
      Serial.println("原因: Reset due to power glitch detected. (電源毛刺重置:檢測到極短時間的電壓異常)");
      break;
    case ESP_RST_CPU_LOCKUP:
      Serial.println("原因: Reset due to CPU lock up (double exception). (CPU 死鎖重置:發生了嚴重的雙重異常)");
      break;
    default:
      Serial.println("原因: Undefined reset reason. (未定義的重置原因)");
      break;
  }
  Serial.println("========================================");
}

void loop() {
  //讀取 Serial Monitor 輸入
  if (Serial.available()) {

    String readString = Serial.readStringUntil('\n');  // Read until newline
    readString.toUpperCase();
    Serial.println("[readString]:" + readString);

    if (readString == "RST") {
      Serial.println("[ESP.restart]");
      ESP.restart();  //software reset
    }
  }
}




參考:


電路圖上的英文縮寫

  •  控制介面
    • EN:Enable
      要用的時候,開啟 EN 腳,不用的時候就關閉。
      有些是高電平Enable,有些是低電平Enable。
    • CS:Chip Select
      晶片選擇,通常用於發送資料的時候,選擇哪個晶片接收。
      例如,SPI 匯流排可以連接多個設備,DDR 匯流排也可以連接多個 DDR 記憶體晶片。此時,需要使用 CS 來控制資料傳送到哪個裝置。
    • RST:Reset
      若標記為 RST_N,表示低電位時生效。(N:Negative)
    • INT:Interrupt,中斷
      可在接收到中斷訊號時,放下目前工作,優先執行中斷服務程序(ISR),當中斷服務程序完成以後,再繼續原本工作。
    • PD:Power Down,斷電
      不是 USB Type-C 介面中的 PD(Power Delivery)
    • CLK:Clock
      一般標為 xxx_xCLK,如 SPI_CLK、SDIO_CLK、I2S_MCLK(Main Clock)等。
      對於系統時鐘,往往會標註頻率。如SYS_26M、32K等。
      也有標了數字而不標 CLK 三個字,因為只有時鐘才會這麼標。
    • CTRL:control
      或 CMD(Command)。
    • SW:Switch,開關
    • PWM:Pulse-width modulation、脈波寬度調變、脈寬調變
      一條輸出訊號線上輸出不同佔空比的脈衝訊號達到傳遞能量/訊息的目的,
      例如:控制馬達的轉速、加上一個RC構成DAC電路、開關穩壓控制器透過PWM達到穩壓。
    • REF:Reference
      I_REF(參考電流)、V_REF(參考電壓)
      常用在穩壓電路、ADC、DAC。
    • FB:Feedback,回饋
      升壓、降壓電路上都會有回授訊號,和 Reference 類似,晶片根據外部採集來的電壓高低,動態調整輸出。外部電壓偏低了,就加大輸出,外部電壓偏高了,就減少輸出。
    • A/D:Analog/Digital,類比/數位
      DBB(數位基頻)、AGNG(類比地線)、DGND(數位地線)
      其他,PGND(功率地線),CGND(交流地線)、EGND(大地地線)
    • D/DATA:資料
      I2C 上稱為 SDA(Serial DATA)
      SPI 上稱為 SPI_DI、SPI_DO(Data In,Data Out)
      DDR 上稱為 D0,D1,D32
    • A/Address:位址線
      用法同數據線。
      主要用在 DDR 等位址和資料分開的傳輸介面。
      其他接口,慢的像I2C、SPI,快的像MIPI、RJ45等,都是地址和資料放在一組線上傳輸的,就沒有位址線。

  • 方向標識
    • TX/RX:Transmit/Receive、發送/接收
      用在串口(UART)上是最多的,一條線負責發送,一根線負責接收。
    • P/N:Positive/Negative,正/負
    • L/R:Left/Right。
      通常用於音頻線,區分左右。
  • 常用設備
    • BB:Baseband,基頻處理​​器
    • P(GPIO):General-purpose input/output,通用型輸入輸出
      例如,P1、P2、P1_3(第1組的第3個)
    • BAT:Battery
      所有的電池電壓都可以叫做 VBAT
    • CHG:Charge,充電
    • CAM:Camera
    • LCD:顯示器
    • TP:Touch Panel,觸控螢幕
    • DC:Direct Current,直流電
      設備上通常用作外部直流輸入接口,而不是指供電方式或供電電壓。
      例如 VCC_DC_IN,表示外部 DC 介面供電
  • 元件符號
    • C:Capacitor,電容
    • L:Inductor,電感
    • D:Diode,二極體
    • Q:Transistor,晶體管
    • U:Integrated Circuit,積體電路
    • GND:Ground,接地
    • VCC:Power Supply Positive,電源正極
    • VDD:電源電壓,通常用於MOSFET
    • VSS:接地電壓,負極,通常用於MOSFET
    • LED:Light Emitting Diode,發光二極體
    • Z:Zener Diode,齊納二極體
    • VR:Variable Resistor,可變電阻
    • X:Crystal Oscillator,晶體振盪器
    • JP:Jumper,跳線
    • TP:Test Point,測試點


參考:


2026年1月24日 星期六

Arduino 安裝 ESP32 開發板平台出現 DEADLINE_EXCEEDED 錯誤

 環境:

Windows 10、Arduino IDE 2.3.7


問題:

要將 ESP32 開發板從 3.5.2 更到 3.5.5 時,
出現「Error: 4 DEADLINE_EXCEEDED: context deadline exceeded (Client.Timeout or context cancellation while reading body)」錯誤。



解決方式:

因為 Arduino IDE 網路連接逾時時間(connection_timeout)預設為60秒,下載 ESP32 安裝檔案時間超過60秒,便會發生逾時錯誤。

所以將逾時時間(connection_timeout)設定適當延長即可。
設定檔在
C:\Users\<使用者名稱>\.arduinoIDE\arduino-cli.yaml

在檔案總管路徑輸入
C:\Users\%UserName%\.arduinoIDE\
到達該目錄後,編輯 arduino-cli.yaml

在 arduino-cli.yaml 設定檔,新增逾時時間設定如下(若已有該設定,則將逾時時間改大)
我這邊設為600秒,若設為0表示無限期等待。
【 connection_timeout - network inactivity timeout, the value format must be a valid input for time.ParseDuration(), defaults to 60s (60 seconds). 0 means it will wait indefinitely.】

network:
  connection_timeout: 600s

修改後,重啟 Arduino IDE,再安裝 ESP32 即可。







參考:




2026年1月11日 星期日

Update DaVinci Resolve

環境:

Win10、DaVinci Resolve 19.1


目的:

DaVinci Resolve 19.1 升級為最新版(20.3.1)


步驟:

  1. 上方工具列,「DaVinci Resolve」->「Check for Updates...」,檢查是否有新版本

  2. 按「Download」下載新版本

  3. 從 19 升級到 20,跨了一個主版本,建議先將專案匯出成 .drps  備份
    將每個專案,分別經由「File」->「Export Project..」匯出備份

  4. 下載完後為 DaVinci_Resolve_20.3.1_Windows.zip 壓縮檔,解壓縮後為 DaVinci_Resolve_20.3.1_Windows.exe ,執行 DaVinci_Resolve_20.3.1_Windows.exe 進行安裝
    安裝畫面中的「Fairlight Audio Accelerator Utility」,須有相對應的硬體才會用到,一般不用安裝
    按「Instsall」進行安裝

  5. 依序按「Next」進行下一步。
    後續會安裝上個步驟有勾選的項目,也會自動先移除舊版 DaVinci Resolve,所以升級 DaVinci Resolve 不須先移除舊版本




  6. 確認安裝路徑,按「Next」


    按「Instsall」進行安裝


  7. 安裝完成。
    按「Finish」

    按「確定」

  8. 開啟新版 DaVinci Resolve 時,出現「GPU Configuration Warning」訊息
    「DaVinci Resolve is unable to run in CUDA mode as the installed NVIDIA driver is incompatible. Please upgrade your NVIDIA driver for optimal performance.」
    提示電腦顯示卡驅動程式太舊不相容,需要更新驅動程式。
    這邊我按「Quit」,將顯示卡驅動更新到最新版後,即可開啟。




  9. 開啟原本專案時,會提示是舊版專案,Upgrade 後,以後就只能用新版開啟。
    這邊按「Upgrade」升級舊專案





參考:



2025年12月21日 星期日

不修改 hosts 檔案,讓 Chrome 也能解析自訂的網域規則

環境:Windows 10、Chrome

效果:
不修改本機 C:\Windows\System32\drivers\etc\hosts 檔案,讓 chrome 也能解析自訂的網域規則

方法:
啟動 Chrome 時,加上 --host-resolver-rules 參數,該參數可以設定網域解析規則,只對當次開啟的 Chrome 有效,關閉後失效。


 步驟:

  1. 先關閉所有 Chrome 視窗
  2. 用指令啟動 Chrome,並使用 --host-resolver-rules 參數,加上自訂的網域解析規則
    • 方法1:Windows 鍵 + R 
      執行
      chrome.exe --host-resolver-rules="MAP test.example.com 127.0.0.1","MAP test2.example.com:9999 127.0.0.1:80","MAP *.example.org 127.0.0.1"

    • 方法2:cmd 命令列
      執行
      "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --host-resolver-rules="MAP test.example.com 127.0.0.1","MAP test2.example.com:9999 127.0.0.1:80","MAP *.example.org 127.0.0.1"

  3. 啟動參數檢視
    chrome://version/

  4. 查看 Chrome 的網域 IP 解析結果
    chrome://net-internals/#dns

    後圖,加上 PORT 轉換的 test2.example.com:9999 雖然查不到,但後面語法解說測試,可正常運作


  5. --host-resolver-rules 參數的 MAP 語法
    • "MAP test.example.com 127.0.0.1"
      test.example.com 解析為 127.0.0.1

    • "MAP test2.example.com:9999 127.0.0.1:80"
      test2.example.com 解析為 127.0.0.1,並且 9999 PORT 導向 80 PORT

    • "MAP *.example.org 127.0.0.1"
      所有 example.org 子網域都解析為 127.0.0.1

    • "MAP * 127.0.0.1, EXCLUDE www.xyznote.cc"
      除了 www.xyznote.cc,其他所有網域都解析為  127.0.0.1
      後圖測試結果為執行
      "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --host-resolver-rules="MAP * 127.0.0.1, EXCLUDE www.xyznote.cc"


  6. 其他參數
    • 以訪客身分瀏覽:使用 --guest 參數
      "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --guest --host-resolver-rules="MAP * 127.0.0.1, EXCLUDE www.xyznote.cc"

    • 以無痕模式瀏覽:使用 --incognito 參數
      "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --incognito --host-resolver-rules="MAP * 127.0.0.1, EXCLUDE www.xyznote.cc"



參考: