lire differenst types de variable s sur LCD

Bonjour,
Je bute sur un problème de type de variable que je veux visualiser sur un écran LCD .

Voici mon code:

    /* Lecture LCD toutes les 1s */
    if(millis() - DebutChronoLcdMs >= 1000)//permet de ne pas saturer la boucle loop() et rend le mouvement des servos plus fluide
    { 
      static int StringToPrint;
      lcd.setCursor(0,0);lcd.print(F("[Speed  engines 1&2]"));
      lcd.setCursor(0,1);lcd.print(F("S1 = "));lcd.print(vitesse1);lcd.print(F(" tr/mn"));
      lcd.setCursor(0,2);lcd.print(F("S2 = "));lcd.print(vitesse2);lcd.print(F(" tr/mn"));
      lcd.setCursor(0,3);
      switch(StringToPrint)
      {
        case 0:lcd.print("Aux.: " + readAuxType() + "   ");break;
        case 1:lcd.print("Sync.: " + (synchroIsActive == true)?"Yes":"No ");break;
        case 2:lcd.print("Secu.: " + (SecurityIsON == true)?   "Yes":"No ");break;
      }
      (StringToPrint <= 2)?StringToPrint++:StringToPrint=0;       
      DebutChronoLcdMs=millis(); /* Restart the Chrono for the LCD */
    }


String readAuxType()
{
  String AuxType[4]={"(o)","(\\/)","(\\|/)","(<>)"};
  if (auxChannel == 1) return AuxType[0];//Aux non connecte
  if (auxChannel == 2) return AuxType[2];//Aux connecte a inter 3 positions
  if (auxChannel == 3 || auxChannel == 5 ||auxChannel == 6) return AuxType[1];//Aux connecte a inter 2 positions
  if (auxChannel == 4) return AuxType[3];//Aux connecte a direction

}

Je ne vois pas correctement les deux lignes:
case 1:lcd.print("Sync.: " + (synchroIsActive == true)?"Yes":"No ");
case 2:lcd.print("Secu.: " + (SecurityIsON == true)? "Yes":"No ");
Je ne vois que Yes et No

Le but étant de changer d'info toutes les 1s sur la 3eme ligne du LCD!

Merci de votre aide !!!

l'opérateur + n'est pas défini pour le type char[]
Il faudrait remplacer

lcd.print("Aux.: " + readAuxType() + "   ");

par

lcd.print("Aux.: ");
lcd.print(readAuxType());
lcd.print("   ");

Bon sang,
Je cherche toujours à compliquer !

Merci beaucoup!

J'ai modifié le code ainsi:

      switch(StringToPrint)
      {
        case 0:lcd.print(F("Aux.:"));lcd.print(readAuxType());break;
        case 1:;lcd.print(F("Sync.:"));lcd.print((synchroIsActive == true)?"Yes":"No ");break;
      }
      lcd.setCursor(11,3);lcd.print(F("Secu.:"));lcd.print((SecurityIsON == true)?"Yes":"No ");

J'avais aussi trouvé une solution mais sans réél intérêt dans mon cas !

      switch(StringToPrint)
      {
        case 0:sprintf(buff,"Aux.:");lcd.print(buff);lcd.print(readAuxType());break;
        case 1:sprintf(buff,"Sync.:");lcd.print(buff);lcd.print((synchroIsActive == true)?"Yes":"No ");break;
      }
      sprintf(buff,"Secu.:");lcd.setCursor(11,3);lcd.print(buff);lcd.print((SecurityIsON == true)?"Yes":"No ");

Par contre, ma function readAuxType définie en String ne fonctionne pas:
Elle doit retourner un 'char':

char* readAuxType()
{
  char* AuxType[4]={"(o)","(\\/)","(\\|/)","(<>)"};
  if (auxChannel == 1) return AuxType[0];//Aux non connecte
  if (auxChannel == 2) return AuxType[2];//Aux connecte a inter 3 positions
  if (auxChannel == 3 || auxChannel == 5 ||auxChannel == 6) return AuxType[1];//Aux connecte a inter 2 positions
  if (auxChannel == 4) return AuxType[3];//Aux connecte a direction

}

