labs/project/python-serial-plot.py

91 lines
3.0 KiB
Python
Executable File

#!/usr/bin/python2.7
import serial # for serial port
import numpy as np # for arrays, numerical processing
from time import sleep,time
import gtk #the gui toolkit we'll use:
# graph plotting library:
from matplotlib.figure import Figure
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
#needs: python2, pyserial, numpy, matplotlib, pygtk
#0) flash the serial temperature measurement program into the msp430
#1) start this program
#2) press the button the Launchpad to enter 'applcation mode'
#3) warm the chip (eg with a light bulb or your fingers)
#4) when you've seen enough, press the reset button on the launchpad
#5) exit the program by pressing 'q' or clicking on the x
#define the serial port. Pick one:
port = "/dev/ttyACM0" #for Linux
#port = "COM5" #For Windows?
#port = "/dev/tty.uart-XXXX" #For Mac?
#function that gets called when a key is pressed:
def press(event):
print('press', event.key)
if event.key == 'q':
print ('got q!')
quit_app(None)
return True
def quit_app(event):
outFile.close()
ser.close()
quit()
#start our program proper:
#open the serial port
try:
ser = serial.Serial(port,2400,timeout = 0.050)
ser.baudrate=9600
# with timeout=0, read returns immediately, even if no data
except:
print ("Opening serial port",port,"failed")
print ("Edit program to point to the correct port.")
print ("Hit enter to exit")
raw_input()
quit()
#create a window to put the plot in
win = gtk.Window()
#connect the destroy signal (clicking the x in the corner)
win.connect("destroy", quit_app)
win.set_default_size(400,300)
yvals = np.zeros(50) #array to hold last 50 measurements
times=np.arange(0,50,1.0) # 50 from 0 to 49.
#create a plot:
fig = Figure()
ax = fig.add_subplot(111,xlabel='Time Step',ylabel='Distance (cm)')
ax.set_ylim(0,255) # set limits of y axis.
canvas = FigureCanvas(fig) #put the plot onto a canvas
win.add(canvas) #put the canvas in the window
# define a callback for when a key is pressed
fig.canvas.mpl_connect('key_press_event',press)
#show the window
win.show_all()
win.set_title("ready to receive data");
line, = ax.plot(times,yvals)
#open a data file for the output
outFile = open("time_and_dist.txt","w")
start_time = time()
ser.flushInput()
while(1): #loop forever
data = ser.read(1) # look for a character from serial port, will wait up to timeout above.
if len(data) > 0: #was there a byte to read? should always be true.
yvals = np.roll(yvals,-1) # shift the values in the array
yvals[49] = ord(data) # take the value of the byte
outFile.write(str(time()-start_time)+" "+str(yvals[49])+"\n") #write to file
line.set_ydata(yvals) # draw the line
fig.canvas.draw() # update the canvas
win.set_title("Distance: "+str(yvals[49])+" cm")
while gtk.events_pending(): #makes sure the GUI updates
gtk.main_iteration()
# sleep(.05) # don't eat the cpu. This delay limits the data rate to ~ 200 samples/s