Aller au contenu


Photo
- - - - -

arrosage pour bonsai


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

#1 michel

michel

    Habitué

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

Posté 10 mars 2020 - 05:20

bonjour Mike118

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 .

le programme que je t'ai soumis fait tout cela mais j'aimerai ajouter le contrôle du niveau d'eau par le flow water .

il tourne et c'est lui qui comptabilise la quantité d'eau ,donc s'il aucune eau passe il le sait est c'est ça que je voudrais ajouter à mon programme , mais je ne sais pas comment faire .

aucune impulsion avec une temporisation coupe le relais de la pompe .

je te joint le code .

d'avance merci . Grâce à toi et à sandro j'avance et mon projet avance .

bonne soirée .

[attachment=11307:sketch_mar10a_arrosage.ino]



#2 Mike118

Mike118

    Staff Robot Maker

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

Posté 10 mars 2020 - 06:00

Première étape on va faire un petit code qui ne fait fonctionner que le capteur. 
 

=> J'aimerais que tu fasse un code qui ne fait que afficher dans le moniteur série la quantité d'eau vue par le capteur. 

 

Est ce que tu peux nous faire ça ? 

 (Le but du jeu une fois que cela sera fait tu pourras allumer manuellement ta pompe en versant l'eau dans un verre doseur  (ou bien une bouteille d'eau d'un litre ) et tu pourras vérifier les quantité d'eau " mesurée ". part ton capteur.  )
 


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  

 

 

 


#3 michel

michel

    Habitué

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

Posté 12 mars 2020 - 03:03

Bonjour Mike118,

voila le code de base du water flow sensor YF-S401 que j’utilise.

[attachment=11310:G18_Water_Flow_Sensor.jpg]

[attachment=11311:flow_sensor_YF-S401.ino]

bonne journée .



#4 Sandro

Sandro

    Pilier du forum

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

Posté 12 mars 2020 - 04:23

Bonjour,

du coup, le code compile?

Est-ce que tu as testé qu'il te renvois bien la bonne quantité d'eau?

 

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.


#5 Mike118

Mike118

    Staff Robot Maker

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

Posté 12 mars 2020 - 05:49

Ok super, premier pas ok. 

Je pars du principe que les réponses aux questions de Sandro sont " Oui et oui "  car c'était le but de ce code de test ;) 
 J'ai vérifié qu'il compile, et même si on peut l'améliorer, (ce qu'on va faire tout de suite avant de passer à la suite)  l'ensemble me paraît correct ;) 

Du coup avant d'enchainer on va d'abord améliorer le code deux trois trucs. 

1) Pour les petits codes de test comme celui là le mieux c'est de mettre le code directement dans le message soit de cette façon : 

 

    byte sensorInterrupt = 0;  
    byte sensorPin       = 2;
    float calibrationFactor = 4.5;
    volatile byte pulseCount;  
    float flowRate;
    unsigned int flowMilliLitres;
    unsigned long totalMilliLitres;
    unsigned long oldTime;

void setup() {
    water_setup (); 
    Serial.begin(9600);
   
}

void loop() {
    water_read ();
// Print the cumulative total of litres flowed since starting
    Serial.print("Output Liquid Quantity: ");        
    Serial.print(totalMilliLitres);
    Serial.println("mL");  
}
void water_setup ()
{
    pinMode(sensorPin, INPUT);
    digitalWrite(sensorPin, HIGH);
    pulseCount        = 0;
    flowRate          = 0.0;
    flowMilliLitres   = 0;
    totalMilliLitres  = 0;
    oldTime           = 0;
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }
void water_read ()
  {
    if((millis() - oldTime) > 1000) 
    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;
    unsigned int frac;  

    pulseCount = 0;
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
void pulseCounter()
{
  // Increment the pulse counter
    pulseCount++;
} 

Soit en utilisant arduino create par exemple comme présenté dans cet article   car personnellement je trouve cela désagréable de devoir télécharger le code à chaque fois juste pour le lire... 


Ensuite 2) quand on a un code de test comme ça on le paufine au maximum avant de passer à la suite 

+> On retire tout ce qui est en trop et qui sert à rien et on cherche à limiter les variables globales. 

Voilà un code que je te propose à partir du tient : 

 


// On a le droit d'avoir plein constantes de " paramètrage " en globale définies avec const

