Aller au contenu


Photo
- - - - -

arrosage pour bonsai


  • Veuillez vous connecter pour répondre
95 réponses à ce sujet

#21 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 16 mars 2020 - 07:33

Bonsoir,

ce n'est pas encore tout à fait ça :

- les digitalWrite doivent se faire depuis la fonction setWaterPump : c'est elle qui doit allumer et éteindre la pompe (allumer si l'argument est true, éteindre s'il est false)

- tu as toujours etat comme variable globale (indice : static)

- Mike t'avais demandé de ne pas utiliser delay, du coup, il faut revenir à l'utilisation de millis()

 

Peut-être qu'une petite explication sur le type bool peut t'aider.

Une variable de type bool peut prendre seulement deux valeurs :

- false (=0=LOW)

- true (=1=HIGH)

Elle sert donc généralement quand il n'y a que deux états possibles (par exemple pompe allumée (true) ou éteinte (false)

 

Quelques points intéressants avec les bool :

bool mon_bool_vrai=true;
bool mon_bool_faux=false;
bool mon_bool_variable;

if(mon_bool_vrai)   //tu peux juste mettre une variable bool au lieu d'une condition dans ton if : si la variable vaut true, tu entres dans le if, si elle vaut false, tu entres dans le else
{
  //ce code sera exécuté
}
else
{
  //ce code ne sera pas exécuté
}

if(mon_bool_faux)   //tu peux juste mettre une variable bool au lieu d'une condition dans ton if : si la variable vaut true, tu entres dans le if, si elle vaut false, tu entres dans le else
{
  //ce code ne sera pas exécuté
}
else
{
  //ce code sera exécuté
}

digitalWrite(pin, mon_bool_vrai); //vas mettre la pin à HIGH car mon_bool_vrai est true
digitalWrite(pin, mon_bool_faux); //vas mettre la pin à LOW car mon_bool_faux est false


mon_bool_variable= 1<3;  //mon_bool_variable vaut maintenant true car 1<3 est vrai
mon_bool_variable= 1==3;  //mon_bool_variable vaut maintenant false car 1==3 est faux

 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#22 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 17 mars 2020 - 03:47

bonjour Sandro ,

je n y arrive pas , je laisse tomber .

bonne journée .



#23 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 17 mars 2020 - 06:09

Mais non on ne laisse pas tomber =)

Description de ce que doit faire ta fonction setWaterPump : 

Si "etat" alors allumer la pompe et afficher " la pompe est allumée " 
Sinon éteindre la pompe et afficher " la pompe est éteinte "

 

Dans le loop tu appels juste ta fonction et gère le temps entre deux inversion de la variable "static" etat avec millis() . 

Le but de ces petits exercices c'est justement de t'entrainer =) Il faut être patient et ne pas abandonner. Par contre il faut que tu poses des questions et que tu dises " qu'est ce que tu n'arrives  pas " . 

Te bile pas ça prendra peut être du temps mais on y arrivera =) perso je ne suis pas pressé ! =)
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#24 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 17 mars 2020 - 06:10

Bonsoir,

c'est quel point sur lequel tu bloque?

- comprendre ce qu'on voudrait que tu fasses?

- écrire la fonction void setWaterPump(bool etat)?

- écrire une fonction loop qui fonctionne?

- te passer de la variable globale?

- te passer de delay?

 

Si tu me dis sur quel(s) point(s) précis tu bloque, je te donne volentier plus d'indices.

S'il y a au moins un point dans la liste ci-dessus que tu sais faire, alors fait déjà ce point là et poste le code, ce sera toujours une étape de faite.

 

Bonne soirée

Sandro


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#25 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 22 mars 2020 - 03:45

Bonjour Sandro et Mike118,

j’espère que vous allez bien ainsi que tous les membres du forum.

Je vous mets le code que j'ai trouvé .

Bonne soirée;Michel

