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

  1. #1
    Membre à l'essai 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
    Points : 13
    Points
    13
    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 : 1686
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
    12 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    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 à l'essai 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
    Points : 13
    Points
    13
    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 éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    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 à l'essai 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
    Points : 13
    Points
    13
    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 éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    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) ?

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     distancevar=distance-distanceold;
      if((distancevar>=distance*1,01) ||
        (distancevar<=distance*0,99))

    Je pense que dans l'intention, c'est plutôt :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    distancevar=abs(distance-distanceold); // la variation peut être négative
     
    if (distancevar>0.01*distance)  // attention, point décimal = '.'
    {
      // instable
    }
    else
    {
      // stable
    }

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
     if (distancevar>0.01*distance)  // attention, point décimal = '.'
    ouh là oui, je n'avais pas vu ça. Comment se fait-il que cela compile avec la syntaxe 0,01 ?

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Comment se fait-il que cela compile avec la syntaxe 0,01 ?
    Bonne question

  10. #10
    Membre à l'essai 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
    Points : 13
    Points
    13
    Par défaut
    merci les amis pour votre aide

    mais l'éclairage reste actif ...

    me serais je trompé dans la logique ?

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Comment se fait-il que cela compile avec la syntaxe 0,01 ?
    => L'opérateur virgule ,
    => Comma operator - Condition
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Merci Jérôme pour l'info, je comprends mieux ce qui se passe...

    @Bertrand, peux-tu poster la nouvelle version de ton code ?

  13. #13
    Membre à l'essai 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
    Points : 13
    Points
    13
    Par défaut
    F-leb : CA MAAARCHE !

    j'ai relu tes posts et j'ai suivi tes recommandations à la lettre.
    j'y étais presque, mais sans ton aide je crois que je n'y serais jamais arrivé.

    Merci 1000 fois

    Voici le code final :

    Code : 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
     
    /* 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
    unsigned long debutstable=0;  // variable de calcul de calcul de la durée d'immobilité
     
     
    // 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=abs(distance-distanceold); // la variation peut être négative
     
    if (distancevar>0.01*distance) 
      {
          debutstable = millis();   // timer = durée en cours si la distance change
                                          // lorsque la distance ne changera plus le contenu de debutstable sera constant
      }
     
      //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 ((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);
    }
    }
    Voici une vidéo des tests



    Prochaine étape mise en boîte
    Je mettrai bientôt un article bien structuré avec les plans de branchements

    Merci à toutes et tous pour votre aide. Ce forum est génial

  14. #14
    Membre à l'essai 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
    Points : 13
    Points
    13
    Par défaut CONCLUSION ET DOCUMENTATION
    Bonsoir les amis

    Comme promis, je vous récapitule le projet

    - radar de recul de garage signalant la distance avec un code couleur (vert, orange, rouge) avec un bouton de réglage et un arrêt des leds après 10 sec d'immobilité.

    Matériel :
    - arduino nano
    - un bouton
    - une résistance
    - une barre de 8 leds WS2812
    - un radar SR-HC04

    Plan de branchement :
    Nom : RADAR DE GARAGE - BRANCHEMENTS.jpg
Affichages : 1197
Taille : 37,4 Ko

    Photo du prototype :
    Nom : radar garage - prototype.jpg
Affichages : 1175
Taille : 399,2 Ko

    Vidéo des tests :


    Le code :
    Code : 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
    /* 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
    unsigned long debutstable=0;  // variable de calcul de calcul de la durée d'immobilité
     
     
    // 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=abs(distance-distanceold); // la variation peut être négative
     
    if (distancevar>0.01*distance) 
      {
          debutstable = millis();   // timer = durée en cours si la distance change
                                          // lorsque la distance ne changera plus le contenu de debutstable sera constant
      }
     
      //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 ((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);
    }
    }
    Merci pour votre aide et n'hésitez pas à laisser des commentaire ou suggestions pour améliorer le projet.

  15. #15
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    La résistance a quelle valeur ? 10k ? 20k ?

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut


    Comment comptes-tu gérer l'alimentation du dispositif dans ton garage ?

  17. #17
    Membre à l'essai 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
    Points : 13
    Points
    13
    Par défaut
    salut

    l'alimentation sera sur secteur car le garage est fermé

    pour la V2 que je prévois déjà, ce sera pour un garage extérieur et je devrais mettre une batterie et un chargeur solaire.

    je devrai aussi bien penser à la protection contre les éléments.

    Je ne sais pas si le radar sera efficace sous la pluie ... faudra voir

    je mettrai peut être un détecteur de pluie pour le mettre "en veille" si il pleut

    a+

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Bonjour à tous,
    Désireux de faire la même chose, mais avec une carte UNO, pouvez-vous me dire si le code sera le même ?
    Pour les leds, ou avez-vous trouvé le composant ? et comment faites vous pour qu'il change de couleur selon la distance ? J'ai l'impression que c'est par le programme, mais étant grand débutant une aide ma serait précieuse.
    Les bornes de raccordements sont elles les mêmes sur la carte UNO ?
    La résistance est de quelle valeur ?
    Merci pour votre aide
    @+
    Robert

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Bonjour à tous
    Malheureusement, Bertrand 06 ne répond pas à mes interrogations, et j'ai reçu mes composants, mais étant un grand débutant, j'ai peur de tout griller.
    Votre aide me serait d'un grand secours pour éviter les bêtises.
    J'ai recopiè le code mais je ne sais toujours pas à quoi sert le bouton poussoir, quelle est la valeur de la résistance et est-ce que quand tout fonctionne bien, est-ce que l'on doit conserver le bouton poussoir ?
    J'ai l'impression qu'il sert à valider les distances souhaitées mais je n'en suis pas sûr. Je croyais que les distances étaient à renseigner dans le programme, mais je ne les vois pas.

    Je pense que je vais ouvrir un nouveau sujet et espérer votre précieuse aide.
    Merci à tous
    @+
    Robert

+ 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