[BUG] Affichage de caractères étranges sur LCD avec Arduino Uno

Bonjour,

J’ai fait un programme avec une alarme : C’est a dire que lorsque que l’on appuie sur le bouton, L’écran LCD affiche que l’alarme se met en route puis elle sonne automatiquement après 5 secondes (car je n’ai pas de capteur de mouvement ^^) sauf que lorsque qu’elle sonne, l’écran affiche des caractères extrêmement étrange et le bip est infini alors qu’il devrait être seulement répéter 5 fois…

Une idée ? :slight_smile:

Le code :

//------------------------ ALARME --------------------------------------

#define LEDFLASHER 11
#define ALARMSOUNDER 10
#define ALARMSWITCH 12
int i = 0; 
int val = LOW; 
int pre_val = LOW; 
int state = 0;
byte Etat = 0;

//------------------------ ALARME --------------------------------------

//------------------------ LCD --------------------------------------

#include "LiquidCrystal.h"
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

//------------------------ LCD --------------------------------------

void setup() {

	lcd.begin(16, 2);
	lcd.write("ALARDUINO  V.1.3");
	lcd.setCursor(0, 1);
	lcd.write("   Waiting...");
//----------------------------------------------
    pinMode(LEDFLASHER, OUTPUT); 
    pinMode(ALARMSOUNDER, OUTPUT); 
    pinMode(ALARMSWITCH, INPUT); 

}

void loop() {

	delay(3000);
	Etat = digitalRead(ALARMSWITCH);

	if(Etat == 1){
	  
	  declenchement(); 
	
	}

}

void declenchement() {

	lcd.setCursor(0, 1);
	lcd.write("Mise en route...");
        delay(2000);
        
/*        for(i = 0; i = 255; i + 2)
        {
            analogWrite(LEDFLASHER, 255);
            analogWrite(ALARMSOUNDER, 200);
            delay(100);
            analogWrite(LEDFLASHER, 0);
            analogWrite(ALARMSOUNDER, 25);
            delay(100);
         } */
        
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.write("ALARDUINO  V.1.3");
        lcd.setCursor(0, 1);      
        lcd.write("   Alarme !!!");
        delay(2000);
//----------------------------------------------------------
	for(i = 0; i < 255; i = i + 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(10);
        }
        for(i = 255; i > 1; i = i - 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(5);
        }
        for(i = 1; i <= 5; i + 1)
        {
            analogWrite(LEDFLASHER, 255);
            analogWrite(ALARMSOUNDER, 200);
            delay(100);
            analogWrite(LEDFLASHER, 0);
            analogWrite(ALARMSOUNDER, 25);
            delay(100);
        }
        for(i = 0; i < 255; i = i + 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(10);
        }
        for(i = 255; i > 1; i = i - 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(5);
        } 
        
        pre_val = val;
}

Vidéo qui montre le problème : Cliquer ICI (Vidéo YouTube)

PS :

  • J’utilise un Arduino Uno : Le montage en détail : (Cliquer sur les photos ;))




  • L’écran est un WH1602B-TMI-ET (celui qui est dans le Starter Kit)

  • Le câblage au niveau de l’écran est correct car en période IDLE (sans rien faire) rien d’étrange ne se passe même avec un programme d’exemple.

Salut, j’ai eu exactement le même soucis lors de mon dernier montage et je n’ai tj pas trouvé l’origine du problème . J’ai juste remarqué que quand mon arduino est alimentée en usb , c’est moi fréquent . Je vais suivre ton post pour essayer de voir un peu avec les différents com

hello
si tu débranche le buzzer et ne laissse que la led, le prob persiste?
si oui, combien pompe le buzzer?

J'ai également un module buzzer

Le buzzer ne pompe absolument rien (enfin je crois ^^), l’arduino est branché en USB à mon PC.

Je viens de tester en mettant juste une led et voila le résultat : http://youtu.be/LXim63UvFVg

Ca marche !! Reste à savoir pourquoi le buzzer déclenche cette réaction avec l’écran :confused:

Par contre la LED ne doit pas clignoter indéfiniement (5 fois), alors que là c’est le cas… Peut être un problème dans le code ?