peux tu tester ce code
attention, à l'affectation des pinoches du LCD

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
long DebutChronoLcdMs;
boolean synchroIsActive=true;
boolean SecurityIsON=false;
int auxChannel=3;

int vitesse1=111;
int vitesse2=222;
String retour="";

void setup() {
lcd.begin(20, 4); // initialise le LCD
Serial.begin(57600);

}

void loop() {
/* Lecture LCD toutes les 1s /
if(millis() - DebutChronoLcdMs >= 2000)//permet de ne pas saturer la boucle loop() et rend le mouvement des servos plus fluide
{
static int StringToPrint;
lcd.setCursor(18,3);lcd.print(StringToPrint);
lcd.setCursor(0,0);lcd.print(F("[Speed engines 1&2]"));
lcd.setCursor(0,1);lcd.print(F("S1 = "));lcd.print(vitesse1);lcd.print(F(" tr/mn"));
lcd.setCursor(0,2);lcd.print(F("S2 = "));lcd.print(vitesse2);lcd.print(F(" tr/mn"));
//lcd.clear();
lcd.setCursor(0,3);
lcd.print(" ");lcd.setCursor(0,3);
switch(StringToPrint)
{
case 0:lcd.print("Aux.: "); retour=readAuxType();lcd.print(retour);lcd.print(" ");break;
case 1:lcd.print("Sync.: ");if (synchroIsActive == true){lcd.print("Yes");}else{lcd.print("No ");}break;
case 2:lcd.print("Secu.: ");if (SecurityIsON == true) {lcd.print("Yes");}else{lcd.print("No ");}break;
}
//if (StringToPrint <= 1){StringToPrint++;}else{StringToPrint=0;}
(StringToPrint <= 1)?StringToPrint++:StringToPrint=0;
//lcd.setCursor(18,3);lcd.print(StringToPrint);
DebutChronoLcdMs=millis(); /
Restart the Chrono for the LCD */
}

}

String readAuxType()
{
String AuxType[4]={"(o)","(\/)","(\|/)","(<>)"};
if (auxChannel == 1) return AuxType[0];//Aux non connecte
if (auxChannel == 2) return AuxType[2];//Aux connecte a inter 3 positions
if (auxChannel == 3 || auxChannel == 5 ||auxChannel == 6) return AuxType[1];//Aux connecte a inter 2 positions
if (auxChannel == 4) return AuxType[3];//Aux connecte a direction

}

Non , ça me retourne des caractères japonais !
Mais merci pour l'aide

Il me reste un problème avec le caractère \ qui me pose un problème !
Le code suivant fonctionne bien pour (o) et pour (<>) !

char* readAuxType()
{
//  char* AuxType[4]={"(o)","(\\/)","(\\|/)","(<>)"};
  char* AuxType[4]={"(o)","(\\/)","(\\|/)","(<>)"};
  if (auxChannel == 1) return AuxType[0];//Aux non connecte
  if (auxChannel == 2) return AuxType[2];//Aux connecte a inter 3 positions
  if (auxChannel == 3 || auxChannel == 5 ||auxChannel == 6) return AuxType[1];//Aux connecte a inter 2 positions
  if (auxChannel == 4) return AuxType[3];//Aux connecte a direction

}

(\/) et (\|/) passent bien dans la console série , le premier \ protégeant le deuxième \ !
Mais mon but est de visualiser sur le LCD (/) ou (|/) ...
Comment faire svp !!!

allez encore un test
attention aux pinoches du lcd

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
long DebutChronoLcdMs;
boolean synchroIsActive=true;
boolean SecurityIsON=false;
int auxChannel=2; //mettre de 1 à 4 pour test

int vitesse1=111;
int vitesse2=222;
String retour="";
//int retour=0;
byte slash[8] = { B00001, B00001, B00010, B00010, B00100, B00100, B01000, B01000 }; // fleche montante
byte vertical[8] = { B00100, B00100, B00100, B00100, B00100, B00100, B00100, B00100 }; // fleche descendante
byte back_slash[8] = { B10000, B10000, B01000, B01000, B00100, B00100, B00010, B00010 }; // fleche droite

