Guino: Dashboard for Your Arduino




About: IMPORTANT: Please do not message me personally with technical questions. Use the comments in the respective Instructables. I really love sharing and helping people makes much more sense in a shared space whe...
This project is a part of experiments done while doing an artist in residence at Instructables. You can see the other projects here.

It can be a tricky task to debug and visualize realtime data on the Arduino board. You are usually stuck with the standard serial output, as the complexity of your Arduino code grows this makes it impossible to comprehend what is actually going on inside the board. To solve this I have created a little library that will enable you to create your own custom GUI for your Arduino projects. Watch this video to get a demonstration of a basic hello world with a potmeter and a diode:

As of now, the program has the following possibilities and features:

Custom design your interface from the Arduino board
You define which sliders, graphs and buttons you need for your interface. You do this in your Arduino sketch which means that the gui program acts as a slave to the sketch. All information is stored in your board.

Visualize and manipulate realtime data 
Whether you are making an RGB light controller or a robot arm, getting a graphical feedback is crucial to understand what is going on inside the board. This enables you to understand whether it is your hardware or the code that is causing problem. Further the sliders and buttons enables you to tweak the individual parameters in realtime. This way you can see what effect different thresholds have on the interaction.

Save the parameters in the boards memory
When you have tweaked the parameters you can save them to the EEProm of the board. The parameters will be auto loaded next time you power on the board, even if the computer is not connected.

Use the same app for all your Arduino projects
I have made tons of small apps for different projects. My problem is always to find them again a year later. Because we save everything in the Arduino I only need to keep one app around the Arduino will automatically configure the app for the current project.

Prototype the interface before you turn on the soldering iron
Because you can design the gui as you like it (within reasonable limits), you can prototype the interface before you have made a physical interface. This also enables you to divide the tasks between multiple people e.g. one person is working on the hardware and another person is working on the code. When you have made the physical interface the Guino will integrate seamlessly. 

Use it as a fullscreen dashboard
You can use it as a fullscreen dashboard by pressing F and pressing T toggles the visibility of the settings panel. You hereby only present your custom interface for the world around you.

Control the background color
The background color can be controlled from the Arduino this enables you to create different colors for different sketches. It can also bes used to make alerts when something is wrong. It can be green when everything is ok and red when something is wrong.

Fast and Slim
I have taken great care in making the footprint on the Arduino as small as possible - It only stores a minimum amount of data in the memory (concretely a pointer list of 100 items). This setting can be changed to lower or higher depending on the amount of gui items you intend to have in your interface. Further the system relies on the EasyTransfer library which transfers the information in binary form. Each package consists of a byte for command, a byte for item # and an integer for the value. Ideally, all your data should be normalized to a 16 bit signed integer range. This means optimal usage of the serial port when working with integers (technically we use a little extra space for a checksum). 

Good for Instructables
The GUI enables you to make Instructables that only requires the core components. Extra components like potmeters etc. can be made virtually via the gui.

Limitations and future plans
Right now the app has been compiled to the Mac OSX and Windows platform. It is written in Openframeworks so It should be able to run on other platforms  as well. Since the app is using the serial port you will not be able to connect other programs to the Arduino. This will be solved in a future release which will include a Open Sound Control and a Midi bridge.

Programming and idea by: Mads Hobye
Easytransfer library by: Bill Porter
GUI library by:  Reza Ali


Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Getting Started

  • Download and unzip the GUINO package.
  • Download Arduino
  • Copy the libraries folder to your Arduino libraries folder (how to here)
  • Restart Arduino.
  • Open one of the examples within Arduino. (Menu: Files -> Examples -> Guino -> pick one)
  • If you use the simple example then make a circuit as illustrated above.
  • Upload the example.
  • Run the Guino app.
  • Choose the serial port (Usually the last one)
  • Press connect.

Source can be found here.

IMPORTANT: When using it on the Windows platform you have to use a com port which lower or equal to 10. If you use a port that is 10 or above the system will not work. This is a bug in openframeworks.

Step 2: How to Modify the Code

For the library to work with your sketch, you need a couple of extra methods. I have described them below:

