Allumage d'une lampe détection de mouvement quand il fait sombre [résolu]

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.

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

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

T'es tout le temps sur le forum pour répondre en 1 min. :smiley: :smiley: :smiley:
C'est pour ça mais ça ne marche toujours pas. :sob:

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 ?

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

Tu devrais aussi t'intéresser aux conditions logiques dans un test conditionnel. And s'écrit &&

Ca marche, merci lesept !!!!!!!

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 ?

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

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é ) :

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

du coup je ferais plutot :

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

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 !

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 :

#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.

hbachetti:
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.

Et de plus :

 if (analogRead(PIR) >100 && analogRead(photoresistance) >950)

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).

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

Ca n'empêche pas que comme il est dit par hbachetti:

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)

fdufnews:
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.

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

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

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 :stuck_out_tongue: !

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 .

@+

Merci à tous pour votre aide, le code fonctionne parfaitement maintenant. J'ai rajouté un Millis en m'aidant
du site de batto micro:

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

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

    
  }
}