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;
}
}
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.
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"
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.
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.
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
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 ...
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 !
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); }
}