Aller au contenu


Photo
- - - - -

arrosage pour bonsai


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

#81 michel

michel

    Habitué

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

Posté 11 avril 2020 - 11:01

bonjour Mike118,

j’espère que tu va bien ,je n'ai pas eu de tes nouvelles sur la suite du programme .

à très bientôt bonne journée; Michel.



#82 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 691 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 avril 2020 - 01:29

Je t'ai mis la pompe que j'utilise pour l'instant .

pour la précision c'est pas au centième c'est juste une plante , au plus prés en Ml  .

par contre pour le manque d'eau tu as déjà une idée toujours par rapport au flow water .

d'avance merci .

bonne journée.

 

 

Si tu veux une précision au ml et qu'on a d'après ton test environ 300ml / secondes, il faut réduite la fonction d'attente pour attendre 3ms ... au lieu des 1 seconde actuelle... 
dans la fonction water read. 

 


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 ! 

 

Les réalisations de Mike118  

 

 

 


#83 michel

michel

    Habitué

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

Posté 11 avril 2020 - 05:39

merci Mike118,

et pour le contrôle quand il n'y a plus d'eau par le flow water ;

le relais de la pompe Off tu as une idée s'il te plait .

bonne soirée .



#84 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 691 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 avril 2020 - 06:10

merci Mike118,

et pour le contrôle quand il n'y a plus d'eau par le flow water ;

le relais de la pompe Off tu as une idée s'il te plait .

bonne soirée .

 

J'ai rien compris.


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 ! 

 

Les réalisations de Mike118  

 

 

 


#85 michel

michel

    Habitué

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

Posté 11 avril 2020 - 06:25

le flow water contrôle l'eau déverser si il n’y pas d'eau le relay n'alimente plus la pompe . 



#86 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 691 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 avril 2020 - 08:13

Je suis désolé mais je n'ais toujours pas compris. 


Où est ce qu'il n'y a plus d'eau? C'est le capteur d'humidité qui te dit ça? C'est le débit mètre qui ne compte pas d'eau ? 
Quelle fonction du code est en train de s'éxécuter quand tu rencontres le problème? 

Fais des plusieurs phrases, donne des exemples concret... 
=> Le cas qui marche vs le cas qui ne marche pas ... 

Poste le résultat du moniteur série illustrant le problème ou fais une vidéo... 

Car là ma boule de cristal ne marche visiblement pas sur ce coup là :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 ! 

 

Les réalisations de Mike118  

 

 

 


#87 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 623 messages
  • Gender:Male

Posté 11 avril 2020 - 10:16

