Aller au contenu


Photo
- - - - -

Problème de code pour shield lcd + arduino


  • Veuillez vous connecter pour répondre
9 réponses à ce sujet

#1 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 07 avril 2014 - 09:38

Bonjour a tous.

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:

Image IPB

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


#2 ChristianR

ChristianR

    Membre passionné

  • Membres
  • PipPipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)

Posté 07 avril 2014 - 04:01

Avec PC portable + câble usb en alim, je n'ai as de caractères chinois; Ca affiche
113582 sig t: 0
Flr:_0 Rm:00.00
Christian

#3 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 07 avril 2014 - 05:55

C'est sur une tour ( PC fixe ) qui et bien branche avec le cable usb qui alimente la carte Arduino ainsi que le shield LCD

Oui en effet c'est bien c'est chiffre là :

113582 sig t: 0
Flr:_0 Rm:00.00

Mise a par c'est chiffre qui son aléatoire 113582. se ne son jamais les même.

Donc alors c'est un problème venant de mon shield LCD, et non de la programmation a votre avis?

#4 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 07 avril 2014 - 09:46

Je vais également voir si il y a pas des librairies qui pose problème ou re-téléchager le IDE Arduino 0023, plus la librairie du shield LCD que je possède.

Si vous avez d'autre idée je suis preneur.

#5 ChristianR

ChristianR

    Membre passionné

  • Membres
  • PipPipPip
  • 474 messages
  • Gender:Male
  • Location:Isère (38)

Posté 07 avril 2014 - 10:10

Par contre j'utilise l'IDE récente 1.0.5
Essaye avec une alimentation externe sur l'entrée jack.
Christian

#6 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 07 avril 2014 - 10:11

ChristianR


ok merci je vais testé sa.

Je vais mettre une batterie de 8.4V 1100mAh , mais elle et a plat , je vais la recharger , et je vous tien informé.

Merci ChristianR



#7 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 07 avril 2014 - 10:51

Bigot je viens de télécharger L' IDE Arduino 1.0.5 et j'ai quand même fait le teste en laissent le câble d'alimentation USB, est cela fonctionne merci de ton aide

ChristianR sa fait plus 1 semaine que je galéré sur cela.

Encore merci toi.



#8 Kyu

Kyu

    Membre

  • Membres
  • 53 messages
  • Gender:Male

Posté 10 avril 2014 - 10:54

Salut Seb03000 !

(ça fait un bail que je me suis pas connecté :dance2: ) Simple question, pourquoi avoir choisi de faire ta boucle "void loop()" sous forme de switch ?

Je ne prétends pas avoir de meilleure manière de faire je me demande simplement ce qu'y a motivé ce choix ?

Amicalement,

Kyu :zsmoke:
don't panick

#9 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 10 avril 2014 - 11:25

C'est pour illustré l'utilisation d'une instruction switch ,et du commutateur il
pourra me déclaré et me permettre de choisir parmi un ensemble de valeurs de caractère grâce aux bouton du LCD
C'est comme une série d'instructions if.



#10 Kyu

Kyu

    Membre

  • Membres
  • 53 messages
  • Gender:Male

Posté 11 avril 2014 - 08:15

Ah oui je sais effectivement ce à quoi cela correspond cependant en terme d'optimisation je trouvais le code assez laborieux, maintenant que tu viens de me dire que c'était pour illustrer ce cas alors tout prend son sens :tatice_03:

sinon j'aurai fais des for un peu partout :Koshechka_08:
don't panick




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users