之前的實做如要繪製線型圖,是將傳感器的值,如溫度濕度的感測值送到 Thingspeak,再由 Thingspeak 繪出折線圖,來呈現溫度高低的狀況。一直想說不知是否可以在 Windows 系統中繪製圖形,不要再送到IoT的平台。我找到一個方法,實做一下從 Arduino Analog A0 將可變電阻值送到序列埠,再從 Windows 的 Python 程式讀取序列埠的值,透過 matplotlib 繪製成長條圖。
首先要在 Windows 系統安裝 Python,可到 這裡 下載程式安裝。我的環境安裝 Python 3.7.4,可以執行以下指令,看一下是否安裝 Python 以及目前的版本:
如果沒有安裝 pip 程式,可以到 這裡 下載 get-pip.py 程式,執行以下指令來安裝 pip 程式:
安裝繪圖函式庫matplotlib:
安裝完成後,執行一個畫直線的測試程式看看繪圖功能是否正常。可將下列程式存成一個文字檔,附檔名加上 .py,例如:plottest.py。另外開啟命令列視窗,執行 C:\>Python plottest.py即可。
如果出現下圖,表示函式庫 matplotlib 已正確安裝。
首先要在 Windows 系統安裝 Python,可到 這裡 下載程式安裝。我的環境安裝 Python 3.7.4,可以執行以下指令,看一下是否安裝 Python 以及目前的版本:
C:\>python --version安裝好 Python 之後,再檢查一下是否安裝 Python 的安裝程式 pip,可執行以下指令看看是否已經安裝及檢查版本。
C:\>pip --version如果出現以下畫面就表示已經完成安裝好 pip 程式:
如果沒有安裝 pip 程式,可以到 這裡 下載 get-pip.py 程式,執行以下指令來安裝 pip 程式:
C:\>python get-pip.py安裝的結果如下圖:
[安裝Python繪圖函式庫matplotlib]
安裝繪圖函式庫 matplotlib 所需工具程式:C:\>python -m pip install -U pip setuptools安裝結果如下:
安裝繪圖函式庫matplotlib:
C:\>python -m pip install matplotlib安裝結果如下:
安裝完成後,執行一個畫直線的測試程式看看繪圖功能是否正常。可將下列程式存成一個文字檔,附檔名加上 .py,例如:plottest.py。另外開啟命令列視窗,執行 C:\>Python plottest.py即可。
import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show()
如果出現下圖,表示函式庫 matplotlib 已正確安裝。
[線路圖]
[程式]
以下是Arduino程式:讀取可變電阻的值,送到COM Port,並讓 LED燈每秒閃爍一次,表示程式正在執行。const int analogIn = A0; int analogVal = 0; bool led = 1; void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); } void loop() { //讓Arduino板上的LED閃爍 digitalWrite(LED_BUILTIN, led); led = !led; analogVal = analogRead(analogIn); Serial.println(analogVal); delay(500); }以下是Python程式:讀取COM Port的資料,我的 Arduino 用的序列埠是COM11,可以實際執行的 COM Port修改程式,並在命令視窗執行以下繪圖程式。
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.animation as animation import serial import platform print("Python version: " + platform.python_version()) print("matplotlib version: " + mpl.__version__) fig, ax = plt.subplots() line, = ax.plot(np.random.rand(10)) ax.set_ylim(0, 1030) xdata, ydata = [0]*100, [0]*100 SerialIn = serial.Serial("COM11",115200) def update(data): line.set_ydata(data) return line, def run(data): global xdata, ydata x,y = data if (x == 0): xdata = [0]*100 ydata = [0]*100 del xdata[0] del ydata[0] xdata.append(x) ydata.append(y) line.set_data(xdata, ydata) return line, def data_gen(): x = 9 while True: if (x >= 9): x = 0 else: x += 0.1 try: inRaw = SerialIn.readline() inInt = int(inRaw) except: inInt = 0 yield x, inInt ani = animation.FuncAnimation(fig, run, data_gen, interval=0, blit=True) plt.show()
[結果]
[參考資料]
- Python run on Raspberry Pi to plot serial data from ESP8266/NodeMCU
- matplotlib.org
- https://blog.csdn.net/fengbingchun/article/details/77887050
張貼留言