-
-
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