牟曉東
PinPong庫是一個可用于連接硬件設備進行編程的Python庫模塊,在開源硬件編程中可適用于Arduino、虛谷號、micro:bit、掌控板、樹莓派等常見的開發板。只須在Python編程環境中對初始化語句中的參數進行修改即可。比如在ArduinoUNO中的初始化語句是“Board("uno").begin()”,若換成掌控板則修改為“Board("handpy").begin()”。只要所使用的傳感器連接正確的話,Python編程代碼幾乎不必做改動就能夠在各種開發板之間進行“無縫”跨平臺移植,實現相同的功能。下面以掌控板為例,連接上雨水傳感器和火焰傳感器,通過Mind+環境中的Python編程調用PinPong庫來制作一個水火情警報器。
實驗器材包括:掌控板和擴展板各一塊,FC-37雨水傳感器一個,火焰傳感器一個,各種杜邦線若干。首先,將掌控板正確插入至擴展板中,注意二者的金手指面要緊密接觸好;接著,將雨水傳感器的VCC、GND和AO(模擬數據輸出端)分別通過紅色、白色和綠色杜邦線連接至擴展板的P0引腳組的+、-和P端,注意不是連接DO(數字信號輸出端);類似的連接方式,再將火焰傳感器的VCC、GND和DO分別通過紅色、白色和黃色杜邦線連接至擴展板的P1引腳組的+、-和P端;最后,通過數據線將掌控板與電腦的USB口進行連接(如圖1)。

運行Mind+,切換至“代碼”、“Python模式”,再點擊右上角的“庫管理”項查看是否之前已經安裝過PinPong庫,確?!坝布刂啤眳^域中的“pinpong”項后面按鈕顯示為“已安裝”。
開始在左側的代碼主編輯區進行編程。
首先,進行相關庫模塊的導入,包括導入時間庫:“importtime”、導入PinPong庫中的開發板及引腳類:“frompinpong.boardimportBoard,Pin”、導入掌控板擴展設備:“frompinpong.extension.handpyimport*”。接著,初始化掌控板:“Board("handpy").begin()”,再對P0和P1兩個引腳分別進行電平輸入的模擬數據和數字數據的初始化設置:“P0_pin=Pin(Pin.P0,Pin.ANALOG)”、“P1_pin=Pin(Pin.P1,Pin.IN)”(如圖2)。

接下來進行函數的自定義,包括控制掌控板正面三顆LED燈的亮與滅、OLED顯示屏分別進行“水情預警!”和“火情預警!”文字提示共兩組(四個)函數。
第一組控制LED燈的亮與滅函數分別是lights_on()和lights_off(),每個函數均是通過設置RGB值來控制三顆LED燈的發光顏色,其中的rgb[0]、rgb[1]和rgb[2]則分別對應LED燈的序號,在lights_on()函數中通過“rgb[0]=(255,0,0)”、“rgb[1]=(0,255,0)”和“rgb[2]=(0,0,255)”三行語句分別設置三顆LED燈的發光顏色為紅色、綠色和藍色(其中的數字255若改為127則表示對應顏色的發光強度降低為50%);而在lights_off()函數中,三顆LED的RGB值均設置為0,表示不發光(即熄滅狀態);最后,再通過“rgb.write()”語句使其生效(如圖3)。

第二組控制OLED顯示屏提示“水情預警!”的water_alert()函數和“火情預警!”fire_alert()函數代碼類似,以water_alert()函數為例,先通過語句“oled.DispChar('水情預警!',32,16)”來設置文字提示信息的內容顯示及坐標,再通過語句“oled.show()”使OLED顯示屏生效,并且添加時間等待語句“time.sleep(3)”,作用是控制文字信息的顯示提示時間為3秒鐘;接下來,語句“oled.fill(0)”的作用是將低電平輸出至OLED屏,滿屏均為黑色,最終也仍需添加語句“oled.show()”使顯示生效(如圖4)。

最后編寫“whileTrue”循環主程序:建立變量water_value,為其賦值為“P0_pin.read_analog()”,作用是讀取雨水傳感器所獲取的檢測數據(AO模擬端);建立變量fire_value,賦值為“P1_pin.value()”,作用是讀取火焰傳感器所獲取的檢測數據(D1數字端);再通過兩個print()語句將檢測的數據信息在電腦屏幕上顯示輸出:“print("水信號的檢測(模擬)數據為:",water_value)”、“print("火信號的檢測(數字)數據為:",fire_value)”;建立第一個if條件分支結構,其判斷為“water_value<1000”,因為通過測試發現雨水傳感器的檢測板在“無水”時的輸出值為1040左右,而“有水”時的輸出值為960左右;若該條件成立,說明檢測到“有水”,則分別執行亮燈函數lights_on()、水情預警函數water_alert()和滅燈函數lights_off();第二個if條件分支結構類似,只是判斷條件修改為“fire_value==0”,因為通過測試發現火焰傳感器在“無火”時的輸出值為1(“有火”則為0),條件成立則執行亮燈函數lights_on()、火情預警函數fire_alert()和滅燈函數lights_off();最后,為循環結構添加0.3秒鐘的時間等待語句“time.sleep(0.3)”(如圖5)。

將程序保存,點擊右上角的“運行”進行測試:在“無水”、“無火”的正常情況下,掌控板的LED燈不發光,OLED屏也不顯示任何信息,電腦程序下方的“終端”處每隔0.3秒會顯示一組水與火信號的檢測數據;當在雨水傳感器的檢測板上滴幾滴水時,三顆LED燈發光,同時在顯示屏上出現“水情預警!”的提示,直至將水滴擦除才會解除燈光和文字警報;當在火焰傳感器附近點燃打火機時,LED燈發光,顯示屏提示“火情預警!”,直至熄滅打火機才會解除警報。