【ESP32專欄】用 DigitalRead 功能製作「來客通知器」

作者:尤濬哲

本篇我們要利用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)感應器如下圖。

PIR SR-501

SR-501的感應參數如下圖:

S501的感應角度大概110度,感應距離大概3-7公尺

另外一個要注意的部份就是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等腳位,不過其實是因為他們是標在正面,也就是白色橢圓形內部,建議拆開檢查確認腳位,若插錯正負級會導致零件故障。而白色橢圓形的功能是用來收集更多的紅外線,讓它感應範圍更廣。

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都有分數位腳位或類比,數位感測器必須插在數位腳上,類比感測必須插在類比腳位(如下圖)。

Arduino的數位腳位在上,類比腳位在下

然而ESP32最大的特色就是他的腳位不分數位類比,只要在程式中寫明數位讀取或類比讀取即可,不過感測必須使用ADC腳位(粉紅標示),相關說明請參閱:ESP32 Arduino開發環境架設

三、撰寫程式

1.簡易SR-501測試

首先我們先測試SR-501是否正常,每一秒檢測一次是否有人經過,當感應到紅外線時,在序列視窗顯示「Coming」,沒有感測到時,則顯示「None」。

數位感測用的是digitalRead(腳位編號),而輸出的值也只有HIGH或LOW兩種狀況,因此可以利用digitalRead(16) == HIGH來判斷是否有人經過。範例程式如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,當有人經過時,顯示紅燈,無人經過時,顯示綠燈。範例程式如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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,不然會冒煙喔。

觸摸感測器

(作者為本刊共筆作者,其專欄文章同步發表於作者部落格原文連結;責任編輯:歐敏銓)

尤濬哲

Author: 尤濬哲

身兼助理教授/專欄作家/知名部落客,以及點點滴滴科技研發總監等身份,專長包括人工智慧、多媒體互動(Unity)、智慧互動裝置(APP、Arduino)、虛擬實境與擴增實境互動、IoT 實做開發。 學歷:中山大學資訊管理研究所 博士

Share This Post On
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x