Arduino Forum

International => Français => Topic started by: charpi_ on Apr 23, 2019, 10:05 pm

Title: Plusieurs tâches dans le loop ?
Post by: charpi_ on Apr 23, 2019, 10:05 pm
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 ;)
Title: Re: Plusieurs tâches dans le loop ?
Post by: fdufnews on Apr 23, 2019, 10:20 pm
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.
Title: Re: Plusieurs tâches dans le loop ?
Post by: charpi_ on Apr 23, 2019, 10:38 pm
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 ? 
Title: Re: Plusieurs tâches dans le loop ?
Post by: aladec on Apr 24, 2019, 11:04 am
Bonjour,
Envisager une programmation par "machines à états" ?
Voir https://forum.arduino.cc/index.php?topic=470879.0 (https://forum.arduino.cc/index.php?topic=470879.0)
Title: Re: Plusieurs tâches dans le loop ?
Post by: fdufnews on Apr 24, 2019, 11:34 am
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?