-
-
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() |
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
Unfornately it is very slow. When the sensor data changes, I'll wait 10 seconds. Then it changes.