// constantes de paramétrage
// Capteur de débit d'eau
const uint8_t sensorInterrupt = 0;
const uint8_t sensorPin       = 2;
const float calibrationFactor = 4.5;
const uint32_t tempsEntreDeuxAffichages = 1000; // Temps en ms 

// Mais on limite au maximum les variables globales

// 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;

// variables globales non volatile 
// Néant!

void setup() {
  water_setup ();  // initialisation du capteur de pompe
  Serial.begin(9600); 
}

void loop() {
  static uint32_t lastAffiche = millis ();  // Variable statique initialisée que la première fois ... 
  if( millis() - lastAffiche > tempsEntreDeuxAffichages  ) {
    // Print the cumulative total of litres flowed since starting
    Serial.print("Output Liquid Quantity: ");
    Serial.print(water_read());
    Serial.println("mL");
    lastAffiche = millis ();
  }
}

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++;
}

Du coup on apprend à utiliser les variables "static " qui permettent de limiter les variables globales et on profite aussi pour utiliser au maximum des variables dont on maîtrise la taille . 

 

 

Du coup une fois qu'on a un code amélioré : 

=> On vérifie qu'il fonctionne toujours ( ce que je te laisse le soin de faire )  et vu que cette fois ci c'est pas toi qui a fait le code " améliorer " on comprend bien les petites notions qui ont été incluses  ( variables "static",  fonction qui retourne un résultat, variable uint8_t , uint32_t ... )  

Si tu as des questions tu hésites pas à les poser ;) 

Une fois que tu as bien compris le code et que tu as testé et que ça marche bien comme tu veux alors on pourra passer à la suite =) Du coup j'attend ton retour, tes questions ou autre avant d'aller à l'étape suivante ;)


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  

 

 

 


#6 michel

michel

    Habitué

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

Posté 13 mars 2020 - 03:02

bonjour Mike118 ,

le code permet de voir le débit d'eau dans le Serial port de la carte arduino.

bonne journée.



#7 Mike118

Mike118

    Staff Robot Maker

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

Posté 13 mars 2020 - 06:45

bonjour Mike118 ,

le code permet de voir le débit d'eau dans le Serial port de la carte arduino.

bonne journée.

 

Ce que tu veux dire c'est que : 

Tu confirmes avoir testé ce code :

// On a le droit d'avoir plein constantes de " paramètrage " en globale définies avec const

// constantes de paramétrage
// Capteur de débit d'eau
const uint8_t sensorInterrupt = 0;
const uint8_t sensorPin       = 2;
const float calibrationFactor = 4.5;
const uint32_t tempsEntreDeuxAffichages = 1000; // Temps en ms 

// Mais on limite au maximum les variables globales

// 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;

// variables globales non volatile 
// Néant!

void setup() {
  water_setup ();  // initialisation du capteur de pompe
  Serial.begin(9600); 
}

void loop() {
  static uint32_t lastAffiche = millis ();  // Variable statique initialisée que la première fois ... 
  if( millis() - lastAffiche > tempsEntreDeuxAffichages  ) {
    // Print the cumulative total of litres flowed since starting
    Serial.print("Output Liquid Quantity: ");
    Serial.print(water_read());
    Serial.println("mL");
    lastAffiche = millis ();
  }
}

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++;
}

Qu'il fonctionne comme attendu , que tu l'as complètement compris, et donc que tu n'as aucune question à poser sur ce qu'est une variable " static " ou autre.
C'est bien ça ? 

Si oui on va passer à la suite!

 => Maintenant on fait un code qui ne fait que afficher dans le moniteur série la valeur d'humidité du sol.

 

Est ce que tu peux nous faire ça ? En cherchant bien entendu à limiter le nombre de variables globales et en prenant un peu comme modèle le code fait pour 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  

 

 

 


#8 michel

michel

    Habitué

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

Posté 14 mars 2020 - 11:42

Bonjour Mike118,

[attachment=11325:Moisture_sensor_.jpg]

je te joins le code du sensor  , tout est ok compilation et test  .

lu dans le Serial de la carte .

d'avance merci .

je te donne des nouvelles de ton code pour la lune  c'est parfait tout se passe comme je voulais .

bonne journée,Michel.

/*Soil Moisture*/
#define MoisturePin     A0
/* Variables Arrosage*/
float MoisHumidity   = 0;
float percentage;

