probleme avec ligne lcd et convertion de variable

bonjours a tous
je sais pas si je post au bon endroit mais vue que c’est en français je me lance :stuck_out_tongue:
je suis entrain de faire un projet pour faire du code morse j’ai d’ailleurs trouver un bout de code sur internet que j’ai adapter a mes besoin je suis newbi mais je me débrouille quand même bien

j’ai 2 problème mon premier est que j’ai un LCD 20x4 j’ai des valeur d’écrit sur la première ligne tout est correct sauf que je veux faire apparaître un “String” sur ma 2ieme ligne si le “String” est inférieur a 19 soit la largeur du LCD tout est beau mais le problème est que si ça dépasse 19 a la place de continuer sur la 3ieme ligne il continu sur la 4ieme ligne
il y a t-il quelque chose que j’ai loupé ? et surtout il y a t-il un moyen d’arranger ça ou c’est une question de hardware ?

mon 2ieme problème est que la variable a entrer pour le code morse est un Const Char quand je met ma variable Input qui est le résultat d’un Serial.Read() et un “String” ça me donne un erreur cannot convert String to Const Char j’ai passer la journée d’hier a essayer plein de chose mais a chaque chose que j essayais ça me créais un nouveau problème je ne sais plus quoi penser :sob: qu’es-ce que je peux faire pour corriger ce problème la

merci d’avance
Danny

voila le code:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Define the LED Pin
#define PIN_OUT 13
//Define unit length in ms
#define UNIT_LENGTH 250 
int startButton = 0;
String autoButton = "Auto Off";
int phraseDelay = 1000;
//String input = "";
 String input = "";

//Build a struct with the morse code mapping
static const struct {const char letter, *code;} MorseMap[] =
{
{ 'A', ".-" },
{ 'B', "-..." },
{ 'C', "-.-." },
{ 'D', "-.." },
{ 'E', "." },
{ 'F', "..-." },
{ 'G', "--." },
{ 'H', "...." },
{ 'I', ".." },
{ 'J', ".---" },
{ 'K', ".-.-" },
{ 'L', ".-.." },
{ 'M', "--" },
{ 'N', "-." },
{ 'O', "---" },
{ 'P', ".--." },
{ 'Q', "--.-" },
{ 'R', ".-." },
{ 'S', "..." },
{ 'T', "-" },
{ 'U', "..-" },
{ 'V', "...-" },
{ 'W', ".--" },
{ 'X', "-..-" },
{ 'Y', "-.--" },
{ 'Z', "--.." },
{ ' ', " " }, //Gap between word, seven units
{ '1', ".----" },
{ '2', "..---" },
{ '3', "...--" },
{ '4', "....-" },
{ '5', "....." },
{ '6', "-...." },
{ '7', "--..." },
{ '8', "---.." },
{ '9', "----." },
{ '0', "-----" },
{ '.', "·–·–·–" },
{ ',', "--..--" },
{ '?', "..--.." },
{ '!', "-.-.--" },
{ ':', "---..." },
{ ';', "-.-.-." },
{ '(', "-.--." },
{ ')', "-.--.-" },
{ '"', ".-..-." },
{ '@', ".--.-." },
{ '&', ".-..." },
};
 
void setup()
{
Serial.begin(9600);
pinMode( PIN_OUT, OUTPUT );
digitalWrite( PIN_OUT, LOW );
lcd.begin(20, 4);
}
 
void loop()
{
 
  lcd.setCursor(0,0);
  lcd.print(autoButton);
  lcd.setCursor(14,0);
  lcd.print("Xmit:");
  
    while(Serial.available()>0) 
      {
        input += (char) Serial.read();
        delay(5);
      }
     
    if(input.indexOf("start") >=0)
      {
        delay(phraseDelay);
        ActivateMorse();
        input = "";
      }
    else if(input.indexOf("auto") >=0)
      { 
        autoButton = "Auto On ";
        input = "";
      }
    else if(input.indexOf("stop") >=0)
      {
        autoButton = "Auto Off ";
        startButton = 0;
        input = ""; 
      }
   
    else  if(autoButton == "Auto On ")
      {
        delay(phraseDelay);
        ActivateMorse();
        delay(phraseDelay);
      }
    else if(input.indexOf("clear") >=0)
      {
        lcd.setCursor(0,1);
        lcd.print("                    ");
        lcd.setCursor(0,3);
        lcd.print("                    ");
        input = "";
      }
    else 
      {
      lcd.setCursor(0,1);       //******************ICI MON PREMIER PROBLÈME
      lcd.print(input);
      input = "";
      } 
}

