Interruptions Capteur Ultrason HC-SR04

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);
    }
  }
}

Utilise une variable globale --> un drapeau.
int drapeau;
Dans le setup() tu l'a met à 1.
drapeau = 1 ;

Dans loop tu lance la détection dans un boucle if
La fonction detection_objet() doit renvoyer un entier 0 ou 1.

if (drapeau)
{
   detection = detection_objet();
   if (detection)
   {
      drapeau = 0 ;
   }
}

Attention tant que par un moyen à définir tu ne remetra pas drapeau à 1 tu ne pourra plus faire de détection.

Salut, merci de ta réponse !
Je voulais savoir à quoi correspond :

   detection = detection_objet();

que tu as mentionné dans ta réponse.

C'est du C. Tout manuel de C/C++ convient.
Voir le mot clé return dans une fonction

detection_objet() est la fonction que TU dois écrire pour faire ce que tu veux.
Tu peux lui donner le nom que tu veux.

"detection" c'est une variable qui reçoit ce que la fonction renvoie par return
Tu aussi l'appeler tartenpion cela fonctionnera aussi bien.

Je ne comprend toujours pas ce que tu veux dire ^^

Je ne sais pas mieux expliquer.

On va recommencer si tu veux bien; je veux que lorsque le capteur ne détecte plus rien, que le programme s'arrête complètement. Mon projet consiste à réaliser des cocktails via un site PHP (avec mysql) en faisant marcher des pompes. Lorsque le capteur détecte un verre, il peut alors commencer le programme correspondant au cocktail choisi; Cependant, quand il ne détecte rien, le programme ne peut se lancer.
Que dois-je rajouter dans mon code principal que voici ? :

#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);
}



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(2000);
    //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(100);
    digitalWrite(pompe_1, LOW);
    delay(80);
    digitalWrite(pompe_2, LOW);
    delay(60);
    digitalWrite(pompe_3, LOW);
    delay(40);
    digitalWrite(pompe_4, LOW);
    delay(20);
    digitalWrite(pompe_5, LOW);

Merci d'avance.

Ca veut dire quoi pour toi "le programme s'arrête" ?

Cela signifie que les pompes s'arrêrent.