Graphing on an Arduino, the EASY WAY!
Intro: Graphing on an Arduino, the EASY WAY!
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);
}
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);
}
6 Comments
BilalA20 8 years ago
it will make the loop duration varying, will have extremely bad results.
Phil_S 9 years ago
Hello,
Not a very nice graph, russ? What do you expect on Serial Monitor? Not Excel. Just be grateful.
Actually, very nice, just what I was looking for for looking at temporary temperature changes - mapped 0 to 50 degrees C to 0 to 100 or 0 to 200.
Well done chowmix
alexis Water Features 9 years ago
Thanks a lot! Such a simple idea and very effective for what I wanted which was to roughly represent an audio output into the arduino.
davidsmith99 11 years ago
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[15]; // 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 |--------------------- |
russ_hensel 11 years ago
ahz 11 years ago
very handy and easy to use
big thanks ;)