第04篇 ESP32數位讀取(感測)digitalRead

本篇我們要利用ESP32的數位讀取(digitalRead)來製作來客通知器
「當有人經過時會亮紅燈,沒人經過時亮綠燈」

我的ESP32實做書籍:我出書了 ESP32 物聯網專題
博客來網址:https://www.books.com.tw/products/0010901195


前言

本篇我們要利用ESP32的數位讀取(digitalRead)來製作來客通知器,「當有人經過時會亮紅燈,沒人經過時亮綠燈」,本篇會結合上一篇數位寫入digitalWrite及紅色、綠色LED。

ESP32數位讀取是什麼?

數位讀取也可稱為數位輸入、數位感測等,都是代表這種方式只能讀取狀態是LOW或是HIGH兩種狀況,例如等等要做的人體紅外線(SR-501模組)感測,該裝置只會提供”有人”或者”無人”,而沒有其他種狀態,相對數位讀取另外一種則是類比讀取,例如雨滴感測來說,它會提供雨滴大小的可能數值,以ESP32來說就是介於0-4095之間,而0代表雨滴非常多、4095則代表目前是乾的,但可能也會讀到數值=1200之類,代表雨滴不大也不小。

感測模組要用哪種方式?要選數位還是類比?

必須看該感測模組提供的讀取方式,這必須查看規格文件或者詢問賣家,當然也可以靠經驗,例如上述的雨滴、瓦斯氣體(mq系列)、土壤…等等都是類比,而人體、觸控則是數位,有些模組則會兩種都提供,例如瓦斯氣體感測有提供DO(Digital Out)及AO(Analog Out)腳位,若是選擇使用D0,則程式使用數位讀取(digitalRead),若是接在A0則是選擇類比讀取(Analog)。

感測模組的數位類比輸出腳位

一、材料準備

要製作來客通知器除了主板ESP32及上次用的LED之外,我們還需要人體紅外線(PIR)感應器,目前市面上主要有兩種如下圖。

人體紅外線(PIR)感應器種類

這裡建議購買大顆SR-501,因為它有旋鈕可以調整設定值。SR-501的感應參數如圖

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

SR-501的感應參數

另外一個要注意的部份就是SR-501的兩個旋鈕用途及腳位,

敏感度旋鈕:感應到多強的紅外線才要觸發
時間延遲旋鈕:觸發後,要多少要持續多久時間,調整範圍是3秒-300秒左右,建議逆時針轉到底,減少持續時間到3秒左右
VCC:供電端,使用5V或3.3V皆可
OUT:訊號輸出,輸出到指定GPIO,LOW或HIGH
GND:接地端,接到GND
觸發模式:採連續觸發或間段觸發,這裡建議保持在LOW的位置(如圖)

SR-501腳位與旋鈕位置說明

由於一般上課都在教室內,教室內到處都是人體所散發的紅外線,因此經常會有神奇的觸發現象,筆者建議將兩個旋鈕全部逆時針轉到底,以降低敏感度及持續時間。

SR-501旋鈕靈敏度調整

市面上SR-501廠家眾多,但有些廠家並未標明VCC、OUT、GND等腳位,不過其實是因為他們標是在正面,也就是白色橢圓形內部,建議拆開檢查確認腳位,若插錯正負級會導致零件故障。而白色橢圓形的功能是用來發散紅外線,讓它感應範圍更廣。

SR-501人體感測器實體圖

二、ESP32線路佈置

首先我們還是要先參考ESP32佈線圖

承續上一篇內容(第三篇 ESP32數位輸出digitalWrite)已經接好三色LED在麵包板右側序號為4,5,7的位置,而這對應的是GPIO15、2、4,再將5V及GND引入麵包板右側正負電符號的直排,這篇我們須再接上SR-501,我們利用公母杜邦線將SR-501的OUT線對接在右8,也就是GPIO16,VCC則接5V,GND接GND,完整佈線圖如下。

ESP32與SR-501完整佈線圖

看到這裡,有些學過ESP8266或Arduino UNO的同學會有疑問的是,ESP32要怎麼區分數位、類比腳位,因為傳統UNO及8266都有分數位腳位或類比,數位感測器必須插在數位腳上,類比感測必須插在類比腳位(如下圖)。然而ESP32最大的特色就是他的腳位不分數位類比,只要在程式中寫明數位讀取或類比讀取即可,不過感測必須使用ADC腳位(粉紅標示),相關說明請參閱:ESP32 Arduino開發環境架設(取代Arduino UNO及ESP8266首選)

Arduino UNO數位、類比腳位位置

三、撰寫程式

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);
}
人體感測完成效果

除了人體感測器之外,其他很多感測也都是數位讀取,例如觸摸感測,接法與程式都相同,請讀者自行測試。
對了目前大部分感測都是3.3V、5V通用,但是有些則是僅能用3.3V,像下面這個觸摸感測,一定要用3.3V,不然會冒煙喔。

觸摸感測器

延伸閱讀

???? 第五篇 ESP32 來客報知機:錄放音模組(ISD1820)

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *