import sys, serial import numpy as np from time import sleep from collections import deque from matplotlib import pyplot as plt # class that holds analog data for N samples class AnalogData: # constr def __init__(self, maxLen): self.ax = deque([0.0]*maxLen) self.ay = deque([0.0]*maxLen) self.maxLen = maxLen # ring buffer def addToBuf(self, buf, val): if len(buf) < self.maxLen: buf.append(val) else: buf.pop() buf.appendleft(val) # add data def add(self, data): assert(len(data) == 2) self.addToBuf(self.ax, data[0]) self.addToBuf(self.ay, data[1]) # plot class class AnalogPlot: # constr def __init__(self, analogData): # set plot to animated self.fig, axplt = plt.subplots() #plt.ion() self.axline, = axplt.plot(analogData.ax) self.ayline, = axplt.plot(analogData.ay) plt.ylim([0, 1023]) # update plot def update(self, analogData): self.axline.set_ydata(analogData.ax) self.ayline.set_ydata(analogData.ay) self.fig.canvas.draw() self.fig.canvas.flush_events() #plt.draw() # main() function def main(dev): strPort = dev # plot parameters analogData = AnalogData(100) analogPlot = AnalogPlot(analogData) print('plotting data...') # open serial port ser = serial.Serial(strPort, 9600) while True: try: #.strip(b'\x00').decode('ascii') added for IPython3 line = ser.readline().strip(b'\x00').decode('ascii') data = [float(val) for val in line.split()] if(len(data) == 2): analogData.add(data) analogPlot.update(analogData) except: #Interrupt the kernal to exit print('Exiting') break # close serial ser.flush() ser.close() #Execute prior to plugging in the arduino pre_list = !ls /dev/tty* #Execute after plugging in the arduino post_list = !ls /dev/tty* for tty_dev in post_list: if tty_dev not in pre_list: print("Your device id is {}".format(tty_dev)) dev = tty_dev main(dev) from IPython.display import Image PWD = !pwd Image(filename=PWD[0]+'/figure_2.png') #Image of plot output with 1 variable resister connected and the other line floating Image(filename=PWD[0]+'/Arduino_image.png')