(適合中一以上)上回說過STEM是無處不在,今次我們又舉一個例子吧!2017年,本地巴士公司在巴士內安裝了上層剩餘座位資訊裝置,目的是為乘客們提供上層座位資料。更想用這些資訊,避免乘客在巴士在開動其間到上層去搜尋座位。這個是很典型的STEM例子,巴士公司是利用人體紅外線感應器來檢測乘客在樓梯移動方向,從而計算上層的坐位數量。在這情景中,不但用到感應器,又有程式來判斷樓上座位數量,再加上連接到手機應用程式提供巴士上層剩餘座位資訊,那已達成STEM 基本元素。現在我們來做一個實驗吧!
首先,我們要準備Arduino和兩個人體紅外線感應器,然後,我們接駁兩個感應器就可開始編程。本文章,我會以一步一步的思考方式來教大家怎樣組成此程式的邏輯。
1. 首先我們來看看感應器的規格:
參數 | 值/範圍 |
工作電壓 | 3V–5V |
工作電流(VCC = 3V) | 100uA |
工作電流(VCC = 5V) | 150uA |
測量範圍 | 0.1 – 6m |
默認檢測距離 | 3m |
保持時間 | 1 – 25s |
工作波長 | 7 – 14um |
檢測角度 | 120度 |
2. 接駁兩個人體紅外線感應器Arduino。因為此感應器介面是用數位(Digital port), 所以我們需把D1 連接到Arduino的數位接口。我會把第一個感應器的D1接到Pin 2,之後第二個感應器的D1接到Pin 4。然後把VCC 接到Arduino的3V接口 及GND 接到Arduino的GND接口。
3. 現在我們開始寫程式了。首先因為我們把感應器1的D1接到 Pin 2 同 感應器2的D1 接到 Pin 4 ,所以我們需要作一個定義,給這兩個接收信號的接口。程式碼如下:
#define PIR_MOTION_SENSOR 2
#define PIR_MOTION_SENSOR_2 4
4. 然後,因為我們是次目標是檢測上層剩餘座位數目,所以我們要製作一個變數來儲存上層的座位數量。 如 remainSeat代表此數量,上層座位總共有60個,我們就可把變數設定: int remainSeat = 60; (int = 整數/Integer)。之後再設定2個變數:
a) long previousMillis = 0; (用來延長時間,為等待感應器數感應為0)
b) long interval = 200; (用來延長時間,200 微秒是等待時間)
5. 然後我們需要不停的檢查感應器提供的數字變化來判斷有沒有物件經過樓梯。我們此時可用把相關的程式碼放入迴路中 (void loop())。
6. 然後就用判斷式 if else 來檢查有沒有在感應器中感應到有物件阻擋著感應器。邏輯如下:
1. 判斷樓下的感應器1接收到信號是1和樓上的感應器2接收到信號是0 , 即表示有物件在樓下開始上樓梯。
1.1 之後我們可用用..while迴路, 等待上層第2個感應器檢測到信號1。我們再檢測樓上感應器100次,如果100次迴路內都沒有人經過,就重新開始,但在100次迴路中,當樓上感應器檢測到信號1時,就把remainSeat – 1,最後把剩如的座位數顯示出來。
2. 相反,判斷樓上的感應器1接收到信號是1和樓下的感應器2接收到信號是0 , 即表示有物件在樓上開始落樓梯
2.1 之後我們可用用..while迴路, 等待下層第2個感應器檢測到信號1。我們再檢測樓上感應器100次,如果100次迴路內都沒有人經過,就重新開始,但在100次迴路中,當樓上感應器檢測到信號1時,就把remainSeat + 1,最後把剩如的座位數顯示出來。
7. 等待200微秒。
8. 最後在void setup()中加上:
pinMode(PIR_MOTION_SENSOR, INPUT); // Pin 2 設為輸入模式,用來啟動感樓下應器
pinMode(PIR_MOTION_SENSOR_2, INPUT); // Pin 4 設為輸入模式,用來啟動樓上感應器
這要好好運用手上的感應器和編程,運用STEM當中學會的邏輯思維,多動手試做,便可以做到很多實用的工具!
程序下載︰按我