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

116,861

45

65

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

  • Plastics Contest

    Plastics Contest
  • Make it Glow Contest 2018

    Make it Glow Contest 2018
  • Optics Contest

    Optics Contest

65 Discussions

0
None
aghosca

1 year ago

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

1 reply
0
None
StefanoR30aghosca

Reply 11 months ago

@line 33 change it with:

buf.popleft()

buf.append(val)

0
None
RitwikaM

2 years ago

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
0
None
electronutRitwikaM

Reply 2 years ago

Without changing the code, run it as:

>python ldr.py --port COM3

What is the output?

0
None
RitwikaMelectronut

Reply 2 years ago

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

0
None
fmarengoRitwikaM

Reply 1 year ago

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!

0
None
fmarengo

1 year ago

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
0
None
Dylan TaylorA

1 year ago

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!

0
None
cristhianc12

2 years ago

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.

0
None
Guddi11

2 years ago

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
0
None
JordiG2

3 years ago on Introduction

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
0
None
electronutJordiG2

Reply 3 years ago on Introduction

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

0
None
DanielleC4JordiG2

Reply 2 years ago

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.

0
None
DanielleC4electronut

Reply 2 years ago

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