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 :

Projet éclairage lever/coucher de soleil pour aquarium


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Par défaut Projet éclairage lever/coucher de soleil pour aquarium
    Nom : Schéma rampe mathieu.png
Affichages : 3997
Taille : 261,2 Ko

    Bonjour,
    Voilà mon projet :
    Réaliser une simulation de lever/coucher de soleil sur un aquarium eau de mer.

    2 canaux d’éclairage :
    – 1 gérant les LED bleues
    – 1 gérant les LED blanches

    Le principe est assez simple, les led bleues s’allument en premier, progressivement sur un délai d’environ 1 heure pour atteindre environ 60% de leur puissance max au zénith, idem pour les led blanches mais en décalage d’1 heure par rapport aux bleues.
    La fonction « dimmable » est assurée par des driver MeanWell LDD-1000H reliés aux sorties PWM de l’arduino Nano.
    Le soir c’est la même chose mais en sens inverse. (intensité des blanche commence à diminuer en premier puis les bleues).

    Voici le code de mon programme

    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
     
    #include <RTClib.h>
    #include <Wire.h>
    #include <LiquidCrystal.h>
     
    #define DS1307_I2C_ADDRESS 0x68
    #define LCD_WIDTH 16
    #define LCD_HEIGHT 2
     
    #define ARRAYSTEP 15
    #define WHITE_LED 11
    #define BLUE_LED 10
     
    char lcdbuf[LCD_WIDTH];
    char lcdbufb[LCD_WIDTH];
     
    int DsHour , DsMin , DsSec;
     
    //LiquidCrystal lcd(30, 31, 32, 36, 37, 38, 39);
    LiquidCrystal lcd(30, 31, 32, 26, 27, 22, 23);
     
    RTC_DS1307 rtc;
     
    int lcdw, lcdwb;
     
    static unsigned long LastTimer ;
     
    byte whiteled[96] = {
      0, 0, 0, 0, 0, 0, 0, 0,  //0 - 1h45
      0, 0, 0, 0, 0, 0, 0, 0,  //2 - 3h45
      0, 0, 0, 0, 0, 0, 0, 0,  //4 - 5h45
      0, 0, 0, 0, 0, 0, 0, 0,  //6 - 7h45
      0, 0, 0, 0, 1, 16, 32, 55,  //8 - 9h45
      80, 110, 140, 153, 153, 153, 153, 153,  //10 - 11h45
      153, 153, 153, 153, 153, 153, 153, 153,  //12 - 13h45
      153, 153, 153, 153, 153, 153, 153, 153,  //14 - 15h45
      153, 153, 153, 153, 153, 153, 153, 153,  //16 - 17h45
      153, 153, 153, 153, 153, 153, 153, 140,  //18 - 19h45
      110, 90,  70,  55,  40 ,  20,  10,   8, //20 - 21h45
      6  , 3 ,   3,   1,   1,    1,   0,   0  //22 - 23h45
    };
     
    byte blueled[96] = {
      0, 0, 0, 0, 0, 0, 0, 0,  //0 - 1h45
      0, 0, 0, 0, 0, 0, 0, 0,  //2 - 3h45
      0, 0, 0, 0, 0, 0, 0, 0,  //4 - 5h45
      0, 0, 0, 0, 0, 0, 0, 0,  //6 - 7h45
      1, 16, 32, 55, 80, 110, 140, 153,  //8 - 9h45
      179, 179, 179, 179, 179, 179, 179, 179,  //10 - 11h45
      179, 179, 179, 179, 179, 179, 179, 179,  //12 - 13h45
      179, 179, 179, 179, 179, 179, 179, 179,  //14 - 15h45
      179, 179, 179, 179, 179, 179, 179, 179,  //16 - 17h45
      179, 179, 179, 179, 179, 179, 153, 140,  //18 - 19h45
      110, 90,  70,  55,  40 ,  20,  10,   8, //20 - 21h45
      6  , 3 ,   3,   1,   1,    1,   0,   0  //22 - 23h45
    };
     
    void setup(void)
    {
     
      pinMode(WHITE_LED, OUTPUT);
      pinMode(BLUE_LED, OUTPUT);
     
      Serial.begin(9600);
      Serial.println("Entrée dans Setup()");
     
      Wire.begin();
      rtc.begin();
     
      lcd.begin(LCD_WIDTH, LCD_HEIGHT, 1);
     
      if (! rtc.isrunning()) {
        Serial.println("Module RTC non initialisé !");
        //Si le DS1307 ne tourne pas (changement de pile et pas d'alim, montage tout neuf, on le règle avec la date/l'heure de la compilation
        rtc.adjust(DateTime(__DATE__, __TIME__));
      }
     
      lcd.clear();
     
      LastTimer  = 0;
     
    }
     
    // renvoie la valeur intermédiaire
    byte average( byte *pt1, byte *pt2, int lstep)
    {
     
      byte result;
     
      float fresult;
     
      // Les 2 valeurs des indices sont égales donc on ne change rien
      if (*pt1 == *pt2) {
        result = *pt1; // Pas de changement
      }
     
      // Cas 1 on augmente la luminosité
      else if (*pt1 < *pt2)
        // Calcul de la valeur intermédiaire (cf Tuto)
      { fresult = ((float(*pt2 - *pt1) / 15.0) * float(lstep)) + float(*pt1);
        result = byte(fresult);
      }
      else
        // Cas 2 on diminue la luminosité
      {
        fresult = -((float(*pt1 - *pt2) / 15.0) * float(lstep)) + float(*pt1);
        result = byte(fresult);
      }
     
      return result;
    }
     
    void SetPWMForLed()
    {
     
      int indice, sstep, t1, t2, min_cnt, pwmmod, pwmmodb;
     
      Serial.println("Entrée SetPWMForLed");
     
      min_cnt = (DsHour * 60) + DsMin;
     
      // on calcule l'indice ((heure * 60) + minute) divisé par le pas du tableau
      indice = min_cnt / ARRAYSTEP;
      // Fonction modulo qui donne la partie décimale du calcul ci dessus (donc valeur entre 0 et le pas soit entre 0 et 15)  .
      sstep = min_cnt % ARRAYSTEP;
     
      t1 = indice;
     
      // cas où l'indice est le dernier du tableau, le suivant est donc le premier !
      if (t1 == 95) {
        t2 = 0;
      }
     
      // sinon indice suivant
      else {
        t2 = t1 + 1;
      }
     
      // on est tombé sur un indice entier (multiple de 1/4h), donc on envoie directement la valeur
      if (sstep == 0)
      {
        pwmmod = whiteled[t1];
        pwmmodb = blueled[t1];
      }
      else
      {
        pwmmod = average(&whiteled[t1], &whiteled[t2], sstep);
        pwmmodb = average(&blueled[t1], &blueled[t2], sstep);
      }
     
      Serial.print("pwmmod:");
      Serial.println(pwmmod);
     
      Serial.print("pwmmodb:");
      Serial.println(pwmmodb);
     
      analogWrite(WHITE_LED, pwmmod);
      analogWrite(BLUE_LED, pwmmodb);
      lcdw = pwmmod;
      lcdwb = pwmmodb;
    }
     
    void GetTimeFromRTC()
    {
      DateTime now = rtc.now();
     
      DsHour = now.hour();
      DsMin = now.minute();
      DsSec = now.second();
    }
     
    void FlushLCD()
    {
      lcd.setCursor(0, 1);
     
      // Ex: Blanc : 32%
      sprintf(lcdbuf, "Blanc : %d%%", lcdw * 100 / 255);
      lcd.print(lcdbuf);
     
      lcd.setCursor(0, 0);
     
      sprintf(lcdbuf, "%.2d:%.2d:%.2d", DsHour, DsMin, DsSec);
      lcd.print(lcdbuf);
     
      // BLEU
      sprintf(lcdbufb, "Bleu : %d%%", lcdwb * 100 / 255);
      lcd.print(lcdbufb);
     
      lcd.setCursor(1, 0);
     
      sprintf(lcdbufb, "%.2d:%.2d:%.2d", DsHour, DsMin, DsSec);
      lcd.print(lcdbufb);
     
    }
     
    void loop(void)
    {
     
      GetTimeFromRTC();
     
      if ( (long)( millis() - LastTimer ) >= 0)
      {
        SetPWMForLed();
        LastTimer += 60000;
      }
     
      Serial.print("Heure RTC : ");
      Serial.println(lcdbuf);
      Serial.println(lcdbufb);
     
      FlushLCD();
     
      delay(900);
     
    }
    La chose qui me pose souci c’est que ce code est fait pour fonctionner avec un écran branché avec les 16 broches alors que j’ai un écran fonctionnant avec le module I²C. Sachant que , tel quel, le programme se compile bien sans erreur.
    Est ce qu’en rajoutant simplement la librairie « LiquidCrystal_I2C.h » et en déclarant l’adresse de mon écran (0x3F) ça fonctionnerait où faut-il modifier autre chose dans le programme ?
    Voyez-vous des erreurs dans le programme ou sur le schéma ?

    P.S. : les numéros de pin des led sont différents sur le schéma et sur le code, je le rectifierai avant de téléverser.

    Merci de votre aide.

  2. #2
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Bonjour,

    Je débute en Arduino, j'ai acheté un Kit et en premier projet j'ai décidé de piloter les leds de mon aquarium (Leds rubans Blanc chaud et blanc froid).

    C'est intéressant de voir les différentes approches qu'on peut avoir.

    Concernant ton montage, il parait bien, mais il faudrait connaitre les datasheet des LEDs que tu utilises (on peut les alimenter directement sans mettre de résistance ?)

    Mes rubans leds ont des résistances intégrés et je peux les alimenter directement.

    J'ai pour ma part utiliser des MOSFET (IRF520) qui à mon avis coûte moins chers (de quelques centimes dans les magasins d'électronique à 2€ en version prêt à l'emploi pour Arduino) que des driver MeanWell LDD-1000H


    Pour ce qui est de ton programme, j'ai quelques questions / remarques

    Mon horloge c'est un DS3231, mais je suppose que le principe est le même pour la DS1307.
    Je ne sais pas quel librairie tu utilises mais dans la mienne je n'ai pas de Isrunning mais une isReady()
    mais quand je regarde comment elle est codé, je me dis que je ne peux pas l'utiliser pour initialiser ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    uint8_t DS3231::isReady(void) 
    {
        return true;
    }
    Ma remarque concerne ce bout de 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
    // renvoie la valeur intermédiaire
    byte average( byte *pt1, byte *pt2, int lstep)
    {
     
      byte result;
     
      float fresult;
     
      // Les 2 valeurs des indices sont égales donc on ne change rien
      if (*pt1 == *pt2) {
        result = *pt1; // Pas de changement
      }
     
      // Cas 1 on augmente la luminosité
      else if (*pt1 < *pt2)
        // Calcul de la valeur intermédiaire (cf Tuto)
      { fresult = ((float(*pt2 - *pt1) / 15.0) * float(lstep)) + float(*pt1);
        result = byte(fresult);
      }
      else
        // Cas 2 on diminue la luminosité
      {
        fresult = -((float(*pt1 - *pt2) / 15.0) * float(lstep)) + float(*pt1);
        result = byte(fresult);
      }
     
      return result;
    }
    Je pense qu'il peut se simplifier comme ci-dessous ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // renvoie la valeur intermédiaire
    byte average( byte *pt1, byte *pt2, int lstep)
    {
      return byte(((float(*pt2 - *pt1) / 15.0) * float(lstep)) + float(*pt1));
    }
    Je me demande même si on ne peut pas utiliser tout simplement MAP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // renvoie la valeur intermédiaire
    byte average( byte *pt1, byte *pt2, int lstep)
    {
      return map(lstep, 0, ARRAYSTEP, *pt1, *pt2);
    }
    J'imagine que depuis juin il y a eut des changements, j'espère que ton projet rend bien le lever et coucher de soleil.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Par défaut
    Salut Barbibulle,

    Depuis le mois de juin, le projet n'a pas trop changé si ce n'est que j'ai aussi pris la décision, après de nombreuses discussions sur d'autres forum, d'utiliser un MOSFET car plus simple à installer, moins coûteux, et au final je pense mieux adapté à ce que je veux en faire.
    Concernant le programme, il est bon, car j'ai pu converser directement avec son créateur et il y a de nombreuses personnes qui l'utilisent tel quel.
    Par contre, effectivement, lui aussi utilise un transistor pour faire varier l'éclairage, je lui avait posé la question pour les LDD, il m'avait dit que ça fonctionnait.
    Je te mets le lien vers le forum.
    http://www.francenanorecif.fr/commun...e-ccm-tuto-n-8

    Pour le datasheet des led....j'ai pas grand chose si ce n'est qu'elles fonctionnent sous 3,4v - 700mAh

    Pour l'horloge, la DS1307 est une basique, pas chère mais qui fait bien son taf et je l'utilise avec la librairie RTClib.h
    Je n'ai pas encore reçu les MOSFET donc je n'ai pas pu tester si ça va mieux.
    Mais à mon avis, le LDD consomme trop de tension par rapport à mon montage (j'ai testé sur un montage avec 9 led) donc soit l'alim ne donne pas assez et du coup le clignottement correspond au temps de charge/décharge des condensateurs, soit il y a quelque chose dans mon circuit qui se met en court-circuit et qui se réarme automatiquement toute les secondes......
    Je t'avoue que ça me soule un peu et que je suis à la limite de tout laisser tomber...

  4. #4
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Salut,

    Et bien si tu me mets des liens vers les composants que tu as achetés je peux peut être t'aider.

    par exemple pour le driver c est bien MeanWell LDD-1000H ?

    Dans ce cas il n'y a que 1A max en sortie si une led pompe 0.7A tu ne peux en mettre qu'une au delà le driver va couper (se mets en sécurité) avant de réessayer...

    Pour les LDD tu me dis 3.4V en entrée et tu alimentes le driver en 48V ?

    Ce n'est pas cohérent.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Par défaut
    Les led ce sont des chinoises que j'avais depuis longtemps de ce type :
    https://fr.aliexpress.com/item/10Pcs...311.0.0.c1SxHd
    C'est pas le LDD que j'alimente en 3.4v, ce sont les led qui fonctionnent sous 3.4v - 700mh et elle sont en série, donc qu'il y en ait 1 ou 10 ma conso sera toujours de 700mh, par contre les tensions s'additionnent (3.4v x 10 = 34v) d'où l'alim 48v, le LDD pouvant être alimenté entre 9-56v donc je suis dans les clous
    La conso du LDD pour son fonctionnement je crois de mémoire c'est de l'ordre de 1 ou 2v

  6. #6
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Heu oui je me suis embrouillé j'ai écrit LDD pour LED. Bref c'était confus ..


    Et ton alimentation 48V peut délivrer combien d'ampère ?

Discussions similaires

  1. [PHP 5.3] heures du lever/coucher du soleil pour un lieu donné
    Par elcoyotos dans le forum Langage
    Réponses: 6
    Dernier message: 16/02/2017, 15h50
  2. Calcul des heures de lever/coucher du soleil
    Par #define dans le forum C#
    Réponses: 2
    Dernier message: 06/01/2016, 15h43
  3. Lever de soleil-Coucher de soleil
    Par mesbec dans le forum Général Java
    Réponses: 1
    Dernier message: 24/05/2013, 14h33
  4. [Formule] Lever et coucher du soleil
    Par psl dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/10/2002, 16h37

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