void setup() {
  Serial.begin(9600);
 /* Init SoilMoisture*/
  pinMode(MoisturePin,INPUT);
}
void setSol() {
  MoisHumidity = analogRead(MoisturePin);
  percentage = map(MoisHumidity, 1023, 0, 0, 100);
  if(percentage>100){
    percentage=100;
  return percentage;
  }
  delay(1000);
}
void loop() {
    setSol(); //initialisation setSol
 /*Sol Moisture*/
   MoisHumidity = analogRead(MoisturePin) ;
  Serial.print("Moisture: ");
  Serial.print(MoisHumidity);
  Serial.print("\t");
  /*Humidité du sol en pourcentage */
  percentage = map(MoisHumidity, 1023, 0, 100, 0);
  Serial.print("Percentage: ");
  Serial.print(percentage);
  Serial.println("%");
}

 


#9 Mike118

Mike118

    Staff Robot Maker

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

Posté 14 mars 2020 - 12:15

Hop hop hop, on ne passe pas encore à l'étape suivante :P 

On va reprendre le code du capteur d'humidité, mais cette fois ci c'est pas moi qui fait tout le boulot de nettoyage! 

Rappel : 
=> Tu n'as pas le droit d'utiliser tes deux variables globales. float MoisHumidity   = 0;  et float percentage;

=> Tu n'as pas le droit d'utiliser la fonction delay

 

PS : 

=> On choisit une bonne fois pour toute dès maintenant si on utilise des #define ou des " const " pour les numéro de pins  ( ça c'est ton choix les deux se font mais on essaye d'être cohérent avec soit même ) 

 

et pour t'aider cette fois ci je te fournis le loop() => 

void loop() {
  
static uint32_t lastAffiche = millis (); // Variable statique initialisée que la première fois ... 
  if( millis() - lastAffiche > tempsEntreDeuxAffichages ) {

    uint16_t rawHumidity = getRawHumidity();
    uint8_t percentHumidity = getPercentHumidity(rawHumidity);

    Serial.print("Raw wumidity value: ");
    Serial.print(rawHumidity);
    Serial.print("\t");
    Serial.print("Percentage: ");
    Serial.print(percentHumidity);
    Serial.println("%");

    lastAffiche = millis ();
  }

}

il te reste donc juste à faire les deux fonctions : 

uint16_t getRawHumidity();
uint8_t getPercentHumidity(uint16_t rawHumidity);

 

Par contre ça sera à toi de faire le prochain loop du code de test :P 

Donc à toi de jouer, j'attend ta version " nettoyée " respectant les contraintes évoquées ci dessus ;) 

 


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  

 

 

 


#10 michel

michel

    Habitué

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

Posté 14 mars 2020 - 07:15

bonsoir Mike118,

je te met le code quand même  je pêche sur le pourcentage , j'ai 200% pour une humidité de 650 le soil moisture tremper dans un verre d'eau .

je ne sais pas pourquoi , je devrais avoir 100%

le code à surement des erreurs mais je ne trouve pas la solution .

il compile j'ai bien l'humidité du sol et le pourcentage 0% et 0 humidité quand je sort la fourchette de l'eau

uint8_t percentHumidity = getPercentHumidity(rawHumidity);arduino n'en veux pas (rawHumidity)

d'avance merci bonne soirée .

/*Soil Moisture*/
const uint8_t  sensor_MoisturePin =  A0;
/* Variables Arrosage*/
int rawHumidity = 0 ;
int percentHumidity ;
const uint32_t tempsEntreDeuxAffichages = 1000;


void setup() {
 Serial.begin(9600);
 /* Init SoilMoisture*/
  pinMode(sensor_MoisturePin,INPUT);

}
int getRawHumidity(){
  rawHumidity = analogRead(sensor_MoisturePin);
  return rawHumidity;
}
int getPercentHumidity(){
   rawHumidity = analogRead(sensor_MoisturePin);
   return rawHumidity;
   
   percentHumidity = map(rawHumidity, 1023, 0, 0, 100);
   
  if(percentHumidity>100){
    percentHumidity=100;
    return percentHumidity;
   
  }
}
void loop() {
  static uint32_t lastAffiche = millis (); // Variable statique initialisée que la première fois ...
  if( millis() - lastAffiche > tempsEntreDeuxAffichages ) {

    uint16_t rawHumidity = getRawHumidity();
    uint8_t percentHumidity = getPercentHumidity();
        
    Serial.print("Raw Humidity value: ");
    Serial.print(rawHumidity);
    Serial.print("\t");
    Serial.print("Percentage: ");
    Serial.print(percentHumidity);
    Serial.println("%");

    lastAffiche = millis ();
  }

}

 
 
 
 