void setup() {
lcd.begin(20, 4); // initialise le LCD
Serial.begin(57600);
lcd.createChar(0, slash);
lcd.createChar(1, vertical);
lcd.createChar(2, back_slash);
}

void loop() {
/* Lecture LCD toutes les 1s /
if(millis() - DebutChronoLcdMs >= 2000)//permet de ne pas saturer la boucle loop() et rend le mouvement des servos plus fluide
{
static int StringToPrint;
lcd.setCursor(18,3);lcd.print(StringToPrint);
lcd.setCursor(0,0);lcd.print(F("[Speed engines 1&2]"));
lcd.setCursor(0,1);lcd.print(F("S1 = "));lcd.print(vitesse1);lcd.print(F(" tr/mn"));
lcd.setCursor(0,2);lcd.print(F("S2 = "));lcd.print(vitesse2);lcd.print(F(" tr/mn"));
//lcd.clear();
lcd.setCursor(0,3);
lcd.print(" ");lcd.setCursor(0,3);
switch(StringToPrint)
{
case 0:lcd.print("Aux.: "); retour=readAuxType();lcd.print(retour);lcd.print(" ");break;
case 1:lcd.print("Sync.: ");if (synchroIsActive == true){lcd.print("Yes");}else{lcd.print("No ");}break;
case 2:lcd.print("Secu.: ");if (SecurityIsON == true) {lcd.print("Yes");}else{lcd.print("No ");}break;
}
//if (StringToPrint <= 1){StringToPrint++;}else{StringToPrint=0;}
(StringToPrint <= 1)?StringToPrint++:StringToPrint=0;
//lcd.setCursor(18,3);lcd.print(StringToPrint);
DebutChronoLcdMs=millis(); /
Restart the Chrono for the LCD */
}

}

String readAuxType()
{
String AuxType[5]={"(o)","(\/)","(\|/)","(<>)",("")};
if (auxChannel == 1) return AuxType[0];//Aux non connecte
if (auxChannel == 2) {lcd.write(byte(2));lcd.write(byte(2));lcd.write(byte(1));lcd.write(byte(0));return AuxType[5];}
if (auxChannel == 3 || auxChannel == 5 ||auxChannel == 6) {lcd.write(byte(2));lcd.write(byte(2));lcd.write(byte(0));return AuxType[5];}
if (auxChannel == 4) return AuxType[3];//Aux connecte a direction

}

Oui , effectivement c'est exactement ce que j'ai fini par faire, créer un caractère spécial

création du caractère :

byte charbackslash[8] ={B0,B10000,B1000,B100,B10,B1,B0,B0};

puis chargement dans l'un des huit emplacements possible:

if(LCDML.getCursorPos()==8) lcd.setCursor(15,0);readAuxTypeLCD();


void readAuxTypeLCD()
{
  switch(auxChannel)
  {
    case 1:lcd.print(F("(o)"));break;//Aux non connecte
    case 2:lcd.print(F("("));lcd.write(byte(7));lcd.print(F("|/)"));break;//Aux connecte a inter 3 positions
    case 3:
    case 5:
    case 6:lcd.print(F("("));lcd.write(byte(7));lcd.print(F("/)"));break;//Aux connecte a inter 2 positions
    case 4:lcd.print(F("(<>)"));break;//Aux connecte a direction
  }
}

yes, nous en sommes arrivés au même point :slight_smile:

as tu testé en dessinant un caractère spécial comprenant le double slash
et un autre comprenant la barre verticale et le back_slash
cela accentuerait l'effet visuel du sélecteur

dfgh:
yes, nous en sommes arrivés au même point :slight_smile:

as tu testé en dessinant un caractère spécial comprenant le double slash
et un autre comprenant la barre verticale et le back_slash
cela accentuerait l'effet visuel du sélecteur

Non, je suis limité en définition de caractères spéciaux car j'utilise un menu qui en définit déjà 5 à lui seul !
LCDMenuLib v2beta2