牟曉東
PinPong庫是一個(gè)可用于連接硬件設(shè)備進(jìn)行編程的Python庫模塊,在開源硬件編程中可適用于Arduino、虛谷號(hào)、micro:bit、掌控板、樹莓派等常見的開發(fā)板。只須在Python編程環(huán)境中對(duì)初始化語句中的參數(shù)進(jìn)行修改即可。比如在ArduinoUNO中的初始化語句是“Board("uno").begin()”,若換成掌控板則修改為“Board("handpy").begin()”。只要所使用的傳感器連接正確的話,Python編程代碼幾乎不必做改動(dòng)就能夠在各種開發(fā)板之間進(jìn)行“無縫”跨平臺(tái)移植,實(shí)現(xiàn)相同的功能。下面以掌控板為例,連接上雨水傳感器和火焰?zhèn)鞲衅鳎ㄟ^Mind+環(huán)境中的Python編程調(diào)用PinPong庫來制作一個(gè)水火情警報(bào)器。
實(shí)驗(yàn)器材包括:掌控板和擴(kuò)展板各一塊,F(xiàn)C-37雨水傳感器一個(gè),火焰?zhèn)鞲衅饕粋€(gè),各種杜邦線若干。首先,將掌控板正確插入至擴(kuò)展板中,注意二者的金手指面要緊密接觸好;接著,將雨水傳感器的VCC、GND和AO(模擬數(shù)據(jù)輸出端)分別通過紅色、白色和綠色杜邦線連接至擴(kuò)展板的P0引腳組的+、-和P端,注意不是連接DO(數(shù)字信號(hào)輸出端);類似的連接方式,再將火焰?zhèn)鞲衅鞯腣CC、GND和DO分別通過紅色、白色和黃色杜邦線連接至擴(kuò)展板的P1引腳組的+、-和P端;最后,通過數(shù)據(jù)線將掌控板與電腦的USB口進(jìn)行連接(如圖1)。
運(yùn)行Mind+,切換至“代碼”、“Python模式”,再點(diǎn)擊右上角的“庫管理”項(xiàng)查看是否之前已經(jīng)安裝過PinPong庫,確?!坝布刂啤眳^(qū)域中的“pinpong”項(xiàng)后面按鈕顯示為“已安裝”。
開始在左側(cè)的代碼主編輯區(qū)進(jìn)行編程。
首先,進(jìn)行相關(guān)庫模塊的導(dǎo)入,包括導(dǎo)入時(shí)間庫:“importtime”、導(dǎo)入PinPong庫中的開發(fā)板及引腳類:“frompinpong.boardimportBoard,Pin”、導(dǎo)入掌控板擴(kuò)展設(shè)備:“frompinpong.extension.handpyimport*”。接著,初始化掌控板:“Board("handpy").begin()”,再對(duì)P0和P1兩個(gè)引腳分別進(jìn)行電平輸入的模擬數(shù)據(jù)和數(shù)字?jǐn)?shù)據(jù)的初始化設(shè)置:“P0_pin=Pin(Pin.P0,Pin.ANALOG)”、“P1_pin=Pin(Pin.P1,Pin.IN)”(如圖2)。
接下來進(jìn)行函數(shù)的自定義,包括控制掌控板正面三顆LED燈的亮與滅、OLED顯示屏分別進(jìn)行“水情預(yù)警!”和“火情預(yù)警!”文字提示共兩組(四個(gè))函數(shù)。
第一組控制LED燈的亮與滅函數(shù)分別是lights_on()和lights_off(),每個(gè)函數(shù)均是通過設(shè)置RGB值來控制三顆LED燈的發(fā)光顏色,其中的rgb[0]、rgb[1]和rgb[2]則分別對(duì)應(yīng)LED燈的序號(hào),在lights_on()函數(shù)中通過“rgb[0]=(255,0,0)”、“rgb[1]=(0,255,0)”和“rgb[2]=(0,0,255)”三行語句分別設(shè)置三顆LED燈的發(fā)光顏色為紅色、綠色和藍(lán)色(其中的數(shù)字255若改為127則表示對(duì)應(yīng)顏色的發(fā)光強(qiáng)度降低為50%);而在lights_off()函數(shù)中,三顆LED的RGB值均設(shè)置為0,表示不發(fā)光(即熄滅狀態(tài));最后,再通過“rgb.write()”語句使其生效(如圖3)。
第二組控制OLED顯示屏提示“水情預(yù)警!”的water_alert()函數(shù)和“火情預(yù)警!”fire_alert()函數(shù)代碼類似,以water_alert()函數(shù)為例,先通過語句“oled.DispChar('水情預(yù)警!',32,16)”來設(shè)置文字提示信息的內(nèi)容顯示及坐標(biāo),再通過語句“oled.show()”使OLED顯示屏生效,并且添加時(shí)間等待語句“time.sleep(3)”,作用是控制文字信息的顯示提示時(shí)間為3秒鐘;接下來,語句“oled.fill(0)”的作用是將低電平輸出至OLED屏,滿屏均為黑色,最終也仍需添加語句“oled.show()”使顯示生效(如圖4)。
最后編寫“whileTrue”循環(huán)主程序:建立變量water_value,為其賦值為“P0_pin.read_analog()”,作用是讀取雨水傳感器所獲取的檢測數(shù)據(jù)(AO模擬端);建立變量fire_value,賦值為“P1_pin.value()”,作用是讀取火焰?zhèn)鞲衅魉@取的檢測數(shù)據(jù)(D1數(shù)字端);再通過兩個(gè)print()語句將檢測的數(shù)據(jù)信息在電腦屏幕上顯示輸出:“print("水信號(hào)的檢測(模擬)數(shù)據(jù)為:",water_value)”、“print("火信號(hào)的檢測(數(shù)字)數(shù)據(jù)為:",fire_value)”;建立第一個(gè)if條件分支結(jié)構(gòu),其判斷為“water_value<1000”,因?yàn)橥ㄟ^測試發(fā)現(xiàn)雨水傳感器的檢測板在“無水”時(shí)的輸出值為1040左右,而“有水”時(shí)的輸出值為960左右;若該條件成立,說明檢測到“有水”,則分別執(zhí)行亮燈函數(shù)lights_on()、水情預(yù)警函數(shù)water_alert()和滅燈函數(shù)lights_off();第二個(gè)if條件分支結(jié)構(gòu)類似,只是判斷條件修改為“fire_value==0”,因?yàn)橥ㄟ^測試發(fā)現(xiàn)火焰?zhèn)鞲衅髟凇盁o火”時(shí)的輸出值為1(“有火”則為0),條件成立則執(zhí)行亮燈函數(shù)lights_on()、火情預(yù)警函數(shù)fire_alert()和滅燈函數(shù)lights_off();最后,為循環(huán)結(jié)構(gòu)添加0.3秒鐘的時(shí)間等待語句“time.sleep(0.3)”(如圖5)。
將程序保存,點(diǎn)擊右上角的“運(yùn)行”進(jìn)行測試:在“無水”、“無火”的正常情況下,掌控板的LED燈不發(fā)光,OLED屏也不顯示任何信息,電腦程序下方的“終端”處每隔0.3秒會(huì)顯示一組水與火信號(hào)的檢測數(shù)據(jù);當(dāng)在雨水傳感器的檢測板上滴幾滴水時(shí),三顆LED燈發(fā)光,同時(shí)在顯示屏上出現(xiàn)“水情預(yù)警!”的提示,直至將水滴擦除才會(huì)解除燈光和文字警報(bào);當(dāng)在火焰?zhèn)鞲衅鞲浇c(diǎn)燃打火機(jī)時(shí),LED燈發(fā)光,顯示屏提示“火情預(yù)警!”,直至熄滅打火機(jī)才會(huì)解除警報(bào)。