2 capteurs comportement non prévu

Bonjour :
je débute c'est mon 1er montage sur une Breadboard
Un aduino pro mini 3,3v
un capteur lumière TEMT6000 sortie Out ---> A2
un capteur pluie sortie A0 ---> A0 (celui avec une grande plaque )
Chose étonnante : les 2 valeurs sont 1023 capteur sec et lumière ambiante, même si je met une feuille de carton sur le capteur lumiere
Encore plus étonnant, en mouillant le capteur pluie, les 2 valeur (pluie et lumière ) descendent même si un carton cache le capteur lumière. En séchant ils remontent tous les 2 à 1023
Je ne comprend pas
Merci de vos .... lumières

Bonjour @dmlk

une photo nette du montage avec un gros plan sur la plaque d'essai pourrait aider à faire un diagnostic

+publier le code en tenant compte des consignes :

voici la photo
Merci de votre intérêt

Il manque un fil vert ! :grin:

Blague à part, impossible de voir comment c'est connecté sur ta photo.

une photo nette du montage avec un gros plan sur la plaque d'essai pourrait aider à faire un diagnostic

.......j'ai fait preuve d'un excès d'optimisme !

Ah oui OK ....
il faudrait peut-être souder des pins dans la carte pour la raccorder à la breadboard

Merci de vos réponses
Mais comment faites vous alors pour faire vos essais : toujours en soudant ?
ou alors juste la carte sur sa nappe de communication ?
J'ai dû mal cherché, je n'ai pas vu de recommandations allant dans ce sens : seulement la breadboard avec des cables Dupont pour faire des essais !
Avec la carte arduino pro mini je ne sais faire, j'ai fait au mieux :
Le moniteur série me montrait que ça fonctionnait à la cadence prévue : il renvoyait bien des valeurs correspondantes aux input prévus

Est-ce plus lisible ?


Oui mais les câbles Dupont ne font pas un bon contact électrique avec les trous métallisés de la carte Arduino. Des fois ça touche, des fois ça touche pas.
En général, on soude des broches comme celles-ci sur la carte et c'est elles qui feront la liaison électrique entre la carte et la breadboard.

pack-de-5-connecteurs-1x16-male-male

Merci
Je rentre de vacances
je vais sortir mon fer à souder

J'ai fait mes soudures sur l'arduino.
J'ai refait un nouveau montage, et j'ai changé mon code
un capteur de lumière sur A2
un capteur de pluie pin analogique sur A0, pin digitale sur 2
je commande la sortie sur la pin 5 pour allumer si lumiere et pas de pluie seulement
on éteint la nuit, on éteint s'il pleut (c'est pour sortir du 1500v en extérieur, que le jour )
la pin 2 commande une interruption
mais le capteur mouillé ou sec aucune interruption :slight_smile: Voici le code


const byte capteur_digit_pluie = 2;//capteur pluie digital D0
const int capteur_A = A0;//capteur analog pluie A0
const int CateurLumPin = A2; //On branche le capteur lumiere sur A2
int val_analogiquePluie;
volatile byte etatPluie = HIGH; //le capteur est sec

int ledPin = 5;  //On renomme la broche 5 en "ledPin" celle qui allume la led si pas de pluie
int seuilLumiere = 6 ; //inferieur a 6-1=5 = nuit

void setup(){
    Serial.begin(9600);
    pinMode(capteur_digit_pluie, INPUT_PULLUP);
    pinMode(capteur_A, INPUT);
    pinMode(CateurLumPin, INPUT);
    pinMode(ledPin, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(capteur_digit_pluie), siPluie, CHANGE);
}

