我們身處的世界中,任何隨著時間或空間變化的量都是潛在的訊號,他們可以提供物理系統的狀態資訊、或不同物體之間傳達的訊息。
術語「訊號」包括音訊、視訊、語音、圖像、通訊、地球物理、聲納、雷達、醫療和音樂訊號等。
來源: IEEE訊號處理彙刊
訊號可以分為數位訊號、類比訊號兩種。
今天只會先來介紹ESP32中的數位輸入、輸出函式,在之前的LED閃爍範例中,已經使用過了數位輸出了!也就是pinMode
與digitalWrite
的部分,那與digitalWrite
相對的就是digitalRead
,函式的取名非常直白,分別是「腳位模式」、「數位寫出」、「數位讀取」。
請注意:函式的大小寫很重要!千萬不要拼錯了,拼錯的話會編譯失敗喔!!
請注意:函式的大小寫很重要!千萬不要拼錯了,拼錯的話會編譯失敗喔!!
請注意:函式的大小寫很重要!千萬不要拼錯了,拼錯的話會編譯失敗喔!!
你選擇的GPIOs(pin)編號,根據ESP32的腳位功能,除了GPIOs 6~11(以連接SPI flash)與GPIOs 34、35、36、39(僅提供input功能)等腳位外,都能自由選擇下列四種模式:INPUT:、OUTPUT、INPUT_PULLUP、INPUT_PULLDOWN
如果模式選擇了OUTPUT後,可以透過digitalWrite
來控制要送出高電位(3.3V)或低電位(0V),對應之參數值分別為HIGH、LOW,選擇使用1、0來當參數也是可行的。
請注意:HIGH、LOW均為大寫
與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);
}
}
(我把影片轉為.gif,所以看起來有點卡卡的><)
太康船介面的效果是,當A腳位未接收到高電位時,兩顆紅燈會交錯閃爍,直到A腳位確實收到高電位,則兩顆紅燈停止閃爍,換成綠燈長亮。如果你有按鈕的話,可以將A腳位串接上按鈕來控制開關,如果沒有的話,可以直接使用一條杜邦線拔插,是一樣的效果,只是要注意雜訊的問題,至於如何處理雜訊,請參考「ESP32_DAY9 開發好夥伴-電阻」
(又是.gif)
給不熟C++的人小提示: 可以用if else來判斷讀取到的是高或低電位