作者:尤濬哲
本篇我們要利用ESP32的數位讀取(digitalRead)來製作來客通知器,也就是「當有人經過時會亮紅燈,沒人經過時亮綠燈」,本篇會結合數位寫入digitalWrite功能,並使用紅色、綠色LED顯示狀態。
數位讀取也稱為數位輸入、數位感測等,都是代表這種方式只能讀取狀態,而數位則代表狀態只有LOW或是HIGH兩種狀況,例如人體紅外線(SR-501模組)裝置只會提供”有人”(HIGH)或者”無人”(LOW)。相對數位讀取另外一種則是類比讀取AnalogRead,例如雨滴感測來說,它會提供雨滴大小的可能數值,ESP32來說就是介於0-4095之間,而0代表雨滴非常多、4095則代表目前是乾的,但可能也會讀到數值=1200之類,代表雨滴不大也不小,這單元則於下一節介紹。
至於使用者會疑惑哪些感測器是數位還是類比讀取?則必須查該感測模組的格文件或者詢問賣家,當然也可以靠經驗,例如上述的雨滴、瓦斯氣體(mq系列)、土壤…等等都是類比,而人體、觸控則是數位;有些模組則會兩種都提供,例如瓦斯氣體感測有提供DO(Digital Out)及AO(Analog Out)腳位,若是選擇使用DO則程式使用數位讀取(digitalRead),若是接在AO是選擇類比讀取(Analog),這部份會於後續介紹。
一、材料準備
要製作來客通知器除了主板ESP32及紅、綠LED之外,我們還需要人體紅外線(PIR SR-501)感應器如下圖。
SR-501的感應參數如下圖:
另外一個要注意的部份就是SR-501的兩個旋鈕用途及腳位,如下圖:
功能特色如下:
- 敏感度旋鈕:調整感應的距離,從3公尺到7公尺左右。
- 時間延遲旋鈕:觸發後,要多少要持續HIGH多久時間,調整範圍是3秒-300秒左右,建議逆時針轉到底,減少持續時間到3秒左右
- VCC:供電端,使用5V或3.3V皆可
- OUT:訊號輸出,輸出到指定GPIO,LOW或HIGH
- GND:接地端,接到GND
- 觸發模式:採連續觸發或間段觸發,這裡建議保持在LOW的位置
由於一般上課都在教室內,教室內到處都是人體所散發的紅外線,因此經常會有神奇的觸發現象,筆者建議將兩個旋鈕全部逆時針轉到底,以降低敏感度及持續時間。
市面上SR-501廠家眾多,但有些廠家並未標明VCC、OUT、GND等腳位,不過其實是因為他們是標在正面,也就是白色橢圓形內部,建議拆開檢查確認腳位,若插錯正負級會導致零件故障。而白色橢圓形的功能是用來收集更多的紅外線,讓它感應範圍更廣。
二、ESP32線路佈置
先接好三色LED在麵包板右側序號為4、5、7的位置,而這對應的是GPIO15、2、4,再將5V及GND引入麵包板右側正負電符號的直排,這篇我們須再接上SR-501,我們利用公母杜邦線將SR-501的OUT線對接在右8,也就是GPIO16,VCC則接5V,GND接GND,完整佈線圖如下:
看到這裡,有些學過ESP8266或Arduino UNO的人會有疑問的是,ESP32要怎麼區分數位、類比腳位?因為傳統UNO及8266都有分數位腳位或類比,數位感測器必須插在數位腳上,類比感測必須插在類比腳位(如下圖)。
然而ESP32最大的特色就是他的腳位不分數位類比,只要在程式中寫明數位讀取或類比讀取即可,不過感測必須使用ADC腳位(粉紅標示),相關說明請參閱:ESP32 Arduino開發環境架設。
三、撰寫程式
1.簡易SR-501測試
首先我們先測試SR-501是否正常,每一秒檢測一次是否有人經過,當感應到紅外線時,在序列視窗顯示「Coming」,沒有感測到時,則顯示「None」。
數位感測用的是digitalRead(腳位編號),而輸出的值也只有HIGH或LOW兩種狀況,因此可以利用digitalRead(16) == HIGH來判斷是否有人經過。範例程式如下:
void setup() {
//setup設定,只執行一次
Serial.begin(115200);
pinMode(16, INPUT); //宣告GPIO 16作為輸入(人體紅外線SR-501)
}
void loop() {
//loop迴圈,重複執行不停止
if (digitalRead(16) == HIGH) {
Serial.println("Coming");//偵測到有人經過
}
else {
Serial.println("None");//偵測無人經過
}
delay(1000);//休息1秒
}
2.以LED顯示
接下來我們來整合SR-505及紅綠LED,當有人經過時,顯示紅燈,無人經過時,顯示綠燈。範例程式如下:
void setup() {
//setup設定,只執行一次
Serial.begin(115200);
pinMode(16, INPUT); //宣告GPIO 16作為輸入(人體紅外線SR-501)
pinMode(4, OUTPUT); //宣告GPIO 4作為輸出(紅LED)
pinMode(15, OUTPUT); //宣告GPIO 15作為輸出(綠LED)
}
void loop() {
//loop迴圈,重複執行不停止
if (digitalRead(16) == HIGH) {
Serial.println("Coming");//偵測到有人經過
digitalWrite(4, HIGH); //亮紅燈
digitalWrite(15, LOW); //關綠燈
}
else {
Serial.println("None");//偵測無人經過
digitalWrite(4, LOW); //關紅燈
digitalWrite(15, HIGH); //亮綠燈
}
delay(1000);
}
完成到這裡,我們已經完成透過SR-501知道是否有人經過,當然進一步就可以製作一個簡單的人流計數器,宣告一個變數來紀錄經過的人數,有人經過就+1,最後看該變數的數值即可。
不過使用人體感測器另外一個常見問題是,他是感應紅外線「變化」,例如有一個人進入SR-501範圍時會觸發HIGH,但是他若停留在範圍內保持靜止一段時間後,則SR501就會開始輸出LOW,直到他再開始活動為止,這部份在使用上讀者必須注意。
除了人體感測器之外,其他很多感測也都是數位讀取,例如觸摸感測、振動感測等,接法與程式都相同,請讀者自行測試。對了,目前大部分感測都是3.3V、5V通用,但是有些則是僅能用3.3V,像下面這個觸摸感測,一定要用3.3V,不然會冒煙喔。
(作者為本刊共筆作者,其專欄文章同步發表於作者部落格,原文連結;責任編輯:歐敏銓)
- 舊瓶裝新酒還是新瓶裝舊酒?Jetson Orin Super效能實測 - 2025/03/12
- 低成本空氣品質感測器 – 夏普 GP2Y10開箱實驗 - 2023/03/16
- 【ESP32專欄】ESP32 MQTT與深度睡眠 - 2022/06/20
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!