2.1把Arduino傳來的數值繪圖
Python 程式碼
功能如下:
1.可以辨識連接電腦的Serial Port (最多五個)
2.手動輸入port
3.可以使用按鈕控制開始記錄與暫停
4.可以儲存畫面為png檔
import time
import numpy as np
import matplotlib.pyplot as pyplot
import win32com.client
from tkinter import *
import tkinter as tk
import serial
window = Tk()
x = []
y1 = []
y2 = []
y3 = []
y4 = []
i = 0
wmi = win32com.client.GetObject("winmgmts:")
serials=[]
for serial_1 in wmi.InstancesOf("Win32_SerialPort"):
serials.append(serial_1.Name)
for i in range(0, len(serials)):
print(serials[i])
arduino = serial.Serial('COM'+input('Please Enter the Arduino Port:'), 9600) #設定Serial Port
fig=pyplot.figure()
def onStartButtonPress():
while True:
if flag.get():
global i
i += 1
time.sleep(0.005)
cmd = arduino.readline().strip().decode('ascii') #Arduino傳來的CSV檔並去掉無效字
print(cmd)
cmd=cmd.split(',') #將csv格式資料拆到容器cmd的四個位置
x.append(int(i)) #插新點在x容器的最後方
y1.append(int(cmd[0])) #插新點在y1容器的最後方
y2.append(int(cmd[1])) #插新點在y2容器的最後方
y3.append(int(cmd[2])) #插新點在y3容器的最後方
y4.append(int(cmd[3])) #插新點在y4容器的最後方
if i > 100 : #可以保持畫面由左到右共100點,取消掉這一串後圖形可以累加數值
x.pop(0) #刪掉x容器的第一個數值
y1.pop(0) #刪掉y1容器的第一個數值
y2.pop(0) #刪掉y2容器的第一個數值
y3.pop(0) #刪掉y3容器的第一個數值
y4.pop(0) #刪掉y4容器的第一個數值
line1.set_data(x, y1)
line2.set_data(x, y2)
line3.set_data(x, y3)
line4.set_data(x, y4)
ax.relim()
ax.autoscale_view(True,True,True)
fig.canvas.draw()
pyplot.pause(0.01) #可以使畫面不當機,一定要加 # update the plot
window.update()
else:
flag.set(True)
break
def onPauseButtonPress():
flag.set(False)
def onExitButtonPress():
print ("Exiting....")
onPauseButtonPress()
arduino.close()
pyplot.close(fig)
window.quit()
window.destroy()
print ("Done.")
sys.exit()
# Create flag to work with indefinite while loop
flag = BooleanVar(window)
flag.set(True)
pyplot.xlabel('number') #改變x軸標題
pyplot.ylabel('AnalogRead') #改變y軸標題
pyplot.title('Title') #改變圖表標題
pyplot.grid(axis = 'y')
pyplot.ion()
pyplot.show()
ax = fig.add_subplot(111)
line1, = ax.plot(x, y1, 'o-', lw=3) #改變線條1樣式
line2, = ax.plot(x, y2, 'o-') #改變線條2樣式
line3, = ax.plot(x, y3, 'o-') #改變線條3樣式
line4, = ax.plot(x, y4, 'o-') #改變線條4樣式
startButton = Button(window, text="Start",command=onStartButtonPress).grid(column=1, row=2)
pauseButton = Button(window, text="Pause",command=onPauseButtonPress).grid(column=2, row=2)
exitButton = Button(window,text="Exit",command=onExitButtonPress).grid(column=3, row=2)
window.attributes("-topmost", 1)
window.mainloop()