Arduino Forum

International => Français => Topic started by: leg2027 on Nov 06, 2019, 12:44 pm

Title: Allumage d'une lampe détection de mouvement quand il fait sombre [résolu]
Post by: leg2027 on Nov 06, 2019, 12:44 pm
Bonjour, je voudrais faire une lampe à détecteur de mouvement mais uniquement quand il fait très sombre.
J'ai testé ce code mais ça n'a pas l'air de marcher.

Code: [Select]
const char PIR= 0;
int led = 2;
const char photoresistance = 1;


void setup() {
  pinMode(PIR, OUTPUT);
}

void loop() {
  if (analogRead(PIR)  >100)
  {
    digitalWrite(led, LOW);
  }
  if (analogRead(photoresistance)  <300)
  {
    digitalWrite(led, LOW);
 }
 else
 digitalWrite(led,  HIGH);
}
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: kamill on Nov 06, 2019, 12:49 pm
Bonjour,

Pourquoi ça:   pinMode(PIR, OUTPUT);
PIR est une entrée

De plus PIR ne fait pas référence à la même entrée dans pinMode() et analogRead()
pinMode(PIR,..) fait référence à la pin O
analogRead(PIR) fait référence à la pin A0

Sur quelle entrée est connecté ton capteur?

Il faut éviter d'utiliser les pins 0 et 1 qui sont utilisées pour RX/TX
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: leg2027 on Nov 06, 2019, 03:57 pm
T'es tout le temps sur le forum pour répondre en 1 min. :D  :D  :D
C'est pour ça mais ça ne marche toujours pas.  :smiley-cry:

Quote
De plus PIR ne fait pas référence à la même entrée dans pinMode() et analogRead()
pinMode(PIR,..) fait référence à la pin O
analogRead(PIR) fait référence à la pin A0
Comment faut il faire alors ?
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: kamill on Nov 06, 2019, 04:18 pm
Utiliser le numéro de pin qui correspond à la pin sur laquelle tu es connecté
Utiliser digitalRead() pour lire une pin numérique.
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: lesept on Nov 06, 2019, 05:35 pm
Tu devrais aussi t'intéresser aux conditions logiques dans un test conditionnel. And (https://www.arduino.cc/reference/en/language/structure/boolean-operators/logicaland/) s'écrit &&
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre [résolu]
Post by: leg2027 on Nov 06, 2019, 07:55 pm
Ca marche, merci lesept !!!!!!!
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre [résolu]
Post by: leg2027 on Nov 07, 2019, 07:31 pm
Ca marche tout à fait bien mais la lampe clignote à un certain niveau de luminosité(seuil juste avant l'allumage normal (ou tellement clignotant que l'on ne voit pas))
Comment cela ce fait il ?

Code: [Select]
Avec ce code:
const char PIR= 3;
int led = 13;
const char photoresistance = 2;
 
void setup() {
  pinMode(PIR, INPUT);
  Serial.begin(9600);
 
}

void loop() {

  if (analogRead(PIR) >100 && analogRead(photoresistance) >950)
  {
  digitalWrite(led, HIGH);
  }
  else {
  digitalWrite(led, LOW);
  }
}
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: iznobe on Nov 08, 2019, 08:08 am
Salut ,

moi ce qui m ' etonne c ' est le type des variables PIR et photoresistance ( char ) et son utilisation qui ne pose pas de probleme ... char c ' est pour des caracteres , les chiffres en sont , mais surprenant que ca marche !
le type byte serait plus approprié .

sinon pour le probleme que tu decris dans ton denier post , ca s' apellle de l ' hysteresis  les valeurs d' arret et de marche sont trop proche l ' une de l' autre , tout simplement du coup il ya 2 solutions :

soit mettre une temporisation en tre le marche et l' arret de ta lampe , soit augmenter l ' ecart de marche par rapport a l'  arret .

le probleme vient du if else ( et certainement de la luminosité ) :
Code: [Select]

if (analogRead(PIR) >100 && analogRead(photoresistance) >950)
  {
  digitalWrite(led, HIGH);
  }
  else {
  digitalWrite(led, LOW);
  }


du coup je ferais plutot :
Code: [Select]

if (analogRead(PIR) > 100 ) {
   
    if (analogRead(photoresistance) >950) {
        digitalWrite(led, HIGH);
    }
    else if (analogRead(photoresistance) < 900) {
        digitalWrite(led, LOW);
    }
}
else {
    digitalWrite(led, LOW);
}
  
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: hbachetti on Nov 08, 2019, 09:30 am
Quote
moi ce qui m ' etonne c ' est le type des variables PIR et photoresistance ( char ) et son utilisation qui ne pose pas de probleme ... char c ' est pour des caracteres , les chiffres en sont , mais surprenant que ca marche !
Code: [Select]

const char PIR= 3;
const char photoresistance = 2;


Le type char n'est pas problématique dans ce cas où les valeurs sont < 127.
On a plus l'habitude de voir int ou :

Code: [Select]

