probleme lecture port serie

bonjour j ai un probleme que je n arrive pas à solutionner

j’ai une balance qui print le poids lorsqu il est stable

dans mon programme à l etape g1=12, je fais une pause, afin de pouvoir travailler sur la balance sans avoir d effet sur le deplacement du moteur

et mon probleme est que je n y arrive pas, lorsque je suis en pause

je met un truc sur la balance, et la fonction getPoids() à l’air de quand meme capter le signal, alors que nous sommes bloquer dans une boucle while

du coup quand j enleve ma pause, ba mon moteur se met a tourner

Nouveau document texte.txt (25.8 KB)

C’est une usine à gaz votre code (modularité, fonctions - ça vous parle ?) et même pas indenté... donc illisible sur mon tel.... il semble que vous avez une grosse machine à état (cf mon tuto éventuellement pour voir ce qu’est un enum et un switch)

À l’étape g1 == 12 il vous faut clicker (appui et relâche) le bouton LEFT pour sortir du while et aller en g1=10

while (g1==12 || g1==13)
      {
    if (g1 == 12 && btnLEFT == getButton())
    {
        g1=13;
        printG1();      
    }
        if (g1 == 13 && btnNONE == getButton())
    {
        lcd.setCursor(0, 0);
        lcd.print("               ");
        lcd.setCursor(0, 1);
        lcd.print("               ");
        g1=10;
        printG1(); 
        break;     
    }
  }

mais il ne se passe pas grand chose à part de l'affichage lors du click —> c’est quoi votre question exactement ?

—-

Au passage

void printG1()
{
  char bufG1[10];
  lcd.setCursor(13, 0);
  sprintf(bufG1, "%d", g1);
  lcd.print(bufG1);
}

pourquoi passer par un buffer ?

void printG1()
{
  lcd.setCursor(13, 0);
  lcd.print(g1);
}

fait le même chose...

alors pour le print g1 , c'est pas moi qui est fait cette base de code, c'est un ami

pour la pause en effet, c est ce qu'elle doit faire

mon probleme est pendant que le code est bloquer dans la boucle while

si ma balance envoi un print, il est quand meme considerer par le programme

alors que j 'ai tout fait pour que le port ne soit pas en lecture si la pause est activé

du coup quand j enleve la pause, il repasse à l etape 10

comme il à memorisé un poidsLu supérieur à 5, il passe donc au etape d'avant et actrive une correction moteur avec g2

hors, j'active la pause, je pose quelque chose sur la balance, elle print donc un poids superieur à 5, ensuite j'enleve l objet, elle print encore et envoi donc un poids=0

ensuite j enleve la pause, et bien elle a gardé en memoire le poids superieur à 5 et active le programme alors que rien n est sur la balance

bon, j'ai un inter double sur le rx/tx, je pourrais me servir de lui pour faire mes tare sur la balance, sans que le programme se met en branle, mais c est dommage j aurais preferer faire ça en code

Ben voilà... Parce que quand vous sortez de la boucle tout ce qui a été dit sur le port série (dans l’ordre d’arrivee) est toujours là à attendre ... (au moins les 64 derniers octets)

Perso je pense qu’il faut tout reprendre avec une bonne machine à état et pas le gros plat de spaghetti que vous avez.... lisez mon tuto éventuellement ça vous donnera des idées —> il faut toujours revenir à la loop qui testera les contions de transitions et pourra aussi écouter ce que dit la balance et décider de le garder ou pas

Sinon rajoutez aux spaghettis la lecture du port série dans l’attente et ignorez tout ce que dit la balance... au point où vous en êtes...while (Serial.available() >0) Serial.read();

est ce que il y a une façon d ecrire simplement à la sortie de la boucle pause, on vide le port serie?

vtec35: est ce que il y a une façon d ecrire simplement à la sortie de la boucle pause, on vide le port serie?

c'est un peu ce que fait la ligne que j'ai écrit. le soucis c'est que ça vide le buffer du port série très vite, plus vite potentiellement que les infos de la balance arrivent et donc ça va s'arrêter mais on ne sait pas si d'autres caractères ne vont pas arriver.. donc c'est pour cela que je vous proposais de le mettre ça dans la boucle active, au moins pendant qu'on attend on vide, et éventuellement on le fait encore un coup, ou pendant un certain temps en sortie de boucle

dans l'absolu la machine a état ne devrait pas être être bloquée mais être dans un état où elle lit et ignore les messages

avec un peu de chance cependant vous ignorerez un bout suffisamment gros du message pour qu'il ne soit pas lisible. si le reste de votre code est robuste et ignore une communication de la balance incomplète et sait se resynchroniser sur le prochain message alors ça devrait aller

c est bon probleme resolu merci

et d habitude je n utilise jamais de while pour justement eviter de bloquer, mais bon mon pote est plus experimenté que moi, j ai pas voulu le contre dire

vtec35: et d habitude je n utilise jamais de while pour justement eviter de bloquer, mais bon mon pote est plus experimenté que moi, j ai pas voulu le contre dire

vous lui direz que vous avez raison :)

salut alors j ai tester la machine en condition aujourd hui, impeccable

j'ai juste un probleme au tout debut du parametrage du programme, je peux faire un deplacement moteur via les bouton up et down

avec un choix de vitesse lente ou rapide

mais comme je ne savais pas comment mettre en place le code d accel stepper pour piloter en manuel

j'ai mis

digitalWrite(DIR, HIGH); analogWrite(11, 127);

mais du coup pas de rampe, d accel ou deccel, pour la vitesse lente ça poste pas de soucis, mais pour la rapide, je suis obligé d aider le moteur a demarrer, sinon il decroche

du coup la question est:

est ce que je peux faire une boucle du style?

void loop ()

{ stepper1.setSpeed(v1); stepper1.moveTo(s1); stepper1.run();

si j appuie sur le bouton up s1= 1000000 si j appuie sur le bouton down s1=-100000 et si pas de bouton = stop

}