/*Relay Pompe Arrosage*/
const uint8_t RelayPin = A2;
bool etat = false;
const uint32_t tempsEntreDeuxAffichages = 1000; // Temps en ms

 
void setup() {
  Serial.begin(9600);
  /* Init Relay Pumpe  */
  pinMode(RelayPin, OUTPUT);
 
}
void loop() {
static uint32_t lastAffiche = millis ();  

if( millis() - lastAffiche > tempsEntreDeuxAffichages  ) {
     lastAffiche = millis ();
     
  if ( etat == false )
   {
     setWaterPump(false);                   
    Serial.println("pompe 0ff");   
    etat = true;                
 
  }
  else
  {
      
    setWaterPump(true);
    Serial.println("pompe 0n");     
    etat = false;                    
   }
  }
}
void setWaterPump(bool etat){
  if ( etat == false )
  {
 digitalWrite(RelayPin,false);
 }
  else
  {
 digitalWrite(RelayPin,true);
  }
}




#26 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 22 mars 2020 - 04:37

Cool ! =) Tu as réussi ! J'étais sur que tu allais réussir ;) 

Du coup maintenant je te propose cette petite modification mineure 

 

 

/*Relay Pompe Arrosage*/
const uint8_t RelayPin = A2;
const uint32_t tempsEntreDeuxAffichages = 1000; // Temps en ms

void setup() {
  Serial.begin(9600);
  /* Init Relay Pumpe  */
  pinMode(RelayPin, OUTPUT);
}

void loop() {
 static uint32_t lastAffiche = millis ();  
 static bool etatPompe = false;

 if( millis() - lastAffiche > tempsEntreDeuxAffichages  ) {
  lastAffiche = millis ();   
  setWaterPump(etatPompe);   // On met à jour l'état de la pompe
  etatPompe =! etatPompe;    // On inverse etat pompe pour la fois suivante
 }
}

void setWaterPump(bool etat) {
 if ( etat == false ) {
  digitalWrite(RelayPin,false);
  Serial.println("pompe Off");
 }
 else {
  digitalWrite(RelayPin,true);
  Serial.println("pompe On");
 }
}

Afin de garder le code court j'intègre le serial directement dans la fonction setWaterPump, ainsi tu n'as pas à gérer cet affichage dans la loop. En effet, plus tard notre loop va devenir bien assez compliquée, alors il faut chercher dès à présent à réduire le code qui s'y trouve =) 

 

De même j'ai mis ta variable été en variable "static " dans ta fonction loop =)

Au delà de ces modifications c'est exactement ce que tu avais fait ! =) 

Maintenant attention on rentre dans le sérieux. 

On a trois fonctions de tests . 

La première : pour le capteur de débit 
La deuxième : pour le capteur d'humidité 

La troisième : pour la gestion de la pompe 

 

On va maintenant chercher à tout fusionner. 
Peux tu nous faire un code qui chaque seconde, affiche la quantité d'eau passée par le capteur de débit, le niveau d'humidité et change l'état de la pompe ? =)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#27 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 23 mars 2020 - 02:52

Bonjour Mike118,

voila le code j’espère que tout est correct  .

merci encore d'être disponible pour moi ainsi que tous les membres du forum .

Bonne journée.

/*Soil Moisture*/
const uint8_t  sensor_MoisturePin =  A0;
const uint32_t tempsEntreDeuxAffichages = 1000;// Temps en ms

/*Relay Pompe Arrosage*/
const uint8_t RelayPin = A2;

/* Capteur de débit d'eau*/
const uint8_t sensorInterrupt = 0;
const uint8_t sensorPin       = 2;
const float calibrationFactor = 4.5;

/* Variables volatiles utilisées dans l'interruption pour le débit d'eau = une des rares variables qu'on a le droit d'avoir en globale*/
  volatile uint8_t pulseCount = 0;

void setup() {
    Serial.begin(9600);
    /* Init SoilMoisture*/
    pinMode(sensor_MoisturePin,INPUT);
    /* Init Relay Pumpe  */
    pinMode(RelayPin, OUTPUT);
    /* initialisation du capteur de pompe*/
    water_setup ();  
}

uint16_t getRawHumidity(){
/* Variables Arrosage*/
    uint16_t rawHumidity = analogRead(sensor_MoisturePin);
    return rawHumidity;
}