pour le buzzer, regardes ce lien
http://shallowsky.com/arduino/class/buzzer.html
pour la répétition faire:
void loop()
{
delay(3000);
Etat = 0; // ici il faut remettre "etat" à 0 sinon appel indefini
Etat = digitalRead(ALARMSWITCH);
if (Etat == 1) {
declenchement();
}
}

Ok merci ! Je ne pourrai pas tester le programme avant un petit bout de temps car je ne suis pas chez moi ! Mais je regarde tout ça dès que possible !! Merci pour cette proposition !!

en fait, il aurait mieux valu mettre ta résistance en pull up sur le 5 V plutôt qu'en push down à la masse
et bien sur inverser le test de état. "si etat ==1" deviendrait "si etat ==0"
nota : au lieu de la résistance extérieure, tu pouvais déclarer l'entrée en pull up.

Un question bête : pull up / down ? Je suppose que c’est positf / négatif (masse) ?

pull up = tirer vers le haut.
push down = pousser vers le bas

sur une entrée, mettre une pull up maintiendra l’entrée à 5 V (état haut).
si tu mets un BP raccordé à la masse, lorsque tu appui dessus, tu force l’entrée à 0V (état bas)
lorsque tu relâches le BP, l’entrée repasse à 5V “état haut”

dans le cas du schield keyboard LCD, pour les BP, la pull up est de 2K
voir schema : reponse #35 sur ce fil http://forum.arduino.cc/index.php?topic=339923.30

Ok merci pour ces précisions :wink: !
Comme je l'ai dit je ne peu pas tester ça avant 2 semaines car je n'ai pas l'arduino avec moi.

Je te tient au courant dès que possible :slight_smile:

Apres quelques petits test une fois rentré chez moi en branchant la LED et le piezzo sans résistances, l’écran fait toujours ces caractères spéciaux… Pour savoir si c’était bien le piezzo, le l’ai débranché et j’ai laisser la LED, il n’y a pas de probleme !

Ce que j’ai pu remarquer, c’est que les caractères spéciaux n’apparaissent pas lorsque cette partie de code est exécutée :

        for(i = 0; i < 255; i = i + 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(10);
        }
        for(i = 255; i > 1; i = i - 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(5);
        }

Cette partie correspond a la croissance de la luminosité de LED et du son du piezzo et inversement.

Mais le bug avec l’écran se déclenche lorsque les bips sont effectué :

         for(i = 1; i <= 5; i + 1)
        {
            analogWrite(LEDFLASHER, 255);
            analogWrite(ALARMSOUNDER, 200);
            delay(100);
            analogWrite(LEDFLASHER, 0);
            analogWrite(ALARMSOUNDER, 25);
            delay(100);
        }

Faut-il relier le piezzo a une résistance sur le circuit ?

Après avoir fait plusieurs tests, c’est bien la partie de code qui émet les bips qui fait bug l’écran et qui fait que des caractères spéciaux s’affichent…

D’ailleurs j’ai modifié un peu le code :

//------------------------ ALARME --------------------------------------

#define LEDFLASHER 11
#define ALARMSOUNDER 10
#define ALARMSWITCH 12
int i = 0; 
int val = LOW;  
byte Etat = 0;

//------------------------ ALARME --------------------------------------

//------------------------ LCD --------------------------------------

#include "LiquidCrystal.h"
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

//------------------------ LCD --------------------------------------

void setup() {

 lcd.begin(16, 2);
 lcd.write("ALARDUINO  V.1.3");
 lcd.setCursor(0, 1);
 lcd.write("   Waiting...");
//----------------------------------------------
    pinMode(LEDFLASHER, OUTPUT); 
    pinMode(ALARMSOUNDER, OUTPUT); 
    pinMode(ALARMSWITCH, INPUT); 

}

void loop() {

 delay(3000);
        Etat = 0;
 Etat = digitalRead(ALARMSWITCH);

 if(Etat == 1){
  
  declenchement();
          remiseazero();
 
 }

}

void declenchement() {

 lcd.setCursor(0, 1);
 lcd.write("Mise en route...");
    delay(2000);        
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.write("ALARDUINO  V.1.3");
    lcd.setCursor(0, 1);      
    lcd.write("   Alarme !!!");
    delay(10);

//----------------------------------------------------------
 for(i = 0; i < 255; i = i + 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(10);
        }
        for(i = 255; i > 1; i = i - 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(5);
        }
/*--------------- PARTIE QUI BUG -------------------------        
        for(i = 1; i = 25; i + 1)
        {
            if(digitalRead(ALARMSWITCH) != 1)
            {
            analogWrite(LEDFLASHER, 255);
            analogWrite(ALARMSOUNDER, 200);
            delay(100);
            analogWrite(LEDFLASHER, 0);
            analogWrite(ALARMSOUNDER, 25);
            delay(100);
            }            
        }
*///------------- PARTIE QUI BUG ---------------------------
}

