-
-
Save electronut/d5e5f68c610821e311b0 to your computer and use it in GitHub Desktop.
""" | |
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() |
Really nice approach. Might try to use this in a ShrimpKey lesson plan, thanks.
Unfornately it is very slow. When the sensor data changes, I'll wait 10 seconds. Then it changes.
yeah its really slow :(
That is really awesome. Is there a way to add labels on the right side of the Y-Axis (for example, for plotting both altitude and pressure, each with different units)? I'm still learning about these tools and am curious if there's a quick solution for this. How about adding a little text box right on the graph? Thanks!
Where in the code do you input the Port your running your Arduino on. I don't know where to insert my 'COM4' port location?????
I tried to run your code to my arduino test, but it seems that not worked. It is simply don't plotting anything. thanks for the help
@exclaimedpower while running your script you can use --port flag in linux
eg your command will be
python ldr.py --port COM4
I'm having this problem.
$ python3 ldr.py --port /dev/tty.usbmodem411
Traceback (most recent call last):
File "ldr.py", line 10, in
import sys, serial, argparse
ImportError: No module named 'serial'
I've installed $python install serial
@fmendes75 I think that I installed 'pyserial' with pip install pyserial
(or pip3 install pyserial
). Try, I guess that this solve your problem
Nice. Thanks for sharing !
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 ?
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.
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
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)
can we use pyfirmata for the same code ?and how we edit that in this code
nice python