uint8_t getPercentHumidity(uint16_t rawHumidity){
    if(rawHumidity > 1023)
     rawHumidity = 1023;
    uint8_t percentHumidity = map(rawHumidity, 0, 1023, 0, 100);
    return percentHumidity;
}
void water_setup () {
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);
  pulseCount = 0;
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
/* fonction qui lit stock en interne et retourne le résultat */
uint32_t water_read () {
  /* Les variables statiques sont des variables qui ne sont pas écrasée, ça permet d'éviter d'utiliser des variables globales*/
  static uint32_t totalMilliLitres = 0;
  static uint32_t oldTime = millis();

  /* Variables temporaires juste pour les calculs => Pas besoin d'avoir des variables globales pour ça*/
  float flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
  float flowMilliLitres = (flowRate / 60) * 1000;

  /* Mise à jour de notre variable de stockage ( variable statique ) */
  totalMilliLitres += flowMilliLitres;

  /* Remise à zero des outils de calculs ( variable statique + globale volatile)*/
  oldTime = millis();
  pulseCount = 0;

  /* Retour du résultat*/
  return totalMilliLitres;
}

void pulseCounter() {
  /* Incremente pulseCount*/
  pulseCount++;
}
void setWaterPump(bool etat) {
  if ( etat == false ) {
    digitalWrite(RelayPin,false);
    Serial.println("pompe Off");
 }
 else {
    digitalWrite(RelayPin,true);
    Serial.println("pompe On");
  }
}
void loop() {
 
    static uint32_t lastAffiche = millis (); // Variable statique initialisée que la première fois ...
    
    setsoil();//commande soil_moisture_relay
  if( millis() - lastAffiche > tempsEntreDeuxAffichages ) {
    uint16_t rawHumidity = getRawHumidity();
    uint8_t percentHumidity = getPercentHumidity(rawHumidity);
    Serial.print("Raw Humidity value: ");
    Serial.print(rawHumidity);
    Serial.print("\t");
    Serial.print("Percentage: ");
    Serial.print(percentHumidity);
    Serial.println("%");
    Serial.print("Output Liquid Quantity: ");
    Serial.print(water_read());
    Serial.println("mL");
    lastAffiche = millis ();
  }

}
 void setsoil(){
    uint16_t rawHumidity = getRawHumidity();
    uint8_t percentHumidity = getPercentHumidity(rawHumidity);
    static bool etatPompe = false;
    if (percentHumidity <30 ){    //limite de basculement en %
      setWaterPump(etatPompe);   // On met à jour l'état de la pompe true
       etatPompe = true;        // Pompe On
    }
     else{
       (setWaterPump(etatPompe));  //on remet l'etat de la pompe false  
        etatPompe=false;           //Pompe Off
    }
 }
      


#28 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 23 mars 2020 - 03:12

Bonjour,

tu as testé le code? Il fonctionne comme attendu?

 

J'ai rapidement regardé, à première vue pas grand chose à améliorer :

- si tu gère entièrement la pompe dans setSoil, alors enlève la variable etatPompe du loop (tu la défins déjà dans setSoil).

- tu mets la limite de basculement de l'humidité (30%) directement dans la fonction setSoil : ce n'est pas faux, mais à ta place, je la mettrais plutôt soit comme const au tout début du code, soit en argument de la fonction setSoil : comme ça, le jour où tu as une plante plus gourmande en eau (des réseaux par exemple) ou moins (un cactus), ce sera plus facile à adapter.

 

Pour le reste, il faux que tu testes (d'ailleurs, si possible, fais les tests avant même de poster le code, et dis nous en même temps que tu poste le code s'il fonctionne comme prévu).

 

Bonne journée

Sandro


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#29 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 23 mars 2020 - 05:05

bonjour Sandro ,

oui tout fonctionne  .

pour le pourcentage j'ai un réglage dans mon programme ainsi que pour le volume d'eau.

qui stocke le réglage dans EEPROM .

je rectifierai le code , merci pour tes conseils .

Bonne soirée .



#30 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 23 mars 2020 - 10:26

Bravo tu as même devancé mon étape suivante en faisant une fonction ! :P 

 

Du coup un première amélioration à ta fonction : 


void setsoil(){
    uint16_t rawHumidity = getRawHumidity();
    uint8_t percentHumidity = getPercentHumidity(rawHumidity);
    bool etatPompe = false; // Pompe Off par défaut

    if (percentHumidity <30 ) {
       etatPompe = true;        // Pompe On
    }
    
    setWaterPump(etatPompe));  //on remet l'etat de la pompe false  

 }

Pas besoin de mettre " static" quand c'est recalculé à chaque fois.  => Static c'est pour quand on veut se souvenir de la valeur calculée précédement =) 

 

