micro:bit X MbitBot空汙偵查戰(下篇)

micro:bit X MbitBot空汙偵查戰(下篇)

前言

上一篇「micro:bit X MbitBot空汙偵查戰(上篇)」我們已經教大家如何撰寫基本感測器讀取與顯示程式,也將感測到的資料上傳到ThingSpeak,本篇將教大家如何使用PMS3003 與ESP-12F 的低功號模式,並加入震動感測器的功能。

PMS3003

首先先來說明一下PMS3003 的低功耗模式,還記得我們PMS3003 的接線有一條名稱為SET 嗎? 沒錯!由下圖說明所示,只要將SET 輸入高電位,PMS3003 將工作在連續採樣的正常模式,風扇會一直持續轉動。若將SET 輸入低電位,PMS3003 將進入低功耗模式,風扇將會停止轉動。

PMS3003 的接口標示圖
PMS3003 的接口標示圖

那我們要怎麼將這個功能放入我們之前寫好的程式裡呢?之前的程式是一直重複讀取資料並上傳到ThingSpeak,其實讀取完資料後,資料會存在我們設定的變數裡,如下圖所示:

設定讀取數值的位置
設定讀取數值的位置

當我們調用「Read PMS3003 pin…」 與「DHT 11 pin…」 的程式積木時,micro:bit 會向感測器要資料,然後如上圖我們所撰寫的,將資料依序丟進變數裡(P1、P2、…..),之後程式會進到上傳資料的步驟,這時PMS3003 其實是閒置的狀態,我們可以在此時讓PMS3003 進入低功耗模式,等到上傳完資料後要再讀取PMS3003 前,讓它進到正常模式即可。光是偶爾讓風扇停止轉動就能省很多電了呢!調用的程式積木如下圖:

設定PMS3003 低功耗模式
設定PMS3003 低功耗模式

我們將這個積木如剛剛的描述放在變數們的下方,記得要選對連接pin 的位子,並在set 後方選擇ON 打開低功耗模式。

設定PMS3003 低功耗模式
設定PMS3003 低功耗模式

順便來新增一下當micro:bit 要讀取PMS3003 感測的數值時,開啟正常模式的程式積木。因為開啟時風扇會開始轉動,此時若馬上讀取數值會因為空氣擾動而使讀取的數值不正確。所以在開啟正常模式後,我們會加入一個暫停時間的積木,讓風扇轉動一陣子後再讀取數值。在此小編是設定10秒鐘,其實應該要大過30秒比較保險,您可以依照自己的狀況延長時間。

開啟正常模式與進入低功耗模式的程式積木一樣,只是要在set 的後方選擇OFF 關閉低功耗模式。程式寫到這裡,您的風扇應該會依照程式轉動與停止~

ESP-12F

接下來我們來設定Wi-Fi,什麼時候要讓它進入睡眠模式呢?沒錯!也就是上傳完資料後,傳完資料後我們正開啟PMS3003 的風扇,等到真的讀取到PM2.5 其實過了不少時間,這段時間我們沒有動用到ESP-12F ,所以在傳完資料後我們可以讓ESP-12F 進到睡眠模式,等到讀取完PMS3003 的資料後,再喚醒ESP-12F。

依照ESP-12F 的Datasheet 它的睡眠模式有幾種,分別是Modem-sleep、Light-sleep 與Deep-sleep。很遺憾的依照我們目前的接線(TX、RX、VCC、GND)只能使用Modem-sleep,因為其餘模式如果要喚醒的話,需要多一條線在ESP-12F 的某腳位輸入HIGH才行,但是我們沒有多餘的接線能連接到那隻腳位,有興趣的夥伴可以自行研究,只要再加一組線上去就好了。

要讓我們的ESP-12F 進入睡眠模式非常簡單,MbitBot 程式庫內有包含Modem-sleep 開啟與關閉的程式積木,只要調用下方的程式積木即可。

設定ESP-12F睡眠模式
設定ESP-12F睡眠模式

