Instructables

Guino: Dashboard for your Arduino

Featured
Picture of Guino: Dashboard for your Arduino
Screen Shot 2012-10-01 at 8.07.42 PM.png
Screen Shot 2012-10-02 at 5.18.12 PM.png
Screen Shot 2012-10-02 at 7.28.20 PM.png
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.

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



 
 
Remove these adsRemove these ads by Signing Up
JimmyD134 days ago

Hi All,

Just wondered if anyone could help me. I'm working with the Guino dashboard and using it to control a two phase measurement system. The problem I'm having is I'm processing input very quickly and need to store them in an array for later calculations. But if I initialise any kind of array in the arduino code. The gInit appears not to run :S and I'm really confused.

Thanks.

Freeto10 days ago

Absolutely love GUINO! Its like LabView for Arduinos but it doesn't look terrible!

That said, any plans to make it Retina-compatible for OSX?

How can I download this?

furioncycle1 month ago

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.

nitro-ale4 months ago
I think guino it's a really nice and powerfull project, but I can't understand how to manage the installation on my pc.
Basically I've downloaded the guino-master.zip on github and installed the library. Next step is to upload the sketch on the arduino, and this is a piece of cake.
But I can't figure how to run the Guino dashboard. Help is really appreciate :)

You may have already figured it out but I want this to be up here because I was blundering around with this same question for about 20 minutes (doh!) -- in the guino-master.zip there are /win and /mac folders (in the same directory you found the /copy folder), extract the system you need and you should find a guino.exe inside!

Very simple but easy to overlook when you're already swamped with so much new info (this is my first real Arduino proj at all and so when i found the .exe and opened it and actual had it working I made a bunch of embarassing pteradactyl noises of excitement.)

farmersride11 months ago
Is it possible to make a version of this distribution that runs over bluetooth COM port? I have been trying to change the code in disneyTouchGuino to use SoftEasyTransfer (instead of EasyTransfer) so it can send data into a bluetooth serial object but have not been successful. Having wireless for this interface would be highly desirable.
Hi farmersride,

Did you ever figure this out? I'm trying to do the same thing as you -- isolate the ground via a bluetooth connection...

Would love any advice/findings you had...
mushroom glue4 months ago
Is it possible to remove objects while the programme is running? I'd like to be able to hide cirtain controls when not needed. I've figured out how to add them, but I can't remove them without resetting the arduino.
madshobye (author)  mushroom glue4 months ago
This is not possible at the moment. It would require a fundamental change in the logic of the protocol. It uses a sequential id and the id list would eventually run out. Plus it would not have a way to place them in the proper order. What could be done, would be to add a possibility to hide controls. This way the system would be able to generate all the controls in the beginning and then hide the ones that should not be presented in any given moment. This would require a some programming work on both sides but could quite quickly.
creativemen4 months ago
hi
i need a help
i have this error
'EEPROM' was not declared in this scope

BasicPotmeterAndLed.cpp: In function 'void EEPROMWriteInt(int, int)':
Guino_libray:49: error: 'EEPROM' was not declared in this scope
BasicPotmeterAndLed.cpp: In function 'unsigned int EEPROMReadInt(int)':
Guino_libray:56: error: 'EEPROM' was not declared in this scope

what i need??
mkocabas4 months ago
Appreciate you Mads... Great work... I'm planning to reveal a dashboard like your... But I will write it in Processing.. Can you share your thoughts on Processing? Is it logical or not?
madshobye (author)  mkocabas4 months ago
Processing would enable other people to hack your gui. So it would be a good idea. You should use mycommunication protocol. This way the arduino code would be compatible.
Thanks for reply. Also for further development, studying on inter-Arduino communication protocol would be a precious idea.. Good luck:)
mgülsuna4 months ago
Hi Madshobye, ı wantto say that great job, and ı am wondering how to code the guino for ds 1307 clock can you post an example pls.
Guy Smith1 year ago
Hi Slobodan..

Here is what I did...

made 2 labels
timeLabel1 = gAddLabel("TIME: ",1);
gAddSpacer(1);
dateLabel1 = gAddLabel("DATE: ",1);
gAddSpacer(5);


and in the code somewhere made a function to call each second. You can use ds1307 and 1hz interrupt of just check if seconds and different.

