牟曉東 牟奕炫
借助PinPong庫,我們用Python編程能控制其“顯示”輸出——向我們展示各種數(shù)據(jù)信息,包括從傳感器獲取的數(shù)字或模擬數(shù)據(jù)、程序運行的結(jié)果數(shù)據(jù)以及根據(jù)所設(shè)定的條件進(jìn)行文字提醒等等。以常見的OLED顯示屏、四位數(shù)碼管以及1602LCD液晶顯示屏為例,在Arduino 中進(jìn)行Python編程,分別進(jìn)行煙霧監(jiān)測數(shù)據(jù)的顯示與提醒、雙按鈕半自動比賽計分顯示和聲光數(shù)據(jù)的同步顯示三個創(chuàng)客實驗項目測試。
1.OLED12864屏
用Arduino UNO一塊,小型面包板一塊,OLED12864顯示屏一塊,MQ-2煙霧傳感器一個,杜邦線若干,打火機(jī)一個,實現(xiàn)顯示煙霧傳感數(shù)據(jù)及提示。
將OLED顯示屏和煙霧傳感器的四個引腳插入面包板;用橙色和白色杜邦線分別將Arduino 的5V 和GND與面包板的紅色和藍(lán)色側(cè)邊電源連接,再用兩對橙色和白色杜邦線分別將OLED 顯示屏和煙霧傳感器的VCC、GND連接至面包板的側(cè)邊電源;用黃色杜邦線將煙霧傳感器的AO模擬數(shù)據(jù)輸出端與Arduino的A0模擬端連接;用紅色和綠色杜邦線將OLED顯示屏的SCL、SDA端與Arduino 的SCL、SDA引腳連接;最后,通過數(shù)據(jù)線將Arduino與電腦的USB端口連接(如圖1)。
在電腦端進(jìn)入Python IDE編輯界面開始編程:
導(dǎo)入相關(guān)的庫模塊:“importtime”“from pinpong.board importBoard,Pin,ADC”“from pinpong.libs.dfrobot_ssd1306 import SSD1306_I2C”; 接著, 初始化Arduino 板:“Board("uno").begin()”, 再初始化OLED 顯示屏:“oled=SSD1306_I2C(width=128, height=64)”, 屏幕的像素點數(shù)為橫向128、縱向64;建立變量Smoke Sensor,為其賦值為“ADC(Pin(Pin.A0))”, 作用是設(shè)置煙霧傳感器通過Arduino 的A0端進(jìn)行模擬輸入。
在“while True”循環(huán)主體部分,先建立變量SmokeSensor_Value,賦值為“SmokeSensor.read()”, 作用是讀取A0 模擬端的數(shù)據(jù),再通過print()語句在電腦屏幕端將該數(shù)據(jù)輸出:“print("Smokevalue:", SmokeSensor_Value)”;接著,通過oled.text("Smoke value:",8,8)”和“ oled.text (Smoke Sensor_Value,60,23)”語句,作用是在OLED顯示屏對應(yīng)的坐標(biāo)位置點顯示輸出文字提示及變量SmokeSensor_Value 的值,后面的語句“oled.show()”作用是將顯示內(nèi)容生效;然后建立一個if 條件分支結(jié)構(gòu),判斷條件是“SmokeSensor_Value>=100”,因為經(jīng)測試后發(fā)現(xiàn),正常情況下MQ-2煙霧傳感器在Arduino的A0端輸出數(shù)據(jù)均在100以內(nèi),當(dāng)打火機(jī)燃?xì)膺M(jìn)入其檢測范圍時,該數(shù)據(jù)會增加;當(dāng)該條件成立時,表示檢測到有危險氣體泄漏,則控制OLED顯示屏先顯示“Alert?。?!”警示信息并持續(xù)3 秒鐘,再將該警示信息“擦除”,擦除方法是用若干個空格覆蓋之前的提示,注意別忘了顯示生效語句;最后,為整個循環(huán)結(jié)構(gòu)添加一個0.5秒的等待(如圖2)。
將程序保存為“OLED 屏顯示煙霧數(shù)據(jù)及警示提醒.py”,按F5 功能鍵運行程序進(jìn)行測試:正常情況下,OLED 顯示屏顯示“Smoke value:” 和“37” 兩行信息,并且每隔0.5 秒鐘就會刷新顯示一個近似范圍的數(shù)據(jù);當(dāng)嘗試用打火機(jī)靠近煙霧傳感器并釋放可燃?xì)怏w時,很快就會在OLED 顯示屏上出現(xiàn)有“Alert?。?!”的警示信息,中間的數(shù)據(jù)也顯示為219、182 之類的較大數(shù)據(jù);直至移走打火機(jī)后,煙霧傳感器監(jiān)測到的數(shù)據(jù)又會恢復(fù)至37、35、33,OLED顯示屏上的“Alert?。?!” 警示信息也隨之消失。同時,在整個測試過程中,電腦屏幕上也會同步顯示“Smokevalue:219”等提示信息(如圖3)。
用Arduino UNO 一塊,小型面包板一塊,四位數(shù)碼管一個,綠色和白色按鈕各一個,杜邦線若干,實現(xiàn)雙按鈕半自動計分器。
在上個OLED 顯示屏實驗的基礎(chǔ)上,先拆除OLED顯示屏、煙霧傳感器和一部分杜邦線,保持Arduino 與面包板間的電源及接地連通;接著,將四位數(shù)碼管插入之前OLED顯示屏的位置,用橙、白杜邦線將VCC和GND端與面包板的側(cè)邊紅色電源、藍(lán)色接地相連,數(shù)碼管的SCL 和SDA端分別通過紅、藍(lán)杜邦線與Arduino的SCL、SDA 引腳連接;然后,在數(shù)碼管的左右兩側(cè)分別插入綠色和白色按鈕,兩個按鈕的VCC和GND端均通過一對橙色和白色杜邦線連接至面包板的側(cè)邊紅色電源、藍(lán)色接地;綠色按鈕的OUT 信號連接至Arduino 的7 號引腳,白色按鈕的OUT 信號輸出端連接至Arduino 的8號引腳(如圖4)。
導(dǎo)入“time”“Board,Pin”“TM1650”庫; 初始化Arduino 板, 初始化四位數(shù)碼管; 建立變量CurrentScore, 賦值為“"00.00"”, 類型為字符串型數(shù)據(jù),再將變量CurrentScore 存儲的字符串顯示在數(shù)碼管上,長度為五位的字符串中間的小數(shù)點會對應(yīng)點亮數(shù)碼管中間的冒號(:); 建立變量ButtonGreen 和ButtonWhite,分別賦值為“Pin(Pin.D7,Pin.IN)”和“Pin(Pin.D8, Pin.IN)”,作用是初始化連接在7 號和8 號引腳的綠色與白色按鈕,設(shè)置為信號輸入端。
在“while True” 循環(huán)主體部分, 建立變量ButtonGreen_value 和ButtonWhite_value 并賦值, 作用是讀取對應(yīng)引腳的電平數(shù)據(jù),按鈕未按下時為0, 按下則會觸發(fā)產(chǎn)生1;接著,建立if 條件選擇結(jié)構(gòu), 當(dāng)電平為1 時判斷按鈕被按下。條件成立則將變量CurrentScore 的值顯示在數(shù)碼管上。建立變量LeftTwo 和RightTwo并賦值。對應(yīng)從變量CurrentScore 所存儲的五位長度字符串?dāng)?shù)據(jù)的首尾兩端截取前兩位和后兩位,注意先截取出的兩位數(shù)據(jù)CurrentScore[:2] 和CurrentScore[-2:]均為字符串,需先使用int()函數(shù)轉(zhuǎn)換為整數(shù)再與按鈕的狀態(tài)值(ButtonGreen_value 或ButtonWhite_value)進(jìn)行算術(shù)加法運算,再使用str()函數(shù)將結(jié)果重新轉(zhuǎn)換成字符串型數(shù)據(jù);接下來,對于新的計算結(jié)果LeftTwo 和RightTwo 要分別進(jìn)行“長度是否為1”的if 條件判斷,條件成立,說明對應(yīng)的比分是十以內(nèi)的個位數(shù),要在其左側(cè)進(jìn)行字符串“補(bǔ)0”;接著,重新構(gòu)建生成變量CurrentScore的值,包括左側(cè)兩位字符(LeftTwo)、中間的小數(shù)點字符('.') 和右側(cè)的兩位字符(RightTwo):“LeftTwo + '.'+ RightTwo”; 最后, 通過語句“tm.display_string(CurrentScore)”, 將新的比分?jǐn)?shù)據(jù)顯示在數(shù)碼管上,為整個循環(huán)添加0.2 秒等待(如圖5)。
保存并運行測試:四位數(shù)碼管應(yīng)顯示比分為00:00,按一次綠色、按兩次白色按鈕,比分應(yīng)變?yōu)?1:02,然后還需測試十位數(shù)控制顯示是否正常(如圖6)。
用Arduino UNO一塊,小型面包板一塊,1602LCD液晶顯示屏一塊,聲音傳感器和光線傳感器各一支,紅色LED 燈一支,杜邦線若干,實現(xiàn)聲音與光線數(shù)據(jù)的同步顯示。
將聲音傳感器和光線傳感器各自的VCC、GND與Arduino的5V和GND相連,將二者的AO 模擬輸出引腳連接至Arduino的A0和A1模擬輸入引腳;1602LCD的VCC 和GND引腳連接面包板的紅色和藍(lán)色電源,將SCL和SDA引腳與Arduino的SCL和SDA引腳相連;在Arduino 的13 號引腳處插入紅色LED燈的正極(長),負(fù)極(短)插入相鄰的GND引腳(如圖7)。
導(dǎo)入庫;初始化Arduino 板;設(shè)置13號引腳的紅色LED燈為數(shù)字信號輸出端,建立變量SoundSensor 和LightSensor并賦值, 將A0和A1模擬引腳的聲音和光線傳感器設(shè)置為模擬輸入方式;對1602LCD液晶顯示屏初始化,I2C 地址為0x27、打開顯示背光,清屏。
在循環(huán)主體部分, 建立變量SoundSensor_Value并賦值, 用來讀取聲音傳感器的模擬數(shù)據(jù);在第一組語句中,先設(shè)置LCD的光標(biāo)位置為第一行第0個字符處,顯示字符串“Sound:”;再設(shè)置LCD的光標(biāo)位置為(6,0),顯示變量SoundSensor_Value的值;類似地,第二組語句是對光線傳感器所監(jiān)測的模擬數(shù)據(jù)進(jìn)行讀取和顯示,注意LCD 光標(biāo)要變?yōu)椋?,1)和(6,1)對應(yīng)第二行;接著,建立if 分支結(jié)構(gòu),如果聲音值大于24且光線值大于100(聲音傳感器和光線傳感器監(jiān)測的數(shù)據(jù)越大,表示環(huán)境光線越暗、聲音強(qiáng)度越大),則控制LED 燈發(fā)光并持續(xù)10 秒鐘;為循環(huán)添加0.5 秒等待,最后關(guān)閉LED 燈(如圖8)。
保存并運行測試:LCD液晶顯示屏應(yīng)顯示兩行實時信息, 如“Sound:24Light:84”。嘗試鼓掌改變聲音數(shù)值,蓋住光敏電阻改變光線值,看是否達(dá)成有聲音光線又暗這兩個條件時,LED 燈發(fā)光并持續(xù)10秒的目標(biāo)。測試任一條件不成立時LED燈熄滅。
如果只有背景光,看不到信息,可試著用螺絲刀調(diào)節(jié)顯示屏背面的藍(lán)色對比度調(diào)節(jié)旋鈕。