#11 Sandro

Sandro

    Pilier du forum

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

Posté 14 mars 2020 - 08:50

Bonsoir,

 


il compile j'ai bien l'humidité du sol et le pourcentage 0% et 0 humidité quand je sort la fourchette de l'eau

uint8_t percentHumidity = getPercentHumidity(rawHumidity);arduino n'en veux pas (rawHumidity)

Euh ... si  l'arduino n'en veut pas,alors il ne compilera pas. C'est quoi l'erreur exactement que l'IDE t'affiche (essaye de toujours nous recopier les messages d'erreurs : même si tu ne les comprends pas, il y a de fortes chances qu'ils nous parlent à Mike ou moi (ou au pire à Google))?

Sinon, est-ce que tu as bien gardé la ligne précédente du code de Mike?

 

 

Pour ton erreur, je vois plusieurs causes possibles :

- tu as des returns qui se balladent un peu partout dans getPercentHumidity

- tu n'as pas respecté les types de retout (uint8_t et uint16_t)


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.


#12 Mike118

Mike118

    Staff Robot Maker

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

Posté 14 mars 2020 - 09:01

Bon je te file directement le corrigé pour cette fois ci :P

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


void setup() {
 Serial.begin(9600);
 /* Init SoilMoisture*/
  pinMode(sensor_MoisturePin,INPUT);

}

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, 1023, 0, 0, 100);
  return percentHumidity;
}

void loop() {
  static uint32_t lastAffiche = millis (); // Variable statique initialisée que la première fois ...
  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("%");

    lastAffiche = millis ();
  }

}

Je te laisse vérifier que ça marche bien ;) 
 

Par contre si tu as pas compris quelque chose dans cette corrections c'est maintenant qu'il faut poser des questions avant de passer à l'étape suivante  :P car pour la suite il n'y aura plus de correction "directe "   ;)

 

Rappel : 

+> Tu n'avais pas le droit de garder tes variables globales qui étaient toujours présente dans le dernier code que tu avais mis   :diablo: 

 

+> Il faut que tu sache rédiger une fonction qui retourne quelque chose, et qui prend des variables en paramètre... 

Visiblement tu ne maîtrises pas trop ça encore mais regarde bien en détail comment j'ai fais et apprend... Si il y a un truc que tu comprends pas pose des questions ! 

Pas besoin d'avoir des variables globales car les fonctions retourne des valeurs ! Tu dois utiliser le résultat que te retourne tes fonctions. ;)  

Attention quand tu mets un return dans une fonction la fonction ne va pas au dela... Tout le code de ta fonction après le return ne sera pas exécuté ! 
 

+> Utilise au maximum des variables dont tu maîtrises la taille => Tu n'as plus le droit à " int " mais tu as le droit à uint8_t  int8_t  int16_t uint16_t  etc... 
Si besoin relis ce lien :  des variables dont on maîtrise la taille . 

 

 

Confirme moi que c'est bon, que tu as tout compris, que tu vas bien faire des fonctions qui retourne les bonnes choses et prennent des variables en paramètre et on passe à l'étape suivante ;)  

Si tout n'est pas encore bien claire => Pose des questions jusqu'à ce que ça soit clair. Ne pas passer à l'étape suivante tant que la base n'est pas comprise =)
 

C'est en te laissant faire des erreurs puis en te montrant la correction qu'on comprend ;)

 

Eh oui plus ça va aller et moins je vais bosser !  :beach: 

Car normalement tu dois réussir à coder de mieux en mieux ;) 
 


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  

 

 

 


#13 Sandro

Sandro

    Pilier du forum

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

Posté 14 mars 2020 - 09:07

@Mike : tu as oublié le lien vers les infos sur 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.


#14 michel

michel

    Habitué

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

Posté 15 mars 2020 - 04:34

bonjour Mike118,

j'ai testé ton code j'avais juste un soucis soil_moisture trempé dans l'eau ( humidité = 665, pourcentage 34%) soil_moisture hors de l'eau (humidité 0, pourcentage 100%) pour map = uint8_t percentHumidity = map(rawHumidity, 1023, 0, 0, 100);

