Contents

接觸 ESP32 和 Arduino 時需要了解的事項

這篇文章介紹了 ESP32 和 Arduino 的基本知識,包括交流電、直流電、數位訊號和類比訊號,並提供了相關圖片和簡單說明,適合初學者快速入門。

Info
我整理了一些資訊,有些不需要完全理解,重點部分已用粗體標示,使用 Arduino 時應該不會有問題。

電子學基礎

  • 交流電:這是一種電壓和電流方向不斷變化的電力,最常見於家庭和商業電源中。
    https://upload.wikimedia.org/wikipedia/commons/5/52/AC_wave.gif

  • 直流電:這是一種電壓和電流方向保持不變的電力,電池就是直流電的一個例子。
    https://gist.github.com/assets/6058558/a4b47e5d-a37f-4543-93d3-4e76b032ac5a

  • 數位訊號:這是一種只有兩種狀態的訊號,通常被稱為 0 和 1 或者 高 和 低。
    https://upload.wikimedia.org/wikipedia/commons/c/cf/Original_message.jpg

  • 類比訊號:這是一種可以有無限多種狀態的訊號。在 Arduino 中,類比訊號可以是 0 到 1023 的任何值。
    https://gist.github.com/assets/6058558/c2f1bebd-e361-4143-8cc8-83bc913d763a

公式

歐姆定律
電壓 = 電流 × 電阻 (V = I × R)

功率計算
功率 = 電壓 × 電流 (P = V × I)

開發工具

  • 開發板:這是一種預先設計好的電路板,用於開發和測試新的微控制器設計。Arduino 和 ESP32 都是開發板的例子。
  • 編程環境:這是用於編寫和上傳程式碼到開發板的軟體。例如,Arduino IDE 是專為 Arduino 開發板設計的編程環境,它包含了一個程式碼編輯器和一個用於上傳程式碼到開發板的工具。
  • 函式庫:這些是預先寫好的程式碼片段,可以幫助開發者快速實現特定的功能,如讀取感測器數據、控制馬達等。Arduino 社區提供了大量的函式庫,可以幫助開發者快速開發項目。

開發板

Arduino Uno 有 6 個可以讀取類比訊號的腳位,分別是 A0 到 A5。這些腳位都連接到內置的類比到數位轉換器(ADC),可以讀取介於 0(對應於 0V)和 1023(對應於供應電壓,通常是 5V)之間的值。

這些類比輸入腳位可以用來讀取各種類比感測器的數據,如溫度感測器、光敏電阻、壓力感測器等。它們也可以用來讀取變壓器或電位計的輸出,或者任何其他可以產生在 0 到 5V 範圍內的類比電壓的裝置。

Info
簡單來說,數位訊號只能接收 0 和 1 兩個值。但光敏電阻之類的感測器會給出很多範圍的值,這時就需要用類比訊號。通常需要查看產品的資料表(DataSheet)

請注意,雖然這些腳位可以讀取類比訊號,但它們不能輸出類比訊號。Arduino Uno 沒有內置的數位到類比轉換器(DAC)。然而,它可以使用 PWM(Pulse Width Modulation,脈衝寬度調變)來模擬類比輸出,這在控制 LED 的亮度或馬達的速度時非常有用。在 Arduino Uno 上,腳位 3、5、6、9、10 和 11 支援 PWM 輸出。

NodeMCU-32s 是一個基於 ESP32 微控制器的開發板。它具有許多類似於 Arduino Uno 的功能,但也有一些額外的功能和能力。例如,ESP32 具有內置的 Wi-Fi 和藍牙模組,可以連接到網路並與其他裝置通信。它還具有更多的 GPIO 腳位,更多的類比輸入腳位,以及更多的通信接口(如 SPI、I2C 等)。這使得它更適合於一些需要更多功能和能力的應用,如物聯網設備、智能家居設備等。

詳細的開發板資訊

  • Arduino Uno

    • 類比輸入腳位:A0 到 A5
    • 數位輸入/輸出腳位:0 到 13
    • PWM 輸出腳位:3、5、6、9、10、11
    • 供應電壓:5V
    • 邏輯電壓:5V
    • 類比電壓範圍:0 到 5V
    • 類比到數位轉換器(ADC)位數:10 位
    • 數位到類比轉換器(DAC):無
    • 通信接口:UART、SPI、I2C
    • 其他功能:無
  • ESP32