void remiseazero() {

    lcd.clear();
    lcd.write("ALARDUINO  V.1.3");
    lcd.setCursor(0, 1);
    lcd.write("   Waiting...");

    for(i = 0; i < 255; i = i + 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(10);
        }
        for(i = 255; i > 1; i = i - 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(5);
        }

        analogWrite(LEDFLASHER, 0);
        analogWrite(ALARMSOUNDER, 0);

}

Ce que j’aimerais faire c’est que lorsque l’alrme se déclenche il faut rappuyer sur le bouton pour l’éteindre. Lorsque j’appuie sur le bouton j’aimerais que ça déclenche le void remiseazero, et que ça arrête une boucle infinie qui ferai les bips. Une idée ?

Tu peux utiliser les interruptions, mais pour cela il te faudra un deuxième bouton sur l'une des entrées prévu à cet effet. attachInterrupt() - Arduino Reference

Tu mets ta fonction declenchement() dans un WHILE conditionné par un bit que ton interruption mettra à 1.
ex: while(Etat == 1 && !acquitDefaut)
Comme cela à l'appui de ce bouton, tu excécute ta fonction remiseazero() à lequelle tu intègres le bit acquitDefaut conditionnant le WHILE.

Je teste ça demain et je te tient au courant !!

Merci pour la proposition !! :slight_smile:

Comment intégrer le bit aquitDefaut dans le programme ?

Voici la modif sans le bit qui est intégré. Es-ce correct ??

//------------------------ ALARME --------------------------------------

#define LEDFLASHER 11
#define ALARMSOUNDER 10
#define ALARMSWITCH 12

int i = 0; 
int val = LOW;  
byte Etat = 0;

//------------------------ ALARME --------------------------------------

//------------------------ LCD --------------------------------------

#include "LiquidCrystal.h"
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

//------------------------ LCD --------------------------------------

void setup() {

	lcd.begin(16, 2);
	lcd.write("ALARDUINO  V.1.3");
	lcd.setCursor(0, 1);
	lcd.write("   Waiting...");
//----------------------------------------------
    pinMode(LEDFLASHER, OUTPUT); 
    pinMode(ALARMSOUNDER, OUTPUT); 
    pinMode(ALARMSWITCH, INPUT); 
//----------------------------------------------
    attachInterrupt(0, remiseazero, change); //<-------------------------------------------

}

void loop() {

	delay(3000);
        Etat = 0;
	Etat = digitalRead(ALARMSWITCH);

	if(Etat == 1){
	  
	  declenchement();
	  remiseazero();

	}

}

void declenchement() {

    Etat = 1;
  
    lcd.setCursor(0, 1);
    lcd.write("Mise en route...");
    delay(2000);        
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.write("ALARDUINO  V.1.3");
    lcd.setCursor(0, 1);      
    lcd.write("   Alarme !!!");
    delay(10);


    while(Etat == 1 && !acquitDefaut){  //<------------------------------------

        Etat = 1;                                 //<------------------------------------
//----------------------------------------------------------
	for(i = 0; i < 255; i = i + 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(10);
        }
        for(i = 255; i > 1; i = i - 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(5);
        } }
/*--------------- PARTIE QUI BUG -------------------------        
        for(i = 1; i = 25; i + 1)
        {
            if(digitalRead(ALARMSWITCH) != 1)
            {
            analogWrite(LEDFLASHER, 255);
            analogWrite(ALARMSOUNDER, 200);
            delay(100);
            analogWrite(LEDFLASHER, 0);
            analogWrite(ALARMSOUNDER, 25);
            delay(100);
            }            
        }
*///------------- PARTIE QUI BUG ---------------------------


void remiseazero() {

    lcd.clear();
    lcd.write("ALARDUINO  V.1.3");
    lcd.setCursor(0, 1);
    lcd.write("   Waiting...");

    for(i = 0; i < 255; i = i + 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(10);
        }
        for(i = 255; i > 1; i = i - 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(5);
        }

        analogWrite(LEDFLASHER, 0);
        analogWrite(ALARMSOUNDER, 0);

}

Alarm_Piezzo_LCD.ino (2.67 KB)

J’aurai pensé à ça:

//------------------------ ALARME --------------------------------------

#define LEDFLASHER 11
#define ALARMSOUNDER 10
#define ALARMSWITCH 12

int i = 0; 
int val = LOW;  
byte Etat = 0;
byte acquitDefaut = 0;

//------------------------ ALARME --------------------------------------

//------------------------ LCD --------------------------------------

#include "LiquidCrystal.h"
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);