retour à la normal avec map= uint8_t percentHumidity = map(rawHumidity, 0, 1023, 0, 100); soil_moisture trempé dans l'eau ( humidité = 665, pourcentage 69%) soil_moisture hors de l'eau (humidité 0,pourcentage 0%)

 est ce que cela pourrait être la solution?.

bonne soirée .

prêt pour la suite .



#15 Mike118

Mike118

    Staff Robot Maker

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

Posté 15 mars 2020 - 05:28

bonjour Mike118,

j'ai testé ton code j'avais juste un soucis soil_moisture trempé dans l'eau ( humidité = 665, pourcentage 34%) soil_moisture hors de l'eau (humidité 0, pourcentage 100%) pour map = uint8_t percentHumidity = map(rawHumidity, 1023, 0, 0, 100);

retour à la normal avec map= uint8_t percentHumidity = map(rawHumidity, 0, 1023, 0, 100); soil_moisture trempé dans l'eau ( humidité = 665, pourcentage 69%) soil_moisture hors de l'eau (humidité 0,pourcentage 0%)

 est ce que cela pourrait être la solution?.

bonne soirée .

prêt pour la suite .

 

 

Justement ça ça fait partie des choses que tu dois vérifier en fonction de comment fonctionne ton capteur ;) 
+> C'est pour ça qu'il est important de bien faire les phases de tests à chaque fois pour chaque étapes et de ne pas tout faire d'un coupe ^^ 

Moi j'ai bêtement recopié ce que tu avais marqué plus tôt quand tu as fais tes essais ( Ton capteur aurait pu avoir un comportement inversé ^^ ) 
Donc c'est toi qui nous avait induit en erreur dans ta fonction ^^ 

Bref rien de bien grave =) L'important c'est que tu ais vu le problème et que tu as su le corriger tout seul =)   ( Car oui tu as trouvé la bonne solution ;) )

Donc si tu as plus de question on peut donc passer à la suite :P

 

Aller cette fois ci c'est un code très simple à rédiger : 

Tu vas faire le code de test de la pompe toute seule. 

Dans le set up tu dois initier la pompe ( même si c'est tout petit on va faire une fonction d'initialisation ) 
Dans le loop, chaque seconde tu vas changer l'état de la pompe entre tourne et tourne pas.  ( Même si c'est petit on va faire une seule fonction qui prend en paramètre l'état qu'on veut donner à la pompe  => Quand la pompe s'allume ou s'éteind on en profitera pour mettre un petit message sur le moniteur série du genre " la pompe est allumée " , " la pompe est éteinte " ) 

Est ce que tu peux me faire cela ? =) Attention on rappel toujours pas de variables globales ( les const pour les pins eux restent autorisé ) et on utilise des types de variable adapté !  Et cette fois ci je ne fournirais pas directement la correction :P J'espère que tu feras tout bon du premier coup! ;) 
 


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  

 

 

 


#16 michel

michel

    Habitué

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

Posté 15 mars 2020 - 06:20

voila le code du relais ,

bonne soirée , j’espère que tu va bien surtout si tu a un soucis avec le covit19 j'ai le temps , prend soin de toi ,Michel.

[attachment=11327:ar-module-relais-grove-103020005-19046.jpg]

/*Relay Pompe Arrosage*/
const uint8_t RelayPin = A2;
const uint8_t RelayOn  = HIGH;
const uint8_t RelayOff = LOW;
const uint32_t tempsEntreDeuxAffichages = 2000;
void setup() {
  Serial.begin(9600);
  /* Init Relay Pumpe  */
  pinMode(RelayPin, OUTPUT);

}

void loop() {
 
 static uint32_t lastAffiche = millis (); // Variable statique initialisée que la première fois ...
 if( millis() - lastAffiche > tempsEntreDeuxAffichages ) {
  WaterPumpOn();
  Serial.print("la pompe est allumee");
  Serial.println();
  lastAffiche = millis ();
 }
if( millis() - lastAffiche > tempsEntreDeuxAffichages ) {
  WaterPumpOff();
  Serial.print("la pompe est eteinte");
  Serial.println();
  lastAffiche = millis ();
  }
}
void WaterPumpOn()
{
    digitalWrite(RelayPin,RelayOn);
}

void WaterPumpOff()
{
    digitalWrite(RelayPin,RelayOff);
} 
 
 
 
 
 
 
 



