IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Radar de recul de garage : problème de code ou de logique


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club Avatar de bertrand0611001
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2016
    Messages : 9
    Par défaut Radar de recul de garage : problème de code ou de logique
    Salut les amis

    J'ai besoin d'un coup de main pour mon premier projet (eh oui, je suis débutant)

    je présente le projet :
    Un radar de recul pour mon garage
    J'en ai assez de ne jamais être sûr de ne pas toucher le mur du fonds de mon garage (ma voiture n'a pas de radar de recul) alors j'ai décidé de faire un appareil a fixer au mur qui m'indiquerait la distance de ma voiture avec un code couleur par LEDS (vert/orange/rouge)
    Côté matériel, voici ce que j'ai choisi :
    Arduino nano
    HC-SR04 (radar)
    une barre de 8 leds WS2812
    1 bouton (pour le réglage)

    une photo du montage :

    Nom : radar garage - prototype.jpg
Affichages : 1796
Taille : 399,2 Ko

    j'ai avancé pas à pas sans trop de difficulté jusqu'à ce que j'essaye de coder une fonction pour que les leds s'éteignent après 10 secondes d'immobilité.

    C'est là que j'ai besoin de votre aide.

    Voici donc le code en question :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
     
    /* 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);
    }
    }

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 206
    Billets dans le blog
    48
    Par défaut
    Bonjour et bienvenue,

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((etatstable=true)&&((millis()-debutstable)>=10000)) {

    Peut-être un premier souci avec le double '=' qui manque : etatstable==true.

    Pour les booléens on a une écriture plus concise :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    if (etatstable && ((millis()-debutstable)>=10000)) {

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    if( !distchange && !etatstable) {

    etc.

    Beau projet, on a un projet similaire en magasin avec Rasperry Pi.

  3. #3
    Membre du Club Avatar de bertrand0611001
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2016
    Messages : 9
    Par défaut
    Merci beaucoup pour ton aide si rapide et pour tes encouragements.

    En effet, il manquait un "double ="

    Malheureusement, la correction n'a pas eu l'effet escompté.

    le radar refonctionne, mais il ne se met plus "en veille"

    Ci dessous la vidéo du test :

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    pour moi les variables etatstable et distchange sont inutiles. Les tests peuvent porter que sur debutstable.


    Le code entre les lignes 73 et 88 peut se simplifier en :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if ((distancevar>=distance*1,01) || (distancevar<=distance*0,99))  
      {
          debutstable = millis();   // timer = durée en cours si la distance change
                                          // lorsque la distance ne changera plus le contenu de debutstable sera constant
      }

    Puis le test ligne 111 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if (millis()-debutstable)>=10000) 
      {
        fled(0,0,0,0);
      }

    Ensuite, la question que je me pose est la suivante : lorsque tu es dans un état stable dans quel intervalle varie le contenu de ta variable distancevar ? Est-ce que tes facteurs 1,01 et 0,99 sont suffisants ? Car s'il y a des variations de la distance mesurée même quand tu es arrêté, ton test peut être toujours valide et donc tu peux ne jamais passer en veille.

  5. #5
    Membre du Club Avatar de bertrand0611001
    Homme Profil pro
    Comptable
    Inscrit en
    Juin 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Comptable
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2016
    Messages : 9
    Par défaut
    Merci encore pour ta réponse rapide.

    L'idée est bonne.
    J'ai augmenté le ratio à 50% (1.5 et 0.5).
    Malheureusement ce n'est pas encore ça.
    Je me creuse encore la tête.

    Autre sujet, je suis ravi de constater que mon code est lisible et compréhensible pour un premier essai, je ne m'y attendais pas.

    a+

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Je viens de relire la doc de la fonction millis():
    Please note that the return value for millis() is an unsigned long, logic errors may occur if a programmer tries to do arithmetic with smaller data types such as int's. Even signed long may encounter errors as its maximum value is half that of its unsigned counterpart.
    Du coup dans ta déclaration de variable transforme le en
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned long debutstable=0;


    Effectivement ton code est plutôt bien lisible. J'ai l'impression que tu as fait du C auparavant (présence de fonction de prototypage) ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de code avec un tableau
    Par richard038 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/05/2006, 17h35
  2. problème de code javascript pour une vue 360°
    Par tomguiss dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/03/2006, 22h50
  3. [POO] Problème de code PHP avec Internet Explorer
    Par bzoler dans le forum Langage
    Réponses: 5
    Dernier message: 12/02/2006, 11h00
  4. Problème de code besoin d un petit depannage
    Par rakengoule dans le forum MFC
    Réponses: 3
    Dernier message: 10/10/2005, 16h25
  5. Probléme de code non portable
    Par Stany dans le forum Windows
    Réponses: 2
    Dernier message: 23/08/2005, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo