Projet SIN : Capteur PIR

Bonjour, je suis en terminale STI2D SIN.
Pour le BAC, nous devons réaliser des projets par groupe de 3 ou 4.
Mon groupe fait le projet de maison sécuriser, qui consiste à faire une alarme qui sonne lorsque elle détecte un passant et qui permet à la personne habitant dans la maison de voir à tout moment grâce à une application sur tablette si il y a une personne ou non dans sa maison.

Moi je suis en charge du capteur qui détecte une personne. J'ai acheté le même matériel qu'au lycée pour chez moi, c'est à dire: -Un capteur PIR
-Une carte arduino SainSmart Uno
-3 fils

Pour faire fonctionner mon capteur j'ai suivi la notice du capteur PIR, j'ai même pris le programme de la notice pour mettre dans le logiciel Arduino. Il fonctionne, mais lorsqu'on le téléverse, que le capteur détecte ou non un mouvement rien n' est écris sur l'écran alors que d'après le programme il faudrait qu'il y est marqué "Motion detected!" ou "Motion ended!".

Voici mon programme (Celui de la notice du capteur PIR):

/* * PIR sensor tester */
int ledPin = 13;      // choose the pin for the LED
int inputPin = 2;     // choose the input pin (for PIR sensor)
int pirState = LOW;            // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status
 
void setup() {
pinMode(ledPin, OUTPUT);      // declare LED as output
pinMode(inputPin, INPUT);     // declare sensor as input
  Serial.begin(9600);
  }