void ActivateMorse() 
{
String morseWord = encode(input);       //ICI MON DEUXIÈME LA VARIABLE ÉTAIT "SOS" A LA PLACE DU INPUT
for(int i=0; i<=morseWord.length(); i++)
{
    switch( morseWord[i] )
  
{
case '.': //dit
digitalWrite( PIN_OUT, HIGH );
lcd.setCursor(19,0);
lcd.print("X");
delay( UNIT_LENGTH );
digitalWrite( PIN_OUT, LOW );
lcd.setCursor(19,0);
lcd.print(" ");
delay( UNIT_LENGTH );
break;
 
case '-': //dah
digitalWrite( PIN_OUT, HIGH );
lcd.setCursor(19,0);
lcd.print("X");
delay( UNIT_LENGTH*3 );
digitalWrite( PIN_OUT, LOW );
lcd.setCursor(19,0);
lcd.print(" ");
delay( UNIT_LENGTH );
break;
 
case ' ': //gap
delay( UNIT_LENGTH );
} } } 

String encode(const char *string)
{
size_t i, j;
String morseWord = "";
for( i = 0; string[i]; ++i )
{
for( j = 0; j < sizeof MorseMap / sizeof *MorseMap; ++j )
{
if( toupper(string[i]) == MorseMap[j].letter )
{
morseWord += MorseMap[j].code;
lcd.setCursor(0,3);
lcd.print(morseWord);
break;
}
}
morseWord += " "; //Add tailing space to seperate the chars
}
 
return morseWord;
}
 
String decode(String morse)
{
String msg = "";
int lastPos = 0;
int pos = morse.indexOf(' ');
while( lastPos <= morse.lastIndexOf(' ') )
{
for( int i = 0; i < sizeof MorseMap / sizeof *MorseMap; ++i )
{

if( morse.substring(lastPos, pos) == MorseMap[i].code )
{
msg += MorseMap[i].letter;
}
}
lastPos = pos+1;
pos = morse.indexOf(' ', lastPos);
// Handle white-spaces between words (7 spaces)
while( morse[lastPos] == ' ' && morse[pos+1] == ' ' )
{
pos ++;
}
}
 
return msg;
}

bonjour,
pour ton 1er problème, essaye de faire un serial print pour voir ce que ca donne, s'il n'y a pas un saut de ligne qui pourrait se mettre quelque part.

salut merci de ta réponse
je viens de l'essayer cette fonction affiche pas sur mon LCD mais dans la console au moment ou je pese sur enter
je ne sais pas si ça viens de ça mais mon LCD n'est pas filer en série mais avec les 6 fil

re bonjours bon ok j'ai trouver la solution au problème #2 maintenant sa fonctionne
il me reste le problème du texte qui affiche sur la mauvaise ligne quand il est plus long que le LCD

il faudrait que je puisse faire un Scroll sur la ligne a partir du curseur #7 a aller jusqu'a 19 et ça résolurais tous mes problème

merci
danny

bonjours a tous
j'ai trouver enfin je crois la raison que l’écran affiche sur la mauvaise ligne. mon LCD fais 20x4 et c'est un HD44780 or si sur une ligne j'ai 21 caractère le 1 de surplus le met sur l'autre ligne en dessous
ex: si sur ma ligne 1 j'ai 25 caractère de long il affiche 20 caractère sur la ligne 1 et les 5 autre il va les afficher sur la 3e ligne et si c'est sur la ligne 2 alors la balance est écrit sur la ligne 4 comme si l’écran étais 40x2 qu'il a été couper en 2 et mis un au dessus de l'autre
il paraîtrait que l'option "auto wrap" serais par default a "on"
il y a t-il un moyen de modifier cela et le mettre a off?

merci
Danny

Je n'ai rien vu de ce genre dans la librairie mais rien ne t'empêche de l'implémenter par toi même.
Une petite fonction qui récupère les chaînes à imprimer, les tronque à 20 caractères et les places sur la bonne ligne.

Bonjour,
Regarde le datasheet du HD44780 et tu verras que l'affichage se fait de la manière suivante en cas de débordement de la ligne :
1ére ligne puis 3ème ligne puis 2ème ligne et enfin 4ème ligne.
Si tu envoies, par exemple "premiere ligne et puis la deuxieme lignela troisieme ligne et la quatrieme !!!!!"
le LCD affiche :
"premiere ligne et pu"
"la troisieme ligne e"
"is la deuxieme ligne"
"t la quatrieme !!!!!"

oui c'est ça et après quelque recherche sa serais la fonction "auto wrap" on peux mettre ce mode la a off par default la valeur serais on il donnais une façon avec Serial.print mais moi mon LCD n’est pas connecter série il est connecter avec les 6 fils alors je ne sais pas comment modifier cette option javais penser en modifiant le fichier liquidcrystal.h mais je mi perd un peux

anyway fdufnew a donner une bonne idée maintenant il faut juste que je trouve comment tronquer une chaîne de caractère plus grand que 20 a 20 j'ai trouver sur le net une fonction pour le scroll il fonctionne très bien jusqu'a 20 en haut de ça il déborde

voila le code pour le scroll

String ScrollTxt(String txt)
{
  if(txt.length()>20) 
    {
      
      return txt.substring(1,txt.length()) + txt.substring(0,1);
    }
  else
    {
     return txt;
    } 
}

merci
danny