牟曉東
在進行開源硬件編程和創客作品開發時,我們都會先借助各種傳感器進行各種數據的即時采集,再根據設定的相關判定條件去控制LED燈等外設做出響應。對于傳感器在每個瞬間所“捕獲”的數據,程序通常都是“用完便棄”的一次性處理,如果后期對數據想要進行整理和圖像繪制等二次使用的話,就必須將傳感器在實驗過程中所采集的數據以文件形式存儲,從而達到將實驗數據圖形化“再現”的目的——尤其是多個不同傳感器同時快速采集數據的情況。以常見的掌控板“聲光雙控燈”項目為例,如何同時對聲音傳感器、光線傳感器的數據采集進行同步存儲和Python作圖呢?
在mPython X中通過圖形化編程實現傳感器數據存儲。首先,初始化掌控板的OLED顯示屏進行提示信息的顯示——清除第2行和第3行的信息、在對應坐標位置顯示“按A鍵采集數據”和“按B鍵結束”、OLED顯示生效;接著,編寫“當按鍵A被按下…執行…”主函數,先是初始化兩個文本文件sound.txt和light.txt,分別對應聲音傳感器和光線傳感器采集數據的目標存儲文件;再進入一個“一直重復…執行…”循環結構,將兩個傳感器的“聲音值”和“光線值”分別賦值給對應的兩個變量:“測試聲音值”和“測試光線值”,接著再調用“采集并存儲”函數;接下來,進入一個判斷“按鍵B是否已經按下”的選擇結構,如果條件成立的話,則先調用“讀取并輸出”函數,再執行“中斷循環”模塊跳出該層循環;為了控制兩個傳感器采集數據的時間間隔,需要在循環結構中加入“等待1秒”模塊語句。
自定義的“采集并存儲”函數包括:先將變量測試聲音值和測試光線值由數值型轉為文本再分別寫入sound.txt和light.txt兩個文本文件,注意設置為以回車來分隔相鄰的兩個數據;接著,將這些數據附加提示信息后進行顯示輸出;“讀取并輸出”函數先打印輸出“數據采集結束”的提示信息,然后定義sound_list和light_list兩個列表,通過“讀取文本文件為列表”模塊語句進行賦值,實現從對應的文本文件中讀取已經存儲過的傳感器數據(注意同樣也要設置為對應的“以回車分隔”);最后,將所有的聲音數據和光線數據顯示輸出(如圖1)。

將掌控板通過數據線連接至電腦的USB接口,正常的話會在窗口上方有“掌控板”、“COM4”等提示信息。程序保存后點擊“刷入運行”按鈕,當右下角有“刷入成功”提示信息后,在掌控板的OLED顯示屏上會出現兩行提示信息“按A鍵采集數據、按B鍵結束”;接著,輕觸一下掌控板的A鍵,提示窗口就會每隔1秒鐘出現一行類似于“聲音值為0,光線值為1063”的信息,此時可嘗試敲擊桌子或對著掌控板哼唱幾句歌曲,同時還可以用手捂住光線傳感器或使用手機的“手電筒”進行照射;采集周圍的聲音數據和光線數據一段時間后,輕觸一下掌控板的B鍵,程序則會停止數據的采集(輸出“數據采集結束”),并且將采集的聲音數據和光線數據以列表形式輸出(如圖2)。

點擊mPython X頂端的“文件管理”按鈕,彈出“板載文件管理”窗口,找到其中的sound.txt和light.txt文本文件,分別選中后再點擊“下載到電腦”按鈕,從掌控板的SD卡將它們下載至電腦本地(比如D盤根目錄中);再使用記事本程序分別打開進行查看,其中所存儲的數據正是之前聲音傳感器和光線傳感器每隔一秒鐘所采集到的幾十個數據,每個數據占據一行(如圖3)。

在Spyder編輯器中進行Python代碼編程。
首先,進行matplotlib和numpy庫模塊的導入:“import matplotlib.pyplot as plt”、“import numpy as np”;接著,設置圖像坐標軸能夠正常顯示中文(比如仿宋)和“負數”數據:“plt.rcParams['font.sans-serif'] = ['FangSong']”、“plt.rcParams['axes.unicode_minus'] = False”;然后,從sound.txt和light.txt兩個文本文件中分別讀取之前兩個傳感器所采集到的41個數據,其中的“x = np.linspace(0,40,41)”是用來構建圖像的橫坐標數據,代表每隔1秒鐘進行一次數據采集;分別初始化y_sound和y_light兩個空列表后,使用“with open”方法以只讀方式打開對應的文本文件后,通過range()循環以append()列表數據追加的方法將每個數據添加到列表中,注意還要使用eval()方法將每個原始的文本數據轉換為int整型數據;最后,進行圖像的坐標軸、標題、圖例和網格等的設置,并且調用plt.plot()進行圖像的同步繪制,再將生成的圖像以png圖片文件形式進行保存:“plt.savefig(‘傳感器采集數據.png’,dpi=200)”。
將程序保存為“Python繪制傳感器的采集數據.py”,按F5功能鍵運行測試,在右側的控制臺中就會顯示有預覽圖像的輸出結果;同時,在D盤中也生成了“傳感器采集數據.png”文件(如圖4),實現了將兩個傳感器采集的實時數據先以文本文件的形式存儲后、再通過Python代碼編程繪制圖像展示的目的,大家不妨一試。
