Graphing on an Arduino, the EASY WAY!

14,733

80

6

Sometimes when you're testing a sensor or debugging a value in an Arduino project, you want to see something other than numbers flying by in the Serial Monitor. However, you want to get the sensor working quickly, and you don't want to take the time to write code to graph it or display it in an intricate way.

Well, we can fix that :)

The trick is very simple. However it graphs it sideways, but hey, it's quick and easy.

The basic idea to graphing really quickly is this
print a basic letter, which can be a unit for the graph such as a lowercase L, l;

however, we want to print this letter repeatedly to emulate a graph.

Pseudocode:

//Gather Sensor Data;

// scale values down to a reasonable size

for(int i = 0; i < (The value you want to graph); i++) {
//print the letter you chose, such as "l";
// but print it all on the same line;
}
// now go to the next line in the Serial Monitor;

Here is some sample code to read and graph the input from AnalogPin A0;

void setup() {
Serial.begin(9600);
}

void loop() {
// Analog Sensor Connected to analog pin 0
int SensorVal = analogRead(A0);

SensorVal = map(SensorVal, 0, 1023, 0, 100);

for(int i = 0; i < SensorVal; i++) {
Serial.print("l");
}
Serial.println();
delay(50);
}

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson. Finalist in the
Electronics Tips and Tricks Participated in the
Pocket-Sized Contest

6 Discussions

I've used similar methods for serial port diagnostics for years.
Here's an enhancement your graph above to print the number to be graphed as well... and to get the format of the number consistent.
Uses Arduino syntax

#include <stdlib.h>
float z = 0;
float y = 0;
float x = 0;
static char dtostrfbuffer;    // needed by graph:  print float

void loop() {
.....
z = graph(y)     // the number you want to graph at a suitable rate such as 1 - 10 Hz}
...
}

int graph (float z)  // draw a text-based vertical graph to monitor
{
int i = 0;
int k = 0;
int maxWidth = 80;
k = int(z);
if (k > maxWidth) k = maxWidth;  // width of the graph "column"
// dtostrf(FLOAT,WIDTH,PRECSISION,BUFFER);
// gist.github.com/2343665
// www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#g6c140bdd3b9bd740a1490137317caa44
dtostrf(z,8, 2, dtostrfbuffer);  // -nnnnnn.nn Use this for a consistent float format
Serial.print(dtostrfbuffer);

Serial.print(" |");
for (i=0; i<maxWidth; i++) {
if (i<=k) Serial.print("-");
else Serial.print(" ");
}
Serial.print("|\n");
return k;
}

OUTPUT looks like:  (needs monospaced font)

46.51 |-----------------------------------------------                                 |
47.32 |------------------------------------------------                                |
45.81 |----------------------------------------------                                  |
42.00 |-------------------------------------------                                     |
41.92 |------------------------------------------                                      |
39.60 |----------------------------------------                                        |
35.07 |------------------------------------                                            |
32.36 |---------------------------------                                               |
29.51 |------------------------------                                                  |
28.58 |-----------------------------                                                   |
23.59 |------------------------                                                        |
22.59 |-----------------------                                                         |
19.63 |--------------------                                                            |
14.75 |---------------                                                                 |
13.98 |--------------                                                                  |
9.38 |----------                                                                      |
6.96 |-------                                                                         |
4.78 |-----                                                                           |
2.87 |---                                                                             |
3.24 |----                                                                            |
-0.08 |-                                                                               |
0.94 |-                                                                               |
-1.70 |                                                                                |
0.01 |-                                                                               |
0.09 |-                                                                               |
-1.47 |                                                                                |
1.31 |--                                                                              |
2.44 |---                                                                             |
1.89 |--                                                                              |
3.65 |----                                                                            |
5.68 |------                                                                          |
9.96 |----------                                                                      |
12.46 |-------------                                                                   |
15.14 |----------------                                                                |
15.96 |----------------                                                                |
20.88 |---------------------                                                           |