Go Down

Topic: Lire deux capteur d'humidité a intervalle différent non bloquant. (Read 825 times) previous topic - next topic

lesept

Je ne vois rien de mal dans ton code, la seule chose : tu peux ôter int dans ces deux lignes :
Code: [Select]
int humidite = digitalRead(capthumidite); // Lecture de l etat du détecteur 1
int niveaucanal = digitalRead(canal); // Lecture de l etat du du niveau d'eau canal
Si ça ne suffit pas, tu peux ajouter des Serial.print(millis()); dans les fonctions togglexxx pour voir s tu y passes bien après les temporisations
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

gwest77

En effet, sans les int cela fonctionne mieux.

ET j'avais inversé "LOW" et High dans  le capteur d'humidité.

Tout fonctionne parfaitement.

Un Grand merci a lesept :)

gwest77

Par contre j'ai rajouté du code dans le "setup" pour lire l'état des capteurs avant démarrage, car cela pouvait fausser la valeur d'un jour a l'autre (l'arduino s'allume tous les jours dans une plage horaire pour vérifier l'humidité.)

Disons que la lecture du capteur au démarrage était sur "sec" du coup la pompe s'allumait, et 3 minutes après la lecture du capteur humidité sol, la pompe s'arrêtait car le sol était en réalité mouillé.

Maintenant la lecture du capteur est directement sur sol mouillé. Donc a la prochaine lecture (3minutes après) le capteur vérifie si le sol est bien mouillé ou pas.

Code: [Select]
  int humidite = digitalRead(capthumidite); // Lecture de l etat du détecteur 1
  int niveaucanal = digitalRead(canal); // Lecture de l etat du du niveau d'eau canal



gwest77

Et je me demandais si c'était possible que les leds témoins (humidité, sec, ) puissent s'allumer a la seconde près du changement d'état. c'est a dire qu'ils puissent s'allumer de suite sans délais millis.

Car maintenant, les leds s'allument 3 minutes après avoir mesuré l'humidité du sol

Mais que la pompe réagirait en fonction du millis.

J-M-L

Tout est possible - faut juste coder en fonction du besoin :)

Éventuellement jetez un œil à mon tuto Programmation Automate fini / Machine à état
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

lesept

Il suffit de déplacer tes if dans la fonction concernée :
Code: [Select]
  if  (humidite == LOW) {
    digitalWrite(ledhumide, HIGH); // Allumer LED humide
    digitalWrite(ledsec, LOW); // Eteindre Led sec
  }

  if  (humidite == HIGH) {
    digitalWrite(ledsec, HIGH); // Allumer Led sec
    digitalWrite(ledhumide, LOW); // Eteindre LED humide
  }
déplacé dans togglecapthumidite qui devient :
Code: [Select]
void togglecapthumidite ()
{


int humidite = digitalRead(capthumidite); // Lecture de l etat du détecteur 1

if  (humidite == LOW) {
    digitalWrite(ledhumide, HIGH); // Allumer LED humide
    digitalWrite(ledsec, LOW); // Eteindre Led sec
  }

  if  (humidite == HIGH) {
    digitalWrite(ledsec, HIGH); // Allumer Led sec
    digitalWrite(ledhumide, LOW); // Eteindre LED humide
  }

  // remember when we toggled it
  capthumiditetimer = millis ();
}  // end of togglecapthumidite
et même chose pour l'autre fonction
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

gwest77

Alors, déplacer les "int" ne fonctionne pas. Les leds restent éteintes, je pense que c'est plus compliqué que ça.

Mais bon,, je pense laisser comme ça. Cela fonctionne bien.

Il y a juste le capteur d'humidité qui a tendance a  changer de résistivité a cause de la corrosion il me semble.

Je n'ai pas branché en Analogique car les valeurs variaient beaucoup trop et ne sont pas stables (le cable du capteur a une longueur de 6/7m. Il y a deux tiges en aluminium qui plongent dans le terre et qui sont fixés parallèlement par une plaque de plexiglas a une distance de 1.5cm).


lesept