Par contre comme l'a dit Sandro => le "30" % en hard codé c'est pas top pour l'évolution du code ;) 
Ensuite le travail n'est pas fini :P 

En effet tu as un truc qui fonction ok, mais en mode un peu " tout ou rien " et pas comme ce que tu avais écrit dans ton premier message à savoir :  

 

j'aimerai arroser un arbre en fonction de l'humidité du sol .

quand le sol est inférieur à la mesure prés régler la pompe arrose une quantité d'eau régler également.

il s'écoule un temps de 3mn le temps pour l'eau de passer au travers de la terre et si la terre est suffisamment  arroser la pompe ne se remets pas en route ,sinon elle refait un second arrosage .

Donc maintenant on va chercher à améliorer encore ta fonction pour que ça fasse ce que tu voulais.   

Pour cela on va commencer par faire une fonction qui permet " d'arroser une certaine quantité d'eau " . 
Cette fonction prendra la quantité d'eau à arroser en paramètre. =)
Je te laisse la tester comme tout ce qu'on a testé au fur et à mesure auparavant ( sans utiliser de delay ni de variables globales autre que des const :P )
 

 

Ensuite une fois que ça sera fait tu pourras modifier ta fonction set soil pour faire 

 

 

Si humidité < seuil 

 

alors arroser (X ml )  // la fonction que tu viens de faire 

Attendre 3min  ( On attend sans utiliser de delay grâce à millis() et à un temps de référence )

et pendant qu'on attend  : 
  on vérifie l'humidité 
  Si humidité > seuil 
     alors Afficher Arrosage terminé avec succès
     et on arrête d'attendre 

Si on a attendu les 3min mais que l'humidité n'est pas remontée
alors afficher  "Echec d'arrosage" 

 

 

La boucle du loop relancera alors un arrosage =)


 

Bon he bien moi maintenant je vais te laisser coder tout ça ! :P


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#31 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 25 mars 2020 - 06:22

bonjour Mike118,

je reviens te voir avec mon programme ,beaucoup de difficultés à faire ce que tu me demandes .

je te mets mon code qui fonctionne soil_moisture <30% Pompe true  .

soil_moisture >60% Pompe false eau passe dans flow sensor >100ml Pompe false et voila je suis bloquè j'avais penser de faire une temporisation  qui au bout du temps de 3minutes  fait un reset du compteur pour relancer l'arrosage met cela ne fonctionne pas ,je ne l'ai pas mis dans le code .

pourrais tu regarder si ceux que j'ai fait est correct ou non et me mettre sur la voie s'il te plait.

d'avance merci .

Bonne Soirée.

  
/*Soil Moisture*/
const uint8_t  sensor_MoisturePin =  A0;
const uint32_t tempsEntreDeuxAffichages = 1000;// Temps en ms

/*Relay Pompe Arrosage*/
const uint8_t RelayPin = A2;

/* Capteur de débit d'eau*/
const uint8_t sensorInterrupt = 0;
const uint8_t sensorPin       = 2;
const float calibrationFactor = 4.5;
const float flowRate;

/* Variables volatiles utilisées dans l'interruption pour le débit d'eau = une des rares variables qu'on a le droit d'avoir en globale*/
  volatile uint8_t pulseCount = 0;

void setup() {
    Serial.begin(9600);
    /* Init SoilMoisture*/
    pinMode(sensor_MoisturePin,INPUT);
    /* Init Relay Pumpe  */
    pinMode(RelayPin, OUTPUT);
    /* initialisation du capteur de pompe*/
    water_setup ();
   
}

uint16_t getRawHumidity(){
/* Variables Arrosage*/
    uint16_t rawHumidity = analogRead(sensor_MoisturePin);
    return rawHumidity;
}

uint8_t getPercentHumidity(uint16_t rawHumidity){
    if(rawHumidity > 1023)
     rawHumidity = 1023;
    uint8_t percentHumidity = map(rawHumidity, 0, 1023, 0, 100);
    return percentHumidity;
}
void water_setup () {
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);
  pulseCount = 0;
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
/* fonction qui lit stock en interne et retourne le résultat */
uint32_t water_read () {
  /* Les variables statiques sont des variables qui ne sont pas écrasée, ça permet d'éviter d'utiliser des variables globales*/
  static uint32_t totalMilliLitres = 0;
  static uint32_t oldTime = millis();

  /* Variables temporaires juste pour les calculs => Pas besoin d'avoir des variables globales pour ça*/
  float flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
  float flowMilliLitres = (flowRate / 60) * 1000;

  /* Mise à jour de notre variable de stockage ( variable statique ) */
  totalMilliLitres += flowMilliLitres;

  /* Remise à zero des outils de calculs ( variable statique + globale volatile)*/
  oldTime = millis();
  pulseCount = 0;

  /* Retour du résultat*/
  return totalMilliLitres;
}

