我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


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

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

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

image

一、材料準備

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

image

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

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

image

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

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

image

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

image

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

image

二、ESP32線路佈置

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

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

image

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

image

三、撰寫程式

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秒
}


image

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);
}


20200223_031812

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

 

arrow
arrow

    夜市 小霸王 發表在 痞客邦 留言(0) 人氣()