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

Updated: Oct 8, 2019






前言:

上一篇我們已經教大家如何撰寫基本感測器讀取與顯示程式,也將感測到的資料上傳到ThingSpeak,本篇將教大家如何使用PMS3003 與ESP-12F 的低功號模式,並加入震動感測器的功能。


還沒看過上一篇的夥伴可以點選下面的傳送門直接前往:


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



PMS3003 :

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


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



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


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



順便來新增一下當micro:bit 要讀取PMS3003 感測的數值時,開啟正常模式的程式積木。因為開啟時風扇會開始轉動,此時若馬上讀取數值會因為空氣擾動而使讀取的數值不正確。所以在開啟正常模式後,我們會加入一個暫停時間的積木,讓風扇轉動一陣子後再讀取數值。在此小編是設定30秒鐘,其實應該要大過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 開啟與關閉的程式積木,只要調用下方的程式積木即可。


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



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



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



震動感應器:

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


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


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


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

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


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

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



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



特別小叮嚀:

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



本篇的完整範例程式:

https://makecode.microbit.org/_7wh7D4TyfPJ5


結論:

這樣就算是大公告程囉!我們在上一篇學習到感測器的讀取與上傳,而在這一篇學習到如何節能的小撇步,至於後續的種種就讓大家發揮囉!比方說幫它找個盒子裝之類的像封面圖那樣~懶的找的夥伴可以參考下方iCShop 的購買連結,那我們就下個主題再見吧!



購買連結:

micro:bit X MbitBot 空氣小屋


#microbit #PMS3003 #ESP8266 #ESP12F #PM2.5 #ThingSpeak #SleepMode

創客萊吧MakerLab

高雄市左營區博愛二路202號B1F        

0989-250-580