animation sur LCD 16x2

bonjour a tous

je suis sur un petit projet d animation sur un écran LCD 16x2.

j'ai utiliser la fonction "createChar" afin de créer de petit dessins.(super cool a faire)

tout ce passait bien tant qu'il y avait une seule petite animation, une petite tête de mort qui ouvre et ferme le bouche si le code taper sur le clavier est pas bon./
du coup j ai décidé d ajouter une autre animation avec un cadenas qui s ouvre et se ferme quand le code est bon.

j'ai donc crée deux fonctions , une pour chaque animation. Le soucis maintenant c'est que quelque soit le code , qu'il soit bon ou mauvais c'est toujours la même animation qui s'affiche. Ce qui est bizarre c'est que l'animation prend les propriétés de l autre. Je m'explique:
en fait si le code est bon le cadenas doit s'animer 3 fois par exemple et si le code est mauvais l'animation doit s'animer 5 fois.
du coup l'animation reste la même mais elle s'anime le nombre de fois voulu selon le code mauvais ou bon.
quelque chose m’échappe
je pense que c'est un soucis est quand j’attribue une numérotation a chaque "lcd.createChar".
si j'ai bien compris la numérotation doit être en "format octal", j'ai essayer mais rien n'y fait.
voici le code, bon il a l’état de prototypage et un peu long a lire j’espère que vous n'aurez pas mal a la tête en le lisant
le code dans le post suivant

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12 );                                                                          
bool decrocher = false; 
byte Decrocher = 6;                                               
#include <Keypad.h>
const byte TX = 0;
const byte RX = 1;
bool effacer = false;
byte boutonEffacer = 5;
byte i=0;//indice du tableau d'enregitrement de saisie des touches clavier
byte a=5;//indice de l'affichage du code saisie 
unsigned long temps_precedent=0;
const long interval=1000;
unsigned long temps;
char motdepasse1[]={'4','8','6','2'};
char motdepassetaper[]={'0','0','0','0'};
char motdepasse [] ={'7','9','6','1'};
byte ledok = 13;
const byte ROWS = 4; //4 lignes
const byte COLS = 3; //3 colonnes
//definition des caracters clavier
char hexaKeys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'},
};

