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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Manche (Basse Normandie)

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

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    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
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    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
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    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
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Manche (Basse Normandie)

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

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    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
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    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
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2018
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Manche (Basse Normandie)

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

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    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
    Invité de passage
    Homme Profil pro
    Prof de techno
    Inscrit en
    Février 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Prof de techno
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2019
    Messages : 1
    Par défaut besoin d'aire
    Bonjour,
    Étant professeur de technologie j'aimerai monter ce projet à bien avec mes élèves.
    Pouvez vous me donner le (ou les schéma), les plans et le programme, tous les documents nécessaire pour mener à bien ce projet.
    Très intéressant.
    Merci à vous et aux autres pour votre aide.

    #### ne postez pas votre adresse mail directement. Il y a toujours un risque que quelqu'un l'ajoute a une mailing list à spamer

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

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

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Par défaut
    Bonjour technolog,

    J'ai donné la plupart des informations que vous recherchez, par contre je n'ai pas fait de plan de câblage, je l'avais dans ma tête et j'étais feignant à le retranscrire… mais le câblage est plutôt simple, vous aurez certaines infos directement dans le programme.
    Est ce que votre projet sera une maquette? ou le but est de faire ce projet à taille réelle? Je pose cette question car si c'est une maquette avec par exemple une led par marche, vous n'aurez pas besoin de tous les éléments tel que les cartes mosfet du fait que la carte d'extension pwm ne pouvait pas gérer une grosse puissance.

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

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

    Informations forums :
    Inscription : Janvier 2018
    Messages : 24
    Par défaut
    Je viens de me rendre compte que je n'avais pas posté le code final et fonctionnel (même si il est à rallonge, j'expliquerais pourquoi)
    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
    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
    /*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 de présence (avec capteur ultrason) en 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.
      Capteur de luminosité pour que le système fonctionne que la nuit.
    */
     
    #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
    int lumPin;           //variable état du contact du capteur de luminosité
    boolean etatLumPin;
    // 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 = 40; //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() {
     
      lumPin = 2;   //pin défini pour l'état du capteur de luminosité
      etatLumPin = 0;
     
      pinMode(lumPin, INPUT_PULLUP);
     
      Serial.begin(9600);
      pinMode(trigPin, OUTPUT);  //On defini Trig comme une sortie
      pinMode(echoPin, INPUT);   //On defini Echo comme une entree
      pinMode(trigPin2, OUTPUT); //On defini Trig2 comme une sortie
      pinMode(echoPin2, INPUT);  //On defini Echo2 comme une entree
     
      pwm.begin(); //demarrage carte pwm
      pwm.setPWMFreq(1000);  //reglage de la frequence
    }
     
    void loop() {
     
      boolean etatLumPin = digitalRead(lumPin);
      Serial.print("Capteur de luminosite : ");
      Serial.println(etatLumPin);
     
      if (etatLumPin) //condition "nuit" pour utilisation du système
      {
        //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");
     
          for (uint8_t led = 0 ; led < 16; led++) {
            for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen += 8) { //chiffre/nombre pair
              pwm.setPWM(led, 0, pulselen);
            }
          }
     
          delay(5000);// délai avant extinction progressive:
     
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led1, 0, pulselen);
          }
          pwm.setPWM(0, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led2, 0, pulselen);
          }
          pwm.setPWM(1, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led3, 0, pulselen);
          }
          pwm.setPWM(2, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led4, 0, pulselen);
          }
          pwm.setPWM(3, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led5, 0, pulselen);
          }
          pwm.setPWM(4, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led6, 0, pulselen);
          }
          pwm.setPWM(5, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led7, 0, pulselen);
          }
          pwm.setPWM(6, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led8, 0, pulselen);
          }
          pwm.setPWM(7, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led9, 0, pulselen);
          }
          pwm.setPWM(8, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led10, 0, pulselen);
          }
          pwm.setPWM(9, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led11, 0, pulselen);
          }
          pwm.setPWM(10, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led12, 0, pulselen);
          }
          pwm.setPWM(11, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led13, 0, pulselen);
          }
          pwm.setPWM(12, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led14, 0, pulselen);
          }
          pwm.setPWM(13, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led15, 0, pulselen);
          }
          pwm.setPWM(14, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led16, 0, pulselen);
          }
          pwm.setPWM(15, 0, 4096);
        }
     
     
     
        // 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");
     
          for (uint8_t led = 15 + 1 ; led > 0; led--) {
            for (uint16_t pulselen = LEDMIN; pulselen < LEDMAX; pulselen += 10) { //chiffre/nombre pair
              pwm.setPWM(led - 1, 0, pulselen);
            }
          }
     
          delay(5000);// délai avant extinction progressive:
     
     
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led16, 0, pulselen);
          }
          pwm.setPWM(15, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led15, 0, pulselen);
          }
          pwm.setPWM(14, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led14, 0, pulselen);
          }
          pwm.setPWM(13, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led13, 0, pulselen);
          }
          pwm.setPWM(12, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led12, 0, pulselen);
          }
          pwm.setPWM(11, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led11, 0, pulselen);
          }
          pwm.setPWM(10, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led10, 0, pulselen);
          }
          pwm.setPWM(9, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led9, 0, pulselen);
          }
          pwm.setPWM(8, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led8, 0, pulselen);
          }
          pwm.setPWM(7, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led7, 0, pulselen);
          }
          pwm.setPWM(6, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led6, 0, pulselen);
          }
          pwm.setPWM(5, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led5, 0, pulselen);
          }
          pwm.setPWM(4, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led4, 0, pulselen);
          }
          pwm.setPWM(3, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led3, 0, pulselen);
          }
          pwm.setPWM(2, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led2, 0, pulselen);
          }
          pwm.setPWM(1, 0, 4096);
          for (uint16_t pulselen = LEDMAX; pulselen > LEDMIN; pulselen -= 2) {
            pwm.setPWM(led1, 0, pulselen);
          }
          pwm.setPWM(0, 0, 4096);
        }
      }
    }
    Vous constaterez le retour à des fonctions répétées et lourdes, je sais qu'elles peuvent êtres simplifiées, mais quand elles sont simplifiées le code ne s'exécute pas très bien: les led ne s'éteignent pas totalement comme si le mode pwm n'arrivait pas à 0. Dès que j'utilise le code ci-dessus le problème disparait!

    Voilà 8mois que mon escalier est équipé et ça marche parfaitement!

    Un grand merci à tous ceux qui m'ont aidé.

  10. #10
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 1
    Par défaut
    Bonjour ValentinRou,

    Peux-tu nous fournir une photo de l’installation stp ?
    Je cherche à faire moi-même un éclairage progressif mais je n’ai pas réussi à trouver ET le matériel ET le code sur le net en arduino...pourtant je vois pas mal de gens de faire eux même. Je ne m’y connais pas trop en programmation mais je peux suivre les étapes d’un DIY et ´manipuler’ un arduino.

    Les solutions toutes prêtes, uniquement du module de contrôle, coûtent relativement cher (150-200€) mais j’aimerai m’en passer puisque c’est faisable soi-même, faut juste trouver le tuto et c’est tout le souci.
    Merci de ton retour.

    Salutations
    Mathieu

  11. #11
    Nouveau candidat au Club
    Homme Profil pro
    Ingénieur Mécanique
    Inscrit en
    Novembre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Mécanique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2019
    Messages : 2
    Par défaut Merci
    Salut à tous,

    Merci, je suis tellement heureux de trouver exactement ce dont j'ai besoin.
    malheureusement je trouve ça un peu tard, j'ai exactement le même projet mais je l'ai abordé différemment.
    J'ai 16 marche 8 capteurs,

    Une alim 12V 300W 25A
    un arduino uno
    mon pwm 16 canaux est le même mais sous forme shield : Driver-I2C Servo PCA9685
    16 commutateurs 15A 400W MOS FET
    mes 8 capteurs sont des PIR : HC-SR505
    j'ai presque 20m de LED 5630 5730 étanche DC12V 60 LED s/m
    mises dans des quart de rond
    + 100 m de câble
    le tout avec un interrupteur connecté sonoff (pour gérer avec google home)


    pour l'instant j'en suis a gérer un capteur défaillant et faire mon code, je ne suis pas chez moi du coup je l'ai pas là pour le poster.

    Mais j'ai eu le même problème de courant résiduel en fait c'est normal :

    @ValentinRou
    tu utilise son pulselen comme pas d'allumage/extinction pour gérer ta vitesse jusqu'a ce que pulselen > LEDMIN

    ton LEDMIN=0
    mais imagine tu a pulselen = 5 ta contition pulselen > LEDMIN est juste donc tu execute pulselen = pulselen - 2
    alors tu a pulselen = 3 ta contition pulselen > LEDMIN est juste donc tu execute pulselen = pulselen - 2
    alors tu a pulselen = 1 ta contition pulselen > LEDMIN n'est plus respecté ==>ta boucle est finie

    mais tous as toujours pulselen = 1 !!!!
    le voila ton courant résiduel.

    de mon coté j'ai mis un truc du genre si pulselen <= pasdallumage (c'est mon 2 mis en variable) alors pulselen = 0

    pour alléger ton code il y a F-leb qui te propose un truc pas mal que tu peux adapter aussi pour l'extinction:

    Citation Envoyé par f-leb Voir le message
    Oups, je me suis fait avoir avec un entier non signé (led) qui tente de prendre une valeur négative en fin de boucle


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