void loop(){
    val_analogiquePluie = analogRead(capteur_A); 
    int valueLumiere = analogRead(CateurLumPin);  
    byte val_digit_pluie = digitalRead(capteur_digit_pluie);
  
    Serial.print("Analog value Pluie: ");
    Serial.println(val_analogiquePluie); 
    
    Serial.print("Valeur digital Pluie: ");
    Serial.println(val_digit_pluie); 
    
    Serial.print("Value Lumiere : ");
    Serial.println(valueLumiere);

    Serial.print("Valeur etatpluie : ");
    Serial.println(etatPluie);

    Serial.print("Valeur ledPin output : ");
    Serial.println(ledPin);

    Serial.println("");

    if (etatPluie==HIGH){ //le capteur est sec
      if(valueLumiere < seuilLumiere) //=nuit
        {
          digitalWrite(ledPin,LOW); //on éteint la led
        }
        else 
        {
        digitalWrite(ledPin,HIGH); // allume la led
        }
    } 
    else {//le capteur est mouillé
    digitalWrite(ledPin,LOW); //on éteint la led
    }  
    delay(5000);
}
void siPluie() {
  Serial.println("Interruption: ");
  etatPluie = !etatPluie;
  if(etatPluie=="LOW"){ //LOW=Humide
        Serial.println("De l eau sur le capteur");
        }
        else
        {Serial.println("le capteur est sec");
        }   
 } 

Les capteurs fonctionnent : j'ai bien une variation des variables analogiques pluie et lumière que j'affiche sur le moniteur série : voici un exemple avec lumière le soir et un peu d'eau sur le capteur

Analog value Pluie: 604
Valeur digital Pluie: 1
Value Lumiere : 781
Valeur etatpluie : 1
Valeur ledPin output : 5

Merci de vos réponses

Je ne comprends pas très bien pourquoi tu utilises une interruption pour la gestion de la pluie puisque tu lis l'état des capteurs dans loop().

De même, je ne comprends pas l'intérêt d'avoir une sortie analogique et une sortie logique alors que cela pourrait être fait directement dans le logiciel par seuillage.

Dans la routine d'interruption, tu fais basculer etatPluie à chaque changement d'état du capteur mais tu ne lis pas l'état dudit capteur donc la variable ne représente pas l'état réel du capteur mais seulement le fait qu'il y a eu un changement.

Merci de ta réponse.
Mon dispositif sera à l'extérieur pour alimenter ma harpe anti--frelon à côté de mes ruches, qui a besoin de fonctionner dans une pâture loin de toute source d'énergie, et loin de l'apiculteur. Donc je cherche à économiser le plus possible : pas de frelon la nuit : j'éteint, le jour ne tombe pas d'un coup donc je vais mettre l'arduino en sommeil pour qu'il ne consomme pas trop.
J'alimente la harpe (= des fils tendus à 2.5cm d'écart )avec une ddp de 1500V : je préfère qu'il ne pleuve pas dessus d'où l'interruption qui peut déclancher même si l'arduino est en sommeil

