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 :

Eclairage progressif d'escalier


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut Eclairage progressif d'escalier
    Bonjour à tous!

    J'ai comme projet de faire un éclairage progressif pour mes escaliers (15 marches).
    J'ai vu plein d'exemple sur youtube et autres sites internet, mais en ce qui concerne la programmation je ne trouve rien! Du coup je m'y met mais je suis ultra débutant...

    Alors voici mon idée:
    Quand il y a une détection de passage en bas des escalier, allumage avec variation (pour ne pas éblouir) des marches par incrémentation de bas en haut, càd allumage de la première marche, puis s'ajoute la seconde puis s'ajoute la troisième etc jusqu'à allumer toute les marches. Après un délai établi, extinction progressive marche après marche de bas en haut.
    Fonctionnement inverse si détection de passage en haut des marches.

    Pour faire tourner tout ça je suis parti sur cette architecture:

    - Un capteur à ultrason en bas des escalier, un second en haut des escaliers HC-SR04 > je ne veux pas utiliser de capteur PIR car détection trop importante.
    - des rubans Led une couleur sous chacune des marches
    - un capteur de luminosité pour éviter de faire fonctionner tout ça en plein jour
    - une arduino uno
    - une carte d'extension PWM adafruit 16 canaux
    - 15 modules MOSFET IRF520
    - alim 12V 5A

    Etant donné que je dois gérer 15 marches, je ne peux pas utiliser directement la carte arduino, du coup je passe sur une carte extension PWM (pour la partie variation), cette dernière ne pouvant être alimentée en 12v je compte utiliser mes modules mosfet sur chacune des sorties PWM de cette carte pour brancher mes LED.

    Je m'arrache surtout les cheveux pour le programme!

    J'arrive pour l'instant à allumer mes leds avec incrémentation mais pas avec de variation PWM, j'arrive à les éteindre après un délai avec une variation cette fois. (je l'ai pas utilisée pour l'allumage car trop longue et je n'arrive pas à réduire le temps de variation de la fonction utilisée)
    Je n'arrive pas à faire varier à la vitesse souhaitée et je n'arrive pas à intégrer le deuxiemme capteur à ultrason.
    Je n'ai pas encore intégré le capteur de luminosité non plus (simple contact sec)

    Comme je n'ai que très peu de bases en programmation, je dirais même que c'est le néant, si une bonne âme pouvait m'aider à m'en dépêtrer... je serais super content!
    Si vous avez des conseils j'en ai bien besoin!

    Merci d'avance!

    je sais pas si le programme s'affiche mais le voici:

    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
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
     
    /*ESSAI ALLUMAGE PROGRESSIF ECLAIRAGE D'ESCALIER
     *AVEC CARTE D'EXTENSION PWM 16 CANAUX
     *Avec capteur ultrason en haut et bas des escaliers
     *Principe recherché: détection présence (avec capteur ultrason) haut des escalier > allumage progressif du haut vers le bas 
     *puis délai et extinction progressive du haut vers le bas.
     *Même principe à l'inverse avec le second capteur à ultrason (séquence que je n'arrive pas à intégrer)
     *Dans l'idéal, je souhaite que l'allumage soit dimmable mais avec un délai maitrisable (pas le cas avec le code que j'utilise pour l'extinction)
     */
     
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
     
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //chemin d'accès à la carte pwm
     
    #define LEDMIN  0 // impulsion min (entre 0 et 4096)
    #define LEDMAX  4096 //impulsion max (entre 0 et 4096)
    #define trigPin 12      //Trig 
    #define echoPin 11      //Echo 
    //Il manque la déclaration du second capteur, le trigpin serait 13 et echopin serait 10 sur la carte.
     
    // Liste des leds
    uint8_t led1 = 0;
    uint8_t led2 = 1;
    uint8_t led3 = 2;
    uint8_t led4 = 3;
    uint8_t led5 = 4;
    uint8_t led6 = 5;
    uint8_t led7 = 6;
    uint8_t led8 = 7;
    uint8_t led9 = 8;
    uint8_t led10 = 9;
    uint8_t led11 = 10;
    uint8_t led12 = 11;
    uint8_t led13 = 12;
    uint8_t led14 = 13;
    uint8_t led15 = 14;
    uint8_t led16 = 15;
    // capteur ultrason:
    int mindist = 50; //distance en dessous de laquelle nous souhaitons démarrer le cycle d'allumage
     
     
    void setup() {
     
      pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
      pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
     
     //manque capteur à ultrason 2
     
      pwm.begin(); //démarrage carte pwm
      pwm.setPWMFreq(60);  //réglage de la fréquence
    }
     
    /*Fonction ci-dessous que je ne comprend pas
     * quoi que je puisse modifier le délai entre les fonctions for ne change pas
     */
    void setServoPulse(uint8_t n, double pulse) {
      double pulselength;
     
      pulselength = 1000000;   // 1,000,000 us per second
      pulselength /= 60;   // 60 Hz
      pulselength /= 4096;  // 12 bits of resolution
      pulse *= 1000;
      pulse /= pulselength;
      pwm.setPWM(n, 0, pulse);
    }
     
    void loop() {
     
    long duration, distance;
      digitalWrite(trigPin, LOW);  
      delayMicroseconds(2); 
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms 
      digitalWrite(trigPin, LOW);
     
      // On calcule le temps pour l'aller retour du signal
      duration = pulseIn(echoPin, HIGH);
      distance = duration*340/(2*10000); 
     
     //ajouter le second capteur ici ou plus bas? 
     
      if (distance < mindist) { // si capteur détecte une distance en dessous de 60cm
     
    {unsigned long debut =millis();// permet une détection plus fréquente
     
    // allumage progressif des leds sans variation, dans l'espoir de trouver un moyen d'inclure la variation des leds
         pwm.setPWM(0, 4096, 0);
        delay(300);
        pwm.setPWM(1, 4096, 0);
        delay(300);
        pwm.setPWM(2, 4096, 0);
        delay(300);
        pwm.setPWM(3, 4096, 0);
        delay(300);
        pwm.setPWM(4, 4096, 0);
        delay(300);
        pwm.setPWM(5, 4096, 0);
        delay(300);
        pwm.setPWM(6, 4096, 0);
        delay(300);
        pwm.setPWM(7, 4096, 0);
        delay(300);
        pwm.setPWM(8, 4096, 0);
        delay(300);
        pwm.setPWM(9, 4096, 0);
        delay(300);
        pwm.setPWM(10, 4096, 0);
        delay(300);
        pwm.setPWM(11, 4096, 0);
        delay(300);
        pwm.setPWM(12, 4096, 0);
        delay(300);
        pwm.setPWM(13, 4096, 0);
        delay(300);
        pwm.setPWM(14, 4096, 0);
        delay(300);
        pwm.setPWM(15, 4096, 0);
      }
     
      delay(3000);// délai avant extinction progressive:
     
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led1, 0, pulselen);// impossible de changer le temps de la variation?
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led2, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led3, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led4, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led5, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led6, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led7, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led8, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led9, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led10, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led11, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led12, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led13, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led14, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led15, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led16, 0, pulselen);
      }
      }
    }
     
    /*Partie qui ne marche pas encore,grosses difficultés à déclarer le deuxième capteur à ultrason:
     
    if (distance2 < mindist) { // si capteur détecte une distance en dessous de 50cm
     
    {unsigned long debut =millis();// permet une détection plus fréquente
     
    // allumage progressif des leds dans le sens inverse sans variation
         pwm.setPWM(15, 4096, 0);
        delay(300);
        pwm.setPWM(14, 4096, 0);
        delay(300);
        pwm.setPWM(13, 4096, 0);
        delay(300);
        pwm.setPWM(12, 4096, 0);
        delay(300);
        pwm.setPWM(11, 4096, 0);
        delay(300);
        pwm.setPWM(10, 4096, 0);
        delay(300);
        pwm.setPWM(9, 4096, 0);
        delay(300);
        pwm.setPWM(8, 4096, 0);
        delay(300);
        pwm.setPWM(7, 4096, 0);
        delay(300);
        pwm.setPWM(6, 4096, 0);
        delay(300);
        pwm.setPWM(5, 4096, 0);
        delay(300);
        pwm.setPWM(4, 4096, 0);
        delay(300);
        pwm.setPWM(3, 4096, 0);
        delay(300);
        pwm.setPWM(2, 4096, 0);
        delay(300);
        pwm.setPWM(1, 4096, 0);
        delay(300);
        pwm.setPWM(0, 4096, 0);
      }
      
      delay(3000);// dans le futur, serai remplacé par une détection du capteur opposé à celui qui a démarré l'allumage
        
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led16, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led15, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led14, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led13, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led12, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led11, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led10, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led9, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led8, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led7, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led6, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led5, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led4, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led3, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led2, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led1, 0, pulselen);
      }
     }
    }
    */

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Il y a beaucoup de choses...

    Déjà, connais-tu le principe des signaux PWM ? Qu'est-ce qu'un signal à modulation de largeur d'impulsion (PWM) et à quoi sert-il ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pwm.setPWMFreq(60);  //réglage de la fréquence
    La fréquence est réglée à 60 Hz.

    Pour la fonction setPWM (voir la Library Reference)
    setPWM(channel, on, off)

    Description
    This function sets the start (on) and end (off) of the high segment of the PWM pulse on a specific channel. You specify the 'tick' value between 0..4095 when the signal will turn on, and when it will turn of. Channel indicates which of the 16 PWM outputs should be updated with the new values.

    Arguments
    channel: The channel that should be updated with the new values (0..15)
    on: The tick (between 0..4095) when the signal should transition from low to high
    off:the tick (between 0..4095) when the signal should transition from high to low
    Tu découpes ta période en 4096 'ticks' (1 'tick' dure donc (1/60)/4096 = 4 microsecondes)

    le PWM démarrant à l'état bas, le paramètre 'on' indique le 'tick' où le signale bascule de l'état bas vers l'état haut, le paramètre 'off' indique le 'tick' ou le signal rebascule de l'état haut à l'état bas.

    L'exemple de la doc devrait t'éclairer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pwm.setPWM(15, 1024, 3072)
    1024= 25% de 4096
    3072 = 75% de 4096
    Sur une période, le signal est à l'état haut entre le 'tick' 1024 et 3072, soit 50% de la durée de la période.

    Pour augmenter progressivement la luminosité, il faut dans une boucle augmenter progressivement la durée du signal à l'état haut sur une période.

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led1, 0, pulselen);// impossible de changer le temps de la variation?
      }
    pulselen décroît de 4095 à 0 par pas de 1. Si tu veux aller deux fois plus vite, tu peux décroître par pas de 2 : tu remplaces pulselen-- par pulselen-=2.

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    Je pensais pas avoir de réponse si vite! Merci!

    Alors j'ai un peu "étudié" le PWM et je trouvais ça intéressant pour mon projet, plutôt que de faire un allumage direct avec de simples relais...

    Mais je t'avoue que je vais un peu trop vite dans le sens où je n'ai que très peu de base alors je joue un peu à l'alchimiste en prenant par ci par là des fonctions qui pourraient marcher (je suis parti du programme démo de la carte PWM adafruit qui était plutôt prévue pour jouer avec des servomoteurs...

    Merci aussi pour l'explication sur la vitesse d'extinction sur la fonction setPWM! (je peux multiplier par 3 ou 4?) ça va m'aider et du coup je pense utiliser les mêmes fonctions pour l'allumage des LEDs

    Reste plus qu'à intégrer mon deuxième capteur à ultrason et le contact sec du capteur de luminosité!

    C'est mon tout premier projet Arduino et je sais que je mets la barre haute mais j'aimerais par la suite en apprendre plus bien évidement et travailler les bases de la programmation

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    En passant vite fait...

    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
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led1, 0, pulselen);// impossible de changer le temps de la variation?
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led2, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led3, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led4, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led5, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led6, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led7, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led8, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led9, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led10, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led11, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led12, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led13, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led14, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led15, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
        pwm.setPWM(led16, 0, pulselen);
      }
    Il y a mieux à faire ici dans une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (uint8_t led=0 ; led<16; led++){
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen--) {
            pwm.setPWM(led, 0, pulselen);
        }
    }

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    Wow! Je compilerai ça demain! Je me doutais qu'il y avait plus simple que toutes mes lignes de code...

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Quand j'y pense, plutôt que d'allumer les marches une par une, on pourrait faire quelque chose de plus progressif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const int LEDMAX=4095;
     
      for (int i = 256; i >= 0; i--) {  // par pas de -1
        for (int led = 0 ; led < 16; led++) {
          pwm.setPWM(led, 0, LEDMAX-led*i);
        }
        // delay(1);
      }
    Au départ, la 1ère marche est complètement allumée et la dernière est éteinte avec un dégradé en remontant. Puis on allume progressivement les marches en avançant.

    à voir...

  8. #8
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    Bonsoir F-leb

    J'ai tenté ton dernier code mais je crois que je m'y prends mal, ça ne passe pas:

    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
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
     
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //chemin d'accès à la carte pwm
     
    #define LEDMIN  0 // impulsion min (entre 0 et 4096)
    const int LEDMAX=4095;//impulsion max (entre 0 et 4096)
    #define trigPin 12      //Trig 
    #define echoPin 11      //Echo 
    //Il manque la déclaration du second capteur, le trigpin serait 13 et echopin serait 10 sur la carte.
     
    // Liste des leds
    uint8_t led1 = 0;
    uint8_t led2 = 1;
    uint8_t led3 = 2;
    uint8_t led4 = 3;
    uint8_t led5 = 4;
    uint8_t led6 = 5;
    uint8_t led7 = 6;
    uint8_t led8 = 7;
    uint8_t led9 = 8;
    uint8_t led10 = 9;
    uint8_t led11 = 10;
    uint8_t led12 = 11;
    uint8_t led13 = 12;
    uint8_t led14 = 13;
    uint8_t led15 = 14;
    uint8_t led16 = 15;
    // capteur ultrason:
    int mindist = 50; //distance en dessous de laquelle nous souhaitons démarrer le cycle d'allumage
     
     
    void setup() {
     
      pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
      pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
     
     //manque capteur à ultrason 2
     
      pwm.begin(); //démarrage carte pwm
      pwm.setPWMFreq(60);  //réglage de la fréquence
    }
     
    /*Fonction ci-dessous que je ne comprend pas
     * quoi que je puisse modifier le délai entre les fonctions for ne change pas
     */
    void setServoPulse(uint8_t n, double pulse) {
      double pulselength;
     
      pulselength = 1000000;   // 1,000,000 us per second
      pulselength /= 60;   // 60 Hz
      pulselength /= 4096;  // 12 bits of resolution
      pulse *= 1000;
      pulse /= pulselength;
      pwm.setPWM(n, 0, pulse);
    }
     
    void loop() {
     
    long duration, distance;
      digitalWrite(trigPin, LOW);  
      delayMicroseconds(2); 
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms 
      digitalWrite(trigPin, LOW);
     
      // On calcule le temps pour l'aller retour du signal
      duration = pulseIn(echoPin, HIGH);
      distance = duration*340/(2*10000); 
     
     //ajouter le second capteur ici ou plus bas? 
     
      if (distance < mindist) { // si capteur détecte une distance en dessous de 60cm
     
    {unsigned long debut =millis();// permet une détection plus fréquente
     
     
      for (int i = 256; i >= 0; i--) {  // par pas de -1
        for (int led = 0 ; led < 16; led++) {
          pwm.setPWM(led, 0, LEDMAX-led*i);
        }
        // delay(1);
      }
     
      delay(3000);// délai avant extinction progressive:
     
    for (uint8_t led=0 ; led<16; led++){
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen-=2) {
            pwm.setPWM(led, 0, pulselen);
        }
    }
    }
    }
    }
    J'ai cependant tenté une autre programmation mais je n'arrive pas à réduire le nombre de ligne, par contre ça marche:

    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
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
     
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //chemin d'accès à la carte pwm
     
    #define LEDMIN  0 // impulsion min (entre 0 et 4096)
    #define LEDMAX  4096 //impulsion max (entre 0 et 4096)
    #define trigPin 12      //Trig 
    #define echoPin 11      //Echo 
    //Il manque la déclaration du second capteur, le trigpin serait 13 et echopin serait 10 sur la carte.
     
    // Liste des leds
    uint8_t led1 = 0;
    uint8_t led2 = 1;
    uint8_t led3 = 2;
    uint8_t led4 = 3;
    uint8_t led5 = 4;
    uint8_t led6 = 5;
    uint8_t led7 = 6;
    uint8_t led8 = 7;
    uint8_t led9 = 8;
    uint8_t led10 = 9;
    uint8_t led11 = 10;
    uint8_t led12 = 11;
    uint8_t led13 = 12;
    uint8_t led14 = 13;
    uint8_t led15 = 14;
    uint8_t led16 = 15;
    // capteur ultrason:
    int mindist = 50; //distance en dessous de laquelle nous souhaitons démarrer le cycle d'allumage
     
     
    void setup() {
     
      pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
      pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
     
     //manque capteur à ultrason 2
     
      pwm.begin(); //démarrage carte pwm
      pwm.setPWMFreq(60);  //réglage de la fréquence
    }
     
    /*Fonction ci-dessous que je ne comprend pas
     * quoi que je puisse modifier le délai entre les fonctions for ne change pas
     */
    void setServoPulse(uint8_t n, double pulse) {
      double pulselength;
     
      pulselength = 1000000;   // 1,000,000 us per second
      pulselength /= 60;   // 60 Hz
      pulselength /= 4096;  // 12 bits of resolution
      pulse *= 1000;
      pulse /= pulselength;
      pwm.setPWM(n, 0, pulse);
    }
     
    void loop() {
     
    long duration, distance;
      digitalWrite(trigPin, LOW);  
      delayMicroseconds(2); 
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms 
      digitalWrite(trigPin, LOW);
     
      // On calcule le temps pour l'aller retour du signal
      duration = pulseIn(echoPin, HIGH);
      distance = duration*340/(2*10000); 
     
     //ajouter le second capteur ici ou plus bas? 
     
      if (distance < mindist) { // si capteur détecte une distance en dessous de 60cm
     
    {unsigned long debut =millis();// permet une détection plus fréquente
     
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led1, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led2, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led3, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led4, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led5, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led6, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led7, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMAX; pulselen < LEDMIN; pulselen+=15) {
        pwm.setPWM(led8, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led9, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led10, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led11, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led12, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led13, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led14, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led15, 0, pulselen);
      }
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
        pwm.setPWM(led16, 0, pulselen);
    }
     
      delay(3000);// délai avant extinction progressive:
     
    for (uint8_t led=0 ; led<16; led++){
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen-=2) {
            pwm.setPWM(led, 0, pulselen);
        }
    }
    }
    }
    }
    Ce programme me plait bien, par contre je continue de m'arracher les cheveux à inclure mon deuxième capteur à ultrason et inverser le fonctionnement

  9. #9
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    Bonsoir!

    J'ai pu me pencher à nouveau sur mon projet, j'ai réussi à réduire le nombre de ligne de commande pour la première séquence!
    Je me suis donc aventuré dans l'intégration du second capteur et de la séquence qui va avec... et là le drame! mon premier capteur est plus très réactif et la séquence avec le second capteur ne marche pas...

    A l'aide!

    Voici mon nouveau 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
    /*ESSAI ALLUMAGE PROGRESSIF ECLAIRAGE D'ESCALIER
    *AVEC CARTE D'EXTENSION PWM 16 CANAUX
    *Avec capteur ultrason en haut et bas des escaliers
    *Principe recherché: détection présence (avec capteur ultrason) haut des escalier > allumage progressif du haut vers le bas 
    *puis délai et extinction progressive du haut vers le bas.
    *Même principe à l'inverse avec le second capteur à ultrason (séquence que je n'arrive pas à intégrer)
    *Dans l'idéal, je souhaite que l'allumage soit dimmable mais avec un délai maitrisable (pas le cas avec le code que j'utilise pour l'extinction)
    */
     
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
     
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //chemin d'accès à la carte pwm
     
    #define LEDMIN  0 // impulsion min (entre 0 et 4096)
    #define LEDMAX  4096//impulsion max (entre 0 et 4096)
    #define trigPin 12  //Trig premier capteur
    #define echoPin 11  //Echo premier capteur
    #define trigPin2 13 //Trig2 second capteur
    #define echoPin2 10 //Echo2 second capteur
     
    // Liste des leds
    uint8_t led1 = 0;
    uint8_t led2 = 1;
    uint8_t led3 = 2;
    uint8_t led4 = 3;
    uint8_t led5 = 4;
    uint8_t led6 = 5;
    uint8_t led7 = 6;
    uint8_t led8 = 7;
    uint8_t led9 = 8;
    uint8_t led10 = 9;
    uint8_t led11 = 10;
    uint8_t led12 = 11;
    uint8_t led13 = 12;
    uint8_t led14 = 13;
    uint8_t led15 = 14;
    uint8_t led16 = 15;
    // capteur ultrason:
    int mindist = 50; //distance en dessous de laquelle nous souhaitons démarrer le cycle d'allumage
    int mindist2 = 50;
     
    void setup() {
     
      pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
      pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
      pinMode(trigPin2, OUTPUT); //On défini Trig2 comme une sortie
      pinMode(echoPin2, INPUT);  //On défini Echo2 comme une entrée
     
       pwm.begin(); //démarrage carte pwm
      pwm.setPWMFreq(60);  //réglage de la fréquence
    }
     
    void setServoPulse(uint8_t n, double pulse) {
      double pulselength;
     
      pulselength = 1000000;   // 1,000,000 us per second
      pulselength /= 60;   // 60 Hz
      pulselength /= 4096;  // 12 bits of resolution
      pulse *= 1000;
      pulse /= pulselength;
      pwm.setPWM(n, 0, pulse);
    }
     
    void loop() {
     
    //premier capteur à ultrason:
    long duration, distance;
      digitalWrite(trigPin, LOW);  
      delayMicroseconds(2); 
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms 
      digitalWrite(trigPin, LOW);
     
      duration = pulseIn(echoPin, HIGH);
      distance = duration*340/(2*10000);
     
    // second capteur à ultrason:
    long duration2, distance2;
      digitalWrite(trigPin2, LOW);  
      delayMicroseconds(2); 
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms 
      digitalWrite(trigPin2, LOW);
     
      duration2 = pulseIn(echoPin2, HIGH);
      distance2 = duration2*340/(2*10000); 
     
     
     
      if (distance < mindist) { // si capteur détecte une distance en dessous de 50cm
     
    {unsigned long debut =millis();// permet une détection plus fréquente normalement, allumage progressif de la led 1 à 16:
     
     
    for (uint8_t led=0 ; led<16; led++){
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
            pwm.setPWM(led, 0, pulselen);
        }
    }
     
      delay(3000);// délai avant extinction progressive:
     
    for (uint8_t led=0 ; led<16; led++){
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen-=2) {
            pwm.setPWM(led, 0, pulselen);
        }
    }
    }
    }
      else { 
        (distance2 < mindist2); // si capteur détecte une distance en dessous de 60cm
     
     
    {unsigned long debut =millis();// permet une détection plus fréquente normalement, allumage progressif inversé de la led 16 à 1:
     
     
    for (uint8_t led=16 ; led<0; led++){
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen+=15) {
            pwm.setPWM(led, 0, pulselen);
        }
    }
     
      delay(3000);// délai avant extinction progressive:
     
    for (uint8_t led=16 ; led<0; led++){
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen-=2) {
            pwm.setPWM(led, 0, pulselen);
        }
    }
    }
    }
    }

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    il y a déjà un souci au niveau de la structure if else...

    Citation Envoyé par ValentinRou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (distance < mindist) { // si capteur détecte une distance en dessous de 50cm
    ...
    }
     else { 
        (distance2 < mindist2); // si capteur détecte une distance en dessous de 60cm
      
    ...
    Dans l'intention, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (distance < mindist) { // si capteur détecte une distance en dessous de 50cm
    ...
    }
    else if (distance2 < mindist2) { // si capteur détecte une distance en dessous de 60cm
     
    ...
     
    }

  11. #11
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    Merci! correction faite!
    mais la séquence avec le second capteur ne marche pas... je ne sais même pas si le second capteur est bien déclaré...

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Tu devrais nettoyer un peu le code de tout ce qui est inutile histoire d'y voir plus clair... La fonction setServoPulse par exemple, tu ne t'en sers jamais, pourquoi déclarer cette fonction ?
    Idem avec la variable debut =millis(), cette variable n'est jamais utilisée, pourquoi la déclarer ?

    Vérifie également tes crochets { ... }, les crochets sont-ils ouverts/fermés au bon endroit ? Ce n'est pas facile à voir avec ton indentation.
    Essaie d'indenter ton code selon ce modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
    ...
        {
           ...
        }
     
        {
            {
              ...
            }
        }
    ...
    }
    On voit mieux où commencent/se terminent tes blocs de cette façon. Dans l'EDI Arduino, le menu Outil-->Formatage automatique peut t'aider à mettre en forme.

    le second capteur ne marche pas
    Essaie d'être un peu plus précis, qu'entends-tu par "ne marche pas" ? Il y a un message d'erreur à la compilation ?
    Est-ce que le programme se rend bien dans le else lorsque la distance est inférieure mindist2 ? (ajouter des Serial.print pour afficher des messages dans le moniteur Série)

  13. #13
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    en ajoutant la variable debut millis, j'ai eu l'impression que le capteur était plus réactif, finalement tu as raison ça ne change rien...
    Pour le second capteur ya du nouveau, il est bien actif mais ne réagit pas vite (la détection demande quelques secondes) ensuite sa séquence ne se fait pas comme la première avec le premier capteur (les led s'allument l'une après l'autre) et je n'arrive pas à réduire le nombre de ligne comme tu m'as montré que j'avais réussi à modifier pour l'extinction lors de la première séquence.
    j’appelle séquence le morceau de programme qui s'active après détection d'un des capteurs.

    voici à nouveau le code corrigé avec tes recommandations:

    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
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    /*ESSAI ALLUMAGE PROGRESSIF ECLAIRAGE D'ESCALIER
      AVEC CARTE D'EXTENSION PWM 16 CANAUX
      Avec capteur ultrason en haut et bas des escaliers
      Principe recherché: détection présence (avec capteur ultrason) haut des escalier > allumage progressif du haut vers le bas
      puis délai et extinction progressive du haut vers le bas.
      Même principe à l'inverse avec le second capteur à ultrason (séquence que je n'arrive pas à intégrer)
      Dans l'idéal, je souhaite que l'allumage soit dimmable mais avec un délai maitrisable (pas le cas avec le code que j'utilise pour l'extinction)
    */
     
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
     
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //chemin d'accès à la carte pwm
     
    #define LEDMIN  0 // impulsion min (entre 0 et 4096)
    #define LEDMAX  4096//impulsion max (entre 0 et 4096)
    #define trigPin 12  //Trig premier capteur
    #define echoPin 11  //Echo premier capteur
    #define trigPin2 13 //Trig2 second capteur
    #define echoPin2 10 //Echo2 second capteur
     
    // Liste des leds
    uint8_t led1 = 0;
    uint8_t led2 = 1;
    uint8_t led3 = 2;
    uint8_t led4 = 3;
    uint8_t led5 = 4;
    uint8_t led6 = 5;
    uint8_t led7 = 6;
    uint8_t led8 = 7;
    uint8_t led9 = 8;
    uint8_t led10 = 9;
    uint8_t led11 = 10;
    uint8_t led12 = 11;
    uint8_t led13 = 12;
    uint8_t led14 = 13;
    uint8_t led15 = 14;
    uint8_t led16 = 15;
    // capteur ultrason:
    int mindist = 50; //distance en dessous de laquelle nous souhaitons démarrer le cycle d'allumage
    int mindist2 = 50;
     
    void setup() {
     
      pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
      pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
      pinMode(trigPin2, OUTPUT); //On défini Trig2 comme une sortie
      pinMode(echoPin2, INPUT);  //On défini Echo2 comme une entrée
     
      pwm.begin(); //démarrage carte pwm
      pwm.setPWMFreq(60);  //réglage de la fréquence
    }
     
    void loop() {
     
      //premier capteur à ultrason:
      long duration, distance;
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms
      digitalWrite(trigPin, LOW);
     
      duration = pulseIn(echoPin, HIGH);
      distance = duration * 340 / (2 * 10000);
     
      // second capteur à ultrason:
      long duration2, distance2;
      digitalWrite(trigPin2, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms
      digitalWrite(trigPin2, LOW);
     
      duration2 = pulseIn(echoPin2, HIGH);
      distance2 = duration2 * 340 / (2 * 10000);
     
      //Séquence 1: sens d'allumage de la led 1 à 16
     
      if (distance < mindist) { // si capteur détecte une distance en dessous de 50cm
     
        for (uint8_t led = 0 ; led < 16; led++) {
          for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen += 15) {
            pwm.setPWM(led, 0, pulselen);
          }
        }
     
        delay(3000);// délai avant extinction progressive:
     
        for (uint8_t led = 0 ; led < 16; led++) {
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led, 0, pulselen);
          }
        }
     
      }
     
      // Séquence 2: sens d'allumage de la led 16 à 1
     
      else if (distance2 < mindist) { // si capteur détecte une distance en dessous de 50cm
     
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led16, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led15, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led14, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led13, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led12, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led11, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led10, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led9, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led8, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led7, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led6, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led5, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led4, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led3, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led2, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led1, 0, pulselen);
        }
      }
     
      delay(3000);// délai avant extinction progressive:
     
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led16, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led15, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led14, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led13, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led12, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led11, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led10, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led9, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led8, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led7, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led6, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led5, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led4, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led3, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led2, 0, pulselen);
      }
      for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
        pwm.setPWM(led1, 0, pulselen);
      }
    }
    }

  14. #14
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    Je crois avoir trouvé la solution pour la vidéo (qualité très médiocre mais je ne pouvais dépasser 2Mo...):
    VID_20180116_230546_s01 (1).zip

  15. #15
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    Bonsoir!
    As tu regardé la vidéo?
    En ce moment j'essaie d'intégrer les serial printIn, pas facile quand les bases sont pas solides, en même temps on apprend face aux difficultés!

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    Pour le second capteur ya du nouveau, il est bien actif mais ne réagit pas vite (la détection demande quelques secondes)
    Et si tu inverses l'ordre de lecture des capteurs dans le programme ? Tu lis d'abord le capteur 2, et ensuite le capteur 1.

  17. #17
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    Alors j'ai enquêté un peu! Comme tu disais en ajoutant des infos sur la console ça pouvait m'aider: les deux capteurs fonctionnent parfaitement car je peux lire en temps réel les distances.
    Par contre, toujours pas possible de "démarrer" la deuxième séquence d'allumage: pas de réaction à partir de la fonction if (distance2 < mindist), pourtant mindist fonctionne bien sur la première séquence d'allumage... que je mette la fonction if ou else if n'y change rien... ai-je oublié quelque chose?
    Sinon j'ai fait un peu de clair dans le programme (mis à part réduire les lignes de la seconde séquence).

    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
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    /*ESSAI ALLUMAGE PROGRESSIF ECLAIRAGE D'ESCALIER
      AVEC CARTE D'EXTENSION PWM 16 CANAUX
      Avec capteur ultrason en haut et bas des escaliers
      Principe recherché: détection présence (avec capteur ultrason) haut des escalier > allumage progressif du haut vers le bas
      puis délai et extinction progressive du haut vers le bas.
      Même principe à l'inverse avec le second capteur à ultrason (séquence que je n'arrive pas à intégrer)
    */
     
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
     
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //chemin d'accès à la carte pwm
     
    #define LEDMIN  0     // impulsion min (entre 0 et 4096)
    #define LEDMAX  4096  //impulsion max (entre 0 et 4096)
    #define trigPin 12    //Trig premier capteur
    #define echoPin 11    //Echo premier capteur
    #define trigPin2 13   //Trig2 second capteur
    #define echoPin2 10   //Echo2 second capteur
    #define ledUltra1 2 //led de contrôle capteur à ultrason 1
    #define ledUltra2 3 //led de contrôle capteur à ultrason 2
    // Liste des leds
    uint8_t led1 = 0;
    uint8_t led2 = 1;
    uint8_t led3 = 2;
    uint8_t led4 = 3;
    uint8_t led5 = 4;
    uint8_t led6 = 5;
    uint8_t led7 = 6;
    uint8_t led8 = 7;
    uint8_t led9 = 8;
    uint8_t led10 = 9;
    uint8_t led11 = 10;
    uint8_t led12 = 11;
    uint8_t led13 = 12;
    uint8_t led14 = 13;
    uint8_t led15 = 14;
    uint8_t led16 = 15;
    // capteur ultrason:
    int mindist = 20; //distance en dessous de laquelle nous souhaitons démarrer le cycle d'allumage
    long duration, distance; //capteur 1
    long duration2, distance2; //capteur 2
     
    void setup() {
     
      Serial.begin(9600);
      pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
      pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
      pinMode(trigPin2, OUTPUT); //On défini Trig2 comme une sortie
      pinMode(echoPin2, INPUT);  //On défini Echo2 comme une entrée
      pinMode(ledUltra1, OUTPUT);
      pinMode(ledUltra2, OUTPUT);
      pwm.begin(); //démarrage carte pwm
      pwm.setPWMFreq(60);  //réglage de la fréquence
    }
     
    void loop() {
     
      //premier capteur à ultrason:
     
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms
      digitalWrite(trigPin, LOW);
     
      duration = pulseIn(echoPin, HIGH);
      distance = duration * 340 / (2 * 10000);
      Serial.print("Distance1 : ");
      Serial.println(distance);
     
      // second capteur à ultrason:
     
      digitalWrite(trigPin2, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms
      digitalWrite(trigPin2, LOW);
     
      duration2 = pulseIn(echoPin2, HIGH);
      distance2 = duration2 * 340 / (2 * 10000);
      Serial.print("Distance2 : ");
      Serial.println(distance2);
     
      //Séquence 1:sens d'allumage de la led 1 à 16
     
      if (distance < mindist) { // si capteur détecte une distance en dessous de 50cm
     
        digitalWrite(ledUltra1, HIGH);  //led de visualisation du démarrage de la séquence pour vérifier si un défaut ne vient pas du capteur
     
        for (uint8_t led = 0 ; led < 16; led++) {
          for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen += 15) {
            pwm.setPWM(led, 0, pulselen);
          }
        }
        digitalWrite(ledUltra1, LOW);
     
        delay(3000);// délai avant extinction progressive:
     
        for (uint8_t led = 0 ; led < 16; led++) {
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led, 0, pulselen);
          }
        }
     
      }
     
      // Séquence 2: sens d'allumage de la led 16 à 1
     
      if (distance2 < mindist) { // si capteur détecte une distance en dessous de 50cm
     
        digitalWrite(ledUltra2, HIGH); //led de visualisation du démarrage de la séquence pour vérifier si un défaut ne vient pas du capteur
     
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led16, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led15, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led14, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led13, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led12, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led11, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led10, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led9, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led8, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led7, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led6, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led5, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led4, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led3, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led2, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen > LEDMAX; pulselen += 15) {
          pwm.setPWM(led1, 0, pulselen);
        }
        digitalWrite(ledUltra2, LOW);
     
        delay(3000);// délai avant extinction progressive:
     
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led16, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led15, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led14, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led13, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led12, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led11, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led10, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led9, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led8, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led7, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led6, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led5, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led4, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led3, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led2, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led1, 0, pulselen);
        }
      }
    }

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    La led ledUltra2 (ligne 112 de ton dernier code) ne s'allume jamais ?

  19. #19
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Points : 4
    Points
    4
    Par défaut
    bonjour F-leb!
    Maintenant si! le programme tourne à présent! après c'est dommage que je n'arrive pas à réduire le nombre de ligne...
    Avec ce code tout tourne:

    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
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    /*ESSAI ALLUMAGE PROGRESSIF ECLAIRAGE D'ESCALIER
      AVEC CARTE D'EXTENSION PWM 16 CANAUX
      Avec capteur ultrason en haut et bas des escaliers
      Principe recherché: détection présence (avec capteur ultrason) haut des escalier > allumage progressif du haut vers le bas
      puis délai et extinction progressive du haut vers le bas.
      Même principe à l'inverse avec le second capteur à ultrason (séquence que je n'arrive pas à intégrer)
    */
     
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
     
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //chemin d'accès à la carte pwm
     
    #define LEDMIN  0     // impulsion min (entre 0 et 4096)
    #define LEDMAX  4096  //impulsion max (entre 0 et 4096)
    #define trigPin 12    //Trig premier capteur
    #define echoPin 11    //Echo premier capteur
    #define trigPin2 13   //Trig2 second capteur
    #define echoPin2 10   //Echo2 second capteur
    #define ledUltra1 2 //led de contrôle capteur à ultrason 1
    #define ledUltra2 3 //led de contrôle capteur à ultrason 2
    // Liste des leds
    uint8_t led1 = 0;
    uint8_t led2 = 1;
    uint8_t led3 = 2;
    uint8_t led4 = 3;
    uint8_t led5 = 4;
    uint8_t led6 = 5;
    uint8_t led7 = 6;
    uint8_t led8 = 7;
    uint8_t led9 = 8;
    uint8_t led10 = 9;
    uint8_t led11 = 10;
    uint8_t led12 = 11;
    uint8_t led13 = 12;
    uint8_t led14 = 13;
    uint8_t led15 = 14;
    uint8_t led16 = 15;
    // capteur ultrason:
    int mindist = 5; //distance en dessous de laquelle nous souhaitons démarrer le cycle d'allumage
    long duration, distance; //capteur 1
    long duration2, distance2; //capteur 2
     
    void setup() {
     
      Serial.begin(9600);
      pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
      pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
      pinMode(trigPin2, OUTPUT); //On défini Trig2 comme une sortie
      pinMode(echoPin2, INPUT);  //On défini Echo2 comme une entrée
      pinMode(ledUltra1, OUTPUT);
      pinMode(ledUltra2, OUTPUT);
      pwm.begin(); //démarrage carte pwm
      pwm.setPWMFreq(60);  //réglage de la fréquence
    }
     
    void loop() {
     
      //premier capteur à ultrason:
     
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms
      digitalWrite(trigPin, LOW);
     
      duration = pulseIn(echoPin, HIGH);
      distance = duration * 340 / (2 * 10000);
      Serial.print("Distance1 : ");
      Serial.println(distance);
     
      // second capteur à ultrason:
     
      digitalWrite(trigPin2, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin2, HIGH);
      delayMicroseconds(10); //Trig envoi pendant 10ms
      digitalWrite(trigPin2, LOW);
     
      duration2 = pulseIn(echoPin2, HIGH);
      distance2 = duration2 * 340 / (2 * 10000);
      Serial.print("Distance2 : ");
      Serial.println(distance2);
     
      //Séquence 1:sens d'allumage de la led 1 à 16
     
      if (distance < mindist) { // si capteur détecte une distance en dessous de 50cm
     
        Serial.print("Séquence d'allumage 1");
     
        digitalWrite(ledUltra1, HIGH);  //led de visualisation du démarrage de la séquence pour vérifier si un défaut ne vient pas du capteur
     
        for (uint8_t led = 0 ; led < 16; led++) {
          for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen += 15) {
            pwm.setPWM(led, 0, pulselen);
          }
        }
        digitalWrite(ledUltra1, LOW);
     
        delay(3000);// délai avant extinction progressive:
     
        for (uint8_t led = 0 ; led < 16; led++) {
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led, 0, pulselen);
          }
        }
    Serial.print("Fin de séquence d'allumage 1");
      }
     
      // Séquence 2: sens d'allumage de la led 16 à 1
     
      if (distance2 < mindist) { // si capteur détecte une distance en dessous de 50cm
     
        Serial.print("Séquence d'allumage 2");
     
         digitalWrite(ledUltra2, HIGH); //led de visualisation du démarrage de la séquence pour vérifier si un défaut ne vient pas du capteur
     
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led16, 0, pulselen);
        }
        Serial.print("Led 16 allumée");
     
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led15, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led14, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led13, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led12, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led11, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led10, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led9, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led8, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led7, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led6, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led5, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led4, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led3, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led2, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led1, 0, pulselen);
        }
        digitalWrite(ledUltra2, LOW);
     
        delay(3000);// délai avant extinction progressive:
     
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led16, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led15, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led14, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led13, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led12, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led11, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led10, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led9, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led8, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led7, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led6, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led5, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led4, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led3, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led2, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
          pwm.setPWM(led1, 0, pulselen);
        }
      Serial.print("Fin de séquence d'allumage 2");
      }
    }

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    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 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Maintenant si! le programme tourne à présent!
    Qu'est-ce qui a changé ?

    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
    for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led16, 0, pulselen);
        }
     
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led15, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led14, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led13, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led12, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led11, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led10, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led9, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led8, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led7, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led6, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led5, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led4, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led3, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led2, 0, pulselen);
        }
        for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led1, 0, pulselen);
        }
    En effet, ceci devrait fonctionner à la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for (uint8_t led = 15 ; led >= 0; led--) {
          for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen +=15) {
          pwm.setPWM(led, 0, pulselen);
          }
        }

Discussions similaires

  1. Eclairage de marches d'escalier
    Par edgardio dans le forum Arduino
    Réponses: 28
    Dernier message: 07/02/2017, 22h53
  2. Balayage progressif et affichage entrelacé?
    Par sali dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 29/12/2004, 10h05
  3. [FLASH MX2004] Compteur progressif 0 à 95%
    Par DJeys dans le forum Flash
    Réponses: 5
    Dernier message: 21/07/2004, 14h58
  4. Normales Normalisation Normalisage et Eclairage
    Par Dam)rpgheaven dans le forum OpenGL
    Réponses: 10
    Dernier message: 17/06/2004, 23h49
  5. probleme eclairage....
    Par DjiZ dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/12/2003, 14h33

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