我的ESP32實做書籍:我出書了 ESP32 物聯網專題
博客來網址:https://www.books.com.tw/products/0010901195
一、數位寫入語法說明
數位寫入是最基礎的Arduino課程,用來指定某腳位輸出高電壓(HIGH=3.3V)或低電壓(LOW=0)。通常我們必須先告訴ESP32要使用那一個腳位,是用作輸入偵測,還是輸出以開啟某個裝置(例如LED),語法則是
pinMode(腳位,模式);//宣告腳位模式語法腳位是腳位編號,模式則有作為輸入INPUT或輸出OUTPUT,都是大寫
digitalWrite(腳位,電位);//數位寫入語法,腳位是腳位編號,電位則有HIGH或LOW都是大寫,也可以寫1或0
這裡要注意的是ESP32的腳位(如下圖,腳位解說可參閱本文:第一篇 ESP32 Arduino開發環境架設),除了灰色系統用之外,GPIO34-39僅能提供INPUT,另外有些腳位則是有特殊用途,因此筆者會先避開
TXRX:GPIO1、3
I2C:GPIO21、22
SPI:GPIO5、18、19、23
二、ESP32+LED線路佈置
ESP32不像arduino把插孔預留在主板上,而是腳位向下,因此為了方便起見,多會將ESP32插入麵包板中(如下圖),方式是將ESP32的USB插孔朝下,麵包板的編號1朝下,數字多的朝上。
將ESP32腳位對準後,完整用力的壓入麵包板中,避免接觸不良。
再加上ESP32-S的腳位是寫在下方,一旦插入麵包板就無法看到腳位,為了方便起見,會指定所有學生插入相同的位置,參考下圖,不過這樣就會變成實際GPIO編號與麵包板序號不同,例如你可能會說將LED長腳插入GPIO4,學生可能會以為是右側4號,也就是GPIO15,這個很常發生。因此腳位圖,是非常好用的。
我們先準備一個LED,LED的口訣是「長正短負」,也就是長腳接正極,短腳接負極(在arduino中負極可視為GND=接地),這次我們要用GPIO15作為練習,因此我們將它長腳插入GPIO15(麵包板右側4號),短腳插入右側藍色線的位置,這裡預設是要作為GND,因此最後我們再拿一根公對公杜邦線將GND(麵包板右19)引入右側藍色線的位置,這樣整個右側藍色都是GND。
如此便算是設定好本次練習的線路,接下來就可來寫程式。
三、程式撰寫
這次我們來練習LED最常見的範例叫做Blink,也就是閃耀,我們希望它亮一秒後,暗一秒,不斷的重複,
開啟Arduino IDE後,寫入以下程式,相關說明都註解在程式內。
void setup() {
//setup設定,只執行一次
pinMode(15, OUTPUT);//選告GPIO15作為輸出(綠色LED)
}
void loop() {
//loop迴圈,重複執行不停止
digitalWrite(15, HIGH);//將GPIO15綠色LED給予高電位(3.3V)
delay(1000);//休息一秒
digitalWrite(15, LOW);//將GPIO15綠色LED給予低電位(0)
delay(1000);//休息一秒
}
一樣的提醒您,當出現「……____……____」,要按下右側的BOOT按鈕,直至開始燒錄,即可放開(如果沒有放開,要在燒錄完畢後,按一下左側RESET重開機以開始工作)
四、紅綠燈練習
第一個練習完成後,我們可以嘗試稍微複雜的紅綠燈練習,假設紅綠燈的規定是
「綠燈亮5秒、黃燈亮1秒、紅燈亮3秒」
此時我們須先將缺少的黃及紅LED插入麵包板,這裡建議使用黃色使用GPIO2(麵包板右5)、紅色使用GPIO4(麵包板右7),相同的,將長腳插入指定的GPIO,而短腳插入右側的藍色代表GNP的位置,此時佈線如下圖。
程式上,我們必須多宣告黃、紅LED的pinMode,此外每次換燈號時,則必須先關掉原先燈號,再亮後面的燈號,例如綠燈轉黃燈時,要記得下指令關閉綠燈,再開啟黃燈。
void setup() {
//setup設定,只執行一次
pinMode(15, OUTPUT);//選告GPIO15作為輸出(綠色LED)
pinMode(2, OUTPUT);//選告GPIO 2作為輸出(黃色LED)
pinMode(4, OUTPUT);//選告GPIO 4作為輸出(紅色LED)
}
void loop() {
//loop迴圈,重複執行不停止
digitalWrite(15, HIGH);//開啟綠燈
delay(5000);//休息5秒
digitalWrite(15, LOW);//關閉綠燈
digitalWrite(2, HIGH);//開啟黃燈
delay(1000);//休息1秒
digitalWrite(2, LOW);//關閉黃燈
digitalWrite(4, HIGH);//開啟紅燈
delay(3000);//休息1秒
digitalWrite(4, LOW);//關閉紅燈
}