Maîtriser le débit d'une pompe

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:

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.

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.

Wiiik:
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)

Merci à vous deux

barbudor:
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 :wink:

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...

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'
}
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 )

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'

Non j'ai adapté le code, l'erreur est donc mienne :grin:

Je vais plancher dessus merci!