SOLUCIONADO -- Void simplificar escritura en LCD

Hola de nuevo.

Estoy intentando depurar un codigo, y para no tener que ver tantas veces los comandos correspondientes a la escrutura en el LCD, he realizado un Void.

Intento simplificar esto:

 lcd.setCursor(1,0);
 lcd.print("Porcentaje=");
 lcd.setCursor(12,0);
 lcd.print(Porcent_1);

Para eso, como os comentaba he ideado hacer un Void:

void cursor_y_texto(byte x, byte y, String texto){
  lcd.setCursor(x,y);
  lcd.print(texto);
}

De esta manera cada vez que tenga que escribir en el LCD, bastaría con hacer esto:

 cursor_y_texto(1,0,"Alarma 1=");

Mi problema lo tengo ahora cuando quiero que me escriba una variable en vez de texto, ya que String texto, solo me sirve para texto.

Si quiero que me escriba la variable Porcent_1, me da error.

 cursor_y_texto(12,0,Porcent_1);

¿¿Se os ocurre como puedo defirnir el void para que me escriba variables o texto independientemente?

Del mismo modo que lcd.print puede hacerlo.
Estudia el comando lcd.print y verás como permite hacerlo con String o variables.

Si claro. el comando "lcd.print" puede imprimir cualquier cosa.

Lo que intento hace es no tener que mover el cusor "lcd.Setcursor" y poner "lcd.print" cada vez que tengo que imprimir algo en el LCD.

Más que nada, porque siempre imprimes un texto nombrando a la variable, y seguidamente imprimes su valor.
Este hecho, tan usual, siempre obliga a poner como mínimo 4 columnas de código, como puede ser:

lcd.setCursor(1,0);
 lcd.print("Porcentaje=");
 lcd.setCursor(12,0);
 lcd.print(Porcent_1);

Por eso intento hacer un Void, donde con solo poner una linea, tenga solucionado el problema:

cursor_y_texto(1,0,"Porcentaje=");

Lo que me encuentro es, el problema cuando tengo que incluir variables en vez de texto, que lógicamente lo declare con String

Como solución pensé en hacer otro void, para escribir variables, pero me surgió la duda de si habría alguna manera de definir, el texto String, y las variables long , o int al tiempo.

En caso de que no exista, siempre puedo hacer algo así:

void cursor_y_dato(byte x, byte y, long dato){
  lcd.setCursor(x,y);
  lcd.print(dato);
  }

De forma que al tener los dos Void´s al poner esto ya funcione

cursor_y_texto(1,1,"Alarma 2=");
cursor_y_dato(12,1,Porcent_2);

intenta asi

cursor_y_texto(12,0,String(Porcent_1));

surbyte:
intenta asi

cursor_y_texto(12,0,String(Porcent_1));

Buena idea, pero da error, ya que no defines el texto dentro de String

void cursor_y_texto(byte x, byte y, String texto){
  lcd.setCursor(x,y);
  lcd.print(texto);
}

Al poner

void cursor_y_texto(byte x, byte y, String (Porcent_1)){
  lcd.setCursor(x,y);
  lcd.print(texto);
}

la línea lcd.print(texto) da error, y es lógico ya que texto no es una variable.

Te paso el código completo.
No te asustes ya que no está depurado. Hay cosas que sobran.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x38,20,4);  // set the LCD address to 0x20 for a 20 chars and 4 line display

const int pinHall = A0; 
const int Pot_1=A1;
const int Pot_2=A2;
const int boton=8;


int Alarma_1=0;
int Alarma_2=0;
int porcentaje;  //El valor de nivel del tanque en %

long Porcent_1; 
long Porcent_2;

const byte //Cuando escribamos el código {a,b,c} a es la posición a-0, b-1 y c-2
Alarma_10[]   ={5,6,7},
Alarma_20[]   ={3,4};

/*DATOS*/

 
void setup() {
  pinMode(pinHall,INPUT); //Entrada pin sensor de nivel
  pinMode(boton,INPUT);

  Serial.begin(9600);
  

  lcd.init();   // inicializa el lcd
   // Print a message to the LCD.
  lcd.backlight(); //Enciende la luz del LCD
  lcd.clear();
    
  Alarmas();   //Miro los valores de las alarmas
   }   

void cursor_y_texto(byte x, byte y, String texto){
  lcd.setCursor(x,y);
  lcd.print(texto);
}

void cursor_y_dato(byte x, byte y, long dato){
  lcd.setCursor(x,y);
  lcd.print(dato);
  }
 /*-------------------------------------------------
    PROGRAMA PARA DEFINIR LAS ALARMAS
 -----------------------------------------------*/   