Les 'if' pas les 'int'. Il faut vérifier que les variables ledsec et ledhumide sont globales (définies dans l'entête du code, avant le setup).

Au besoin poste le code en l'état actuel...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

gwest77

Oui les if et pas les int dsl.

Voici le code actuel :

Code: [Select]
const int canal = 10; // niveau d'eau canal
const int pompe = 9; // relais pompe
const int capthumidite = 8; // détecteur d'humidité numéro 1
int ledhumide = 7;
int ledsec = 6;
int ledniveaucanalbas = 5;
int ledniveaucanalhaut = 4;
const int ledprogramateur = 3;
int pumpLEDPin = 2; // Led  pompe verte

// Time periods  in milliseconds (1000 to a second).
const unsigned long canalinterval = 3000;
const unsigned long capthumiditeinterval = 180000;

// Variable holding the timer value so far. One for each "Timer"
unsigned long canaltimer;
unsigned long capthumiditetimer;

int niveaucanal; // état du du niveau d'eau canal
int humidite; // état du détecteur 1


void setup ()
{
  // Configure la broche avec la résistance de tirage
  Serial.begin(9600);
  pinMode (canal, INPUT); // entrée capteur niveau canal
  pinMode (capthumidite, INPUT); // entrée capteur sol humidité
  pinMode(pompe, OUTPUT); // pompe est une broche de sortie
  pinMode(ledhumide, OUTPUT);
  pinMode(ledsec, OUTPUT);
  pinMode(ledniveaucanalbas, OUTPUT);
  pinMode(ledniveaucanalhaut, OUTPUT);
  pinMode(ledprogramateur, OUTPUT);
  pinMode(pumpLEDPin, OUTPUT);

  int humidite = digitalRead(capthumidite); // Lecture de l etat du détecteur 1
  int niveaucanal = digitalRead(canal); // Lecture de l etat du du niveau d'eau canal



  canaltimer = millis ();
  capthumiditetimer = millis ();




}  // end of setup

void togglecanal ()
{

  niveaucanal = digitalRead(canal); // Lecture de l etat du du niveau d'eau canal

  // remember when we toggled it
  canaltimer = millis ();

  Serial.print(millis());
}  // end of togglecanal

void togglecapthumidite ()
{


  humidite = digitalRead(capthumidite); // Lecture de l etat du détecteur 1


  // remember when we toggled it
  capthumiditetimer = millis ();

  Serial.print(millis());
}  // end of togglecapthumidite

void loop ()
{

  // Handling the blink of one sensor
  if ( (millis () - canaltimer) >= canalinterval)
    togglecanal ();

  // The other sensor is controlled the same way. Repeat for more sensors
  if ( (millis () - capthumiditetimer) >= capthumiditeinterval)
    togglecapthumidite ();

  /* Other code that needs to execute goes here.
     It will be called many thousand times per second because the above code
     does not wait for the sensor blink interval to finish. */


  digitalWrite(ledprogramateur, HIGH); // Allumer Led programateur








  if  (humidite == LOW) {
    digitalWrite(ledhumide, HIGH); // Allumer LED humide
    digitalWrite(ledsec, LOW); // Eteindre Led sec
  }

  if  (humidite == HIGH) {
    digitalWrite(ledsec, HIGH); // Allumer Led sec
    digitalWrite(ledhumide, LOW); // Eteindre LED humide
  }

  if  ((niveaucanal) == HIGH) {
    digitalWrite(ledniveaucanalbas, HIGH); // Allumer LED niveau canal bas
    digitalWrite(ledniveaucanalhaut, LOW); // Eteindre Led niveau canal haut
  }

  if  ((niveaucanal) == LOW) {
    digitalWrite(ledniveaucanalbas, LOW); // Eteindre Led niveau canal bas
    digitalWrite(ledniveaucanalhaut, HIGH); // Allumer LED niveau canal haut
  }






  // Agir en fonction de l'état des parametres
  if ((humidite == HIGH) && (niveaucanal == LOW))
  {
    digitalWrite(pompe, LOW);
    digitalWrite(pumpLEDPin, HIGH); // Allumer Led pompe
  }
  else
  {
    digitalWrite(pompe, HIGH);
    digitalWrite(pumpLEDPin, LOW); // Eteindre Led pompe
  }




  delay(3000); // Attendre 3 seconde (prendre des mesures toutes les 3 secondes)




}  // end of loop

lesept

Et quand tu déplaces ces lignes
Code: [Select]
  if  (humidite == LOW) {
    digitalWrite(ledhumide, HIGH); // Allumer LED humide
    digitalWrite(ledsec, LOW); // Eteindre Led sec
  }

  if  (humidite == HIGH) {
    digitalWrite(ledsec, HIGH); // Allumer Led sec
    digitalWrite(ledhumide, LOW); // Eteindre LED humide
  }
de la loop dans la fonction togglecapthumidite :
Code: [Select]
void togglecapthumidite ()
{


  humidite = digitalRead(capthumidite); // Lecture de l etat du détecteur 1

  if  (humidite == LOW) {
    digitalWrite(ledhumide, HIGH); // Allumer LED humide
    digitalWrite(ledsec, LOW); // Eteindre Led sec
  } else { // <-- petit changement au passage...
    digitalWrite(ledsec, HIGH); // Allumer Led sec
    digitalWrite(ledhumide, LOW); // Eteindre LED humide
  }

  // remember when we toggled it
  capthumiditetimer = millis ();

  Serial.print(millis());
}  // end of togglecapthumidite
ça n'allume pas les LEDs ?
Je ne vois pas pourquoi...

Au besoin, ajoute un
Code: [Select]
Serial.println(humidite);après le digitalRead pour voir ce que ça vaut.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

gwest77

Non les deux leds du capteur d'humidité restent éteinte, c'est peut etre parce que le toggle humidité se fait que toutes les trois minutes.?



lesept

Oui, le toggle humidité se fait toutes les 3 minutes et, avec la modification, les leds s'allument au moment de la mesur d'humidité.
Mais celle du niveau se fait toutes les 3 secondes, tu devrais voir les leds s'allumer plus souvent.

Tu peux enlever les deux lignes digitalRead du setup et les remplacer par les deux appels togglexxx
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up