Go Down

Topic: Maîtriser le débit d'une pompe (Read 573 times) previous topic - next topic

Wiiik

Bonsoir,

Une des fonctions de mon programme doit piloter une pompe qui a un débit de 1,8 litres par minute. Or dans ce projet le débit doit être compris entre 0 et 100 ml/h.

Donc 1,8 L/min = 1800 ml /min = 30 ml/sec

100/30 = 3.33 sec

Il faut donc que la pompe fonctionne pendant 3.33 secondes toutes les heures et je ne peux pas utiliser la fonction delay() car le reste du programme doit continuer à s'exécuter.

Je pense donc écrire cette fonction de cette manière:

Code: [Select]

int temps = 0;
long precedent_millis = 0;

void arroser(debit) // fonction ne renvoyant rien et recevant un debit compris entre 0 et 100 ml/h
{
  unsigned long valeur_millis = millis();
 
  if(valeur_millis - precedent_millis >= 3600000) // autrement dit si une heure s'est écoulée depuis le dernier arrosage
  {
    temps = debit /30; // donne un résultat en secondes
    temps = temps*1000; // convertit en millisecondes
   
    digitalWrite(pompe, HIGH);
   
    delay(temps);
   
    digitalWrite(pompe, LOW);
  }
}


Ma question est simple: comme millis() déborde tous les 50 jours d'après la doc, est ce que le programme va planter à ce moment.
Si c'est le cas existe-t-il un moyen de réinitialiser millis() à chaque fois que la condition est vraie? Merci.

barbudor

Comme tu compares une différence (c'est exactement ce qu'il faut faire, bravo) çà sera bon si tu mets des types cohérents : met soit des "long" soit des "unsigned long" partout.

Par ailleurs tu peux aussi éviter de bloquer le reste du programme pendant les 3.3 secondes en utilisant la même méthode et une petite machine d'état à 2 états.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Jean-François


Ma question est simple: comme millis() déborde tous les 50 jours d'après la doc, est ce que le programme va planter à ce moment.


Fait un test avec la fonction micros().... tu seras plus vite fixé  XD (70 minutes il me semble)
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Wiiik

Merci à vous deux


Comme tu compares une différence (c'est exactement ce qu'il faut faire, bravo)


Je n'ai pas beaucoup de mérite, je n'ai fait qu'adapter la doc ;)

Bon maintenant je chercher à récupérer une consigne de débit via la liaison série. Le but serait d'enregistrer une valeur lorsque la carte reçoit dans son buffer une chaîne "debit : valeur". Par exemple on tape "debit : 100" dans la liaison série et hop! la variable debit passe à 100.

Pour ce faire j'ai essayer d'adapter du code qui provient du cours du site du zero, mais rien que le test "if(mot==test) ne fonctionne pas et je ne comprend pas pourquoi...

Code: [Select]
char mot[5];
char test[5]={'d','e','b','i','t'};

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  if(Serial.available())
  {
    //alors on va lire le contenu de la réception
    lireVoieSerie();
    Serial.println(mot);
  }
}
//lit un mot sur la liaison série (lit jusqu'à rencontrer le caractère '\n')
void lireVoieSerie(void)
{
int i = 0; //variable locale pour l'incrémentation des données du tableau

//on lit les caractères tant qu'il y en a
//OU si jamais le nombre de caractères lus atteint 4 (limite du tableau stockant le mot - 1 caractère)
while(Serial.available() > 0 && i <= 4)
{
            mot[i] = Serial.read(); //on enregistre le caractère lu
            delay(10); //laisse un peu de temps entre chaque accès a la mémoire
            i++; //on passe à l'indice suivant
            if(mot==test)
            {
              Serial.println("ca marche");
            }
}
        mot[i] = '\0'; //on supprime le caractère '\n' et on le remplace par celui de fin de chaine '\0'
}


barbudor

Code: [Select]
if(mot==test)

Tu a trouvé cela sur le site du zéro ?
Ca m'étonnerais, généralement ils ne font pas ce genre d'erreur

test et mot sont des tableaux de caractères. Le signe == ne peut pas s'appliquer à un tableau (ou plutot il s'applique sur le pointeur en mémoire du tableau et pas sur son contenu)
pour comparer 2 chaines de caractères il faut utiliser la fonction strcmp( chaine1, chaine2 ) qui retour 0 en cas d'égalité.
Ou bien strncmp( chaine 1, chaine 2, nombrechar )

Code: [Select]
char mot[5];
char test[] = " debit"; // on déclare comme un chaine de caractère terminée par un caractère nul '\0'

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  if(Serial.available())
  {
    //alors on va lire le contenu de la réception
    lireVoieSerie();
    Serial.println(mot);
  }
}
//lit un mot sur la liaison série (lit jusqu'à rencontrer le caractère '\n')
void lireVoieSerie(void)
{
int i = 0; //variable locale pour l'incrémentation des données du tableau

//on lit les caractères tant qu'il y en a
//OU si jamais le nombre de caractères lus atteint 4 (limite du tableau stockant le mot - 1 caractère)
while(Serial.available() > 0 && i <= 4)
{
            mot[i] = Serial.read(); //on enregistre le caractère lu
            delay(10); //laisse un peu de temps entre chaque accès a la mémoire
            i++; //on passe à l'indice suivant
            if(0 == strncmp(mot, test, 5) )
            {
              Serial.println("ca marche");
            }
}
        mot[i] = '\0'; //on supprime le caractère '\n' et on le remplace par celui de fin de chaine '\0'
}



Il y a encore des trucs a voir dans ton code
Si la syntaxe de test commandes est toujours <mot-clé>:<mot-clé>\n
Tu peux utiliser habilement les fonctions Serial.readUntil pour lire le 1er mot jusqu'au ':' puis le 2eme mot jusqu'au '\n'
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Wiiik

Non j'ai adapté le code, l'erreur est donc mienne  :smiley-mr-green:

Je vais plancher dessus merci!

Go Up