【ESP32專欄】用Arduino ESP32計算防疫場地人數(台灣社交距離APP)

作者:尤濬哲

前幾天(2021/05/15)一大早就聽到老婆在鬼叫鬼叫,原來是確診人數竟然有180,實在太令人害怕了,不過記者會現場介紹了一個APP「台灣社交距離APP」,說可以紀錄「人與人的連接」,我仔細看了一下這個APP的介紹,發現這個構想我以前也想過,但是沒空動手做,反正做了也沒人理我,不過這個原理就是我一直在研究的BLE Beacon,我認為這個APP應該就是利用手機同時模擬Beacon Central(中央)及Peripheral(週邊),也就是手機會廣播自己的藍芽裝置,並同時掃描附近的藍芽裝置,利用RSSI與TX來計算大概距離,這個機制我經常在使用,有些人會害怕個資外洩,但我覺得不會,主要是因為紀錄的是「去識別化」的代號,另外也去中心化,沒有中央伺服器,所以也不會因為使用者太多而導致當機之類。

註:關於Beacon原理可以參閱筆者的以前的文章:ESP32 Arduino Beacon簡易Bluetooth室內定位

為了驗證APP是採用Beacon廣播模式,我利用老婆與妮妮的手機進行測試,當安裝好APP後,開啟藍芽我就可以馬上偵測到一個新的Beacon裝置,開啟該裝置後,查看基本資訊如下圖:

檢查多隻手機後確認,「台灣社交距離APP」使用的UUID應該是「0000fd6f-0000-1000-8000-00805f9b34fb」,沒有Name,而且發現Mac Address會一直變,以往如果我要用Beacon偵測使用者是誰的時候用的就是Mac Address(可以參閱:我那狗子在家嗎?),不過這次APP每次開關藍芽都會變更Mac,我想應該是為了保護使用者不會被我們這種每天想圖謀不軌的人監測,能夠想到這個問題要幫開發者按個讚。

也因為這樣,我們就沒辦法利用這個APP辨識個人嘍,不過呢?我們還是可以算現場人數,計算人數的程式可以寫在ESP32中,不過總不能透過Serial來查看人數吧。我們總是需要一個圖表可以呈現給管理者查看,可以使用的方案有兩個:

1.Nodered+MQTT:這個我還沒製作教學,目前只有PPT講義
2.ThingSpeak:可以參考ThingSpeak教學:ESP32 資料庫存取ThingSpeak圖表製作

由於第1個方法較為複雜,一天寫不完,所以這個範例就利用ESP32及ThingSpeak來計算人數,並且當使用者人數超過範圍時發出Line通知。

1. 開發平台

關於ESP32開發平台可以參考本篇:ESP32 Arduino開發環境架設(取代Arduino UNO及ESP8266首選)

假設讀者們已經完成Arduino ESP32的開發平台設定,這裡要注意的是ESP32核心目前最新版是1.0.6,而我比較習慣的是1.0.4,這兩個版本在Beacon Scan的差異是1.0.6會重複掃描同一個裝置,而1.0.4則是同一個裝置只會紀錄一次,使用1.0.4的好處是我們就不用自己篩選,但是我覺得像1.0.6這樣重複掃描應該是ESP32核心未來的常態,所以這次我就使用1.0.6的重複掃描的方式來修改程式。

2. 程式撰寫

本次我使用的是AI-Thinker的NodeMCU ESP32,對於本次任務還是很容易的,小事情還用不到RPi出馬。程式流程如下:

讀者在上述的圖中可以發現,「掃描到藍芽裝置」是一個很重要的程序,而在ESP32中是以MyAdvertisedDeviceCallbacks來實做,因此我們必須在該程序中完成所有的判斷,然後在一次掃描結束後,就可以計算人數並上傳網站,然後再下一輪的掃描。

註:原始程式請參考Github

Callback部份節錄如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
//列印UUID
String UUID = advertisedDevice.getServiceDataUUID().toString().c_str();
Serial.print("UUID:"); Serial.print(UUID);
//列印RSSI
int RSSI = advertisedDevice.getRSSI();
Serial.print(",RSSI:"); Serial.print(RSSI);
//列印Mac Address
String Address = advertisedDevice.getAddress().toString().c_str();
Serial.print(",Address:"); Serial.println(Address);
//判斷是否符合條件
if (UUID == SocialDistancingAPPUUID && RSSI >= RSSIthreshold) {
if (TotlaMacAddress.indexOf(Address) < 0) {
TotlaMacAddress = TotlaMacAddress + "," + Address;
Serial.println("TotlaMacAddress=" + TotlaMacAddress);
MacAddressCount++;
}
}
}
};

3. ThingSpeak畫面

完成的圖如下:

4. 當人數超過限制時,傳Line給管理員

關於Line Token申請與測試可以參考:ESP32 LINE通知:倉庫溫度異常機器人

而ThingSpeak可以直接連到Line,方式是採用React監測Channel內的欄位數值,並發現超過人數時,以ThingHTTP發送通知,這部份也請參考:ESP32 資料庫存取ThingSpeak圖表製作

4.1 先設定ThingHTTP(日期不對是因為直接改以前的來用)

4.2 設定React

4.3 Line通知

如果一切正常的話,我們就可以收到超過人數的通知喔!

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

尤濬哲

Author: 尤濬哲

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

Share This Post On

發表

跳至工具列