Problème programmation pour un banc d'essai

Bonjour,

Dans le cadre de mon BTS j'ai un projet qui consiste à créer un banc d'essai pour inclinomètres, en gros c'est un plateau fixer sur un axe qui tourne grâce à un moteur pas à pas piloter par l'Arduino Uno et un driver, le moteur doit se positionner en fonction de l'angle entrer par l'utilisateur a partir du pavé numérique et la valeur s'affichera sur un ecran LCD.

Etant débutant avec arduino,

Tout ce passe bien mais j'ai un soucis dans la programmation, lors de la fonction loop() j'ai 2 fonctions, dont la fonction appelée angle() dans laquelle j'ai un soucis, j'essaye de convertir les caractères saisi au pavé en entier ou autre afin qu'il puisse me l'afficher mais aussi l'utiliser dans un calcul.

Les caractères on l'air de se convertir mais seulement une seule fois, je rentre ma valeur d'angle, le moteur tourne et il m'affiche ma valeur mais lorsque je veux recommencer il m'affiche toujours la même valeur et le moteur ne tourne plus.

Je ne sais pas si je suis assez compréhensible mais je vous mets la fonction en dessous, j'aurais vraiment besoin d'aide s'il vous plaît je n'arrive pas à comprendre pourquoi ça ne fonctionne qu'une seule fois,

Merci :blush:

void angle()
{

rec1:
x=0;
y=0;  
d=0;


lcd.setCursor(0,1);

  
while(ang<2)
{
touche = clavier.getKey(); // Lecture la touche appuyée
if (touche != NO_KEY) 
  {
     Clavier[compteur++]= touche;
     Clavier[compteur]= '\0';
     y =atol(Clavier);
     
     if (touche=='A')  {lcd.clear(); lcd.setCursor(1,0); d=(y-x)/0.1; moteur.step(d); delay(300); compteur = 10; lcd.print("Angle : "); lcd.print(y); lcd.setCursor(0,1); lcd.print("Nouveau ? C:Oui"); goto rec1;}

     if (touche=='B')  {lcd.clear(); lcd.setCursor(1,0); lcd.print("Entrez l'angle"); goto rec1;} 

     if (touche=='C')  {lcd.clear(); lcd.setCursor(1,0); x=y; lcd.print("Entrez l'angle"); goto rec1;} else lcd.print(touche); 

     if (touche=='F')  {lcd.clear(); d=(-x)-r; lcd.print("Etalonnage"); lcd.setCursor(0,1); lcd.print("Termine"); delay(5000); lcd.clear(); ang++;}

  }   
}

}

Je peux aussi mettre la totalité de mon programme si nécessaire

Bonjour,

Je pense que compteur devrait être remis à 0 quelque part. Je ne vois pas ç quoi correspond compteur=10 dans le cas 'A'

Remarque: je pense que tu fais de la cryptoprogrammation. Ton programme est illisible avec tes instructions sur une seule ligne, les goto, le while (ang<2) dont on ne voit pas très bien le pourquoi.

Le compteur=10 est en fait une erreur ! c'est plutôt compteur=0 en fait ^^

Je fait tout sur une même ligne comme ça je m'y perds moins ( c'est peut être pas logique )
mais à vrai dire j'ai pas tout compris sur mon système de conversion, je l'ai trouver sur un forum..

Et en mettant compteur à 0, ça fonctionne?

Oui merci bien j'aurais du mieux regarder :sweat_smile:

J'ai encore un petit problème a régler, j'ai besoin de générer des angles et afficher des angles avec une résolution de 0,1°, mais lorsque je tape par exemple 24,3 , le moteur tourne de 24° et l'afficheur m'affiche 24, je n'arrive pas à lui faire comprendre les chiffres a virgules. J'ai essayer de faire passer mes variables en float, le moteur tourne toujours de 24° mais cette fois l'afficheur m'affiche 24,00.

Saurais-tu comment je peux remédier à ça s'il te plaît ?

Merci

tu convertis en flottant puis tu multiplie par 10

 float yf=atof(clavier);
 y=10*yf;

tu supprimes la multiplication par 10 pour d

 d=y-x;

Le problème n'a pas changé..

Tu utilises quel caractère comme séparateur décimal?
Fais un Serial.println(clavier)
Ca t'affiche combien pour y?

Euh.. j'utilise la touche E du clavier que j'ai mis en " , "

char touches[LIGNES][COLONNES] = {
  {'1','2','3','F'},
  {'4','5','6',','},
  {'7','8','9','-'},
  {'A','0','B','C'},
};

Si j'entre 25,4

pour yf il m'affiche 25,00
et pour y il m'affiche 250 ( y etant un int )

Du coups j'ai remplacer la virgule par un point et ça fonctionne ^^ désolé de t'avoir déranger pour une bétise

Par contre juste un détail futile mais est ce qu'il y a moyen de passer en affichage 0.0 et pas 0.00 ?

si tu fais

lcd.print(yf,1);

C'est parfait !

Je te remercie infiniment pour ton aide maintenant mon banc fonctionne super bien.

MERCI