Plotting Real-time Data From Arduino Using Python (matplotlib)

110,652

45

65

Posted in TechnologyArduino

Introduction: Plotting Real-time Data From Arduino Using Python (matplotlib)

About: Open Source Hardware Projects - Microcontrollers, Programming, and new prototyping technologies.

Arduino is fantastic as an intermediary between your computer and a raw electronic circuit. Using the serial interface, you can retrieve information from sensors attached to your Arduino. (You can also send information via the serial interface to actuate circuits and devices (LEDs, relays, servos, etc.) connected to your Arduino.) Once you have the data in your computer, you can do all sorts of things with it – analyze it, display it, or share it on the internet, for instance.

In this instructable, I will be reading and displaying analog data from a pair of LDRs connected to an Arduino. Attached is the schematic.

The Arduino sketch is very simple – it just reads the values from analog pins A0 and A1 (in the range [0, 1023]) and prints it to the serial port.

Here is the code:

https://gist.github.com/electronut/5641938

The serial port sends values in the format:

512 300
513 280
400 200
...

On the computer side, I need to read these values, and plot them as a function of time. I am using Python and the Matplotlib library for this. I wanted to display this as a scrolling graph that moves to the right as data keeps coming in. For that, I am using the Python deque class to keep and update a fixed number of data points for each time frame.

You can see the full implementation here:

https://gist.github.com/electronut/d5e5f68c610821e311b0

3 People Made This Project!

Recommendations

  • Microcontroller Contest

    Microcontroller Contest
  • Space Challenge

    Space Challenge
  • Science of Cooking

    Science of Cooking
user

We have a be nice policy.
Please be positive and constructive.

Tips

Questions

65 Comments

Great! How to reverse the flow of the graph from right to left?

1 reply

@line 33 change it with:

buf.popleft()

buf.append(val)

Hello Elecronut,

Thank you for the code. I am very new to this, so I have been facing quite a few issues with running the code. I keep getting errors while running the argparse command. I replaced port with COM3 like below, but keep getting errors!

def main():

# create parser

parser = argparse.ArgumentParser(description="LDR serial")

# add expected arguments

parser.add_argument('--COM3', dest='COM3', required=True)

Error in python:

usage: test_python.py [-h] --COM3 COM3

test_python.py: error: argument --COM3 is required

My problem is I am not sure where to replace strPort or port with COM3.

Please help!

Thanks!

Ritwika

4 replies

Without changing the code, run it as:

>python ldr.py --port COM3

What is the output?

Thanks, it works!!! I am trying now to add the data to a csv file. Thank you for all the help again!

Hi RitwikaM

Did you happen to execute the python script from a python editor (e.g Spyder)? If your answer is yes, could you please send me your code?
I would like to modify the code so as to plot ONE data series from port COM10. Also, I would like to save the data series on the local HDD.
Thanks!

Dear electronut,

I tried to implement your code in my PC using Spyder editor, but unfortunately it gives me an error (see at the bottom). I also replaced

strPort = args.port

by

strPort = "COM10"

since COM10 is the port I am using in my PC (Windows7 64bits). Even in this case, the error is the same. How can I solve it from the editor, please? Thanks!

usage: ldr.py [-h] --port PORT
ldr.py: error: argument --port is required
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2

Works 'out of the box' which is seriously just fantastic in the world of analog and digital communication. Serial port can be found by looking in your arduino IDE under tools-> serial port. for me it was /dev/ttyACM0

Great work!

good day apologize for my English, I'm from Colombia I am currently developing my thesis project and have been almost impossible to create the code acquisition 4 sensors, I wonder if I can use some of their code in my project. and I wonder if there is any way to predefine the port COM6 not run the program from the console. thank you very much for contribution.

Hi,

I also tried your code and I also get a nice Tk Window, BUT no plot…
apparently analogPlot.update is not called or at least does not do
anything. I already tried some things to fix it, but without success.
Any hint?

Could it be the backend, that doesn’t want to show me anything?

Otherwise, a nice, easy and understandable code!!! Well done!

Thanks in advance.

Robert

1 reply

Hello elecronut,

Thank you for sharing. I like your project and I will use with my robot.

I have a ultrasonic attached to a servo to mapping obstacles. I send to serial port to numbers: angle of the servo and detected distance. Now, I want to graphic the obstacles.

I try your code but I need a XY praph. I mean, use the first number (angle) for X and the second number (distance) as Y.

I tried to make some modification but without any success.

Could you give me any suggestions?

Thank you in advance!

6 replies

Hello,

You need to specify the axes data differently. Take a look at the matplotlib tutorial below:

http://matplotlib.org/users/pyplot_tutorial.html

Regards

Thank you!

Now I can see the problem. I have made some changes and... it works :)!

Hello, I am currently working with the same thing but in a different project. I am just a newbie in python programming would you mind if I ask a copy of the changes you made to make the x axis have a different value instead of time or could you tell me how? I am trying to plot x-axis as velocity and y-axis as position for a phase plot in my case study. Thank You in Advance.

By the way I've already tried this line: a1,=ax.plot([0], [1]), 0-velocity and 1-position, however i didn't get anything on the plotting window.

Thank you for the example you've made, i will try this in my vertical spring oscillation with arduino, hoping it would work :)