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é.