Skip to content

Instantly share code, notes, and snippets.

@electronut
Created May 4, 2014 06:14
Show Gist options
  • Star 79 You must be signed in to star a gist
  • Fork 32 You must be signed in to fork a gist
  • Save electronut/d5e5f68c610821e311b0 to your computer and use it in GitHub Desktop.
Save electronut/d5e5f68c610821e311b0 to your computer and use it in GitHub Desktop.
Display analog data from Arduino using Python (matplotlib animation)
"""
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()
@ruimartinsptl
Copy link

@fmendes75 I think that I installed 'pyserial' with pip install pyserial (or pip3 install pyserial). Try, I guess that this solve your problem

@mamamiya77
Copy link

Nice. Thanks for sharing !

@ta18
Copy link

ta18 commented Nov 7, 2018

Very helpfull but I have this error when I run my code usage: ldr.py [-h] --port PORT ldr.py: error: the following arguments are required: --port
can you help me ?

@carloszoom3000
Copy link

I'm having the following error:
usage: ldr.py [-h] --port PORT
ldr.py: error: the following arguments are required: --port
An exception has occurred, use %tb to see the full traceback.

@JuanDanielSoto
Copy link

JuanDanielSoto commented Apr 21, 2019

Hi, i really like your job. Can you tell me how could i change de direction of the grafic?, for this code run to turn left, i want to right

@CaptainFatty
Copy link

JuanDanielSoto,

Change addToBuffer to:

add to buffer

def addToBuf(self, buf, val):
if len(buf) < self.maxLen:
buf.append(val)
#buf.extendleft(val)
else:
#buf.pop()
#buf.appendleft(val)
buf.popleft()
buf.append(val)

@Prabhjot2800
Copy link

can we use pyfirmata for the same code ?and how we edit that in this code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment