The below Arduino sketch reads the values from analog pins A0 and A1 and prints it to the serial port.
This is the code
void setup() { Serial.begin(9600); } void loop() { // read A0 int val1 = analogRead(0); // read A1 int val2 = analogRead(1); // print to serial Serial.print(val1); Serial.print(" "); Serial.print(val2); Serial.print("\n"); // wait delay(50); }
The serial port sends values in this format
Using python and Matplotlib am plotting this data as a function of time.I wanted to display this as a scrolling graph that moves to the right as data keeps coming in. For that, I am using the Python deque class to keep and update a fixed number of data points for each time frame.
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 plt.ion() self.axline, = plt.plot(analogData.ax) self.ayline, = plt.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) plt.draw() # main() function def main(): # expects 1 arg - serial port string if(len(sys.argv) != 2): print 'Example usage: python showdata.py "/dev/tty.usbmodem411"' exit(1) #strPort = '/dev/tty.usbserial-A7006Yqh' strPort = sys.argv[1]; # plot parameters analogData = AnalogData(100) analogPlot = AnalogPlot(analogData) print 'plotting data...' # open serial port ser = serial.Serial(strPort, 9600) while True: try: line = ser.readline() data = [float(val) for val in line.split()] #print data if(len(data) == 2): analogData.add(data) analogPlot.update(analogData) except KeyboardInterrupt: print 'exiting' break # close serial ser.flush() ser.close() # call main if __name__ == '__main__': main()
The program must be run in this format
python showdata.py /dev/ttyUSB5
Instead of ttyUSB5 add your ttyUSB device.And this is how the plot looks like.
Happy Hacking 🙂