#define Broche_Echo 3 // Broche Echo du HC-SR04 #define Broche_Trigger 2 // Broche Trigger du HC-SR04 int MesureMaxi = 300; // Distance maxi a mesurer // int MesureMini = 3; // Distance mini a mesurer // long Duree; long Distance; const byte FC_ferme = 4; // Fin de course const byte FC_ouvert = 5; // Fin de course const byte moteur = 6; const unsigned long TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s // Constantes pour le timeout const float SOUND_SPEED = 340.0 / 1000; // Vitesse du son dans l'air en mm/us #include Servo Servo_moteur; void ouvrir() { boolean fin=digitalRead(FC_ouvert); while (fin==HIGH) { Servo_moteur.writeMicroseconds(1600); delay(100); fin=digitalRead(FC_ouvert); } Servo_moteur.writeMicroseconds(1500); } void fermer() { boolean fin=digitalRead(FC_ferme); while (fin==HIGH) { Servo_moteur.writeMicroseconds(1400); delay(100); fin=digitalRead(FC_ferme); } Servo_moteur.writeMicroseconds(1500); } void mesure() { digitalWrite(Broche_Trigger, LOW); // On efface l'etat logique de TRIG // delayMicroseconds(2); digitalWrite(Broche_Trigger, HIGH); // On met la broche TRIG a "1" pendant 10µS // delayMicroseconds(10); digitalWrite(Broche_Trigger, LOW); // On remet la broche TRIG a "0" // // On mesure combien de temps le niveau logique haut est actif sur ECHO // Duree = pulseIn(Broche_Echo, HIGH); // Calcul de la distance grace au temps mesure // Distance = Duree*0.034/2; // *** voir explications apres l'exemple de code *** // // Verification si valeur mesuree dans la plage // if (Distance >= MesureMaxi || Distance <= MesureMini) { // Si la distance est hors plage, on affiche un message d'erreur // Serial.println("Distance de mesure en dehors de la plage (3 cm à 3 m)"); } else { // Affichage dans le moniteur serie de la distance mesuree // Serial.print("Distance mesuree :"); Serial.print(Distance); Serial.println("cm"); } /* // Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER_PIN, LOW); // Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (s'il existe) long mesure = pulseIn(ECHO_PIN, HIGH, TIMEOUT); //Calcul la distance à partir du temps mesuré float distance_mm = mesure / 2.0 * SOUND_SPEED; return distance_mm; */ } void setup() { Serial.begin(9600); pinMode(FC_ferme, INPUT_PULLUP); pinMode(FC_ouvert, INPUT_PULLUP); Servo_moteur.attach(moteur); pinMode(Broche_Trigger, OUTPUT); // Broche Trigger en sortie // pinMode(Broche_Echo, INPUT); // Broche Echo en entree // Serial.begin(9600); } void loop() { /* float mesure_mm = mesure(); Serial.print("Distance: "); Serial.print(mesure_mm); Serial.println(" mm"); delay(3000); if ( mesure_mm<50.0 ) { ouvrir(); } else { fermer(); } */ /* // Test du moteur Servo_moteur.writeMicroseconds(1600); delay(2000); Servo_moteur.writeMicroseconds(1500); delay(2000); Servo_moteur.writeMicroseconds(1400); delay(2000); */ mesure(); delay(1000); }