GPIO

大部分的微控制器(包括 Arduino 和 ESP32)的每個 GPIO(General Purpose Input/Output)腳位都可以被配置為讀取或輸出數位訊號。這意味著它們可以被設置為 HIGH(通常對應於供應電壓,例如 3.3V 或 5V)或 LOW(通常對應於地線,0V)。

然而,並非所有的 GPIO 腳位都可以讀取或輸出類比訊號。只有特定的腳位(在 Arduino 上被標記為 A0、A1 等等)才有這個能力。這些腳位連接到內置的類比數位轉換器(ADC),可以讀取介於 0(對應於 0V)和 1023(對應於供應電壓)之間的值。

VCC 和 GND 是兩個特殊的腳位,它們分別代表供應電壓和地線。它們通常用於連接電源和地線,以提供電力給其他裝置。在 Arduino 和 ESP32 上,VCC 通常代表 3.3V 或 5V 的供應電壓,而 GND 代表地線。

數位輸入

這是 Arduino 讀取二進制信號的方式,也就是 0 或 1。例如,你可以透過按鈕開關來提供數位輸入。當按鈕被按下時,Arduino 讀取的是 1(高電壓),而當按鈕未被按下時,Arduino 讀取的是 0(低電壓)。

https://upload.wikimedia.org/wikipedia/commons/c/cf/Original_message.jpg

數位輸出

這是 Arduino 發送二進制信號的方式,也就是 0 或 1。例如,你可以控制 LED 燈的開關。當 Arduino 發送 1(高電壓)時,LED 燈會亮起,而當 Arduino 發送 0(低電壓)時,LED 燈會熄滅。

類比輸入

這是 Arduino 讀取連續範圍內的信號的方式。例如,你可以透過旋轉變阻器來提供類比輸入。旋轉變阻器的阻值會隨著旋轉角度的改變而變化,Arduino 可以讀取這些變化並將其轉換為 0 到 1023 的數值。

https://gist.github.com/assets/6058558/c2f1bebd-e361-4143-8cc8-83bc913d763a

PWM

Arduino 本身並不直接支援類比輸出,但它可以透過 PWM(脈衝寬度調變)來模擬類比輸出。這可以讓我們控制例如 LED 燈的亮度或是伺服馬達的角度等。PWM 透過快速地切換數位輸出(0 和 1)來模擬出類比效果。例如,如果我們將 LED 燈的輸出設定為 50% 的 PWM,那麼 LED 燈會以半亮的狀態顯示。設定為 75% 的 PWM,LED 燈會呈現 75% 亮度。

https://gist.github.com/assets/75846914/c4d8f782-7597-4f30-9970-76e626717c91

麵包板

麵包板是一種用於快速原型設計的電子元件連接板。它通常由一個塑料底座和一個金屬板組成,金屬板上有許多小孔,可以插入電子元件的引腳。這些孔通常排列成一個矩形網格,每個孔之間的距離是標準的間距,可以容納大多數電子元件的引腳。

麵包板通常用於將電子元件連接在一起,以便進行測試和測量。它們通常與彈簧夾一起使用,這樣可以輕鬆地將電子元件插入和拔出。

https://gist.github.com/assets/6058558/d862d1f7-a591-4039-a225-5be45eaa5732

電子元件

  • LED:這是一種發光二極管,可以將電能轉換為光能。它通常用於顯示器、指示燈等。
  • 電阻:這是一種用於限制電流的元件。它的電阻值通常用歐姆(Ω)來表示。
  • 電容:這是一種用於儲存電能的元件。它的電容值通常用法拉(F)來表示。
  • 按鈕:這是一種用於控制電路開關的元件。當按下按鈕時,電路將通電;當釋放按鈕時,電路將斷電。
  • 三極管:這是一種用於放大電流的元件。它通常用於控制馬達、燈光等。

通信技術