#17 Mike118

Mike118

    Staff Robot Maker

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

Posté 15 mars 2020 - 07:51

Bon, un bon point car il n'y a pas de variables globale ! =)

Par contre ce n'est pas exactement ce que j'ai demandé ! 

=> On veut une seule fonction void setWaterPump( bool etat ) ; 

Et pour l'exercice cette fois ci c'est dans cette fonction qu'on va gérer l'affichage =) 

Ensuite est ce que tu as testé ton code ? Je ne suis pas sûr que la logique utilisée permette de faire ce que j'ai demandé =) 

Je pense qu'avec le code que tu as posté là tu as bien un message qui s'affiche à peu près toutes les 2 secondes mais que l'ordre d'affichage est un peu aléatoire non ?

En plus j'ai dit que je ne posterais pas la correction moi même donc il va falloir que tu trouves mais je vais te donner des indices si besoin ^^ En attendant commence par déjà bien faire une seule fonction void setWaterPump(bool etat )  qui prendra en paramètre l'état qu'on veut donner à 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  

 

 

 


#18 michel

michel

    Habitué

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

Posté 16 mars 2020 - 03:06

bonjour Mike118,

écoute j'ai essayer de faire un code avec bool pas facile je ne l'utilise jamais.

par contre pour le code d'hier j'ai pris la photo pour que tu vois le Serial.print.comme cela cela répondra à tes interrogations.

bonne journée.

[attachment=11328:IMG_1696.JPG]

 
/*Relay Pompe Arrosage*/

const uint8_t RelayPin = A2;

const uint32_t tempsEntreDeuxAffichages = 2000;

bool etatRelay = 0;



void setup() {

  Serial.begin(9600);

  /* Init Relay Pumpe  */

  pinMode(RelayPin, OUTPUT);



}



void loop() {

 

  setWaterPump();

 

}

void setWaterPump(){

  static uint32_t lastAffiche = millis (); // Variable statique initialisée que la première fois ...

 if( millis() - lastAffiche > tempsEntreDeuxAffichages ) {

  etatRelay =! etatRelay;

  digitalWrite(RelayPin, etatRelay );

  Serial.println(etatRelay);

  lastAffiche = millis ();

  }

}

 

 voila la photo du Serial.print

[attachment=11329:IMG_1697.JPG]



#19 Sandro

Sandro

    Pilier du forum

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

Posté 16 mars 2020 - 03:38

Bonjour,

 

Par rapport à la première image :

- tu t'attendais à voir quoi?

- Est-ce que ce que tu vois correspond à ce à quoi tu t'attendais?

- Pourquoi?

 

 

Pour la fonction void setWaterPump( bool etat ) , ce que tu as fais ne correspond pas à ce que Mike t'avais demandé de faire :

1) tu as écrit une fonction "void setWaterPump()" au lieu de "void setWaterPump( bool etat )". C'est à dire tu ne prends pas en argument l'état souhaité de la pompe.

Le but est que tu puisse ensuite écrire :

setWaterPump(true);

pour allumer la pompe

et

setWaterPump(false);

pour allumer la pompe

2) la gestion du temps est sensé se faire dans loop (si tu gère un allumage/extinction toutes les 2 minutes dans ta fonction, alors ta fonction ne servira pas à grand chose, vu que tu ne pourra plus décider quand allumer ou pas)

3) tu utilises encore une variable globale (etatRelay ) : on a dit plus de variables globales.

 

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.


#20 michel

michel

    Habitué

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

Posté 16 mars 2020 - 06:29

bonjour Sandro,merci de m'avoir mis sur la voie

 je ne sais pas si sais cela que tu attendais .

bool jamais utiliser .

bonne soirée.

/*Relay Pompe Arrosage*/
const uint8_t RelayPin = A2;
bool etat = false;
const uint32_t PAUSE =1000;


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

}

void loop() {
  if ( etat == false )
  {
    setWaterPump(false);                   
    digitalWrite(RelayPin,false);
    Serial.println("pompe 0ff");   
    etat = true;                
    delay(PAUSE);               
  }
  else
  {
    setWaterPump(true);
    digitalWrite(RelayPin,true);
    Serial.println("pompe 0n");     
    etat = false;               
    delay(PAUSE);               
  }
}

void setWaterPump(bool etat){
 
}
 
 





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

0 members, 0 guests, 0 anonymous users