Skip to content

Instantly share code, notes, and snippets.

@electronut
Created May 4, 2014 06:14
Show Gist options
  • Select an option

  • Save electronut/d5e5f68c610821e311b0 to your computer and use it in GitHub Desktop.

Select an option

Save electronut/d5e5f68c610821e311b0 to your computer and use it in GitHub Desktop.

Revisions

  1. @mkvenkit mkvenkit created this gist May 4, 2014.
    105 changes: 105 additions & 0 deletions ldr.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,105 @@
    """
    ldr.py
    Display analog data from Arduino using Python (matplotlib)
    Author: Mahesh Venkitachalam
    Website: electronut.in
    """

    import sys, serial, argparse
    import numpy as np
    from time import sleep
    from collections import deque

    import matplotlib.pyplot as plt
    import matplotlib.animation as animation


    # plot class
    class AnalogPlot:
    # constr
    def __init__(self, strPort, maxLen):
    # open serial port
    self.ser = serial.Serial(strPort, 9600)

    self.ax = deque([0.0]*maxLen)
    self.ay = deque([0.0]*maxLen)
    self.maxLen = maxLen

    # add to 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])

    # update plot
    def update(self, frameNum, a0, a1):
    try:
    line = self.ser.readline()
    data = [float(val) for val in line.split()]
    # print data
    if(len(data) == 2):
    self.add(data)
    a0.set_data(range(self.maxLen), self.ax)
    a1.set_data(range(self.maxLen), self.ay)
    except KeyboardInterrupt:
    print('exiting')

    return a0,

    # clean up
    def close(self):
    # close serial
    self.ser.flush()
    self.ser.close()

    # main() function
    def main():
    # create parser
    parser = argparse.ArgumentParser(description="LDR serial")
    # add expected arguments
    parser.add_argument('--port', dest='port', required=True)

    # parse args
    args = parser.parse_args()

    #strPort = '/dev/tty.usbserial-A7006Yqh'
    strPort = args.port

    print('reading from serial port %s...' % strPort)

    # plot parameters
    analogPlot = AnalogPlot(strPort, 100)

    print('plotting data...')

    # set up animation
    fig = plt.figure()
    ax = plt.axes(xlim=(0, 100), ylim=(0, 1023))
    a0, = ax.plot([], [])
    a1, = ax.plot([], [])
    anim = animation.FuncAnimation(fig, analogPlot.update,
    fargs=(a0, a1),
    interval=50)

    # show plot
    plt.show()

    # clean up
    analogPlot.close()

    print('exiting.')


    # call main
    if __name__ == '__main__':
    main()