garage radar - logic help needed please

Hi friend !

First of all, I introdure myself :
I’m a french new arduinist, so please, forgive my english or beginner mistakes :slight_smile:

My first project is a garage radar helping me to not touch the back garage wall.
I chose to install the device on the wall and to use a Led light signal.

I use a HC-SR04 sensor to get the dstance, a WS2812 8 bar led to signal the distance, a simple button to calibrate the targer distance and an arduino nano.

Here is a photo of the prototype :

Detecting the distance, the device signals with a green/orange/red signals me if i’m close or not to the back wall.

I’m facing difficulty with an advanced logic function i’d like to have :
If the distance is stable during 10 secs, the red light turns off and the device “wakes up” when the distance chages again.

With this code, the led signal turns off when the distance doesn’t change during 10 secs, but it doens’nt “wakes up” when it changes again.

Could you help me please ?

/* Télémètre ultrason HC-SR04 
 * Essais World of GZ - www.worldofgz.com
 */
#include <EEPROM.h>
#include <Adafruit_NeoPixel.h>

#define TRIG 11
#define ECHO 12
#define buttonPin 2
#define PIN 6// On définit le pin où est connecté la patte DATA du bandeau

//fonctions utilisées
void clignote(int red, int green, int blue, int delai);
void fled(int red, int green, int blue,int bright);

//Variables utilisées
long retourEcho;              // variable pour calcul de la distance mesurée
long distance;                // variable de mesure de la distance mesurée
long distanceold;             // variable de comparaison avec distance mesurée précédente
long distancevar;             // variable de comparaison avec distance mesurée précédente
long cible=0 ;                // variable de réglage de la distance cible mesurée
long relatif ;                // variable de l'écart entre distance mesurée et distance cible
int buttonState=0;            // variable de lecture de l'état du bouton
int checkdelay=100;           // variable de l'intervale de mesure de la distance en millisecondes
bool etatstable=false;        // variable de déclaration d'immobilité
long debutstable=0;           // variable de calcul de calcul de la durée d'immobilité
bool distchange=false;        // variable de détection de changement de distance mesurée

// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

//Ici, le 8 correspond au nombre de led
Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800);

void setup () {
  //On définie les entrées/Sorties
  pinMode(buttonPin, INPUT);
  pinMode(TRIG, OUTPUT);
  digitalWrite(TRIG, LOW); 
  pinMode(ECHO, INPUT);  
  //Lancement de la liaison série
  Serial.begin(57600); 
  Serial.println("Liaison série en ligne");
  strip.begin();
  strip.show(); // Initialise toute les led à 'off'
}

void loop() {
  relatif=distance-cible ;
  
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  
  //On lance notre impulsion de 10µs
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  
  //Mesure de la longueur de la pulse
  retourEcho=pulseIn(ECHO, HIGH);
  
  //Calcul de la distance
  distanceold=distance;
  distance=retourEcho / 58;
  distancevar=distance-distanceold;
  if((distancevar>=distance*1,01) ||
    (distancevar<=distance*0,99))  
    {
      distchange=true;
      etatstable=false; 
      Serial.println("etatstable");
    }
    else 
    {
      distchange=false;
    }
  
  if(distchange==false && etatstable==false) {
    etatstable=true;
    debutstable=millis();
  }

  //Réglage de la valeur cible
  if (buttonState==HIGH) {
    // enregistre la valeur distance comme cible et stocke la valeur
    cible = distance;
    clignote(0,0,233,100);
    
  //Ecriture de la variable valeur à l'adresse 0
  EEPROM.put(0, cible);
  } 
  //Lecture de la valeur à l'adresse 0
  EEPROM.get(0, cible);
  
  //Affichage de la distance dans le moniteur série
  Serial.print("Distance cm : ");
  Serial.println(distance);
  Serial.print("cible cm : ");
  Serial.println(cible);
  Serial.print("relatif cm : ");
  Serial.println(relatif);
  // Signaletique visuelle

  if ((etatstable=true)&&((millis()-debutstable)>=10000)) {
    fled(0,0,0,0);
  }
  else  if (relatif<=10){
     Serial.println("rouge ");
        fled (233,0,0,100);
      }
   else if (relatif<=55){
      Serial.println("orange");
      fled (233,127,16,100);
  }
  else if (relatif<=100){
       Serial.println("vert");
            for(int i = 0; i < 8; i++ ) { // On fait une boucle pour définir la couleur de chaque led
        // setPixelColor(n° de led, Rouge, Vert, Bleu)
        strip.setPixelColor(i, 0, 223, 0);
        }
      
      strip.show(); // on affiche
      strip.setBrightness(40);  
  }
  else {
       Serial.println("rien");
             for(int i = 0; i < 8; i++ ) { // On fait une boucle pour définir la couleur de chaque led
        // setPixelColor(n° de led, Rouge, Vert, Bleu)
        strip.setPixelColor(i, 0, 0, 0);
        }
      
      strip.show(); // on affiche
      strip.setBrightness(40); 
  }
  
         
  delay(checkdelay); 
}

void fled(int red, int green, int blue,int bright) 
  
   {     
         for(int i = 0; i < 8; i++ ) 
          { // On fait une boucle pour définir la couleur de chaque led
        // setPixelColor(n° de led, Rouge, Vert, Bleu)
        strip.setPixelColor(i, red, green, blue);
          }
      strip.show(); // on affiche
      strip.setBrightness(bright);
   }

void clignote(int red, int green, int blue, int delai) {

for(int j = 0; j<3 ; j++){     
         
          for(int i = 0; i < 8; i++ ) { // On fait une boucle pour définir la couleur de chaque led
        // setPixelColor(n° de led, Rouge, Vert, Bleu)
        strip.setPixelColor(i, red, green, blue);
        }
      strip.show(); // on affiche
      strip.setBrightness(50);
      delay(delai);

          for(int i = 0; i < 8; i++ ) { // On fait une boucle pour définir la couleur de chaque led
        // setPixelColor(n° de led, Rouge, Vert, Bleu)
        strip.setPixelColor(i, 0, 0, 0);
        }
      strip.show();
      strip.setBrightness(50);
      delay(delai);
}
}

Moderator edit. Code tags. Always code tags

I'm guessing this is the line that turns things off after 10 secs

if ((etatstable=true)&&((millis()-debutstable)>=10000)) {

As I wrote the rest of this reply I noticed you have an = where you should have ==. Maybe that is the problem.

I suspect that is where the problem lies but, without spending a long time studying the code, I am not able to articulate why.

For example I'm not sure that etatstable should be true BEFORE the time has elapsed. And (separately) I am not sure if the ELSE IFs that follow will work as you expect because they can be considered if either or both of the original IF tests is false - and maybe that is not appropriate.

Try separating the statement into two lines like

if (etatstable == true) {
   if (millis() - debutstable >= 10000) {

...R

This bit looks wrong to me: you are comparing the change in distance with the new distance. Perhaps you should compare distance and distanceold? Or maybe compare distancevar to a fixed value.

        distanceold=distance;
 distance=retourEcho / 58;
 distancevar=distance-distanceold;
 if((distancevar>=distance*1,01) ||    (distancevar<=distance*0,99))

The other problem I can see is here ( and Robin2 beat me to the it): you are setting etatstable=true when you want to test if etatstabe==true instead.

if ((etatstable=true)&&((millis()-debutstable)>=10000)) {
 fled(0,0,0,0);
 }

If I read it right etatstable is set when the distance doesnt change anymore then the timer commences to turn the LED’s off- that bit makes sense to me. But see my comment above.