void pulseCounter() {
  /* Incremente pulseCount*/
  pulseCount++;
}
void setWaterPump(bool etat) {
  if ( etat == false ) {
    digitalWrite(RelayPin,false);
    Serial.println("pompe Off");
 }
 else {
    digitalWrite(RelayPin,true);
    Serial.println("pompe On");
  }
}
void loop() {
 
    static uint32_t lastAffiche = millis (); // Variable statique initialisée que la première fois ...
    static bool etatPompe = false;
    setsoil();//commande soil_moisture_relay
  if( millis() - lastAffiche > tempsEntreDeuxAffichages ) {
    uint16_t rawHumidity = getRawHumidity();
    uint8_t percentHumidity = getPercentHumidity(rawHumidity);
    Serial.print("Raw Humidity value: ");
    Serial.print(rawHumidity);
    Serial.print("\t");
    Serial.print("Percentage: ");
    Serial.print(percentHumidity);
    Serial.println("%");
    Serial.print("Output Liquid Quantity: ");
    Serial.print(water_read());
    Serial.println("mL");
    lastAffiche = millis ();
  }

}
 
 void setsoil(){
    uint16_t rawHumidity = getRawHumidity();
    uint8_t percentHumidity = getPercentHumidity(rawHumidity);
    bool etatPompe = false; // Pompe Off par défaut
    static uint32_t totalMilliLitres=0 ;
    static uint32_t oldTime = millis();
    float flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    float flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;
    static uint32_t lastAffiche = millis ();
    const uint8_t   MOISTURE_THRESHOLD_Min =30 ;
    const uint8_t   MOISTURE_THRESHOLD_Max =60 ;
    const uint8_t   VOLUME_THRESHOLD = 100 ;
    
   if (percentHumidity < MOISTURE_THRESHOLD_Min ) {
        etatPompe = true; //Pompe ON
   }
       else {(percentHumidity > MOISTURE_THRESHOLD_Max );
          etatPompe=false;
          Serial.println("Arrosage complet");          
        }
         
     if (totalMilliLitres>=VOLUME_THRESHOLD) {
         etatPompe = false;  //PompeOff
         Serial.println("dosage eau ok");
     }
      setWaterPump(etatPompe);//on remet l'etat de la pompe false  
}
    

 


#32 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 25 mars 2020 - 06:43

Bonsoir,

 

Je pense que ta difficulté vient (au moins en partie), du fait que tu as mal lu le message de Mike.

Il te demande, dans un premier temps, d'écrire une fonction permettant d'arroser une quantité d'eau donnée :

 

Pour cela on va commencer par faire une fonction qui permet " d'arroser une certaine quantité d'eau " . 
Cette fonction prendra la quantité d'eau à arroser en paramètre. =)
Je te laisse la tester comme tout ce qu'on a testé au fur et à mesure auparavant ( sans utiliser de delay ni de variables globales autre que des const :P )

 

Si tu n'as pas écrit (et testé) cette fonction, faire la suite sera compliqué (car tu est sensé utiliser cette fonction dans la suite).

 

 

Du coup, je te suggère de repartir du code précédent, et de commencer par écrire cette fonction.

Une fois que ce sera fait, tu pourra essayer de modifier setSoil.

 

 

 

Bonne soirée

Sandro


  • Mike118 aime ceci

Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#33 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 27 mars 2020 - 03:28

bonjour Mike118,

voila mon code .

au démarrage de la carte le relais etat true ensuite quand  totalMilliLitres et supérieur au volume le relais et false .

le code fonctionne

bonne journée .

