ESP32 教學系列(四):數位輸入與輸出 – 實作篇

ESP32 教學系列(四):數位輸入與輸出 - 實作篇

一、前言

上篇說明了 ESP32 的腳位和 GPIO 的功能與注意事項,本篇將以兩個簡單的範例說明如何使用 Arduino Framework 控制 ESP32 開發板的數位輸入與輸出,以及如何使用內建的上拉與下拉電阻簡化電路。

材料清單

二、數位輸出

語法說明

要控制數位輸出,會用到兩個函式語法:pinModedigitalWrite

  • pinMode
    pinMode 函式用來定義 GPIO 接腳的操作模式。
pinMode(GPIO Pin, MODE);

參數說明:

GPIO Pin : GPIO 接腳編號

MODE : 接腳的操作模式

操作模式共有四種,可以是 OUTPUT(輸出模式)、INPUT(輸入模式)、INPUT_PULLUP(上拉輸入模式),或INPUT_PULLDOWN(下拉輸入模式)。

  • digitalWrite digitalWrite 函式用來設定 GPIO 接腳的輸出狀態,只有在 pinMode 函式設定成 OUTPUT(輸出模式)時才能使用。
digitalWrite(GPIO Pin, STATE);

參數說明:

GPIO Pin : GPIO 接腳編號

STATE : 接腳的電位,有 HIGH(3.3 V)和LOW (0 V)兩種狀態。

💡 Tips

在使用輸出腳位連接其他元件時建議加上限流電阻,以免損壞接腳或元件。

範例1:閃爍 LED 燈

讓我們以閃爍 LED 燈為例,說明如何控制 GPIO 的數位輸出功能。

元件連接示意圖

ESP32教學系列(四):數位輸入與輸出 - 實作篇

接線圖

ESP32教學系列(四):數位輸入與輸出 - 實作篇

範例程式碼

執行結果

ESP32 教學系列(四):數位輸入與輸出 - 實作篇

三、數位輸入

要讓 ESP32 獲得感測器資料或是外部資訊時,就需要將接腳設定為輸入模式。

將接腳設定為輸入狀態時一樣要使用到 pinMode 語法,詳細的參數與用途可以參考前面的說明。讀取腳位狀態則要用到 digitalRead 語法。

  • digitalRead
    digitalRead 函式的用途是將 GPIO 接腳設定成輸入狀態。 由於 ESP32 接腳預設皆為數位輸入模式,所以在設定時只需要指定 GPIO 接腳編號即可。
digitalRead(GPIO Pin);

參數說明:

GPIO Pin : GPIO接腳編號

進階知識:上拉電阻與下拉電阻

當微控制器的接腳設定為輸入模式時,為了確保接腳在沒有外部訊號輸入的狀況下,也能維持在穩定的狀態,我們通常會加上上拉(Pull-Up)電阻或是下拉(Pull-Down)電阻。

ESP32 接腳本身內建了上拉以及下拉電阻,除了 GPIO34, 35, 36, 39 以外,其他所有的 GPIO 接腳只要在 pinMode 函式中設定就能使用。

當接腳處於浮接狀態時,可能會受到雜訊干擾而產生誤動作,而上拉的作用就是將不確定的訊號狀態透過電阻提升至高電位;下拉的作用則是將不確定的訊號透過電阻拉低至低電位,如此就能提供穩定的電位訊號,常用來檢測開關或按鈕的狀態。

要分辨上拉或是下拉的結構,可以由電阻所在的位置判斷。若電阻其中一端連接到高電位就是上拉電阻(左圖) ;連接到低電位的就是下拉電阻(右圖) 。

ESP32 教學系列(四):數位輸入與輸出 - 實作篇
左圖為上拉電阻結構,右圖為下拉電阻結構

上拉電阻

  • 分析:在按鈕還沒被按下之前,接腳會由上拉電阻提高至高電位;按下按鈕以後,接腳與 GND 連接,此時接腳的狀態為低電位。
  • 說明:有些人將上拉電阻比喻成彈簧,在沒有受到外力作用時,彈簧會拉回到初始位置。相同的,當按鈕被放開後,上拉電阻會將接腳電壓拉回初始高電位(3.3V)狀態。

下拉電阻

  • 分析:在開關還沒被按下之前,接腳會由下拉電阻拉低至低電位(0V);按下開關以後,接腳與 3.3V 連接,此時接腳的狀態為高電位。
  • 說明:下拉電阻就好比重物,當沒有受到外力作用時,重物會一直保持在地面上。所以當按鈕被放開以後,下拉電阻會將接腳電壓拉回低電位(0V)。

範例 2:以按鈕控制 LED 燈

接下來讓我們看第二個範例:用按鈕控制 LED 燈。

這個範例的功能是,只有當按鈕被按下時 LED 才會點亮,其他時候 LED 則保持熄滅狀態。

ESP32 教學系列(四):數位輸入與輸出 - 實作篇
按鈕被按下時,LED點亮;按鈕沒有被按下時,LED熄滅

元件連接示意圖

ESP32 教學系列(四):數位輸入與輸出 - 實作篇

接線圖

ESP32 教學系列(四):數位輸入與輸出 - 實作篇

說明

為了節省接線,我們在讀取按鈕的時候使用內部上拉電阻,因此直接將按鈕開關連接到 GPIO 25 即可,GPIO 26 連接到 LED。

在一般狀態下(LED 熄滅時),由於上拉電阻的關係,開關腳位的電壓會保持在 3.3V;當按鈕被按下時,接腳與 GND 連接,此時電壓讀取到 0V,點亮 LED 燈。

程式碼

執行結果

ESP32 教學系列(四):數位輸入與輸出 - 實作篇

四、小結

我們在這篇文章中示範如何使用 ESP32 的數位輸入與輸出的功能,下篇文章將會說明如何使用 ESP32 的 PWM(數位脈衝寬度調變)訊號控制 NeoPixel Ring 模組。