// used to trigger something every second
int currSec = second();
if(currSec != prevSec)
{
// Clock ticked over another second
PrintTime();
// Update the display
prevSec = currSec;
}



void PrintTime() {

String stringOne = "TIME: ";
stringOne.concat(hour());
stringOne.concat(":");
if(minute()<=9) stringOne.concat("0");
stringOne.concat(minute());
stringOne.concat(":");
if(second()<=9) stringOne.concat("0");
stringOne.concat(second());
stringOne.toCharArray(charBuftime, sizeof(charBuftime));

String stringTwo = " ";
stringTwo.concat(Day[weekday()]);
stringTwo.concat(", ");
stringTwo.concat(Month[month()]);
stringTwo.concat(" ");
stringTwo.concat(day());
stringTwo.concat(", ");
stringTwo.concat(year());
stringTwo.toCharArray(charBufdate, sizeof(charBufdate));

gUpdateLabel(timeLabel1, charBuftime);
gUpdateLabel(dateLabel1, charBufdate);
// the following has nothing to do with time just blinks a LED each second
// if the LED is off turn it on and vice-versa:
if (ledState == LOW){
ledState = HIGH;
ledLight = 1;
}
else {
ledState = LOW;
ledLight = 0;
}
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
digitalWrite(13, ledState);

}


works great... but had to put time and date on two lines since the font is not like courier but variable width and I did not like the seconds bouncing all around since a '1' is not as wide as a '8'.

I used an array to print out the date like: Monday, March 8, 2013.
If you need that part let me know.

Not sure what you mean by data logging. If you can explain that part better I will look at it. Mental block here I guess.

Also did get it to work with Mega BUT had to use Serial 3 port. That way I can upload and use GUI at same time. But my program is bigger than yours probably. Had to raise 100 item limit to 150. I had too many items to display. I guess each label or graph is an item. Mine is 5 columns wide as I am using it for automation control display.
Let me know...guy
Hi Guy, I want to log all data with timestamp, that i receive on my Arduino Mega 2560 from different temperature sensors in one file at same time as Guino is active. I dont know how to do it.... Do you have any suggestion?
Hi Slodoban...

Yes .. See my image of what I have done.

If you can not see clearly send me an email at regular email and I will send you a bigger image. Also some code. You should be able to get my email name in my personal data info. If not let me know and I will send one here for you to use.
I have made several labels and update the temps every minute and also have labels where I update events that happen with time/date stamp when they happened.
Basically you use a gLabel and then control what you want done to it in the code by calling a function with the name you set up for the label. I also am using a 2560 since my code for Guino is now at 80K.
GuiFarm2.jpg
Great example for many things ı have 2 questions the first is can you log the data and can you post your code for understanding the guino
gbevis8 months ago
Is there a way to have the app on my mac pipe some of the data to a log file? That would be the icing on the cake!
madshobye (author)  gbevis8 months ago
Not in the current version, but an obvious next step. Connecting to: https://xively.com/ vould be nice.
purirohan8 months ago
When I run GUINO on my Mac (2012 macbook air) it hogs between 30-50% of the CPU and causes the machine to heat up (and thus the fans to start blowing). The only other time this happens for me is when I'm running Flash through the browser. Any idea what's going on here?
madshobye (author)  purirohan8 months ago
It sounds about right. I have not tweaked the app. Hence I am letting it use as much cpu as it wants. You can recompile the code with a sync to the frame rate. This should slow it down a bit. I prioritized getting as much data as possible = as realtime as possible. This is one of the reasons why the guino is one of the few apps that can show quite a high level of detail in the graphing.
kced8 months ago
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?
Slobodan12311 months ago
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...
Capture.JPG20130517_083423.jpg20130517_083434.jpg
e.ma.niak11 months ago
Guys... i love it! This should by a part of the original distribution of Arduino....
booster12311 months ago
It's really an appreciable project buddy......but i am not able to get what is _item in the function int gUpdateLabel(int _item, char * _text).....
Is it fine to use this function for the string to change while running the guino(while we are changing the touch configuration) without disconnecting and again connecting it ?
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.
int E1=A0; //use Analog 0 as digital pin
int B_E1=0;