gInit() this is where you define your layout
This method defines the layout by adding components sequentially. Components that can be changed (slider, buttons etc.) have a variable attached to it. The & in front of the variable means that we do not want to pass the value in the variable, but we want to pass a reference (pointer) to the variable. This way the Guino system automatically updates them when changes happens in the GUI.

void gInit()
   gAddSlider(0,255,"LED BRIGHTNESS",&ledLight);
  // The rotary sliders
  gAddLabel("ROTARY SLIDERS",1);
  // Add more stuff here.
   gSetColor(r,g,b); // Set the color of the gui interface.

GButtonPressed(int id) this is called whenever a button has been pressed
Generally variables can be updated automatically, but in the case of a button it needs to be an event you take care of. In this example we set the height variable to 100 when somebody presses the button.

void gButtonPressed(int id)
  if(buttonId == id)
    height= 100;

gItemUpdated(int id) This is called whenever and item has been updated
It is usually not necessary to use this since the system will update the variables automatically. If you want to react to a change you can use it as such. In this case we are updating the background color whenever one of the 3 rotary sliders has been changed.

void gItemUpdated(int id)
  if(rotaryRID = id || rotaryGID == id || rotaryBID == id)

Step 3: A Few Quick Tips

Remember to disconnect when uploading a new sketch
You cannot have the Guino running while uploading a new sketch to the Arduino board, because they use the same serial connection. This requires you to disconnect every time you upload a new sketch. If you (and you will) try to upload while having the Guino connected, the board can go into some strange state where it is kind of running, but not quite. At this point your only option is to reset the board by pressing the reset button or by disconnecting and reconnecting the usb cable.

Known bugs
As of now the system is working and stable. The following are bugs one should be aware of:
  • setMin does not work on a movingGraph (there seems to be a bug in GUI library that needs to be fixed). So minimum stays on zero.
  • The serial list is loaded when starting the program. The Arduino has to be plugged in before starting the program. Refreshing the serial list while running cause a bad event. It has yet to be solved.
  • Fiddling with the serial list - sometimes makes the program crash (same gui event as refresh - have to find the source)
  • Toggle buttons background becomes black depending on initialization. I need to set the background manually.
  • On some windows platforms the com port does not show up. Might be a ftdi driver issue.

Step 4: Use Cases

If you want to see some use cases with the Guino interface go to this Instructable.

1 Person Made This Project!


  • Made with Math Contest

    Made with Math Contest
  • Multi-Discipline Contest

    Multi-Discipline Contest
  • Robotics Contest

    Robotics Contest

106 Discussions

Lyno _

5 months ago

Hi mads,

I have installed Guino and have managed to get it running. But im unsure about how I get it running with my capacitive sensor sketch in Arduino?



Question 1 year ago

Trying to run this on macOS High Sierra (10.13.6). On launching GUINO app got a message about incompatibility and the GUI doesn't display properly. Any way of getting it to run?


3 years ago

Sorry for beginner questions but I'm newbie to Arduino. Looking for gui for arduino for displaying sensor data including gps position overlay with satelite images. Would Guino be best solution for this? hope to incorporate images as well with standard gui such as text, sliders, graphs, and buttons.

1 reply

Reply 3 years ago

Forgot to mention but gui would be running from lcd screen and not from pc. Example of what trying to do includes mp3 player which would include album art image with slider, play controls. and time remaining/elapsed.


3 years ago

the guino.h and guino.cpp files are missing from the guino folder. Both are available on github - if you create the files and add them to the folder that you place in the library, it will work...


6 years ago on Introduction

Hello Mads, I have one question about graphs. Is it possible actually to have more than one value per graph? I would like to have 4 temperature values one one graph. Thanks for help.

1 reply

6 years ago on Introduction

First off, GUINO is wonderful. Thanks for putting this out there!

I'm having a problem getting it to work. The example sketch works fine on my Arduino Uno (ATMEGA328) and Arduino Nano (ATMEGA328p) but not with an Arduino Micro (ATMEGA32u4). The error is related to EasyTransfer:

error: no matching function for call to 'EasyTransfer::begin(byte*, unsigned int, Serial_*)

Then it gives me a "candidate" in EasyTransfer.h

Do you know what this error means?

1 reply

Reply 3 years ago