#define PIR                      3
#define PHOTORESISTANCE 2


Mais bon, c'est pinailler ...

Au sujet de l'hystérésis, à partir du moment où l'on travaille sur un seuil, c'est nécessaire.
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: fdufnews on Nov 08, 2019, 09:52 am
Au sujet de l'hystérésis, à partir du moment où l'on travaille sur un seuil, c'est nécessaire.
Surtout que lorsqu'on allume la lampe, il y a de fortes chances que la luminosité change.
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: hbachetti on Nov 08, 2019, 10:24 am
Et de plus :

Code: [Select]
 if (analogRead(PIR) >100 && analogRead(photoresistance) >950)

Quote from: kamill
Utiliser digitalRead() pour lire une pin numérique.
Cette remarque n'a pas été prise en compte.

digitalRead(PIR) == HIGH serait plus approprié étant donné qu'un PIR a une sortie tout ou rien.

Si analogRead(PIR) >100 fonctionne c'est que le PIR a été branché sur A3.

Il devrait être branché sur D3 pour pouvoir le lire avec digitalRead(3).
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: fdufnews on Nov 08, 2019, 01:21 pm
Les entrées "analogiques" sont avant tout des broches digitales. Elles ont la double fonction.
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: kamill on Nov 08, 2019, 01:34 pm
Ca n'empêche pas que comme il est dit par hbachetti:
Il devrait être branché sur D3 pour pouvoir le lire avec digitalRead(3).
Si on est connecté sur A3, il faut utiliser digitalRead(A3)
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: hbachetti on Nov 08, 2019, 04:30 pm
Les entrées "analogiques" sont avant tout des broches digitales. Elles ont la double fonction.
Oui, parfaitement d'accord, mais c'est le if (analogRead(PIR) >100  qui me fait tiquer.
Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: leg2027 on Nov 09, 2019, 12:14 pm
Merci pour toutes vos réponses,
Voici mon nouveau code, j'ai ajouté un delay mais ce serait mieux avec une fonction millis mais je ne sais pas encore trop l'utiliser.
Je n'ai pas changer "analogRead" car ça marche avec.
Plus de clignotement maintenant.
Je pense qu'il faudrait faire
 
si une personne est détectée et qu'il fait sombre
 allumer LED
 ne plus s'occuper de la luminosité
 si la personne pars millis 10 secondes pour vérifier
 éteindre la LED
 se réoccuper de la luminoisté


Mon code qui s'améliore mais ce n'est pas encore ça

Code: [Select]
#define PIR 3
int led = 13;
#define photoresistance  2
 
void setup() {
  pinMode(PIR, INPUT);
  Serial.begin(9600);
  
}

void loop() {
  Serial.println(analogRead(photoresistance));
  
  
  if (analogRead(PIR) >100) {
    if (analogRead(photoresistance) >950) {
      digitalWrite(led, HIGH);
      delay(10000);
    }
    else if (analogRead(photoresistance) <900) {
      digitalWrite(led, LOW);
    }
  }
}


Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre
Post by: iznobe on Nov 10, 2019, 11:45 am
Salut ,

Mon post precedent avec le code que j' ai donné n ' est que partiel , et c ' etait fait expres car je voulais juste mettre en evidence le probleme d' hysteresis .

je ne tenais pas compte de vos messages precedent , car je ne connais pas le montage reel , et puis c ' est pas a moi de coder ^^

le boulot ( en tenant compte de chaque remarque des participants ) est a faire par le posteur originel de la demande  :P  !

Je pars donc du principe qu il en a tenu compte au fur et a mesure des remarques postées.

sachant de plus , que selon l ' emplacement du capteur de luminosité , les valeurs sont certainement a adapter .

@+

Title: Re: Allumage d'une lampe détection de mouvement quand il fait sombre [résolu]
Post by: leg2027 on Nov 13, 2019, 04:05 pm
Merci à tous pour votre aide, le code fonctionne parfaitement maintenant. J'ai rajouté un Millis en m'aidant
du site de batto micro:
https://battomicro.wordpress.com/2013/06/07/tutorial-les-interruptions-temporelles-avec-arduino/

Voici le code fini malgré surement quelques heures dans les "int", les"#define"...


Code: [Select]
#define PIR 3
unsigned long Depart;
int led= 13;
int MonDelai=10000;
#define photoresistance  2
int seuil=950;

 
void setup() {
  pinMode(PIR, INPUT);
  Serial.begin(9600);
  pinMode(led, OUTPUT);
 
}

void loop() {
 
  Serial.println(analogRead(photoresistance));
  Serial.println(digitalRead(A3));
  if((millis()-Depart)>=MonDelai){ // si 1000 ms se sont écoulées

  digitalWrite(led, LOW);
  seuil=950;
 
  }
 
  if (digitalRead(A3) ==1 ) {
    if (analogRead(photoresistance) >seuil) {
      Depart=millis();
      seuil=0;
      digitalWrite(led, HIGH);
     
     
     
    }

   
  }
}