Go Down

Topic: Plusieurs tâches dans le loop ? (Read 247 times) previous topic - next topic

charpi_

Apr 23, 2019, 10:05 pm Last Edit: Apr 23, 2019, 10:09 pm by charpi_
Bonsoir,

Je cherche dans une boucle principal pour à tester plusieurs valeurs en même temps:
 la valeur d'un capteur d'empreinte digital (finger...), d'un keypad (alarm, pave_num()) et d'un capteur d'effort (scale.getGram() qui teste en gramme un effort)
Si le capteur d'empreinte et pavé numérique sont ok j'active l'ouverture de vérin (pas de soucis)
Mais dès que j'ajoute while(scale.getGram() >= 15 (kg) ) mon capteur d'empreinte ralenti et j'ai du mal a rentrer le mot de passe sur le pavé numérique...
Du coup je voudrais exécuter ces deux conditions en "même temps".

void loop()
{
 
 fingerprintID = getFingerprintIDez();
 alarm = pave_num()
     
  if (finger.fingerID == 1 and alarm == 0)
    {
        Serial.println("DEVEROUILLAGE MALLETTE");
        verin_S();
        delay(1000);
        verin_R(); 
    }

  while (scale.getGram() >= 15)
    {
        pompe();
    }

}

Merci d'avance ;)

fdufnews

#1
Apr 23, 2019, 10:20 pm Last Edit: Apr 23, 2019, 10:20 pm by fdufnews
Ce morceau de code est bloquant. Tant que la condition n'est pas remplie le programme reste dans la boucle
Code: [Select]
  while (scale.getGram() >= 15)
    {
        pompe();
    }
Si aucune des autres fonctions appelées dans loop() n'est bloquantes et si leur timing le permet le plus simple serait peut-être de remplacer la boucle while par un if
Code: [Select]
if (scale.getGram() >= 15)
    {
        pompe();
    }
Il ne faut pas perdre de vue que loop est une boucle infinie donc, si comme je le disais au-dessus aucune des autres fonctions appelées n'est bloquantes, tu vas passer très souvent sur le if et la fonction devrait se dérouler comme précédemment mais sans ralentir la saisie au clavier.

charpi_

Je comprend je viens de changer la condition.
Cependant le timing semble toujours difficile...
En effet, la boucle loop() comme tu l'as précisé déroule toute les instructions à l'infinie. Dans ce cas-ci, lorsque j'éxecute le programme pour tester le pavé numérique il voit que sa valeur est incorrecte dont loop passe directement au teste de scale.getGram().
Sachant que le pavé numérique ET le capteur d'empreinte doivent avoir leurs valeurs correcte en un temps donné, le timing est ultra serré...
N'y a-t-il pas un moyen / fonction / méthode ou autre pour que deux tests distincts s'effectuent de manière indépendantes ? 

aladec

Bonjour,
Envisager une programmation par "machines à états" ?
Voir https://forum.arduino.cc/index.php?topic=470879.0
Arduino Yun et Arduino Uno R3

fdufnews

Sachant que le pavé numérique ET le capteur d'empreinte doivent avoir leurs valeurs correcte en un temps donné, le timing est ultra serré...
N'y a-t-il pas un moyen / fonction / méthode ou autre pour que deux tests distincts s'effectuent de manière indépendantes ? 
indépendantes??
Le code s'exécute de manière séquentielle. Si les fonctions que tu appelles s'exécutent dans un temps raisonnable la boucle sera fluide. Maintenant, si tu as prévu un timing trop serré et incompatible de la durée d'exécution de chacun des sous-ensembles il va falloir adapter tes contraintes.

As-tu chiffré le temps d'exécution de chacune des fonctions appelées?

Go Up