I am having this same issue!


3 years ago

I am using your GUINO and love it! But I want to do a few more things with the graph that aren't currently supported and I am struggling to understand your code. I want to be able to display the scale on the graph as well as show the current value of the live graph.

I also would like to enter exact values rather than just sliders. Idk if these are possible by just rearranging the code is some ways just let me know!


4 years ago

Very very very helpful GUI, thanks guys, love it, BUT, i have the same problem with GabrielS33 (below), it cannot visualize float/double type data, how can we solve it? I also try to use updatable "gAddLabel", no error, but the GUI only showing a static "?" symbol. Is there any solution?


4 years ago on Introduction

hi madshobye this application (guino) its wonderful, i make project about analog voltage but guino value type data is integer, can guino convert voltage int to float?, thank you madshobye

this my code

int sensorValue;

float voltage;

float input2volts = 5.0/1023.0;

void setup(){


pinMode(13, OUTPUT);


// Start the guino dashboard interface.

// The number is your personal key for saving data. This should be unique for each sketch

// This key should also be changed if you change the gui structure. Hence the saved data vill not match.



void loop(){

// **** Main update call for the guino


sensorValue = analogRead(0);

voltage = round(sensorValue *(5.0 / 1023.0));




void gInit()




// Last parameter in moving graph defines the size 10 = normal

gAddMovingGraph("VOLTAGE 0-5V ",0,5,&voltage, 10);



this is the error compile in arduino

BasicPotmeterAndLcd2.ino:168:34: error: cannot convert 'float*' to 'int*' for argument '4' to 'int gAddSlider(int, int, char*, int*)'

BasicPotmeterAndLcd2.ino: In function 'void loop()':

BasicPotmeterAndLcd2.ino:269:24: error: invalid conversion from 'float*' to 'int' [-fpermissive]

BasicPotmeterAndLcd2.ino:46:6: error: initializing argument 1 of 'void gUpdateValue(int)' [-fpermissive]

Error compiling.

Hi and thank you so much for this amazing application. One question : how can I send a specific value to arduino from GUI (sliders and rotary sliders don't allow to send sharp values, for exemple, if I want to send 100.00, it's too difficult with sliders, I can olny send 100.02 or 99.95...Possible to add a button with a textbox in witch we can put the desired value (in my cas 100.00) ? Thanks a lot !!


6 years ago on Introduction

Hi all!! Here's an update of the Arduino Data Acquisition System (A.D.A.S.). You can see GUIno in action. I use it on touchscreen and I would like to be able add smaller colomns and to make some sort of numeric keyboard on screen. Is it possible to have smaller colomns? Once finiched I think I will do an Instructable, with the PCD for RJ45 where all sensors are connected, like on the picture, and I will publish also the arduino code...

3 replies

Hi Slobodan123! i am really interested in getting to know further about your project! is it running on a computer system? or did you attach a GLCD and were able to run this? i am looking to create a touchscreen dashboard for a car and am completely lost as to how to go about it. any suggestions would be really helpful!

Sorry for this late responce. I'we been working on other projects in last time and now i wanted to go back to Arduino and Guino and now I cannot make it work! Guino just crash at startup. I run Windows 7 32 bits freshly installed. Maybe it need some VB packages? can someone help me, please?


Reply 5 years ago on Introduction

Hi... I am using Guino dashboard for blinking an Led at about every half of millisecond, and I am plotting the graph according as the led turns on and off. The problem is the width of graph is tooo small to recognize the signal. How can we increase or manipulate the axis???


5 years ago on Introduction

This is awesome and thank you for it!! I have a question though when I compile your example code to check if everything is set up right. It compiles and uploads but once I open GUINO and try to select a com port (mine shows only com10 no matter what USB port I connect to). The terminal window says Selected: COM10

OF: OF_LOG_ERROR: ofSerial: unable to open port.

I don't really know what to do to fix this.

1 reply

Thank you for this wonderful app!

I'm having this error at compile time:

Guino_libray.ino: In function 'void gBegin(int)':
Guino_libray:172: error: no matching function for call to 'EasyTransfer::begin(byte*, unsigned int, usb_serial_class*)'

Is there a fix for this compile error?