void loop(){ 
  val = digitalRead(inputPin);  // read input value 
  if (val == HIGH) {            // check if the input is HIGH  
    digitalWrite(ledPin, HIGH);  // turn LED ON  
    if (pirState == LOW) {      // we have just turned on    
      Serial.println("Motion detected!");      // We only want to print on the output change, not state     
      pirState = HIGH;  
      }
      } else {  
        digitalWrite(ledPin, LOW); // turn LED OFF  
        if (pirState == HIGH){      // we have just turned of   
          Serial.println("Motion ended!");      // We only want to print on the output change, not state     
          pirState = LOW;  
    }
  }

Et voici des photos de mes branchements:

Pouvez vous m'indiquer les erreurs que j'ai faites s'il vous plaît?

le cablage est OK mais question bete,

Est ce que le programme blink, dans l'exemple IDE marche?
C'est une copie d'arduino, c'est pas un arduino officiel, et certaine copie, ne marche pas
as tu lancé le serial monitor?

des qu'il y a detection la led sur la carte doit s'allumer et eteindre.

autrement test le code donné par arduino.

http://playground.arduino.cc/Code/PIRsense

Je pense que c'était des faux contacts, maintenant ça remarche.

Y aurait il un moyen de plus simplifier le code?
Cette ligne ne pourrait pas être supprimée? Je ne la comprend pas bien, pouvez vous me l'expliquer s'il vous plaît?

"val = digitalRead(inputPin);  // Lit la valeur d'entrée du capteur"

Bonjour,

Comme le commentaire l'indique cette ligne lit l'état de ton capteur. Donc elle ne peut absolument pas être supprimée.
val prend la valeur HIGH en cas de présence et LOW en cas d'absence.

Merci de votre réponse.
Effectivement j'ai essayée, lorsqu'on enlève cette ligne rien ne se passe.

J'ai aussi essayée de supprimer le else if, mais dans ce cas là, le capteur détecte une personne une seule fois. Je suppose que c'est parce que du coup ça ne fais pas une boucle.
Donc quelle ligne est ce que je pourrais supprimée ou modifiée?

"digitalWrite(ledPin, HIGH);" et "digitalWrite(ledPin, LOW);" ça sert à quoi? J'ai regardé sur ce site Arduino Playground - DigitalWrite et je n'est pas bien compris à quoi ça sert dans mon code spécifiquement.

avec ce capteur tu ne peux pas discriminer si tu détectes une personne ou plusieurs.

Çà allume/éteins la led

pourquoi tu cherches a supprimer des lignes??

Toutes les lignes servent, autrement elle ne seraient pas la...

"digitalWrite(ledPin, HIGH);" et "digitalWrite(ledPin, LOW);" ===>ca allume et eteint la LED comme dis plus haut.

Il y a quelques choses que je n'ai pas compris dans mon code.
if (val == HIGH) { // ça veut dire si le capteur détecte une présence
digitalWrite(ledPin, HIGH); // On allume la led
if (pirState == LOW) { // Si on ne détecte pas de présence
Serial.println("Motion detected!"); // On affiche motion detected
pirState = HIGH; // Cette ligne je ne l'ai pas comprise
}
} else {
digitalWrite(ledPin, LOW); // On éteint la LED
if (pirState == HIGH){ // Si le capteur détecte une présence
Serial.println("Motion ended!"); // On écrit motion ended
pirState = LOW; // Je n'ai pas compris cette ligne non plus

Les lignes que j'ai mises en orange, ce que je n'ai pas compris, c'est pourquoi on afficherait motion detected lorsque le capteur ne détecte pas de présence? D'ailleurs ce n'est pas le cas, motion detected ne s'affiche que lorsque le capteur détecte une présence dans arduino.

Merci d'avance de vos réponse :slight_smile:

la loop s'exécute en permanence, pour ne pas inonder le moniteur série de messages on cherche a ne notifier que les changement d'état présence ou absence
pour cela il faut mémoriser dans quel état on était a la boucle précédente, c'est ce que fait la variable pirState
c'est assez bien expliqué dans le code de ton premier post

Merci je pense avoir compris pirstate maintenant :slight_smile:

Pour les lignes en orange par contre je n'ai toujours pas compris, est ce que quelqu'un peut m'expliquer?
Parce que moi ce que je comprend en lisant les lignes de codes, c'est que si on ne détecte pas de présence, on affiche "motion detected !". Or ce n'est pas ce qu'il se passe lorsqu'on exécute le programme. C'est le contraire, c'est lorsqu'on détecte une présence que "motion detected !" est affichée dans le moniteur.

if (val == HIGH) { // ça veut dire si le capteur détecte une présence
digitalWrite(ledPin, HIGH); // On allume la led
if (pirState == LOW) { // PirState est LOW si dans la loop précédente il n'y avait pas de présence
Serial.println("Motion detected!"); // On affiche motion detected parce qu'on vient juste de detecter une personne
pirState = HIGH; // on mémorise qu'on a déja signalé la présence donc a la prochaine boucle si val est toujours HIGH et comme pirState est HIGH on ne fera pas un nouveau Serial.println...
}
} else ...

Merci beaucoup, là je pense vraiment avoir compris tout le code :slight_smile:

Nous devons aussi faire en sorte que lorsque le capteur détecte un mouvement, un buzzer sonne. Puisque le projet final devra être une alarme qu'on peut commandé grâce à une tablette.
Pour l'instant nous avons fait ça, ça marche comme on le veut, sauf à la fin, on aimerait que lorsque l'on entre la variable b dans le moniteur série, le buzzer arrête de sonner. Pour cela on a essayer avec un else if mais ça ne marche pas. Pouvez vous nous aider? Merci d'avance ! :slight_smile:

int inputPin = 2;
int pirState = LOW;
char rx_byte = 0;


void setup() {

Serial.begin(9600); 
pinMode(9, OUTPUT);
pinMode(inputPin, INPUT);
digitalWrite(9, HIGH); 
}

void loop() {
 pirState = digitalRead(inputPin); 
 if (Serial.available() > 0) {    
 rx_byte = Serial.read();
 }
  
if (rx_byte == 'a'){
 
  
  while (pirState != HIGH) {
           
     Serial.println("individu detecte");
 
  long temps_note = 0;
            for (temps_note=0;temps_note < 750000;temps_note= temps_note+2000) 
             digitalWrite(9,HIGH);
            delayMicroseconds(2000 / 2);
            digitalWrite(9, LOW);
            delayMicroseconds(2000 / 2);
            delay(750);






}
  
  

        
      }
  else if (rx_byte == 'b') {
    digitalWrite(9, HIGH); }
         
        }

Bonjour,

Indente correctement ton programme (avec CTRL T) tu t'y retrouveras mieux.
Je suppose qu'il manque des {} après le for (temps_note=0; ...

Remplace le while (pirstate!=HIGH) par if et ça devrait fonctionner.

int inputPin = 2;
int pirState = LOW;
char rx_byte = 0;


void setup() {

  Serial.begin(9600);
  pinMode(9, OUTPUT);
  pinMode(inputPin, INPUT);
  digitalWrite(9, HIGH);
}

void loop() {
  pirState = digitalRead(inputPin);
  if (Serial.available() > 0) {
    rx_byte = Serial.read();
  }

  if (rx_byte == 'a') {

    if (pirState != HIGH) {

      Serial.println("individu detecte");

      long temps_note = 0;
      for (temps_note = 0; temps_note < 750000; temps_note = temps_note + 2000L)
      {
        digitalWrite(9, HIGH);
        delayMicroseconds(2000 / 2);
        digitalWrite(9, LOW);
        delayMicroseconds(2000 / 2);
      }
      delay(750);
    }
  }
  else if (rx_byte == 'b') {
    digitalWrite(9, HIGH);
  }

}

Merci, effectivement ça marche avec le if à la place du while :slight_smile:

Content que ça fonctionne.
A la place d'utiliser une boucle for pour générer le son, tu peux utiliser la fonction tone()

Bonjour,
N'oublies pas de mettre une ligne en début de code pour le temps de calibrage du PIR, ça varie de 5 à 60 seconds suivant les capteurs...

Si tu n'as rien sur ta notice, une résistance entre le pin de commande et une led, le temps d'allumage de la led est le temps de calibrage.

Bonne journée