byte rowPins[ROWS] = { A5,A4,A3,A2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {2,3,4}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

char customKey ;
//////////////////////////////////////////////////////////////////////////////////////
////////////////////////animation crane///////////////////////////////////////
/////////////////////////bouche fermee//////////////////////////////////////


byte haut_gauche[8] = {
  0b00111,    
  0b01000,   
  0b10000,    
  0b10111,    
  0b10111,     
  0b10111,      
  0b10000,    
  0b01001,    
};

byte haut_droit[8] = {
  0b11100,
  0b00010,
  0b00001,
  0b11101, 
  0b11101,
  0b11101,
  0b00001,
  0b10010, 
};

byte bas_gauche[8] = {
  0b00100,
  0b00100,
  0b00111,
  0b00101, 
  0b00010,
  0b00001,
  0b00000,
  0b00000, 
};

byte bas_droit[8] = {
  0b00100,
  0b00100,
  0b11100,
  0b10100, 
  0b01000,
  0b10000,
  0b00000,
  0b00000, 
};
////////////////////////////bouche ouverte//////////////////////////////////////
byte haut_gauche1[8] = {
  0b00111,    
  0b01000,   
  0b10000,    
  0b10100,    
  0b10110,     
  0b10111,      
  0b10000,    
  0b01001,    
};

byte haut_droit1[8] = {
  0b11100,
  0b00010,
  0b00001,
  0b00101, 
  0b01101,
  0b11101,
  0b00001,
  0b10010, 
};

byte bas_gauche1[8] = {
  0b00100,
  0b00100,
  0b00111,
  0b00101, 
  0b00101,
  0b00100,
  0b00101,
  0b00111, 
};

byte bas_droit1[8] = {
  0b00100,
  0b00100,
  0b11100,
  0b10100, 
  0b10100,
  0b00100,
  0b10100,
  0b11100, 
};
////////////////////////////////////////////////////////////
//////////////////////ANIMATION CADENAS//////////////////////////////////////
////////////////////////////CADENAS FERME////////////////////////////////
byte cadenas_haut_gauche[8] = {
  0b00000,
  0b00000,
  0b00001,
  0b00010, 
  0b00100,
  0b00100,
  0b00100,
  0b00100, 
};
byte cadenas_haut_droit[8] = {
  0b00000,
  0b00000,
  0b10000,
  0b01000, 
  0b00100,
  0b00100,
  0b00100,
  0b00100, 
};

byte cadenas_bas_gauche[8] = {
  0b01111,
  0b01000,
  0b01001,
  0b01001, 
  0b01011,
  0b01000,
  0b01111,
  0b00000, 
};

byte cadenas_bas_droit[8] = {
  0b11110,
  0b00010,
  0b10010,
  0b10010, 
  0b11010,
  0b00010,
  0b11110,
  0b00000, 
};

////////////////////////////////////////////////////////////////////:
/////////////////////////////CADENAS OUVERT///////////////////////////////////////////
////////////////////////////////////////////////////////////////////
byte cadenas_ouvert_haut_gauche[8] = {
  0b00001,
  0b00010,
  0b00100,
  0b00100, 
  0b00100,
  0b00100,
  0b00000,
  0b00000, 
};
byte cadenas_ouvert_haut_droit[8] = {
  0b10000,
  0b01000,
  0b00100,
  0b00100, 
  0b00100,
  0b00100,
  0b00100,
  0b00100, 
};

byte cadenas_ouvert_bas_gauche[8] = {
  0b01111,
  0b01000,
  0b01001,
  0b01001, 
  0b01011,
  0b01000,
  0b01111,
  0b00000, 
};

byte cadenas_ouvert_bas_droit[8] = {
  0b11110,
  0b00010,
  0b10010,
  0b10010, 
  0b11010,
  0b00010,
  0b11110,
  0b00000,  
};


//////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
void bouche_fermee(){  
  lcd.setCursor(0,0);
  lcd.write(byte(0));
  lcd.setCursor(1,0);
  lcd.write(byte(1));
  lcd.setCursor(0,1);
  lcd.write(byte(2));
  lcd.setCursor(1,1);
  lcd.write(byte(3));
  } 

 void bouche_ouverte(){  
  lcd.setCursor(0,0);
  lcd.write(byte(4));
  lcd.setCursor(1,0);
  lcd.write(byte(5));
  lcd.setCursor(0,1);
  lcd.write(byte(6));
  lcd.setCursor(1,1);
  lcd.write(byte(7));
  }
  //////////////////////////////////////////////////////////////////
  void bouche_fermee1(){  
  lcd.setCursor(2,0);
  lcd.write(byte(0));
  lcd.setCursor(3,0);
  lcd.write(byte(1));
  lcd.setCursor(2,1);
  lcd.write(byte(2));
  lcd.setCursor(3,1);
  lcd.write(byte(3));
  } 

 void bouche_ouverte1(){  
  lcd.setCursor(2,0);
  lcd.write(byte(4));
  lcd.setCursor(3,0);
  lcd.write(byte(5));
  lcd.setCursor(2,1);
  lcd.write(byte(6));
  lcd.setCursor(3,1);
  lcd.write(byte(7));
  }
  ///////////////////////////////////////////////////////////////////
  void bouche_fermee3(){  
  lcd.setCursor(14,0);
  lcd.write(byte(0));
  lcd.setCursor(15,0);
  lcd.write(byte(1));
  lcd.setCursor(14,1);
  lcd.write(byte(2));
  lcd.setCursor(15,1);
  lcd.write(byte(3));
  } 

 void bouche_ouverte3(){  
  lcd.setCursor(14,0);
  lcd.write(byte(4));
  lcd.setCursor(15,0);
  lcd.write(byte(5));
  lcd.setCursor(14,1);
  lcd.write(byte(6));
  lcd.setCursor(15,1);
  lcd.write(byte(7));
  }
///////////////////////////////////////////////////////////////:

  void bouche_fermee2(){  
  lcd.setCursor(12,0);
  lcd.write(byte(0));
  lcd.setCursor(13,0);
  lcd.write(byte(1));
  lcd.setCursor(12,1);
  lcd.write(byte(2));
  lcd.setCursor(13,1);
  lcd.write(byte(3));
  } 

 void bouche_ouverte2(){  
  lcd.setCursor(12,0);
  lcd.write(byte(4));
  lcd.setCursor(13,0);
  lcd.write(byte(5));
  lcd.setCursor(12,1);
  lcd.write(byte(6));
  lcd.setCursor(13,1);
  lcd.write(byte(7));
  }
///////////////////////////////////////////////////////////////////:
////////////////////////////////////////////////////////////////////
void cadenas_ouvert(){
  lcd.setCursor(4,0);
  lcd.write(byte(010));
  lcd.setCursor(5,0);
  lcd.write(byte(011));
  lcd.setCursor(4,1);
  lcd.write(byte(012));
  lcd.setCursor(5,1);
  lcd.write(byte(013));
}
 void cadenas_ferme(){
  lcd.setCursor(4,0);
  lcd.write(byte(014));
  lcd.setCursor(5,0);
  lcd.write(byte(015));
  lcd.setCursor(4,1);
  lcd.write(byte(016));
  lcd.setCursor(5,1);
  lcd.write(byte(017));
 }

Is this really a tutorial?

void setup(){
////////////////////////////////////////////////////////////// 
lcd.createChar(00,haut_gauche);
lcd.createChar(01,haut_droit);
lcd.createChar(02,bas_gauche);
lcd.createChar(03,bas_droit);
lcd.createChar(04,haut_gauche1);
lcd.createChar(05,haut_droit1);
lcd.createChar(06,bas_gauche1);
lcd.createChar(07,bas_droit1);
/////////////////////////////////////////////////////////////
lcd.createChar(010,cadenas_haut_gauche);
lcd.createChar(011,cadenas_haut_droit);
lcd.createChar(012,cadenas_bas_gauche);
lcd.createChar(013,cadenas_bas_droit);
lcd.createChar(014,cadenas_ouvert_haut_gauche);
lcd.createChar(015,cadenas_ouvert_haut_droit);
lcd.createChar(016,cadenas_ouvert_bas_gauche);
lcd.createChar(017,cadenas_ouvert_bas_droit);
////////////////////////////////////////////////////////////
Serial.begin(115200);
lcd.begin(16, 2);
  lcd.setCursor(6,0);
  lcd.print("PRET");
  delay(1000);
  lcd.clear();
  lcd.setCursor(4,1);
  lcd.print("Bonjour");
     pinMode (Decrocher, INPUT);
     pinMode (ledok, OUTPUT); 
     pinMode (boutonEffacer, INPUT);
     delay(2000);
  lcd.clear(); 
      
     }
  
void loop(){
  
  customKey  = customKeypad.getKey();
  effacer = digitalRead(boutonEffacer);
  decrocher = digitalRead(Decrocher);
  
  if(decrocher==false){NonDecrocher();}
 
  else if(decrocher==true){
     
    lcd.setCursor(2,0);
    lcd.print("tapez le code");    
    
  if (customKey){
    Serial.write("c");
    lcd.setCursor(a,1);
    lcd.print(customKey); 
    motdepassetaper[i]=customKey;
    i++;
    a++;}
    
    if(effacer ==true){ effacement();} 
    
    if ( i == 4){verificationCode();} 
  
    }
}
///////////////////////////////////////////////////////////////////////
    void NonDecrocher(){
    static byte x=0;
    if(x==1 && decrocher==false){effacement();x=0;}
    lcd.setCursor(4,0);
    lcd.print("veuillez");
    lcd.setCursor(3,1);
    lcd.print("decrocher");
    decrocher = digitalRead(Decrocher);
    if(decrocher==true){effacement();x++;}
    }
////////////////////////////////////////////////////////////////////////////
    void effacement(){
    Serial.println(effacer);
    lcd.clear();  
    i=0;
    a=5;}
/////////////////////////////////////////////////////////////////////////////
    
  void verificationCode(){
    
    delay(1000);
    //int a=1;
    //int b=2;
        lcd.clear();
      if ((memcmp(motdepasse, motdepassetaper, sizeof(motdepasse)) == 0)||(memcmp(motdepasse1, motdepassetaper, sizeof(motdepasse1)) == 0)){
        //Serial.println("CODE BON");
        Serial.write("a");
        lcd.setCursor(7,0);
        lcd.print("YOU");
        lcd.setCursor(7,1);
        lcd.print("WIN");
        for(int y=0;y<=6;y++){
        cadenas_ferme();
        digitalWrite(ledok,HIGH);
        delay(250); 
        cadenas_ouvert();
        digitalWrite( ledok,LOW);
        delay(250); }
        lcd.clear();  
        i=0;
        a=5;
      }
      else
      {//Serial.println ("mauvais code");
      Serial.write("b");
      lcd.setCursor(7,0);
      lcd.print("YOU");
      lcd.setCursor(6,1);
      lcd.print("LOSE");
  for(int x = 0;x<=1;x++){
     bouche_ouverte();
     bouche_fermee1();
     bouche_ouverte2();
     bouche_fermee3();
      delay(250);
     bouche_fermee();
     bouche_ouverte1();
     bouche_fermee2();
     bouche_ouverte3();
      delay(250);}
           i=0;
           a=5;
           lcd.clear();
           }
    }

I'm sorry I was completely wrong about the section excuse me

Bonjour,

Il ne peut y avoir plus de 8 caractères définis par l'utilisateur.

Bonjour

Merci Kamill pour ta réponse rapide.
Cela explique le comportement de mon écran. je suis un peu triste lol.
Il n y a donc aucune autre solution.C'est bien d'avoir cette info.
Merci encore.

Il faut redéfinir dynamiquement les caractères.
Mais je crois qu'il y a un problème avec la librairie en utilisant la connexion parallèle et quand j'avais essayé, il est impossible de redéfinir le caractères après le lcd.begin(), alors que ça fonctionne bien en connexion I2C.

ok

en effet mon projet est câbler en parallèle j'ai un autre écran en i2c je vais essayer, dommage pour mon projet tout est soudé et presque fini je vais repenser ma stratégie d'affichage il y a quelques caractères qui son identique dans mon animation cela me fera économiser au moins 4 caractères.

Je pense que ça devrait fonctionner en parallèle car la connexion I2C ne fait qu'une conversion I2C - parallèle.
Peut être essayer une autre librairie, ou se pencher sur le fonctionnement de la librairie.

hello

Ça y est j 'y suis parvenu!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! mais quel bonheur!!!!!!!!!!
il suffit de juste de mettre les createChar qu'on a besoin dans chaque fonction qui correspond...
exemple:

void bouche_fermee(){
lcd.createChar(00,haut_gauche);
lcd.createChar(01,haut_droit);
lcd.createChar(02,bas_gauche);
lcd.createChar(03,bas_droit);

lcd.setCursor(0,0);
lcd.write(byte(0));
lcd.setCursor(1,0);
lcd.write(byte(1));
lcd.setCursor(0,1);
lcd.write(byte(2));
lcd.setCursor(1,1);
lcd.write(byte(3));

et l'autre:

void bouche_ouverte(){

lcd.createChar(04,haut_gauche1);
lcd.createChar(05,haut_droit1);
lcd.createChar(06,bas_gauche1);
lcd.createChar(07,bas_droit1);
lcd.setCursor(0,0);
lcd.write(byte(04));
lcd.setCursor(1,0);
lcd.write(byte(05));
lcd.setCursor(0,1);
lcd.write(byte(6));
lcd.setCursor(1,1);
lcd.write(byte(7));
}

et ainsi pour n'importe que caractère qu l'on crée du coup plus de limite tout ca connecter en parallèle
merci encore kamill de m'avoir mis sur la piste

Salut

J'ai eu aussi un soucis avec des caractères "custom" , j'en avais un qui revenait sans cesse alors qu'il était effacé de mon code ...

Toujours pas compris pourquoi ..