Go Down

Topic: Allumage d'une lampe détection de mouvement quand il fait sombre [résolu] (Read 354 times) previous topic - next topic

leg2027

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

kamill

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

leg2027

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 ?

kamill

Utiliser le numéro de pin qui correspond à la pin sur laquelle tu es connecté
Utiliser digitalRead() pour lire une pin numérique.

lesept

Tu devrais aussi t'intéresser aux conditions logiques dans un test conditionnel. And s'écrit &&
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).


leg2027

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

iznobe

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

hbachetti

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.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

fdufnews

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.

hbachetti

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).
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

fdufnews

Les entrées "analogiques" sont avant tout des broches digitales. Elles ont la double fonction.

kamill

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)

hbachetti

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.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

leg2027

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



Go Up