void setup() {
  gBegin(12345);
  pinMode(E1, OUTPUT);
}

void gInit() {
  gAddToggle("E1",&B_E1);
}

void loop() {
  guino_update();
  if (B_E1)
    digitalWrite(E1, HIGH);
  else
    digitalWrite(E1, LOW);
}

Thanks a lot
madshobye (author)  mohammed.morsey1 year ago
just tested it with port 13. Worked like a charm. Not sure what goes on on your side :(
Hello,
Great work on the GUI. I'm having trouble understanding how the toggle is supposed to work. The variable starts as false (as I initialized it). When the button is pressed, it goes to true. Then when pressed again, it just stays at true. I want it to go to false when pressed again.
madshobye (author)  mohammed.morsey1 year ago
You should post some code for me to be able to help you.
TerryKing1 year ago
Some people have trouble understanding / installing libraries for this. Here's some help:
http://arduino-info.wikispaces.com/Arduino-Libraries
naman1231 year ago
Hello......
Thanx for this awesome GUI for Arduino.
I am getting one problem......the moving label is not getting updated in real time.....I have to disconnect and then connect the GUINO for the change in the Label. Can you please assist me in this problem as soon as possible.
I am also getting the problem in changing the size of label.....only 2 and 1 can be used. I want to increase the size more than that.....
madshobye (author)  naman1231 year ago
You need to use gUpdateLabel("some string here") within your draw for it to update. Only a few label sizes are supported at the moment. More than that and you will ned to compile your own version of guino.
Guy Smith1 year ago
Was wondering if Guino could be used on a Raspberry Pi? Would the OSX version maybe work or could it be 'easily' compiled for linux? Would like to use the Pi so as not to have a 'real' computer running all the time to monitor the GUI. It's a lot smaller and cheaper than a real computer. It can then drive a monitor to watch what the Arduino is doing. Would post a screen shot of what I had done so far (up to six columns so far, and not all charts (only 4 charts total used). Any thoughts you might have on Guino on Linux would be appreciated. Thanks agan...guy
madshobye (author)  Guy Smith1 year ago
It should be doable. As far as I know the windows source should be pretty similar to the what is needed to compile for linux in general. Openframeworks has been compiled for RPI. Hence yes it should be possible to get it running.
Here's the code of the clock I wanted to add in Guino but it doesn't work, I don't know how to do it:

#include <Time.h>
int flexLabelId =0;

void setup(){
  gBegin(34236);
  setTime(19,3,0,22,3,13); // set time to noon Jan 1 2011
}


void loop(){
  // **** Main update call for the guino
  guino_update();
//  digitalClockDisplay();
  gUpdateLabel(flexLabelId, digitalClockDisplay());
  delay(1000);

}

void gInit()
{
  gAddSpacer(1);
  flexLabelId = gAddLabel("",0);
  gAddSpacer(1);
}

void digitalClockDisplay(){
  // digital clock display of the time
  printDigits(day());
  Serial.print(".");
  printDigits(month());
  Serial.print(".");
  Serial.print(year());
  Serial.print(" ");
  printDigits(hour());
  Serial.print(":");
  printDigits(minute());
  Serial.print(":");
  printDigits(second());
  Serial.println();
}

void printDigits(int digits){
  // utility function for clock display: prints preceding colon and leading 0
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

void gButtonPressed(int id)
{
}

void gItemUpdated(int id)
{
}
Guy Smith1 year ago
Thanks for your support. Have the time clock working now. Is there any way to change the font? Would like to use a fixed width font for the time clock. A '1' is not as wide as a '8' so the clock bounces back and forth. Otherwise love the font. Also the GUI does not seem to work with the Arduino Mega. Works fine with a UNO. Also is there a way to reverse the font when displaying or hovering over a button or label. White print on white or light background is hard to see. Would be nice if print went negative when highlighted. Also any way to change the color of a button? Like green when off and red when on etc. Thanks for all your support. ...guy
Hi Guy, I am novice in programming with Arduino. I have Arduino Mega 2560 and Guino works fine with it. I wanted also to add a timer in the GUI but I had some problems with implementing it. I wanted also to add a datalogging functionnality in Guino. Any clue? Thanks
Pro

Get More Out of Instructables

Already have an Account?

close

PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!