Label de UTFT_Buttons con una variable.

Hola buenas noches;

Alguien sabe como pasar el texto del botón en la librería UTFT Buttons con una variable, se que debe ser una variable tipo char pero no hay forma.

void MainMenu()
{
b1x1 =230;
b1y1 = 20;
b1x2 = 80;
b1y2 = 40;
char btexto= "Hola" ;
}
void loop()
{

but1 = myButtons.addButton( b1x1, b1y1, b1x2, b1y2, btexto);

Estoy tratando de realizar un menú para mostrar distintas pantallas en una TFT.
Un saludo y gracias.

Yo como esta definida la clase myButtons?
Posteas parte del problema

hola surbyte, gracias por contestar, solo estoy al inicio pero pego el código, quiero crear un menu que abra distintas pantallas y desde estas regresara la menu principal, tengo ya distintos codigos creados para medir el nivel de agua de un deposito o arrancar una bomba, se trata de escalar el proyecto con distintas funciones y que se puedan gestionar desde la tft, se que es mucho pero lo hare poco a poco.
;

[/#define imagedatatype  unsigned int

#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Buttons.h>
#include <Ultrasonic.h>
#include <TFT_Extension.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t Dingbats1_XL[];

// Declare which bitmaps we will be using
extern imagedatatype casa2[];
extern imagedatatype casa1[];
extern imagedatatype casa[];
extern imagedatatype monkey[];

UTFT myGLCD(ILI9341_S5P, /*SDI=*/ 51,/*CLK=*/ 52, /*CS=*/45,/*RST=*/ 47,/*DC=*/ 49);
UTouch  myTouch(33, 35, 37, 39, 41);// (T_CLK, T_CS, T_DIN, T_DOUT, T_IRQ).
UTFT_Buttons  myButtons(&myGLCD, &myTouch);// Finally we set up UTFT_Buttons :)

Ultrasonic ultrasonic(36,38,261000); // (Trig PIN,Echo PIN HC-SR04 + LIMITE MEDICION)

//Variables
byte MenuID;
int  b1x1;
int  b1y1;
int  b1x2;
int  b1y2;
char btexto[10];


void setup()
{
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(BigFont);
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  myButtons.setTextFont(BigFont);
//  myButtons.setSymbolFont(Dingbats1_XL);
  myButtons.setButtonColors(VGA_BLUE,VGA_GRAY,VGA_BLACK, VGA_YELLOW, VGA_WHITE);
//  myGLCD.drawRoundRect(10,10,80,230);
  MainMenu();//Don't forget to load the MAIN MENU!!!!!!!!!!!!!!!!!!!!!!
}

void MainMenu()
{
myGLCD.print("Main Menu", 25, 120);
delay(1000);

b1x1 =230;
b1y1 = 20;
b1x2 = 80;
b1y2 = 40;
char btexto[10]= "Hola" ;

}

void loop()
{
myGLCD.printNumI(b1x1, 25, 20, 4);
myGLCD.printNumI(b1y1, 25, 40, 4);
myGLCD.printNumI(b1x2, 25, 60, 4);
myGLCD.printNumI(b1y2, 25, 80, 4);
myGLCD.print(btexto, 25, 100);

  int but1, but2, but3, but4, but5, but6, but7, pressed_button;
  but1 = myButtons.addButton( b1x1,  b1y1, b1x2,  b1y2, btexto);
  but2 = myButtons.addButton( 230,  60, 80,  40, "casa2");
  but3 = myButtons.addButton( 230, 110, 80,  40, "casa2");
  but4 = myButtons.addButton( 230, 160 , 80, 40, "casa2");
//  but5 = myButtons.addButton( 10, 150, 190, 30, "Disable Dog");

 myButtons.drawButtons();
//  myGLCD.setColor(VGA_BLACK);
//  myGLCD.setBackColor(VGA_WHITE);
  myGLCD.print("None    ", 10, 220);

  while(1) 
  {
    if (myTouch.dataAvailable() == true);
    myGLCD.print("              ", 40, 200);
    myGLCD.printNumI(ultrasonic.Ranging(CM), 40, 200);
    delay(100);
 //   myGLCD.print("Valor Dist", 40, 100);
    
    {
      pressed_button = myButtons.checkButtons();
      if (pressed_button==but1)
        myGLCD.print("Boton1     ", 10, 220);
      if (pressed_button==but2)
        myGLCD.print("Boton2     ", 10, 220);
      if (pressed_button==but3)
        myGLCD.print("Boton3    ", 10, 220);
      if (pressed_button==but4)
        myGLCD.print("Boton4  ", 10, 220);
      if (pressed_button==-1)
        myGLCD.print("None    ", 10, 220);
    }
  }
}]

La clase desconozco como esta creada pertenece a la librería UTFT_Buttons, aunque te pego el código

class UTFT_Buttons
{
	public:
		UTFT_Buttons(UTFT *ptrUTFT, UTouch *ptrUTouch);

		int		addButton(uint16_t x, uint16_t y, uint16_t width, uint16_t height, char *label, uint16_t flags=0);
		int		addButton(uint16_t x, uint16_t y, uint16_t width, uint16_t height, bitmapdatatype data, uint16_t flags=0);
		void	drawButtons();
		void	drawButton(int buttonID);
		void	enableButton(int buttonID, boolean redraw=false);
		void	disableButton(int buttonID, boolean redraw=false);
		void	relabelButton(int buttonID, char *label, boolean redraw=false);
		boolean	buttonEnabled(int buttonID);
		void	deleteButton(int buttonID);
		void	deleteAllButtons();
		int		checkButtons();
		void	setTextFont(uint8_t* font);
		void	setSymbolFont(uint8_t* font);
		void	setButtonColors(word atxt, word iatxt, word brd, word brdhi, word back);

	protected:
		UTFT		*_UTFT;
		UTouch		*_UTouch;
		button_type	buttons[MAX_BUTTONS];
		word		_color_text, _color_text_inactive, _color_background, _color_border, _color_hilite;
		uint8_t		*_font_text, *_font_symbol;
};

Aqui el problema
UTFT_Buttons(UTFT *ptrUTFT, UTouch *ptrUTouch);

esta pidiendo ue pases un puntero UTouch y tu envias un char fijo.

No se como esta definido el tipo UTouch asi que no puedo aconsejarte algo.
Debes definir ese mensaje de texto "hola" de acuerdo con lo que UTouch *ptrUtouch requiere

En el ejemplo de UTFT_Buttons veo esto, muy parecido a lo tuyo, es decir, te basaste en el para hacer el programa, curioso que no funcione.

  int but1, but2, but3, but4, but5, pressed_button;
  
  but1 = myButtons.addButton( 10,  10, 80,  60, cat);
  but2 = myButtons.addButton( 120,  10, 80,  60, dog);
  but3 = myButtons.addButton( 10,  80, 80,  60, bird);
  but4 = myButtons.addButton( 120,  80, 80,  60, monkey, BUTTON_NO_BORDER);
  but5 = myButtons.addButton( 10, 150, 190, 30, "Disable Dog");
  myButtons.drawButtons();

postea el error por favor.

Hola surbyte;
Si he utilizado el código de ejemplo de la librería, el que has puesto pertenece al ejemplo de Bitmaps para botones, aunque seria igual cuando los botones son de texto


but1 = myButtons.addButton( 10, 20, 300, 30, "Button 1")


Si la definición del la variable char, char btexto= "Hola", esta al inicio antes del void setup(), funciona, pero cuando la coloco en la función Void MainMenu(), no lo ve. Así que entiendo que pasarle una variable tipo char es suficiente, pero desconozco porque no funciona.

De todas formas no se si sera la mejor forma de hacer menus para mostrar distintas pantallas, sigo investigando.
Gracias un saludo.

Tu mismo te has contestado ,si defines la variable dentro de la funcion solo existira dentro de esa funcion y se destruira cuando se haya ejecutado.si la defines antes del setup sera global y podras usarla en cualquier parte del sketch

Jaja, no había entendido la idea. Pero claro variables globales valen en todo el programa.
Variables Locales, valen dentro de la función o rutina como bien dijo jose

Gracias jose y surbyte, tiene sentido lo que decís. ¿Alguna idea de como aplicar con esta librería un sistema de menús, es que es bastante fácil de manejar y da muchas opciones en los botones?. Un saludo y gracias.

Como no soy muy diestro con códigos C muy profundos, decidí solo tomar algunas partes de la librería UTFT_Buttons, y ensamblarlas en un código que me resultara algo mas fácil de implementar y de entender.

Para un sistema de menús que no tenga conflictos entre los botones de cada uno, hay que hacer que cada menú sea una función independiente.

En el ejemplo siguiente empleo la librería Utouch para el manejo de la pantalla táctil

void MenuPrincipal()
{

//  Conjunto de instrucciones que se ejecutan una sola vez al inicio del menú

  while (true)
     {

       // Instrucciones que cambian con el tiempo antes de usar la pantalla táctil

       if (myTouch.dataAvailable())
          {
             myTouch.read();
             x=myTouch.getX();
             y=myTouch.getY();        


      // Instrucciones para cada botón que llama a cada menú de forma independiente
      // Menú 1 o submenú 1
          if ((y>=y1min) && (y<=y1max)) 
            {      
             if ((x>=x2min) && (x<=x2max)) 
               {        
               // Función que permite resaltar el botón, para dar la sensación de que se "toca" el botón
               voidbotonRojo(x1min, y1min, x2max, y2max, rojo);
               // Llamado de la función que representa al menú que queremos activar
               Menu2();
               }
            }    

// Submenús adicionales



         }
     }
}

La estructura de cada menú que se tenga pensado implementar es semejante a la propuesta en el ejemplo y permite que cada menú sea independiente del precedente, con la posibilidad de interconectar todos los menús dentro de un arreglo central.

La condición para que funcionen de forma correcta las zonas de cada menú que muestran información que cambia con el tiempo, es que la función que representa al menú principal se llame desde void loop, por ejemplo

void loop() {
    MenuPrincipal();
}

Gracias a todos y feliz año 2015.

Si “TFTLCDCyg” así lo había solucionado he fabricado un código que funciona, seguramente es bastante malo pero como me ha costado mucho encontrar información y pruebas, lo pongo por si a alguien le sirve, igualmente si se puede mejorar seria bueno;

Simplemete es una estructura de menús donde se puede aplicar el código que se quiera y es muy facil de implementar pues se basa en las librerias de UTFT y UTFT_Utouch.

#define imagedatatype  unsigned int

#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Buttons.h>

// Declaracion de fuentes que se usaran
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t Dingbats1_XL[];

// Declare which bitmaps we will be using
extern imagedatatype casa2[];
extern imagedatatype casa1[];
extern imagedatatype casa[];
extern imagedatatype monkey[];

UTFT myGLCD(ILI9341_S5P, /*SDI=*/ 51,/*CLK=*/ 52, /*CS=*/45,/*RST=*/ 47,/*DC=*/ 49);
UTouch  myTouch(33, 35, 37, 39, 41);// (T_CLK, T_CS, T_DIN, T_DOUT, T_IRQ).
UTFT_Buttons  myButtons(&myGLCD, &myTouch);// Finally we set up UTFT_Buttons :)

//Variables Posicinales Botones
byte MenuID;
int  b1x1=1,    b1y1=1,   b1x2=1,    b1y2=1;
int  b2x1=1,    b2y1=1,   b2x2=1,    b2y2=1;
int  b3x1=1,    b3y1=2,   b3x2=1,    b3y2=1;
int  b4x1=1,    b4y1=3,   b4x2=1,    b4y2=1;
int  b5x1=1,    b5y1=4,   b5x2=1,    b5y2=1;
int  b6x1=1,    b6y1=5,   b6x2=1,    b6y2=1;
int  b7x1=1,    b7y1=6,   b7x2=1,    b7y2=1;
int  b8x1=1,    b8y1=7,   b8x2=1,    b8y2=1;
int  b9x1=1,    b9y1=8,   b9x2=1,    b9y2=1;
int  X = 0;

//Variables Texto Botones
char btexto1[]= "Main";
char btexto2[]= "";
char btexto3[]= "";
char btexto4[]= "";
char btexto5[]= "";
char btexto6[]= "";
char btexto7[]= "";
char btexto8[]= "";
char btexto9[]= "";

void setup()
{
  myGLCD.InitLCD();
  //myGLCD.clrScr();
  myGLCD.setFont(BigFont);
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  myButtons.setTextFont(BigFont);
  myButtons.setButtonColors(VGA_BLUE,VGA_GRAY,VGA_BLACK, VGA_YELLOW, VGA_WHITE);
  Inicio();
}

void Inicio(){
 myButtons.deleteAllButtons();
 myGLCD.clrScr();
 myButtons.setButtonColors(VGA_RED,VGA_GRAY,VGA_BLACK, VGA_YELLOW, VGA_WHITE);
 int but1,pressed_button;
 but1 = myButtons.addButton( 10,  10, 300,  220, "INICIO");
 myButtons.drawButtons();
 while(1){X= X++; myGLCD.printNumI(X, 10, 10);
 if (myTouch.dataAvailable() == true); {
 pressed_button = myButtons.checkButtons();
 if (pressed_button==but1){myGLCD.print(">>>MENU PRINCIPAL>>>>", 10, 220); myButtons.deleteAllButtons(); loop();}}}}
   
 void Menu2(){
 myButtons.deleteAllButtons();
 myGLCD.clrScr();
 myGLCD.fillScr(VGA_RED);
 myButtons.setButtonColors(VGA_RED,VGA_GRAY,VGA_BLACK, VGA_YELLOW, VGA_WHITE);
  int but1, pressed_button;
  but1 = myButtons.addButton( 230,  10, 80,  40, "Main");
  myButtons.drawButtons();
  myGLCD.print("Menu 2", 10, 220);
  while(1){X= X++; myGLCD.printNumI(X, 10, 10);
    if (myTouch.dataAvailable() == true);{
    pressed_button = myButtons.checkButtons();
    if (pressed_button==but1){myGLCD.print("En curso Menu Principal", 10, 220); loop();}}}}

 void Menu3(){
myButtons.deleteAllButtons();
 myGLCD.clrScr();
 myGLCD.fillScr(VGA_GREEN);
 myButtons.setButtonColors(VGA_RED,VGA_GRAY,VGA_BLACK, VGA_YELLOW, VGA_WHITE);
  int but1, pressed_button;
  but1 = myButtons.addButton( 230,  10, 80,  40, "Main");
  myButtons.drawButtons();
  myGLCD.print("Menu 3", 10, 220);
  while(1){X= X++; myGLCD.printNumI(X, 10, 10);
    if (myTouch.dataAvailable() == true);{
    pressed_button = myButtons.checkButtons();
    if (pressed_button==but1){myGLCD.print("En curso Menu Principal", 10, 220); loop();}}}}
    
 void Menu4(){
myButtons.deleteAllButtons();
 myGLCD.clrScr();
 myGLCD.fillScr(VGA_YELLOW);
 myButtons.setButtonColors(VGA_RED,VGA_GRAY,VGA_BLACK, VGA_YELLOW, VGA_WHITE);
  int but1, pressed_button;
  but1 = myButtons.addButton( 230,  10, 80,  40, "Main");
  myButtons.drawButtons();
  myGLCD.print("Menu 4", 10, 220);
  while(1){X= X++; myGLCD.printNumI(X, 10, 10);
    if (myTouch.dataAvailable() == true);{
    pressed_button = myButtons.checkButtons();
    if (pressed_button==but1){myGLCD.print("En curso Menu Principal", 10, 220); loop();}}}}   
 void Menu5(){ }
 void Menu6(){ }
 void Menu7(){ }
 void Menu8(){ }
 void Menu9(){ }

void loop()
{
  myButtons.deleteAllButtons();
  myButtons.setButtonColors(VGA_BLUE,VGA_GRAY,VGA_BLACK, VGA_YELLOW, VGA_WHITE);
  myGLCD.clrScr();

//Variables Posicinales Botones  
  b1x1 = 100, b1y1 =  20, b1x2 =  80, b1y2 =  40; char btexto1[]= "Main";
  b2x1 = 100, b2y1 =  70, b2x2 =  80, b2y2 =  40; char btexto2[]= "B2";
  b3x1 = 100, b3y1 = 120, b3x2 =  80, b3y2 =  40; char btexto3[]= "B3";
  b4x1 = 100, b4y1 = 170, b4x2 =  80, b4y2 =  40; char btexto4[]= "B4";
  b5x1 =   1, b5y1 =   1, b5x2 =   1, b5y2 =   1; char btexto5[]= "";
  b6x1 =   1, b6y1 =   1, b6x2 =   1, b6y2 =   1; char btexto6[]= "";
  b7x1 =   1, b7y1 =   1, b7x2 =   1, b7y2 =   1; char btexto7[]= "";
  b8x1 =   1, b8y1 =   1, b8x2 =   1, b8y2=    1; char btexto8[]= "";
  b9x1 =   1, b9y1 =   1, b9x2 =   1, b9y2=    1; char btexto9[]= "";
    
 
  
//Ponemos todos  los botones necesarios.
  int but1, but2, but3, but4, but5, but6, but7, but8, but9, pressed_button;
  but1 = myButtons.addButton( b1x1,  b1y1, b1x2,  b1y2, btexto1);
  but2 = myButtons.addButton( b2x1,  b2y1, b2x2,  b2y2, btexto2);
  but3 = myButtons.addButton( b3x1,  b3y1, b3x2,  b3y2, btexto3);
  but4 = myButtons.addButton( b4x1,  b4y1, b4x2,  b4y2, btexto4);
  but5 = myButtons.addButton( b5x1,  b5y1, b5x2,  b5y2, btexto5);
  but6 = myButtons.addButton( b6x1,  b6y1, b6x2,  b6y2, btexto6);
  but7 = myButtons.addButton( b7x1,  b7y1, b7x2,  b7y2, btexto7);
  but8 = myButtons.addButton( b8x1,  b8y1, b8x2,  b8y2, btexto8);
  but9 = myButtons.addButton( b9x1,  b9y1, b9x2,  b9y2, btexto9);
  
  myButtons.drawButtons();
  
  myGLCD.print("None    ", 10, 220);
  
    // Definimos todas las funciones posibles que necesitamos en los botones, tiniendo en cuenta que cada boton tendra una unica funcion.
  while(1) 
  {
    if (myTouch.dataAvailable() == true);
    {
      pressed_button = myButtons.checkButtons();
      if (pressed_button==but1){myGLCD.print("Boton1     ", 10, 220); loop();}
      if (pressed_button==but2){myGLCD.print("Boton2     ", 10, 220); Menu2();}
      if (pressed_button==but3){myGLCD.print("Boton3     ", 10, 220); Menu3();}
      if (pressed_button==but4){myGLCD.print("Boton4     ", 10, 220); Menu4();}
      if (pressed_button==but5){myGLCD.print("Boton5     ", 10, 220); Menu5();}
      if (pressed_button==but6){myGLCD.print("Boton6     ", 10, 220); Menu6();}
      if (pressed_button==but7){myGLCD.print("Boton7     ", 10, 220); Menu7();}
      if (pressed_button==but8){myGLCD.print("Boton8     ", 10, 220); Menu8();}
      if (pressed_button==but9){myGLCD.print("Boton9     ", 10, 220); Menu9();}
      if (pressed_button==  -1){myGLCD.print("None       ", 10, 220);}
    }
}
}

Sigo sin saber porque no se le puede pasar a el “Label” la etiqueta con una variable Char, porque realizando pruebas, desde otra funcion perfectamente se le puede pasar las variables de posición y tamaño y estando en la misma funcion la variable char no?¿.
Un saludo y gracias.