Guino: Dashboard for your Arduino by madshobye
Featured
Screen Shot 2012-09-12 at 2.58.00 PM.png
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

Step 1: Getting started

Arduino-Logo.jpeg
simple-potmeter-and-led.png

  • 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.
Update: Feb 2013: Source can be found here. Sorry for not posting it sooner. My only excuse is that I wanted to do a couple of more iterations and a little cleanup before I posting it. 



1-40 of 59Next »
Slobodan123 says: May 16, 2013. 11:53 PM
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
farmersride says: May 9, 2013. 2:31 PM
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.
e.ma.niak says: May 6, 2013. 7:43 AM
Guys... i love it! This should by a part of the original distribution of Arduino....
booster123 says: May 2, 2013. 12:46 PM
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 ?
Guy Smith says: Mar 22, 2013. 2:37 PM
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
Slobodan123 says: Apr 16, 2013. 2:32 AM
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?
Guy Smith says: Apr 16, 2013. 4:49 AM
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
Slobodan123 says: Apr 16, 2013. 2:28 AM
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.
mohammed.morsey says: Apr 15, 2013. 10:35 AM
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) says: Apr 15, 2013. 12:03 PM
just tested it with port 13. Worked like a charm. Not sure what goes on on your side :(
mohammed.morsey says: Apr 15, 2013. 6:58 AM
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) says: Apr 15, 2013. 7:08 AM
You should post some code for me to be able to help you.
TerryKing says: Apr 14, 2013. 8:29 AM
Some people have trouble understanding / installing libraries for this. Here's some help:
http://arduino-info.wikispaces.com/Arduino-Libraries
naman123 says: Apr 12, 2013. 1:23 PM
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) says: Apr 13, 2013. 8:29 AM
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 Smith says: Mar 26, 2013. 11:27 AM
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) says: Mar 26, 2013. 1:08 PM
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.
Slobodan123 says: Mar 22, 2013. 2:08 PM
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 Smith says: Mar 20, 2013. 3:17 PM
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
Slobodan123 says: Mar 22, 2013. 2:00 PM
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
madshobye (author) says: Mar 21, 2013. 9:18 AM
Arduino mega might be a timing problem in setup. You might have to move the gSetup around or have a delay somewhere. Let me know what you figure out.

About the rest. It sounds like valid improvements. You should dig into the source and start extending the framework.

Guy Smith says: Mar 19, 2013. 9:12 AM
Thanks for your GUI. Works great on Win 7 and with arduino. One question tho? How do you (or can you) send data to a window or box on the GUI screen. Like putting a time window and updating it. Tried g..update and value but with no effect. I want to post data received from sensors without the slider or dials bars. Thanks...guy
madshobye (author) says: Mar 20, 2013. 2:13 AM
use a label and do some string formatting
Guy Smith says: Mar 19, 2013. 11:57 AM
ps... Saw what Slobodan did. Good work! I saw he used graph "windows" to display his data. Is that the way to go or is it possible just to put values in a "window' ? Like to display the time as Time: xx:xx:xx in a separate box? Thanks....guy
vivek_shankar says: Feb 23, 2013. 11:26 AM
Hi .. Iv tried the older processing code for the disney touche.. but i get only a miniscule peak on touching .. I then tried guino but the whenever i start the package it crashes .. im using a window 7 machine .. :(
madshobye (author) says: Mar 18, 2013. 12:36 PM
Sorry to hear that. I have not tested it on windows 7 (I kind feel off the band wagen after windows xp :). You could try to download the source for guino and try to compile it yourself.
Slobodan123 says: Mar 18, 2013. 5:42 AM
Hi Mads, here's your GUI in use on my HHO Project. Still in development...
HHO_Project_3.JPGHHO_Project_2.JPGHHO_Project.JPG
madshobye (author) says: Mar 18, 2013. 12:33 PM
Nice!
Slobodan123 says: Feb 21, 2013. 11:01 PM
Hello, nice work. Is it possible to have graphs moving slower, and to have floats values instead int showed on sliders? Thanks
madshobye (author) says: Feb 21, 2013. 11:39 PM
The speed of the graphs depends on the speed in which you update the values. If you want to use floats convert them to int in stead - multiply with e.g. 10 to get more resolution.

float a
int b
b = round(a*10)



togobingi says: Feb 16, 2013. 8:20 AM
Hi Mads, great job and very useful GUI. I tried uploading one of the examples and it gave me this error: " 'EasyTransfer' does not name a type". What should I do? thanks
madshobye (author) says: Feb 16, 2013. 11:23 AM
Install the libraries and restart your arduino software..
anake says: Feb 7, 2013. 6:39 AM
I tried all available ports but still nothing, the arduino is runing cool for everything else
anake says: Feb 7, 2013. 5:14 AM
Good day I am Having an error ""ofserial: unable to open port"" do you have any idea why ??, by the way it doesn't matter what port I choose
thanks

madshobye (author) says: Feb 7, 2013. 6:30 AM
Sounds like you are trying the wrong port? Do you have arduino running on the computer with the right ftdi drivers?

Else you might have the serial monitor running in the backgrond.
mijailr says: Feb 6, 2013. 2:56 PM
It will be nice to have in linux... is there any version for linux?

Make OpenSource for OpenHardware!!!
madshobye (author) says: Feb 7, 2013. 4:04 AM
No linux, but feel free to compile your own version and please share it with me.

https://github.com/madshobye/guino

bridgkick says: Jan 2, 2013. 9:13 PM
Great idea. I'm trying to get running on Windows8, but I get these errors:

OF: OF_LOG_NOTICE: ofSerial: listing devices (0 total)
OF: OF_LOG_WARNING: OFXUIDROPDOWNLIST: DON'T USE THIS CONSTRUCTOR. THIS WILL BE
REMOVED ON FUTURE RELEASES.
size♦

Arduino sees my USb serial port just fine (COM4).
Is there anything I can do to make it work?

Cheers,
E.
Engelx says: Jan 14, 2013. 7:50 PM
in w8 i have that error too :s but i hace 2 devices, then the program stop working
madshobye (author) says: Jan 15, 2013. 1:06 AM
This is not erros - just warnings.

I have had problems with one windows machine running it as well. I have not been able to pin point the cause. Maybe reinstall the ftdi drivers?

I am not sure what you mean by two devices...
1-40 of 59Next »
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!