Arduino Redémarre sans raison

Bonjour a tous,

j’ai récupéré un pavé numérique e-blocks (EB014) et je souhaite l’utiliser avec mon arduino pour rentrer des nombres. J’arrive bien a gérer le pavé numérique mais quand j’utilise ma fonction qui me permet d’obtenir un nombre a partir des touches qui ont été appuyé mon arduino redémarre (il ré-exécute la fonction setup et j’imagine que c’est parce qu’il redémarre) et je ne sais vraiment pas d’ou ça peut venir.
Voici mon code : (c’est la fonction NombreTape() qui pose problème et qui fait redémarrer l’arduino la fonction keypad() marche parfaitement bien.

 #include <LiquidCrystal.h>
//TestKeyPadEblock.ino
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int PinColonne[3] = {22,23,24};
int PinLigne[4] = {25,26,27,28};
int EtatLigne[4];
int Colonne;
int Ligne;
int Touche = 0;
int key = 99;
int Curseur[2];
int ValeurKeypad[16];
int i = 0;
int l = 0;
int ChiffreTape[10];
int x = 0;
int y = 0;

void setup() {

 for(int i = 0; i <= 2; i++){ //Pin Collone Keypad
   pinMode(PinColonne[i], OUTPUT);
 }
 for(int l = 0; l <= 3; l++){ //Pin Ligne Keypad
   pinMode(PinLigne[l], INPUT);
 }
 lcd.begin(16, 2);
 lcd.clear();
 lcd.print("Bonjour");
 delay(1000);
}

void loop() {
lcd.clear();
lcd.print("Salut");
x = NombreTape();
lcd.setCursor(0,0);
lcd.print(x);
delay(10000);
}


int Keypad() {
int x;
int key = 99;
int LigneAppuye = 0;
while(key == 99){
  for(int i=0; i <= 2; i++){

  digitalWrite(PinColonne[i],HIGH);
  LigneAppuye = 0;
     for(int t=0; t <= 3; t++){
         EtatLigne[t] = digitalRead(PinLigne[t]);
           if(EtatLigne[t] == 1){
LigneAppuye = t+1;
     }
      switch(i){
      case 0:
          switch(LigneAppuye){
          case 1:
          key = 1;
          break;
          case 2:
          key = 4;
          break;
          case 3:
          key = 7;
          break;
          case 4:
          key = 10;
          break;
          }           
          break;
          case 1:
    
          switch(LigneAppuye){
          case 1:
          key = 2;
          break;
          case 2:
          key = 5;
          break;
          case 3:
          key = 8;
          break;
          case 4:
          key = 0;
          break;
          }
          break;
          case 2:

        switch(LigneAppuye){
          case 1:
          key = 3;
          break;
          case 2:
          key = 6;
          break;
          case 3:
          key = 9;
          break;
          case 4:
          key = 11;
          break;
          }
          break;
        }
       }
       digitalWrite(PinColonne[i],LOW);
    }
//    Serial.println(LigneAppuye);
}
return key;
}

int NombreTape() {
int i = 0;
int y = 0;
int l = 0;
int Curseur[2]={i,1};
int NombreTape = 0;
int Touche = Keypad();
while(true){
   // statement

if(Touche>=0 and Touche <= 9){
lcd.print(Touche);
lcd.setCursor(Curseur[0],Curseur[1]);
ChiffreTape[i] = Touche;
i++;
Curseur[2]=(i,1);
}
else if(Touche == 10){
i--;
l=1;
for(i; i=0; i--){
   NombreTape = NombreTape + ChiffreTape[i]*10^l;
   l++;
}
y++;
}
else if(Touche == 11){
i--;
lcd.print(" ");
ChiffreTape[i]=0;
}
 }
 return NombreTape;
}

Si quelqu’un a une idée pour résoudre mon problème qu’il n’hésite pas.
J’ai déja essayé de changer l’alimentation (j’ai utilisé mon PC fixe et mon chargeur de tel qui peut fournir jusqu’à 8A donc je ne pense pas que ça vienne de la) et le câble d’alimentation. Mais la je sèche complètement.

Merci d’avance,
Desdra

bonjour,
code entre balise code </> merci

normal ca?

 for(int i = 0; i <= 2; i++){      //Pin Collone Keypad
    pinMode(PinColonne, OUTPUT);
  }
  for(int l = 0; l <= 3; l++){      //Pin Ligne Keypad
    pinMode(PinLigne[l], INPUT);
  }

Dsl pour le code.
Oui c'est normal en fait mon pavé numérique fait le lien entre 1 colonne et une ligne donc j'envoie du courant successivement sur les 3 colonnes et je vois quelle ligne le recoit

Bonsoir,

Dans la fonction NombreTape(), "i" devient peut-être négatif et ChiffreTape fait planter le programme.
Essai de tracer "i".

Une petite recherche dans les posts récents ?
mon nano semble redémarrer seul après le void loop

if(Touche>=0 and Touche <= 9){

ça c’est du Basic
en C on écrirait
if((Touche>=0) && (Touche<=9)) {

for(i; i=0; i–){

En C ça devient
for(; i==0; i–) {

C’est bon en bidouillant j’ai réussi a tout faire fonctionné voila le code que j’ai utilisé :

int NombreTape() {
	int i = 0;
	int y = 0;
	int l = 0;
	int Curseur[2]={i,1};
	int NombreTape = 0;
	int Touche = Keypad();
	lcd.setCursor(0,1);
	while(y == 0){
	    // statement
	Touche = Keypad();
	if(Touche>=0 and Touche <= 9){
		lcd.print(Touche);
		ChiffreTape[i] = Touche;
		if(i <= 14){
		    i++;
		}
	}
	else if(Touche == 10){

		i--;
		l=0;
		for(i; i >= 0; i--){
		    NombreTape = NombreTape + ChiffreTape[i]*pow(10,l);
		    l++;
		}
		y++;
	}
	else if(Touche == 11){
		i--;
		lcd.setCursor(i,1);
		lcd.print(" ");
		lcd.setCursor(i,1);
		ChiffreTape[i]=0;
	}
	delay(300);
  }
  return NombreTape;
}

Je ne sais pas d’ou venait le problème mais il est résolu, par contre si quelqu’un sait pourquoi je suis preneur.

Cordialement, Desdra

bonsoir Desdra

je ne suis pas sur de pouvoir apporter de l'eau a ton moulin
mais j'ai remarqué qu'en laissant brancher la carte arduino sur le port usb de l'ordi
la carte arduino redemarré sans crier gare et sans raison apparente

donc je le branche sur une alim externe et tout est rentré dans l'ordre

cordialement

Jean-Pierre

Une explication possible :
Micro coupure dans l'alim USB du PC.

Desdra:
Je ne sais pas d'ou venait le problème mais il est résolu, par contre si quelqu'un sait pourquoi je suis preneur

Bonjour,

Lorsqu'on a des reboots intempestifs et autres problèmes aléatoires, ils sont souvent dus à une écriture en dehors d'une variable ou d'un tableau. Dans ton premier programme tu as:

     Curseur[2] = (i, 1);

Ce qui fait que tu écris en dehors du tableau (qui comporte les index 0 et 1). De plus je ne sais pas ce que tu veux faire avec ton affectation (i,1), mais c'est évalué comme 1.
Ce n'est pas forcément ça le problème, mais ce genre d'erreur peut causer des problèmes complètement aléatoires.