Bonjour, après plusieurs heures de recherche sur le net, je vous demande de l'aide sur comment faire des interruptions avec un capteur ultrason : c'est à dire que le programme s'arrête après ne plus avoir détecté un objet.
#include <NewPing.h>
#define ECHO_PIN 7 // broche Echo sur 7
#define TRIGGER_PIN 6 // broche Trigger sur 6
#define MAX_DISTANCE 5 // distance maximale (en centimètres) que nous voulons "pinger".
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
#include <Servo.h>
Servo myservo;
int trig = 6;
int echo = 7;
int pos = 0; //position du servomoteur
const int LED_capteur = 3; // pin connecté à la LED + resistance
const int LED_power = 4;
const int pompe_1 = 9;
const int pompe_2 = 10;
const int pompe_3 = 11;
const int pompe_4 = 12;
const int pompe_5 = 13;
long cm; // variable pour stocker la distance de l'objet en cm
long duration = 0;
long lecture_echo;
unsigned int pingSpeed = 50; // période d'envoi du "ping". Une période de 50 millisecondes correspond à 20 "pings" par seconde.
unsigned long pingTimer; // timer, pour le prochain "ping".
void setup()
{
pinMode(LED_capteur, OUTPUT);
pinMode(LED_power, OUTPUT);
pinMode(pompe_1, OUTPUT);
pinMode(pompe_2, OUTPUT);
pinMode(pompe_3, OUTPUT);
pinMode(pompe_4, OUTPUT);
pinMode(pompe_5, OUTPUT);
Serial.begin(57600);
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
pingTimer = millis(); // contient le temps écoulé en millisecondes depuis le début de l'exécution du programme. pingTimer=maintenant.
}
void loop() {
digitalWrite(LED_power, HIGH); //voyant power allumé
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo, HIGH);
cm = lecture_echo / 58;
Serial.print("Distancem : ");
Serial.println(cm);
delay(10);
if (cm > 5) // Il n'y a pas de verre
{
digitalWrite(LED_capteur, HIGH); // Allumer LED capteur si pas de verre et ne rien faire d'autre
delay(10); // Temps de traitement
}
else if (cm > 0 && cm < 5) { // Il y a un verre à moins de 5 cm du capteur
digitalWrite(LED_capteur, LOW); // LED capteur éteinte
delay(4000);
//début programmation des pompes
digitalWrite(pompe_1, HIGH);
digitalWrite(pompe_2, HIGH);
digitalWrite(pompe_3, HIGH);
digitalWrite(pompe_4, HIGH);
digitalWrite(pompe_5, HIGH);
delay(3000);
digitalWrite(pompe_1, LOW);
delay(1000);
digitalWrite(pompe_2, LOW);
delay(2000);
digitalWrite(pompe_3, LOW);
delay(1000);
digitalWrite(pompe_4, LOW);
delay(2000);
digitalWrite(pompe_5, LOW);
if (millis() >= pingTimer) { // si temps écoulé depuis dernier "ping", on fait à nouveau un "ping".
pingTimer += pingSpeed; // temps pour déclenchement du prochain "ping"
sonar.ping_timer(echoCheck); // envoie un "ping". Interruption toutes les 24 microsecondes (interruption du Timer 2) et relève si le ping est complété dans la fonction echoCheck.
//fin programmation pompe
}
}
}
void echoCheck() {
if (sonar.check_timer()) { // "ping" complété dans les limites de distance souhaitées ?
// ajouter votre code d'interruption ici
if (cm > 5) // Il n'y a pas de verre
{
digitalWrite(LED_capteur, HIGH); // Allumer LED capteur si pas de verre
delay(10); // Temps de traitement
digitalWrite(pompe_1, LOW);
digitalWrite(pompe_2, LOW);
digitalWrite(pompe_3, LOW);
digitalWrite(pompe_4, LOW);
digitalWrite(pompe_5, LOW);
}
}
}