I2C 它只需要兩根線,一根用於資料 (SDA),另一根用於時鐘 (SCL)。

電學公式

歐姆定律:V = I × R,其中 V 是電壓(伏特),I 是電流(安培),R 是電阻(歐姆)。

Warning
在連接 LED 燈時需要接電阻,原因是如果不接電阻,電流太大會把 LED 燒壞。透過上面的公式,加上電阻後,電流自然就會變小。這也是為什麼我們需要加上電阻。

功率公式:P = V × I,其中 P 是功率(瓦特),V 是電壓(伏特),I 是電流(安培)。

電容公式:Q = C × V,其中 Q 是電荷(庫侖),C 是電容(法拉),V 是電壓(伏特)。

電感公式:V = L × (dI/dt),其中 V 是電壓(伏特),L 是電感(亨利),dI/dt 是電流變化率(安培/秒)。

這些電學公式在設計和實現 Arduino 項目時的許多情況下都可能會用到:

  • 歐姆定律:當你需要計算在特定電阻上的電壓,或者需要計算流經特定電阻的電流時,你會用到歐姆定律。例如,你可能需要使用一個電阻來限制 LED 燈的電流。
  • 功率公式:當你需要確定一個電路或其部分的能量消耗時,你會用到功率公式。例如,你可能需要確定你的 Arduino 項目是否超出了電源的功率限制。
  • 電容公式:當你在設計需要儲存或釋放電能的電路時,你會用到電容公式。例如,你可能在設計一個需要平滑電源電壓的電路時使用電容器。
  • 電感公式:電感公式在設計涉及變化電流的電路時特別有用,例如在設計電源轉換器或調諧電路時。

Arduino 有害論

NXT 有什麼不好?
除了以上 Arduino 有的缺點 NXT 都有(而且更嚴重)以外,NXT 讓學生打打電動、組裝積木就以為自己可以獨立建構嵌入式系統了,可是每次做好的東西單價都貴得要死,想做新的不得不拆掉舊的,不但傷感情,成就感也無法累積,經驗難以傳承,更沒有辦法體會實際產品開發的縮影。如果跟他說學單晶片就可以很便宜地做出來,不用每次拆掉,也沒幾人可以走出 NXT 所圍下的舒適圈,於是就陷入了萬-丈-深-淵-之中~

親眼見證 Arduino 殘害學子實錄

案例2:內湖某科大資訊系學生

在 2013 年宜蘭的某研討會上,他們發表「壓力發電暨人數監控系統」,在發表的文章中提到自己就是用 Arduino 控制板,對多個壓電元件做電壓監測。那我就問他們 ADC 在哪裡?結果報告的人完全聽不懂 ADC 是啥?在台上發楞半天,追問之下才知這位同學是做資料庫的部分,我就問:「寫 firmware 的是誰?有在場嗎?」然後旁邊那位寫 firmware 的同學才出來解釋:「我們沒有用 ADC」,我又問:

「那有比較器或其他類比元件嗎?」

「沒有」(但是他們的參考文獻卻有一項是「運算放大器」)

「沒有 ADC 也沒有比較器,請問你們到底用什麼監控電壓的?」

「我們就用 Arduino 控制板」

這位同學啊~我相信您回去把 ADC 的電子電路讀懂之後,再看一遍 ATmega2560 的 datasheet,一定會對自己當天在眾人面前的表現,感到勇氣可嘉!

簡單來說,我不是電子科系,只是業餘玩玩 IoT,不需要這麼專業😆。但若要朝向韌體工程師,可能就要多多考慮。

路線圖

目前計劃的學習路徑如下,但不打算走 HTTP 這條路。

flowchart LR subgraph 入門學習 學習開始 --> Arduino_ESP32 Arduino_ESP32 --> 數位輸出 數位輸出 --> 數位輸入 數位輸入 --> 類比輸入 類比輸入 --> PWM end subgraph 進階運用 UART SPI I2C PWM --> MQTT PWM --> HTTP HTTP --> IFTTT MQTT --> A[Grafana Dashboard] end

2024-12-24今天 後來我放棄用程式開發,轉向 ESPHome。

彩蛋