void setWater(){
    static bool etatPompe = false;
    const uint8_t   VOLUME_THRESHOLD = 100  ;// ml
    static uint32_t totalMilliLitres=0 ;
    static uint32_t oldTime = millis();
    float flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    float flowMilliLitres = (flowRate / 60) * 1000;
     totalMilliLitres += flowMilliLitres;
     
  if ( etatPompe == false )
   {
     setWaterPump(true);                   
    Serial.println("pompe 0n");   
   }
   if                  
   (etatPompe=true &&totalMilliLitres>=VOLUME_THRESHOLD) {
     setWaterPump(false);//PompeOff
      Serial.println("dosage eau ok");
   }
      
}
 
 
 


#34 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 27 mars 2020 - 03:34

Bonjour,

tu n'as pas tout à fait répondu à la demande de Mike : il demandait que passe la quantité d'eau souhaitée en paramètre.

 

Et tu ne m'as pas dit si tu as testé la fonction, et si oui si elle te donne bien le volume d'eau souhaité


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#35 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 27 mars 2020 - 05:16

Bonsoir Sandro oui la fonction fonctionne et la quantité d'eau est bonne .

Bonne soirée



#36 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 27 mars 2020 - 06:14

Du coup, tu la transforme pour qu'elle prenne en argument la quantité d'eau?


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#37 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 27 mars 2020 - 06:33

sandro , je ne comprend pas ce que tu essaye de me dire .

 la quantité d'eau est calculer en ml par rapport au  VOLUME_THRESHOLD. c'est sur ce n'es pas très précis ce n'est pas des pompe péristaltique

c'est suffisant pour des plantes .



#38 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 27 mars 2020 - 06:47

Ce que Mike te demandais, c'était de ne pas mettre une constante pour VOLUME_THRESHOLD, mais de passer volume_threshold en argument à la fonction setWater.

Ce n'est en soit pas indispensable, mais ça permet d'avoir un code plus modulaire (en général, on évite autant que possible de coder des informations "en dur" dans les fonctions


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#39 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 27 mars 2020 - 07:00

 

bonjour Mike118,

voila mon code .

au démarrage de la carte le relais etat true ensuite quand  totalMilliLitres et supérieur au volume le relais et false .

le code fonctionne

bonne journée .

void setWater(){
    static bool etatPompe = false;
    const uint8_t   VOLUME_THRESHOLD = 100  ;// ml
    static uint32_t totalMilliLitres=0 ;
    static uint32_t oldTime = millis();
    float flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    float flowMilliLitres = (flowRate / 60) * 1000;
     totalMilliLitres += flowMilliLitres;
     
  if ( etatPompe == false )
   {
     setWaterPump(true);                   
    Serial.println("pompe 0n");   
   }
   if                  
   (etatPompe=true &&totalMilliLitres>=VOLUME_THRESHOLD) {
     setWaterPump(false);//PompeOff
      Serial.println("dosage eau ok");
   }
      
}
 
 
 

 

 

En effet Michel, on a pas encore fini cette étape. 

Comme le dit Sandro, et comme ce que j'avais indiqué, le but est de faire une fonction qui va prendre en paramètre la quantité d'eau que tu souhaite déverser sur tes plantes. 

La fonction doit donc avoir cette forme : 

void setWater(uint8_t mlValue)  {

 



Tu dois utiliser mlValue pour définir la quantité à déverser. C'est autant pour te faire apprendre à programmer que pour avoir un code propre. 
Le but est de t'habituer à utiliser des paramètres dans tes fonctions. Car quand on va revenir sur tes autres programmes il faudra aussi mettre des paramètres. 

Par contre il y a un autre truc " plus grave encore " :P qui ne me va pas dans ta fonction setWater : 

On a fait une fonction water_read()  qui te retourne la valeur en ml. Il faut l'utiliser dans ta fonction =) 

PS : il y a déjà un print Serial.println("pompe 0n");      dans la fonction setWaterPump ... Du coup tu affiches deux fois ce texte => Donc pas besoin de le remettre après avoir fait le setWaterPump =)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#40 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 28 mars 2020 - 10:00

bonjour Mike118,

je suis perdu comment je pouvais savoir que je devais utiliser .

void setWater(uint8_t mlValue)  {

 

}

et que je dois utiliser water_read() ;

j'ai bien vu que dans mon programme quand la pompe est arrêter par le volume je n'arrive pas à la remettre à zero pour redémarrer un nouveau arrosage .

je suis complétement perdu .

je ny arriverais jamais .

Bonne journée.






0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users