//------------------------ LCD --------------------------------------

void setup() {

	lcd.begin(16, 2);
	lcd.write("ALARDUINO  V.1.3");
	lcd.setCursor(0, 1);
	lcd.write("   Waiting...");
//----------------------------------------------
    pinMode(LEDFLASHER, OUTPUT); 
    pinMode(ALARMSOUNDER, OUTPUT); 
    pinMode(ALARMSWITCH, INPUT); 
//----------------------------------------------
    attachInterrupt(0, remiseazero, change);

}

void loop() {

	delay(3000);
        Etat = 0;
	Etat = digitalRead(ALARMSWITCH);

	if(Etat == 1){
	  
	  declenchement();
	  remiseazero();

	}
    acquitDefaut = 0;

}

void declenchement() {

    Etat = 1;
  
    lcd.setCursor(0, 1);
    lcd.write("Mise en route...");
    delay(2000);        
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.write("ALARDUINO  V.1.3");
    lcd.setCursor(0, 1);      
    lcd.write("   Alarme !!!");
    delay(10);


    while(Etat == 1 && !acquitDefaut){

        Etat = 1;
//----------------------------------------------------------
	for(i = 0; i < 255; i = i + 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(10);
        }
        for(i = 255; i > 1; i = i - 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(5);
        } }
/*--------------- PARTIE QUI BUG -------------------------        
        for(i = 1; i = 25; i + 1)
        {
            if(digitalRead(ALARMSWITCH) != 1)
            {
            analogWrite(LEDFLASHER, 255);
            analogWrite(ALARMSOUNDER, 200);
            delay(100);
            analogWrite(LEDFLASHER, 0);
            analogWrite(ALARMSOUNDER, 25);
            delay(100);
            }            
        }
*///------------- PARTIE QUI BUG ---------------------------


void remiseazero() {

    lcd.clear();
    lcd.write("ALARDUINO  V.1.3");
    lcd.setCursor(0, 1);
    lcd.write("   Waiting...");

    for(i = 0; i < 255; i = i + 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(10);
        }
        for(i = 255; i > 1; i = i - 2)
        {
            analogWrite(LEDFLASHER, i);
            analogWrite(ALARMSOUNDER, i);
            delay(5);
        }

        analogWrite(LEDFLASHER, 0);
        analogWrite(ALARMSOUNDER, 0);
       
      acquitDefaut = 1;

}

-Je déclare acquitDefaut comme un byte initialisé à 0.
-Dans la fonction déclenchement tu remplaces le !acquitDefaut par acquitDefaut == 0.
-A la fin de ta fonction remise à zéro tu mets acquitDefaut à 1 (pour sortir de la boucle déclenchement).
-A la fin de la boucle LOOP tu remets acquitDefaut = 0 pour te permettre de rééxécuter plus tard la fonction déclenchement.

Je n’ai pas testé le programme mais on ne doit pas être trop loin de la vérité. J’espère que cette solution te convient (et quelle fonctionne)!

Merci d'avoir répondu à ma question et d'avoir prit le temps de m'expliquer !!!!! Je te dit si ça fonctionne ce soir car je ne peux pas le tester ce matin !

Le code ne fonctionne pas bien... L'alarme se déclenche toute seule et l'écran affiche que des carrés blanc après le déclenchement. Une idée ?

PS : Regarde tes messages privés (http://forum.arduino.cc/index.php?action=pm)

Merci d'avance !!

Je viens de tout démonter sauf l'écran et de remonter la LED, le PIEZZO et un BOUTON et ça marche sauf que l'écran refait ces caractères bizarres...