[Tuto] Détecteur de présence
Posté sur: oct. 16, 2013
Catégories: Arduino
Après le tuto sur le sujet d'hier, aujourd'hui l'un des clients du shop nous a soumis des vidéos de son montage que je relais donc sur ce blog.
Voici le fonctionnement de ce montage: Le principe est d'avoir un montage mobile qui se reparamétre à chaque nouvel emplacement.
Il prend une première mesure, 10sec plus tard, une seconde mesure, si elles sont différentes de plus de 5cm il recommence. Ensuite, il prend la moyenne des deux comme référence.
Si un objet est détecté a moins que la distance de référence, la Led s'allume 1sec et la distance retenue est affiché.
#include
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
const int led=11;
const int led2=12;
int mesure1;
int mesure2;
int distanceorigine;
int resultatsortie;
int compteur;
nint trig = 3;
int echo = 2;
long lecture_echo;
long cm;
void setup()
{
compteur=0;
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
Serial.begin(9600);
pinMode( led, OUTPUT);
pinMode(led2, OUTPUT);
digitalWrite(led2, HIGH);
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("initialisation");
delay(1000);
lcd.clear();
lcd.print("mesure distance origine");
mesure1=0;
mesure2=0;
distanceorigine=0;
compteur=1;
do //debut prise mesure origine
{
lcd.clear(); //|
lcd.setCursor(0,1); //|
lcd.print("en cours."); //|
digitalWrite(led, HIGH); // } prise de la première mesure
digitalWrite(trig, HIGH); //|
delayMicroseconds(10); //|
digitalWrite(trig, LOW); //|
lecture_echo = pulseI
(echo, HIGH); //|
mesure1 = lecture_echo / 58; //|
lcd.clear();
lcd.setCursor(0,1);
lcd.print("en cours.. 1/2");
lcd.setCursor(0,0);
lcd.print(mesure1);
delay(10000/compteur); //delai entre les deux mesures qui serra divisé par 2,3,3... si la boucle se répète
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
mesure2 = lecture_echo / 58;
lcd.clear();
lcd.setCursor(0,1);
lcd.print("en cours... 2/2");
lcd.setCursor(0,0);
lcd.print(mesure2);
delay(3000/compteur);
resultatsortie =mesure1-mesure2; //différence de distance entre les deux mesures
compteur++; //incrémentation du compteur
if (compteur>=20){
resultatsortie=0; //SI le compteur arrive a 20, alors on sort de la boucle
}
}
while(abs(resultatsortie)>5); //sortie boucle de mesure
if(compteur>=20) //SI on est sortie de la boucle grace au compteurs alors, le sonar n'a pas detecté d'obstacle a moins de 4mn {
distanceorigine=300; //on demande une detection sur 3m pour éviter les erreur
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" aucun obstacle");
lcd.setCursor(0,1);
lcd.print("distance max =");
delay(2000);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(distanceorigine);
delay(5000);
}nelsen {
distanceorigine=((mesure1+mesure2)/2); //SINON ( sortie de la boucle avec 2 mesures proches, on prend comme repère la moyenne
lcd.clear();
lcd.setCursor(0,0);
lcd.print("distance retenue");
lcd.setCursor(0,1);
lcd.print(distanceorigine);
delay(6000);
}
mesure1=0;nmesure2=0;
}
void loop()
{
lcd.setCursor(0, 0);
digitalWrite(led, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
mesure1 = lecture_echo / 58;
//deux mesures pour éviter les detections parasites
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
mesure2 = lecture_echo / 58;
if(mesure1 - mesure2 < 20) //si les deux mesures sont cohérentes
{
cm=((mesure1+mesure2)/2); //on prend la moyenne
lcd.print("Distance en cm : ");
if( cm<(distanceorigine-10)) // si cette mesure se situe entre l'obstacle ( ou les 3m ) et le capteur ( avec une marge de 10cm)
{
lcd.print(" ");
digitalWrite(led2,LOW);
lcd.setCursor(10, 1); //inscrire sur le 10em charactère
lcd.println(cm); //la distance a laquel a été detecté l'objet
delay(500);
}
lcd.setCursor(0, 1);
if(cm <= 400)
{
lcd.println(cm);
}
else
{ //si la mesure n'est pas compris entre l'obstacle ( ou les 3m ) et le capteur
lcd.print("err"); //afficher "ERR"n digitalWrite(led, LOW); //allumer la led rouge d'erreur
}
}
else
{}
delay(10);
}
//rédigé par Louis-Marie Le Méné pour un usage strictement personnel
http://letmeknow.fr/img/cms/blog/wp-content/uploads/2013/10/MOV_6613.mp4
http://letmeknow.fr/img/cms/blog/wp-content/uploads/2013/10/MOV_6614.mp4
http://letmeknow.fr/img/cms/blog/wp-content/uploads/2013/10/MOV_6609.mp4
Ce montage est pour un usage privé uniquement.
Un grand merci à Louis-Marie Le Méné pour avoir partagé son montage.
Connectez-vous pour commenter
Se connecter