程式撰寫如下,在上傳完ThingSpeak 後方加入睡眠模式的程式積木,記得連接的pin腳要選對,並在set 後方選擇ON 開啟睡眠模式。

設定連接pin腳,開啟睡眠模式
設定連接pin腳,開啟睡眠模式

那喚醒的積木也與睡眠模式的程式積木一樣,但要在set 後方選擇OFF 喚醒我們的ESP-12F,並於喚醒積木的下方加入暫停時間1 秒的積木來等待它喚醒。

設定喚醒ESP-12F與暫留時間

這樣我們ESP-12F 也完成設定囉!

震動感應器

其實讓PMS3003 與ESP-12F 進入低耗模式,已比之前全開時省電不少,特別是那個風扇一關掉整個非常有感,但是不是忘記還有幾個功能其實都是一直全開的呢?沒錯~就是我們的顯示螢幕、micro:bit 表情LED 矩陣與MbitBot 上的RGB LED 燈,這也是加入震動感測器的原因,概念是當接收到外來震動才會出現上述三種功能,比方說敲敲它、拿起來搖一搖或者敲擊擺放的桌面…等。

會調用到的積木如下圖所示,如果不想加入這功能或沒有感測器的夥伴可以跳過這一部份喔!

設定震動感測器

程式的寫法比較複雜一點,可不是加入「if…else」即可。怎麼說呢~因為整個程式在運行的過程中加入非常多需要等待的指令,例如暫停時間。這類型的積木會讓整個程式凍結在那個步驟,此時若是想讀取其他指令是辦不到的。例如:micro:bit 正開啟PMS3003 的風扇,此時進入暫停10 秒的步驟,等待氣流正常才讀取數值。在10 秒還未到的情況下是沒辦法接收訊息的,因為這個程式流程必須等待這10 秒,就算我們敲的再大力,micro:it 也無法接收到震動感測器的狀態。

照這樣說起來是不是很無解呢?別擔心!MakeCode 提供了另外一個程式積木,這個積木能讓您同時執行兩組程式,那就是所謂的「背景運行」,它位在進階 > 控制的積木儲藏列裡。

設定背景運行程式積木
設定背景運行程式積木

意思是它能有一個正常執行的程式與一個背景運行的程式,且兩個程式的資料可以互通,只要功能不重複,基本上可以看成是兩個獨立運行的程式,當正常執行的A 程式執行等待時間的指令時,背景運行的B 程式依舊可以接收或執行動作,而不會被A 程式影響到。

所以我們把讀取空氣感測數值以及上傳的程式留在「重複無限次」的積木裡,至於OLED 螢幕顯示、micro:bit 表情LED、MbitBot RGB LED 與震動感測器的程式,我們將它寫到背景運行的程式積木裡。

「背景運行」的程式積木不像「重複無限次」的積木一樣,它只會執行一次,但是我們需要一直重複接收敲擊並顯示。所以為了要讓它不斷執行,我們需要加入一個While Loop 進去,那加入While Loop 的背景運行程式看起來會像這樣:

設定 While Loop 程式積木
設定 While Loop 程式積木

所以我們就在背景運行的程式內寫上~當偵測到有振動時,則顯示所要要顯示的項目持續一段時間,如果沒有則關閉所有顯示項目

特別小叮嚀

自從MakeCode 改版之後,上述的寫法只要執行個幾輪就會當掉,為了能夠實現我們想要的功能,我們需要在不停重複的那組程式最後加上「重置」這個程式,這個程式被收在積木列表的進階>控制裡面,這樣每執行完一輪,micro:bit 會自動重啟以避免當機發生。

設定「重置」程式積木
設定「重置」程式積木

本篇的完整範例程式

https://makecode.microbit.org/_7wh7D4TyfPJ5

結論:

這樣就算是大功告成囉!我們在上一篇學習到感測器的讀取與上傳,而在這一篇學習到如何節能的小撇步,至於後續的種種就讓大家發揮囉!比方說幫它找個盒子裝之類的(像封面圖那樣~),懶的找的夥伴可以參考下方iCShop 的「micro:bit 空氣小屋」,那我們就下個主題再見!