2.1把Arduino傳來的數值繪圖

Python 程式碼下載

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()