void Alarmas(){
  
 Alarma_1=analogRead(Pot_1);
 Porcent_1=map(Alarma_1,0,1023,0,40);
 
 
 Alarma_2=analogRead(Pot_2);
 Porcent_2=map(Alarma_2,0,1023,0,30); 

 cursor_y_texto(1,0,"Alarma 1=");
 cursor_y_dato(12,0,Porcent_1);
 
 cursor_y_texto(1,1,"Alarma 2=");
 cursor_y_dato(12,1,Porcent_2);
  
 delay(3000);
 lcd.clear();

}  
   
   /*-------------------------------------------------
                      CICLO -- LOOP
   ---------------------------------------------------*/
void loop() {
  if(digitalRead(boton)==HIGH){
  Alarmas();
       }
 
  //media de 20 medidas para filtrar ruido
  long measure = 0;
  for(int i = 0; i < 20; i++){
      int value = 
      measure += analogRead(pinHall);
  }
  measure /= 20;     
  
  porcentaje=map(measure,70,965,5,95);
  
  cursor_y_texto(1,2,"Capacidad=");
  cursor_y_dato(12,2, porcentaje);
  cursor_y_texto(14,2,"%");
 }

He probado lo que te sugerí y a mi no me da error.
tienes un error dentro de un for con int value = que no sugiere nada y luego arrastra otras cosas.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x38,20,4);  // set the LCD address to 0x20 for a 20 chars and 4 line display

const byte pinHall = A0; 
const byte Pot_1   = A1;
const byte Pot_2   = A2;
const byte boton   = 8;


int Alarma_1 = 0;
int Alarma_2 = 0;
int porcentaje;  //El valor de nivel del tanque en %

long Porcent_1; 
long Porcent_2;

const byte //Cuando escribamos el código {a,b,c} a es la posición a-0, b-1 y c-2
Alarma_10[]   ={5,6,7},
Alarma_20[]   ={3,4};

/*DATOS*/

 
void setup() {
  pinMode(pinHall,INPUT); //Entrada pin sensor de nivel
  pinMode(boton,INPUT);

  Serial.begin(9600);
  

  lcd.init();   // inicializa el lcd
   // Print a message to the LCD.
  lcd.backlight(); //Enciende la luz del LCD
  lcd.clear();
    
  Alarmas();   //Miro los valores de las alarmas
   }   

void cursor_y_texto(byte x, byte y, String texto){
  lcd.setCursor(x,y);
  lcd.print(texto);
}

void cursor_y_dato(byte x, byte y, long dato){
  lcd.setCursor(x,y);
  lcd.print(dato);
  }
 /*-------------------------------------------------
    PROGRAMA PARA DEFINIR LAS ALARMAS
 -----------------------------------------------*/   
void Alarmas(){
  
 Alarma_1  = analogRead(Pot_1);
 Porcent_1 = map(Alarma_1,0,1023,0,40);
 
 
 Alarma_2  = analogRead(Pot_2);
 Porcent_2 = map(Alarma_2,0,1023,0,30); 

 cursor_y_texto(1,0,"Alarma 1=");
 cursor_y_dato(12,0,Porcent_1);
 
 cursor_y_texto(1,1,"Alarma 2=");
 cursor_y_dato(12,1,Porcent_2);
  
 delay(3000);
 lcd.clear();

}  
   
   /*-------------------------------------------------
                      CICLO -- LOOP
   ---------------------------------------------------*/
void loop() {
  if(digitalRead(boton)==HIGH){
  Alarmas();
       }
 
  //media de 20 medidas para filtrar ruido
  long measure = 0;
  for(int i = 0; i < 20; i++){
      measure += analogRead(pinHall);
  }
  measure /= 20;     
  
  porcentaje = map(measure,70,965,5,95);
  
  cursor_y_texto(1,2,"Capacidad=");
  cursor_y_texto(12,2, String(porcentaje));
  cursor_y_texto(14,2,"%");
 }

Esto debe funcionar

Ok.
Gracias. Lo probaré

Pero la finalidad, es, intentar que el dato pueda ser cualquier, al igual que el texto.
De esta manera el dato solo lo limitamos al valor que tenga Porcentaje

En definitiva, Porcentaje, es un ejemple. En cuanto introduzca otra variable, no creo que pueda imprimirla en el LCD

Vaya @Katynga te di un ejemplo modifica los demás casos.
Dijiste que no funcionaba, yo lo pruebo y funciona.

O sea que tu no puedes modificar esto?

 cursor_y_dato(12,0,Porcent_1);

x esto

 cursor_y_texto(12,0,String(Porcent_1));

y lo mismo en los demas casos?

Incluso hasta puedes hacer esto

cursor_y_texto(1,0,"Alarma 1=");
 cursor_y_dato(12,0,Porcent_1);

reemplazado por

cursor_y_texto(1,0,"Alarma 1="+String(Porcent_1));

y debería funcionar.