Comme c'est mon 1er projet j'y vais par étapes. je le fais marcher (en tout cas j'essaye) j'ajouterai le sommeil après.
Je lis l'état analogique pour apprendre à le faire marcher, je supprimerai l'analogique pluie dans le projet définitif.
tu dis :

Dans la routine d'interruption, tu fais basculer etatPluie à chaque changement d'état du capteur mais tu ne lis pas l'état dudit capteur donc la variable ne représente pas l'état réel du capteur mais seulement le fait qu'il y a eu un changement.

Citation
il me semblait le faire avec

 pinMode(capteur_digit_pluie, INPUT_PULLUP);

et

attachInterrupt(digitalPinToInterrupt(capteur_digit_pluie), siPluie, CHANGE);

dans setup()
Si ce n'est pas ça c'est que j'ai mal compris l'interruption.

un petit digitalRead(capteur_digit_pluie) à glisser quelque part !
Tes 2 lignes de code configurent la pin, attache l'interruption, mais ne lisent pas le capteur comme fait remarquer @fdufnews

Dans loop() j'ai :

byte val_digit_pluie = digitalRead(capteur_digit_pluie);

Mais je n'en fait rien....
Il faut que je revoie la fonction siPluie().
il me semble que

 etatPluie = !etatPluie;

est de tropcar si on arrive là c'est justement que la variable vient de changer ...
je regarde plus tard,

C'est inutile puisque l'interruption interrompe le cours de l'exécution du programme pour appeler ta fonction, lorsque la broche change d'état.

@fdufnews indique justement que l'instruction:

byte val_digit_pluie = digitalRead(capteur_digit_pluie);

est redondant avec l'interruption.

Non, moi je trouve ça bien, par contre plutôt que de définir arbitrairement la valeur à HIGH, tu pourrais lui donner la valeur de la lecture de la broche dans le setup, pour être sûr que ton état soit coordonnée avec l'état de la broche.

J'ai trouvé

J'ai d'abord changé le code pour simplifier les if successifs, j'ai mis une opération booleenes sur mes 2 variables : les à HIGH on allume, sinon on éteint ce qui équivaut à

digitalWrite(ledPin,etatLumiere && etatPluie);

j'ai mis ma fonction d'interruption au débu
et j'ai changé
pinMode(capteur_digit_pluie, INPUT_PULLUP); en pinMode(capteur_digit_pluie, INPUT);

J'ai gardé les infos de sortie séries, et voilà le code


const byte capteur_digit_pluie = 2;//capteur pluie digital D0
const int capteur_A = A0;//capteur analog pluie A0
const int CateurLumPin = A2; //On branche le capteur lumiere sur A2

int val_analogiquePluie;
int valueLumiere ;

volatile byte etatPluie=0 ;
volatile byte etatLumiere=0;


int ledPin = 5;  //On renomme la broche 5 en "ledPin" celle qui allume la led si pas de pluie
int seuilLumiere = 6 ; //inferieur a 6-1=5 = nuit

void Test() {
  etatPluie = digitalRead(capteur_digit_pluie);
  digitalWrite(ledPin,etatLumiere && etatPluie);
  Serial.print("Valeur ledPin output du Test: ");
  Serial.println(digitalRead(ledPin));
 }

void setup(){
    Serial.begin(9600);
    pinMode(capteur_A, INPUT);
    pinMode(CateurLumPin, INPUT);
    pinMode(ledPin, OUTPUT);
    pinMode(capteur_digit_pluie, INPUT);
    attachInterrupt(digitalPinToInterrupt(capteur_digit_pluie), Test, CHANGE);
     
    valueLumiere = analogRead(CateurLumPin);  
   
    if(valueLumiere < seuilLumiere) {//=nuit
      etatLumiere=LOW;
    }
    else {
      etatLumiere=HIGH;
    }
}

void loop(){
   Test()
  val_analogiquePluie = analogRead(capteur_A); 
    valueLumiere = analogRead(CateurLumPin);  
    etatPluie = digitalRead(capteur_digit_pluie);

    Serial.print("Analog value Pluie: ");
    Serial.println(val_analogiquePluie); 
    
    Serial.print("Value Lumiere : ");
    Serial.println(valueLumiere);

    Serial.print("Valeur etatpluie : ");
    Serial.println(etatPluie);

    Serial.print("Valeur ledPin output : ");
    Serial.println(digitalRead(ledPin));

    Serial.println("");    
     
    delay(5000);
}


Il me reste à modifier pour mettre en sommeil, puis déssouder les leds des composant pour minimiser la consommation
Daniel

Pourquoi changer complétement ton code ?
quel est l'intérêt d'appeler la fonction Test en boucle dans la loop et dans l'interruption sur un changement d'état de ta boche?

Pourquoi afficher toutes les 5 secondes l'état de ton capteur, puisque tu as une interruption qui te prévient lorsque cela change?

C'est un code de travail
Prochaine etape
Je met en sommeil l'arduino
Il se reveille s'il pleut
Mais il faut qu'il continue a tester s'il fait jour pour eteindre s'il fait nuit
Le capteur de lumiere est analogique, donc dans loop(), je continue à tester la lumiere mais je cngerai le delai en 1/2heure au lieu de 5000ms
A moins de trouver un capteur digital.
Je suis preneur de toute proposition allant dans ce ses