Je ne suis pas sur, mais j'ai peut-être une idée de ce que Michel pourrait vouloir dire : si la réserve d'eau est vide, alors il voudrait éteindre la pompe (les pompes à eau ont tendance à ne pas aimer être hors de l'eau).

Est-ce que c'est ça?

 

En tout cas, si tu pouvais être plus explicite et détaillé dans tes demandes, ça nous aiderait pas mal (pense aussi à vérifier les accords, conjugaisons, les virgules, ... : tout ça aide aussi à comprendre).



#88 michel

michel

    Habitué

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

Posté 12 avril 2020 - 08:42

Bonjour Mike118 ,Sandro,

oui c'est ça Sandro à compris ce que j'aimerai faire .

quand il n'y a plus d'eau dans le reversoir la pompe ce coupe .

étant donner que le flow sensor tourne avec l'eau qui passe , quand il n'y a plus d'eau il coupe la pompe .

je vous souhaite un bon dimanche .



#89 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 623 messages
  • Gender:Male

Posté 12 avril 2020 - 10:41

Bonjour,

dans ce cas, la première chose à faire est maintenant de détailler précisément le comportement :

- je suppose que l'eau n'arrive pas instantanément au flow sensor quand tu lances la pompe : quel délai est acceptable? (ie au delà de quel délai on considère qu'il n'y a pas d'eau?)

- quel est le critère précis pour définir un manque d'eau

- s'il y a un manque d'eau une fois, qu'est-ce qu'on fait ensuite? Est-ce qu'on retente l'arrosage en permanence? On allume une LED et on arrête tout jusqu'à l'appui sur un bouton?

 

 

Comme critère d'arrêt, le plus simple serait de vérifier si à un temps t après le début de l'arrosage on a arrosé au moins une quantité d'eau de a*(t-t0) où a est le débit (enfin, il faut prendre un petit peu moins pour être certain que le vrai débit soit jamais inférieur à a s'il y a bien de l'eau)  et t0 le temps maximum pendant lequel il est acceptable que l'eau ne soit pas encore arrivé à au flow sensor. Dans ce cas, on peut couper la pompe et stoper la fonction setWater.

 

La question est si arrêter setWater est suffisent ou pas, car si on ne fait que ça, on retentera un setWater 30 secondes plus tard (depuis la fonction arroser).

Ou alors on peut aussi arrêter la fonction arroser. Dans ce cas, si on mets une attente plus longue entre deux arrosages dans le loop, on peut faire des pauses plus longues.

Ou alors on peut définir des temps avant nouvelle tentative, ou demander l'appui sur un bouton avant d'autoriser de nouvelles tentatives, ...

 

Bref, on peut t'aider à implémenter ce que tu veux, mais on peut difficilement savoir quelles fonctionnalités tu souhaites, à nous de nous le dire



#90 michel

michel

    Habitué

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

Posté 12 avril 2020 - 12:40

Merci Sandro pour ta réponse ;

ajouter un bouton (bp) de reset serait bien j'ai encore des pins analogiques  disponibles ,

"s'il y a un manque d'eau une fois, qu'est-ce qu'on fait ensuite " = arrêt  de la pompe et une deuxième tentative si pas concluant arrêt total jusqu’à reset par le bouton poussoir .

pour le temps je me reporte au délai que Mike a observé sur le relevé Serial = 6 secondes et demi pour que l'eau arrive au flow water  .

je me repose sur vos compétences en cette matière et sur le plus simple codage pour vous à réaliser .

UN GRAND MERCI d'avance,



#91 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 623 messages
  • Gender:Male

Posté 12 avril 2020 - 01:55

Est-ce que tu pourrais remettre la dernière version du code stp?



#92 michel

michel

    Habitué

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

Posté 12 avril 2020 - 02:08

/*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() {
    affichage();      //affichage des constantes sur le serial
    Arrosage(30);     // arroser si humidité <30%
     attendre(1);   // attendre 1000ms    
    
}
void affichage() {
    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");
}
void setWater( uint8_t mlValue) {
   uint16_t mlReference = water_read();// on note la quantité en ml qui était déjà arrosée avant de commencer
   uint16_t ml = mlReference;
   bool etatPompe = false; // Pompe Off par défaut
   setWaterPump(true); // on allume la pompe
   Serial.println("Arrosage en cours");
   while(ml < mlReference + mlValue  ) {

    ml= water_read(); // mise à jour de ml

    // Affichage en attendant que le dosage d'eau soit ok
    Serial.print("Lecture : ");
    Serial.println(ml);
    Serial.print("Limite à atteindre : ");
    Serial.println(mlReference + mlValue);
    Serial.println("");

    attendre(1);  // attendre 1 seconde
 
   }
   Serial.println("dosage eau ok");
   
   setWaterPump(false);// on éteind la pompe quand le dosage est ok      
}
void attendre(uint32_t attente) {    // temps d'attente en secondes
   uint32_t timeReference = millis();// temps avant de commencer
   Serial.print("On attend ");
   Serial.print(attente);
   Serial.println("s");
   while (millis() - timeReference <= attente * 1000) {
      // On ne fait rien en attendant
   }
   Serial.println("Fin de l'attente");
}
    
 void Arrosage(uint8_t seuil){
      uint8_t percentHumidity = getPercentHumidity(getRawHumidity());
       
   if ( percentHumidity < seuil ) {
         setWater(10);//(x ml)
         attendre(30);//attendre
        
         percentHumidity = getPercentHumidity(getRawHumidity());
         if ( percentHumidity >= seuil ) {
           Serial.println("Arrosage terminé avec succès");   
         } else {
           Serial.println("Echec d'arrosage");
         }
   } else {
         Serial.println("Pas besoin d'arroser");
   }
}   
 
 

 

#93 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 623 messages
  • Gender:Male

Posté 12 avril 2020 - 02:11

En attendant, je te suggère de commencer à écrire la fonction suivante (qui nous servira ensuite):

bool manque_d_eau(TYPE1 duree_depuis_debut_d_arrosage_en_ms, TYPE2 volume_d_eau_depuis_debut_d_arrosage_en_ml)
{

}

Cette fonction renverra true s'il y a un manque d'eau, et false si tout vas bien. Tu pourra t'inspirer de ma formule a*(t-t0) à comparer avec le volume d'eau depuis le début de l'arrosage.

Pour a et t0, le mieux est de créer des variables const (nb : je te laisse trouver des noms plus explicites que a et t0) ; à toi de choisir le type le plus adapté (c'est un petit exercice, explique nous ton choix)

 

NB :

- j'ai volontairement mis "TYPE1" et "TYPE2" : à toi de choisir les types qui te semblent les plus adaptés (c'est un petit exercice, explique nous pourquoi tu utilise du bool, float, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, ...)

- la fonction "manque_d_eau" n'a pas à faire appel à des fonctions de mesure de temps (type millis) ni à des fonctions de mesure d'eau (type readWater) car toutes les infos utiles seront données en argument

 

 

 

Est-ce que ça te semble dans tes cordes?

Dans le cas contraire, dis nous précisément ce que tu arrives à faire et ce qui n'est pas clair ou sur quoi tu bloque



#94 michel

michel

    Habitué

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

Posté 12 avril 2020 - 03:42

je suis désolé mais trop compliquer pour moi .

je pense seulement qu'il faudrai au démarrage de la pompe  démarrer un startTime > à un temps déterminer (7 secondes) et ensuite relever water_read si =0;

pompe faise .

par contre je ne sais pas comment faire .



#95 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 691 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 12 avril 2020 - 03:52

Michel, on ne va pas faire tout le travail pour toi, on est là pour t'aider à progresser de sorte à ce que tu puisse faire tes propres fonctions toi même en fonction de ton besoin 

=> "Donne un poisson à un homme il mangera un jour, apprend lui à pêcher il mangera toute sa vie. "

 

Il faut garder en tête que qui veut peut!
Rien est trop compliqué, ça demande juste plus de temps et plus d'implications ... 

 

Est ce que tu veux progresser et y arriver par toi même?

 

Enfin autre adage qui est fonctionne très bien : Ce qui se conçoit bien s'énonce clairement. 


Reprend ce que tu as écris : 
 

 

'il faudrai au démarrage de la pompe  démarrer un startTime > à un temps déterminer (7 secondes) et ensuite relever water_read si =0;

pompe faise .

 

 

N'hésite pas à faire plus de phrases.  A essayer de le transformer en pseudo code comme je t'en ai proposé quelques un dans la discussion .. Essaye de faire du code qui s'en rapproche, test et voit ce qui se passe. 
 

+> Met des prints dans ta fonction comme ce qu'on a vu ensemble pour voir précisément les valeurs que tu obtiens et avoir des traces pour comprendre pourquoi ça ne marche pas comme tu veux ou pour vérifier que ça marche comme tu veux. 

On a vu ensemble plein de morceau de code, maintenant c'est à toi d'avance ! Relis tous les éléments qu'on a fait. Il y a tout ce qu'il faut dedans pour réussir à faire la fonction que tu cherches à faire.

N'hésite pas à revenir ici avec le code que tu as testé et l'erreur rencontré que tu n'arrives pas à résoudre. :) On est toujours là pour aider :)


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 ! 

 

Les réalisations de Mike118  

 

 

 


#96 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 623 messages
  • Gender:Male

Posté 12 avril 2020 - 04:40

je suis désolé mais trop compliquer pour moi .
[...]
par contre je ne sais pas comment faire .

 
 

Est-ce que ça te semble dans tes cordes?
Dans le cas contraire, dis nous précisément ce que tu arrives à faire et ce qui n'est pas clair ou sur quoi tu bloque

Est-ce que c'est trop compliqué pour toi de suivre des consignes simples? A savoir DIRE PRÉCISÉMENT CE QUE TU ARRIVES À FAIRE (je penses qu'au moins une partie tu devrais pouvoir faire, si ce n'est pas tout) ET CE QUI N'EST PAS CLAIR OU SUR QUOI TU BLOQUES.

 

Et vu que j'ai déjà répété cette demande de nombreuses fois, à partir de maintenant, si tu me dis que tu n'y arrives pas, sans dire quelle partie de la consigne tu ne comprends pas ou sur quel point PRÉCIS tu bloque, alors je ne répondrais plus jusqu'à ce que tu ais donné ces précisions.

 

 

 

 Sinon, pour revenir au problème lui-même :

- juste vérifier s'il y a eut de l'eau qui a coulé après 7 secondes, ce ne sera pas une sécurité suffisante (si l'eau se vide après ces 7 secondes, alors la pompe tournera à l'infini). Mais si tu veux, on peux commencer par implémenter ce test (un peu plus simple) dans un premier temps, et ensuite le remplacer par la variante plus sécurisée que je proposais.

- je t'ai proposé d'écrire une fonction "manque_d_eau" qui sert à déterminer si le réservoir d'eau est vide. Ce n'est qu'une étape, mais j'aimerais que tu commences par là (tu peux au choix partir sur un test de type volume>=a*(t-t0), ou sur le test que tu proposais (si t>=t0, alors il faut volume >0) : dans les deux cas, la forme de la fonction sera celle que j'ai donné (si tu utilise ton test, tu aura juste pas besoin de définir une constante a)

 

Tu as donc 3 exercices à faire :

1) Pour la fonction :

bool manque_d_eau(TYPE1 duree_depuis_debut_d_arrosage_en_ms, TYPE2 volume_d_eau_depuis_debut_d_arrosage_en_ml)
{

}

tu choisis les types que tu veux utiliser à la place de "TYPE1" et "TYPE2" en expliquant pourquoi (indice : est-ce que tu as besoin de nombres à virgules ou pas? est-ce que tu peux avoir des valeurs négatives? c'est quoi la plus grande valeur réaliste?)

 

2) Choisir la durée maximale avant l'arrivée d'eau (en ms), et si tu veux partir sur ma variante, alors le débit en mL/ms. Nb : tu devra choisir les types comme dans l'exo 1.

3) remplir la fonction

bool manque_d_eau(TYPE1 duree_depuis_debut_d_arrosage_en_ms, TYPE2 volume_d_eau_depuis_debut_d_arrosage_en_ml)
{

}

Si il manque de l'eau, tu renvois vrai (la condition de manque d'eau, je te laisse choisir entre les 2 évoquées), sinon tu renvois faux.

Si tu as réussi à faire l'exercice 1, alors tu remplace "TYPE1" et "TYPE2" par les types que tu as choisis. Sinon, tu peux provisoirement utiliser "int" et on le remplacera par le bon type une fois que tu aura réussi l'exercice 1.

Si tu as réussi à faire l'exercice 2, alors tu utilises ces valeurs. Sinon, prends des valeurs au hasard, et on verra après pour les bonnes valeurs.
 

 

 

Tu as 3 exercices à faire, et à priori on a déjà vu au fil de tes questions et des bouts de codes tout ce qu'il faut pour y répondre.

Les trois exercices sont indépendants (même si pour le 3, c'est pratique d'avoir fait 1 et 2), donc si tu bloque sur un exercice, en plus de nous expliquer pourquoi tu bloque, tu essayes aussi de faire les autres exercices.

Nb : pour l'exo 1, sauf si tu n'as pas compris la consigne, tu devrais à minima pouvoir répondre aux questions de l'indice






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

0 members, 0 guests, 0 anonymous users