# # hello4.ad.py # receive and display A/D readings # Neil Gershenfeld CBA MIT # 10/29/06 # from Tkinter import * import serial WIDTH = 600 NPTS = 100 HEIGHT = 400 count = 0 path = [] def idle(parent,canvas): global count, path, baseline, offset, gain, filter # # idle routine # lo = ord(ser.read()) hi = ord(ser.read()) value = 255*hi + lo baseline = filter*value + (1-filter)*baseline canvas.itemconfigure("value",text="%d"%value) y = HEIGHT*(1-(offset+gain*(value-baseline))/1024.) path.append(WIDTH*count/(NPTS-1.0)) path.append(y) count += 1 if (count == NPTS): # # update plot # canvas.delete("path") canvas.create_line(path,tag="path",width=3,fill="#00b000") count = 0 path = [] filter = float(wfilter.get()) offset = float(woffset.get()) gain = float(wgain.get()) sbaseline.set("baseline: %.2f filter:"%baseline) # # find framing # ser.flushInput() byte2 = 0 byte3 = 0 byte4 = 0 while 1: byte1 = byte2 byte2 = byte3 byte3 = byte4 byte4 = ord(ser.read()) if ((byte1 == 1) & (byte2 == 2) & (byte3 == 3) & (byte4 == 4)): break parent.after_idle(idle,parent,canvas) # # open serial port # #ser = serial.Serial('/dev/ttyUSB0',9600) ser = serial.Serial('/dev/ttyUSB0',115200) #ser = serial.Serial('/dev/ttyS0',9600) #ser = serial.Serial('/dev/ttyS0',115200) #ser = serial.Serial('COM6',9600) ser.setDTR() # # set up GUI # root = Tk() root.title('hello4.ad.py') root.bind('q','exit') # canvas = Canvas(root, width=WIDTH, height=HEIGHT, background='white') canvas.create_text(.5*WIDTH,.95*HEIGHT,font=("Helvetica", 30),tags="value",fill="#0000b0") canvas.pack() # control_frame = Frame(root) sbaseline = StringVar() wbaseline = Label(control_frame, textvariable=sbaseline) wbaseline.pack(side="left") wfilter = Scale(control_frame,from_=0,to=.1,resolution=.01,orient=HORIZONTAL) filter = 0 wfilter.set(filter) wfilter.pack(side='left') Label(control_frame, text=" offset: ").pack(side="left") woffset = Scale(control_frame,from_=-1024,to=1024,resolution=1,orient=HORIZONTAL) offset = 0 baseline = 0 woffset.set(offset) woffset.pack(side='left') Label(control_frame, text=" gain: ").pack(side="left") wgain = Scale(control_frame,from_=1,to=100,resolution=1,orient=HORIZONTAL) gain = 1 wgain.set(gain) wgain.pack(side='left') quitbtn = Button(control_frame, text="quit") quitbtn.bind('','exit') quitbtn.pack(side="left") control_frame.pack() # # find framing # ser.flushInput() byte2 = 0 byte3 = 0 byte4 = 0 while 1: byte1 = byte2 byte2 = byte3 byte3 = byte4 byte4 = ord(ser.read()) if ((byte1 == 1) & (byte2 == 2) & (byte3 == 3) & (byte4 == 4)): break # # start plotting # root.after(100,idle,root,canvas) root.mainloop()