iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
自我挑戰組

一個營建系學生的韌體之路-ESP32篇系列 第 12

ESP32_DAY12 數位輸入輸出-函式介紹

訊號的種類

https://ithelp.ithome.com.tw/upload/images/20210927/20140433JIoOYGajbs.png
我們身處的世界中,任何隨著時間或空間變化的量都是潛在的訊號,他們可以提供物理系統的狀態資訊、或不同物體之間傳達的訊息。

術語「訊號」包括音訊、視訊、語音、圖像、通訊、地球物理、聲納、雷達、醫療和音樂訊號等。
來源: IEEE訊號處理彙刊

訊號可以分為數位訊號、類比訊號兩種。

  • 數位訊號(Digital signal)
    數位訊號是指使用離散(不連續)的0、1來表示資訊,例如:「電腦是只有0和1的世界」,在電腦中0、1分別代表了「低電位(LOW)」、「高電位(HIGH)」,以大部分ESP32的腳位電壓來說,也能說是「0V」、「3.3V」。
  • 類比訊號(Analog signal)
    相對於數位,類比訊號是使用一個連續的範圍代表資訊,大自然中的一切訊號,例如:聲音、影像、溫度,都是屬於類比訊號,通常我們為了要測量某種類比訊號的變化,會透過量取該類訊號的感測器之電壓大小來得到,例如:為了量測溫度可以使用熱敏電阻來換算。

數位訊號相關函式

今天只會先來介紹ESP32中的數位輸入、輸出函式,在之前的LED閃爍範例中,已經使用過了數位輸出了!也就是pinModedigitalWrite的部分,那與digitalWrite相對的就是digitalRead,函式的取名非常直白,分別是「腳位模式」、「數位寫出」、「數位讀取」。
請注意:函式的大小寫很重要!千萬不要拼錯了,拼錯的話會編譯失敗喔!!
請注意:函式的大小寫很重要!千萬不要拼錯了,拼錯的話會編譯失敗喔!!
請注意:函式的大小寫很重要!千萬不要拼錯了,拼錯的話會編譯失敗喔!!
https://ithelp.ithome.com.tw/upload/images/20210927/20140433HpwMAh9mWD.png

pinMode(pin, mode)

你選擇的GPIOs(pin)編號,根據ESP32的腳位功能,除了GPIOs 6~11(以連接SPI flash)與GPIOs 34、35、36、39(僅提供input功能)等腳位外,都能自由選擇下列四種模式:INPUT:、OUTPUT、INPUT_PULLUP、INPUT_PULLDOWN

  1. INPUT: 可以接受電壓輸入,範圍為0~3.3V
  2. OUTPUT: 可以送出3.3V電壓
  3. INPUT_PULLUP: 開啟上拉電阻功能,根據官方文件,電阻值為45kΩ
  4. INPUT_PULLDOWN: 開啟下拉電阻功能,根據官方文件,電阻值為45kΩ
    請注意:四種模式的參數均為大寫

digitalWrite(pin, value)

如果模式選擇了OUTPUT後,可以透過digitalWrite來控制要送出高電位(3.3V)或低電位(0V),對應之參數值分別為HIGH、LOW,選擇使用1、0來當參數也是可行的。
請注意:HIGH、LOW均為大寫

digitalRead(pin)

digitalWrite相反,digitalRead會讀出此腳位被送入的電位為高電位(3.3V)或低電位(0V),也就是HIGH或LOW(1或0)。在類比訊號中也有類似的函數analogRead,但後者讀取的是連續變化的電壓值,之後在類比訊號的函式介紹中再介紹。

除了上述三個函式外,你可以再搭配delay(ms)函式來達到延遲的效果,裡面的參數要延遲多少毫秒,如果沒有適當的使用此函式,可能會造成高低電位切換太快導致看不效果的情況!

霹靂燈

在霹靂燈的練習中,我是使用LEDBar來取代10顆單獨的LED燈,可以看看自己手邊來決定要如何配置你的霹靂燈~
霹靂燈的效果是LED燈會依序從左到右(反之亦然)點亮再熄滅。

const int ledCount = 10;    // 總共有幾顆燈

int ledPins[] = {
  16, 17, 5, 18, 19, 21, 3, 1, 22, 23
};   // 使用一陣列來記錄所使用的GPIOs


void setup() {
  // 用一個for迴圈來設定所有的LED模式
  for (int thisLed = 0; thisLed < ledCount; thisLed++) {
    pinMode(ledPins[thisLed], OUTPUT);
  }
}

void loop() {
    for (int thisLed = 0; thisLed < ledCount; thisLed++){
      digitalWrite(ledPins[thisLed], HIGH);
      delay(50);
      digitalWrite(ledPins[thisLed], LOW);
      delay(50);
    }
      for (int thisLed = ledCount-1; thisLed >= 0; thisLed--){
      digitalWrite(ledPins[thisLed], HIGH);
      delay(50);
      digitalWrite(ledPins[thisLed], LOW);
      delay(50);
    }

}

https://s19.aconvert.com/convert/p3r68-cdx67/wpb4w-qzhuw.gif
(我把影片轉為.gif,所以看起來有點卡卡的><)

太空船介面(練習)

太康船介面的效果是,當A腳位未接收到高電位時,兩顆紅燈會交錯閃爍,直到A腳位確實收到高電位,則兩顆紅燈停止閃爍,換成綠燈長亮。如果你有按鈕的話,可以將A腳位串接上按鈕來控制開關,如果沒有的話,可以直接使用一條杜邦線拔插,是一樣的效果,只是要注意雜訊的問題,至於如何處理雜訊,請參考「ESP32_DAY9 開發好夥伴-電阻
https://s27.aconvert.com/convert/p3r68-cdx67/rork4-8giim.gif
(又是.gif)
給不熟C++的人小提示: 可以用if else來判斷讀取到的是高或低電位


上一篇
ESP32_DAY11 短路
系列文
一個營建系學生的韌體之路-ESP32篇12

尚未有邦友留言

立即登入留言