Graphing on an Arduino, the EASY WAY!

14,608

80

6

About: I am a young engineer who likes to build things. My motto is Why buy, when you can Make! in 2010 I got an Arduino and I plan to use it to make more things and bring more instructables.

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);
}

Electronics Tips and Tricks

Finalist in the
Electronics Tips and Tricks

Share

    Recommendations

    • Electronics Tips & Tricks Challenge

      Electronics Tips & Tricks Challenge
    • Plastics Contest

      Plastics Contest
    • Audio Contest 2018

      Audio Contest 2018

    6 Discussions

    0
    None
    BilalA20

    3 years ago on Introduction

    it will make the loop duration varying, will have extremely bad results.

    0
    None
    Phil_S

    3 years ago on Introduction

    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

    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.

    0
    None
    davidsmith99

    5 years ago on Introduction

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

    0
    None
    russ_hensel

    6 years ago on Introduction

    Not a very good graph, but so simple it gets my vote ( do I have one? ).

    0
    None
    ahz

    6 years ago on Introduction

    very cool trick
    very handy and easy to use

    big thanks ;)