Problème de mesure avec le HC-SR04

Bonsoir :wink:

J’ai pour projet de faire un détecteur de distance pour mon garage.
Le principe du truc : Le boitier est fixé au mur, il fait des acquisitions de mesures, sonne et allume une led à un certain rythme en fonction de la distance mesurée. En gros, plus la voiture s’approche, plus le boitier s’excite.

Bien sur, si je poste ici c’est que j’ai un problème.
Je pensais avoir fini, je teste mon truc, tout fonctionne à merveille.
J’éteins et redémarre pour en être sur.

C’est la que le problème apparait, le hc-sr04 se met à faire 2 mesures de distances d’affilées en ignorant le délai dans le programme. Le plus embetant, c’est que ces mesures sont beaucoup trop différentes.
Le problème surgit quand la distance est au dessus de 2M, il fait donc 2 mesures, la bonne et une autre.
La première est 2m20 et la deuxième est 60 cm par exemple. Cela pose donc un problème dans le principe du truc puisqu’il est pas censé sonné quand la distance est supèrieure à 2M.

En ésperant que vous aurez une solution.

Mon code :

#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

//Constantes broches Led RGB
const int ledr = 11;
const int ledg = 10;
const int ledb = 9;

/* Constantes pour les broches */
const byte TRIGGER_PIN = 2; // Broche TRIGGER
const byte ECHO_PIN = 3;    // Broche ECHO

/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s

/* Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;

long distance_cm = 0;

const int pinbuzzer = 12;
const int pinpot = A5;

int valpot = 0;
int valpotmap = 0;

int dodo1 = 0;
int dodo2 = 0;

const byte interruptPin = 3;

void setup() 
{
  //Initialisation des broches de la Led RGB
  pinMode(ledr, OUTPUT);
  pinMode(ledg, OUTPUT);
  pinMode(ledb, OUTPUT);

  //Initialisation des pins pour le buzzer
  pinMode(pinbuzzer, OUTPUT);
  pinMode(pinpot, INPUT);

  /* Initialise le port série */
  Serial.begin(9600);

  /* Initialise les broches */
  pinMode(TRIGGER_PIN, OUTPUT);
  digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
  pinMode(ECHO_PIN, INPUT);
  
}

void loop() 
{
  //Lecture des valeurs du potentiometre
  valpot = analogRead(pinpot);
  valpotmap = map(valpot, 0, 1023, 500, 5000);
  
  /* 1. 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);
  
  /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
  long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
   
  /* 3. Calcul la distance à partir du temps mesuré */
  float distance_mm = measure / 2.0 * SOUND_SPEED;
   
  /* Affiche les résultats en mm, cm et m */
  Serial.print(F("Distance: "));
  distance_cm = distance_mm /10.0, 2;
  Serial.print(distance_cm);
  Serial.println(F("cm"));
  
  if(distance_cm > 200)
  {
    digitalWrite(ledg, HIGH);
    dodo1++;
  }
  else if(distance_cm < 200 && distance_cm > 100)
  {
    dodo1 = 0;
    dodo2 = 0;
    Serial.println("délai 800");
    digitalWrite(ledg, LOW);
    digitalWrite(ledr, HIGH);
    tone(pinbuzzer, valpotmap);
    delay(800);
    digitalWrite(ledr, LOW);
    noTone(pinbuzzer);
    delay(800);
  }
  else if(distance_cm < 100 && distance_cm > 50)
  {
    dodo1 = 0;
    dodo2 = 0;
    Serial.println("délai 600");
    digitalWrite(ledg, LOW);
    digitalWrite(ledr, HIGH);
    tone(pinbuzzer, valpotmap);
    delay(600);
    digitalWrite(ledr, LOW);
    noTone(pinbuzzer);
    delay(600);
  }
  else if(distance_cm < 50 && distance_cm > 30)
  {
    dodo1 = 0;
    dodo2 = 0;
    Serial.println("délai 400");
    digitalWrite(ledg, LOW);
    digitalWrite(ledr, HIGH);
    tone(pinbuzzer, valpotmap);
    delay(400);
    digitalWrite(ledr, LOW);
    noTone(pinbuzzer);
    delay(400);
  }
  else if(distance_cm < 30 && distance_cm > 10)
  {
    dodo1 = 0;
    dodo2 = 0;
    Serial.println("délai 200");
    digitalWrite(ledg, LOW);
    digitalWrite(ledr, HIGH);
    tone(pinbuzzer, valpotmap);
    delay(200);
    digitalWrite(ledr, LOW);
    noTone(pinbuzzer);
    delay(200);
  }
  else if(distance_cm < 10)
  {
    dodo1 = 0;
    dodo2++;
    Serial.println("délai 50");
    digitalWrite(ledg, LOW);
    digitalWrite(ledr, HIGH);
    tone(pinbuzzer, valpotmap);
    delay(50);
    digitalWrite(ledr, LOW);
    noTone(pinbuzzer);
    delay(50);
  }

  if(dodo1 == 1000 )
  {
    digitalWrite(ledg, LOW);
    digitalWrite(ledb, HIGH);
    dodo1 = 0;
    dodo2 = 0;
    Serial.println("DODO");
    delay(3000);
    digitalWrite(ledb, LOW);
    attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
    set_sleep_mode(SLEEP_MODE_STANDBY);
    sleep_enable();
    sleep_mode();
  }
  
}

void blink() 
{
  /* 1. 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);
  
  /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
  long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
   
  /* 3. Calcul la distance à partir du temps mesuré */
  float distance_mm = measure / 2.0 * SOUND_SPEED;
   
  /* Affiche les résultats en mm, cm et m */
  Serial.print(F("Distance: "));
  distance_cm = distance_mm /10.0, 2;
  Serial.print(distance_cm);
  Serial.println(F("cm"));

  if(distance_cm < 200 && distance_cm > 100)
  {
    sleep_disable();
    power_all_enable();
    Serial.println("REVEIL");
    detachInterrupt(digitalPinToInterrupt(interruptPin));
    software_Reboot(); 
  }
  
  delay(3000);
}

void software_Reboot()
{
  wdt_enable(WDTO_15MS);

  while(1)
  {

  }
}

Merci, bonne soirée :wink:

ça c'est pas bon...  distance_cm = distance_mm / 10.0[b][color=red], 2[/color][/b];