Je me suis lancer a faire ( une bombe factice ) avec écran LCD et Arduino )
Voici les composants:
Écran LCD KeyPad Shield For Arduino SKU: DFR0009 voici un lien sur sa fiche:
http://www.dfrobot.com/wiki/index.php/LCD_KeyPad_Shield_For_Arduino_SKU:_DF…
Et l'Arduino Duemilanove:
Voici La programmation pris sur le net avec quelque modification:
/*--------------------------------------------------------------------------------------
Includes
--------------------------------------------------------------------------------------*/
#include <LiquidCrystal.h>
/*--------------------------------------------------------------------------------------
Defines
--------------------------------------------------------------------------------------*/
// Pins utilisé
#define BUTTON_ADC_PIN A0 // A0 est l'entrée bouton ADC
#define LCD_BACKLIGHT_PIN 3 // D3 contrôle LCD rétro backlight
// Lectures ADC attendus pour les 5 boutons sur l'entrée ADC
#define RIGHT_10BIT_ADC 0 // droit
#define UP_10BIT_ADC 145 // jusqu'à
#define DOWN_10BIT_ADC 329 // vers le bas
#define LEFT_10BIT_ADC 505 // gauche
#define SELECT_10BIT_ADC 741 // droit
#define BUTTONHYSTERESIS 10 // fenêtre bouton de détection valide
//renvoyer des valeurs pour ReadButtons()
#define BUTTON_NONE 0 //
#define BUTTON_RIGHT 1 //
#define BUTTON_UP 2 //
#define BUTTON_DOWN 3 //
#define BUTTON_LEFT 4 //
#define BUTTON_SELECT 5 //
// Define our states
#define STATE_TITLE 00 // Un écran de titre
#define STATE_KEYWAIT 05 // En attente d'une pression de touche
#define STATE_GAMESTART 20 // Le jeu commence
#define STATE_TURNSTART 30
#define STATE_INPUTNUMBER 40
// Misc. Defines
#define MSGFLASHDELAY 1000 // Combien de temps à clignoter messages pour (ms)?
/*--------------------------------------------------------------------------------------
Variables
--------------------------------------------------------------------------------------*/
byte buttonJustPressed = false; //ce sera vrai après ReadButtons () appeler si elle est déclenchée
byte buttonJustReleased = false; //ce sera vrai après ReadButtons () appeler si elle est déclenchée
byte buttonWas = BUTTON_NONE; //utilisée par ReadButtons () pour la détection d'événements de bouton
// Configuration des variables qui seront utilisées
byte state, nextstate;
byte timer, inputpos, flash;
boolean update;
byte bombpos[6], pos[6], signal[6];
byte ipos[6] = {4,5, 11,12, 14,15 };
int tmp;
unsigned long flashtime;
/*--------------------------------------------------------------------------------------
Init la bibliothèque LCD avec les broches LCD à utiliser
--------------------------------------------------------------------------------------*/
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Pins pour le bouclier freetronics 16x2 LCD. LCD: ( RS, E, LCD-D4, LCD-D5, LCD-D6, LCD-D7 )
/*--------------------------------------------------------------------------------------
setup()
Appelé par l'infrastructure 1 fois, avant le début de la boucle principale
--------------------------------------------------------------------------------------*/
void setup() {
// Setup pins.
pinMode(BUTTON_ADC_PIN, INPUT ); // Entrée analogique pour les boutons de l'écran LCD
digitalWrite(BUTTON_ADC_PIN, LOW );
pinMode(LCD_BACKLIGHT_PIN, OUTPUT ); // contrôle du rétroéclairage (off/on)
digitalWrite(LCD_BACKLIGHT_PIN, HIGH ); // Tournez le rétro-éclairage on
randomSeed(analogRead(1)); // Envoyer le générateur de nombres aléatoires
lcd.begin( 16, 2 ); //bibliothèque LCD affichage 16x2
lcd.setCursor( 0, 0 );
// 1234567890123456
lcd.print( "-_D E F U S E _-" );
lcd.setCursor( 0, 1 );
lcd.print( '.' );
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
lcd.print( '.' );
flashbacklight();
state = STATE_TITLE;
}
/*--------------------------------------------------------------------------------------
loop()
Arduino main loop
--------------------------------------------------------------------------------------*/
void loop() {
byte button;
button = ReadButtons();
switch(state) { // Faire des choses différentes en fonction de "l'état"
case STATE_TITLE:
lcd.setCursor( 0, 0 );
// 1234567890123456
lcd.print( "= D E F U S E =");
lcd.setCursor( 0, 1 );
lcd.print( "Press[touche]key" );
nextstate = STATE_GAMESTART;
state = STATE_KEYWAIT;
break;
case STATE_KEYWAIT:
if(buttonJustPressed) state = nextstate;
break;
case STATE_GAMESTART:
//Init afin de signal
for(int i = 0; i < 6; i++) signal[i] = i;
//Afin de signal aléatoire
for(int cnt = 0; cnt < 500; cnt++) {
int pos1 = random(6);
int pos2 = random(6);
tmp = signal[pos1];
signal[pos1] = signal[pos2];
signal[pos2] = tmp;
}
//Choisissez une position à la bombe. Il ne peut être 00,00,00
do {
tmp = 0;
for(int i = 0; i < 6; i++) {
pos[i] = 0;
bombpos[i] = random(9);
tmp += bombpos[i];
}
}
while(tmp == 0);
timer = 300;
lcd.clear();
// 1234567890123456
lcd.print("Trouver la bombe");
lcd.setCursor(0,1);
lcd.print("il y a des");
delay(MSGFLASHDELAY);
lcd.setCursor(0,0);
lcd.print("detecteur,Il ya ");
lcd.setCursor(0,1);
lcd.print("1 million piece ");
delay(MSGFLASHDELAY);
lcd.setCursor(0,0);
lcd.print("Alors comment ");
lcd.setCursor(0,1);
lcd.print("Sa marche? ");
delay(MSGFLASHDELAY);
state = STATE_TURNSTART;
//tombe à travers
case STATE_TURNSTART:
// 1234567890123456
// SSSSSSsig t:TTT
// Flr:YY Rm:XX.ZZ
if(timer == 0) {
flashbacklight();
lcd.setCursor(0,0);
lcd.print("B O O O O O O ");
lcd.setCursor(0,1);
lcd.print(" O O O O O OM!");
delay(MSGFLASHDELAY);
lcd.clear();
lcd.print("Les bombes etait");
lcd.setCursor(0,1);
lcd.print("Flr:");
lcd.print(bombpos[0]);
lcd.print(bombpos[1]);
lcd.print("Rm:");
lcd.print(bombpos[2]);
lcd.print(bombpos[3]);
lcd.print(".");
lcd.print(bombpos[4]);
lcd.print(bombpos[5]);
nextstate = STATE_TITLE;
state = STATE_KEYWAIT;
break;
}
timer -= 10;
lcd.clear();
for(int i = 0; i < 6; i++) {
lcd.print(9 - abs((int)bombpos[signal[i]] - (int)pos[signal[i]]));
}
lcd.print(" sig t: ");
if(timer<100) lcd.print("0");
lcd.print(timer);
lcd.setCursor(0,1);
lcd.print("Flr:YY Rm:XX.ZZ ");
for(int i = 0; i < 6; i++) {
lcd.setCursor(ipos[i],2);
lcd.print(pos[i]);
}
inputpos = 0;
flashtime = millis() + 750;
flash = 1;
state = STATE_INPUTNUMBER;
//tombe à travers
case STATE_INPUTNUMBER:
update = false;
if(millis() >= flashtime) {
flashtime = millis() + (750 - (500 * flash));
flash = 1 - flash;
update = true;
}
if(buttonJustPressed) {
switch(button) {
case BUTTON_LEFT:
lcd.setCursor(ipos[inputpos],1);
lcd.print(pos[inputpos]);
if(inputpos == 0) inputpos = 5;
else inputpos--;
update = true;
break;
case BUTTON_RIGHT:
lcd.setCursor(ipos[inputpos],1);
lcd.print(pos[inputpos]);
if(inputpos == 5) inputpos = 0;
else inputpos++;
update = true;
break;
case BUTTON_DOWN:
if(pos[inputpos] == 0) pos[inputpos] = 9;
else pos[inputpos]--;
update = true;
break;
case BUTTON_UP:
if(pos[inputpos] == 9) pos[inputpos] = 0;
else pos[inputpos]++;
update = true;
break;
case BUTTON_SELECT:
lcd.clear();
if(bombpos[0] == pos[0] && bombpos[1] == pos[1] && bombpos[2] == pos[2] &&
bombpos[3] == pos[3] && bombpos[4] == pos[4] && bombpos[5] == pos[5]) {
// 1234567890123456
lcd.print("Bombe desactive"); lcd.setCursor(0,1);
lcd.print("Vous etes un heros!");
nextstate = STATE_TITLE;
state = STATE_KEYWAIT;
} else {
lcd.print("Numerisation");
delay(MSGFLASHDELAY/2);
lcd.print(".");
delay(MSGFLASHDELAY/3);
lcd.print(".");
delay(MSGFLASHDELAY/4);
lcd.print(".");
delay(MSGFLASHDELAY/5);
lcd.print(".");
delay(MSGFLASHDELAY/6);
state = STATE_TURNSTART;
}
update = false;
break;
}
}
if(update == true) {
lcd.setCursor(ipos[inputpos],1);
if(flash == 0) lcd.print("_");
else lcd.print(pos[inputpos]);
}
break;
default:
break;
}
//effacer les drapeaux buttonJustPressed & buttonJustReleased; ils ont déjà fait leur travail
if(buttonJustPressed) buttonJustPressed = false;
if(buttonJustReleased) buttonJustReleased = false;
delay(25); //Retard pour arrêter les boutons "sautillement" faux presses. Pas aussi bien comme un véritable anti-rebond.
}
void flashbacklight() {
digitalWrite(LCD_BACKLIGHT_PIN, LOW);
delay(150);
digitalWrite(LCD_BACKLIGHT_PIN, HIGH);
delay(150);
}
/*--------------------------------------------------------------------------------------
ReadButtons()
Détecter le bouton enfoncé et retourner la valeur
Utilise les valeurs mondiales buttonWas, buttonJustPressed, buttonJustReleased.
--------------------------------------------------------------------------------------*/
byte ReadButtons() {
unsigned int buttonVoltage;
byte button = BUTTON_NONE; // retourner aucun bouton pressé si les contrôles ci-dessous n'écrivent pas btn
//lire la tension de la broche bouton ADC
buttonVoltage = analogRead( BUTTON_ADC_PIN );
//sens que si la tension tombe dans les fenêtres de tension valides
if( buttonVoltage < ( RIGHT_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_RIGHT;
}
else if( buttonVoltage >= ( UP_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( UP_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_UP;
}
else if( buttonVoltage >= ( DOWN_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( DOWN_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_DOWN;
}
else if( buttonVoltage >= ( LEFT_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( LEFT_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_LEFT;
}
else if( buttonVoltage >= ( SELECT_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( SELECT_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_SELECT;
}
//gérer drapeaux touche des événements juste pressés et vient de sortir
if( ( buttonWas == BUTTON_NONE ) && ( button != BUTTON_NONE ) )
{
//le bouton a été pressé, mettre buttonJustPressed, ce qui peut éventuellement être utilisé pour déclencher une action ponctuel pour appuyer sur un bouton veille
//il est du devoir du récepteur pour effacer ces drapeaux si elle veut détecter un nouvel événement de changement de bouton
buttonJustPressed = true;
buttonJustReleased = false;
}
if( ( buttonWas != BUTTON_NONE ) && ( button == BUTTON_NONE ) )
{
buttonJustPressed = false;
buttonJustReleased = true;
}
//sauver la dernière valeur de bouton, pour la détection d'événements de modification fois suivante
buttonWas = button;
return( button );
}Voici mon souci le code fonctionne très bien , mais le problème des que je veux entré
un chiffre a laide du clavier intégré de mon LCD, le curseur se mais a clignoté avec un
symbole bizarre , alors que sa dois clignoté avec se tiré ( _ ) <-- tirai du 8 sur le clavier
Voici le symbole bizarre:

Donc a votre avis , soi c'est un problème dans ma programmation ou de shield , ou alimentation ( car je suis brancher en 5V avec le câble USB qui alimente l'Arduino ).
Merci avants tous de m'avoir lu , et merci pour votre aide a tous.
PS: Je me penche quand même a trouvé se problème de mon coté.













