Problème de "loop" pour controler une pompe (12V DC)

Bonjour,

Je dois pour un projet scolaire, "reproduire" une pompe à insuline à l'aide d'Arduino.

Je dispose d'une batterie 9V qui m'a permit de tester la pompe et confirmer son bon fonctionnement. Cependant, une fois le code ci-dessous téléversé, la vitesse du moteur reste la même et la loop semble ne pas boucler. La bibliothèque adafruit motor shield est utilisée.

#include <AFMotor.h>
int LG[24] = {92,350,287,251,240,216,211,205,196,192,172,163,142,124,105,92,84,77,82,81,82,82,85,90}; // Liste de la glycémie en fonction du temps d'un patient quelconque
int LTemps[24] = {0,120,240,360,480,600,720,840,960,1140,1320,1620,1920,2520,3120,3720,4320,4920,5520,6120,7320,8520,9720,10920 }; // Liste des temps associés aux glycémies ci-dessus
int Temps=0;
int G; // Glycémie
int k; // Constante servant à prédire la glycémie
AF_DCMotor motor(3);

void setup() {

//Vitesse initiale nulle et sens de rotation constant
  motor.setSpeed(150);
  motor.run(FORWARD);
}

void loop() {
  
// Changement de valeur de la glycémie G lorsque Temps atteint le temps suivant  de LT
  for (int i=1; i=23; i++){
    if (Temps==LTemps[i]) {
      G=LG[i];  
      k=i;
    }
  }
// Prédiction de la glycémie dans 30min   
  if ((LG[k]-LG[k-1])/(LTemps[k]-LTemps[k-1])*1800 + LG[k]<80){
    motor.run(RELEASE);
  }
 
 
  
  int EntreeHyper = 2990*(G-60)*0.02/60+ 118;
  int EntreeHyperPro = 2990*(G-60)*0.03/60+ 118;
  

 // Glycémie "normale" d=(g-60)*0.02 
 if ((G > 80) && (G < 110)){   
    if (EntreeHyper >= 255) {
      motor.setSpeed(255);
    }
    else if (EntreeHyper <=150){
      motor.setSpeed(150);
    }
    else{
      motor.setSpeed(EntreeHyper);  
    }
  }
  
  
 // Hyperglycémie d=(g-60)*0.02
  else if ((G > 110)){   
    if (EntreeHyper >= 255) {
      motor.setSpeed(255);
    }
    else if (EntreeHyper <=150){
      motor.setSpeed(150);
    }
    else{
      motor.setSpeed(EntreeHyper);  
      
    }
    
  } 
  delay (1000);
  Temps++;

}

La pompe ne fonctionnant pas pour des valeurs inférieures à 150 dans motor.setSpeed() j'ai arbitrairement posé la condition que 150 et 255 soient respectivement les valeurs minimales et maximales
J'ai essayé d'ajouter un Serial.print(1) pour voir si boucle il y avait, sans résultats.
J'ai également essayé d'ajouter la commande motor.run(FORWARD) après chaque motor.setSpeed(), encore une fois sans résultat.

Je ne parviens pas à voir d'où viens le problème et aurait donc besoin de votre aide, merci. (Des indications de ce que je voulais faire sont commentées au dessus des fonctions)

Hum… regardez de plus près

Merci pour votre indication, j'ai remplacé i=23 par i<=23. Cependant, la boucle ne semble toujours pas fonctionner...

Vous faites de nombreux calculs en nombre entier (int) vous risquez des soucis d’arrondis.

Par exemple vérifiez le résultat du calcul de l’expression dans le if


  if ((LG[k]-LG[k-1])/(LTemps[k]-LTemps[k-1])*1800 + LG[k]<80){

Effectivement, les résultats sont totalement incohérents pour les premières valeurs. J'ai donc pensé à ajouté une condition sur le temps, malheureusement arbitraire, pour y remédier. (Temps >= 480)

Pour les arrondis, remplacer les int par float permettrait-il de les minimiser ?
Et est-il possible de mettre un floatant dans motor.setSpeed() ? Par exemple, int EntreeHyper deviendrait float EntreeHyper.

La condition sur le temps choisi n'était pas judicieuse, j'ai alors changé la condition pour Temps >= 720 afin d'éviter d'avoir des valeurs incohérentes.

Vous pouvez faire les calculs en flottant et arrondir à la fin en mettant le résultat dans un entier.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.