[premier projet] Dimmer & timer pour ruban de led

Bonjour à tous,

Pour commencer je tien à préciser que je ne connait rien à l’électronique et que mes connaissances en programmations sont très limitées.
Du coup après avoir réaliser un “truc qui marche” sur ma platine d’essai je viens chercher des commentaires/critiques avant de souder tout ça sur une strip-board.

Le projet est assez simple : il s’agit de contrôler l’éclaire de deux aquariums éclairer par des rubans à LEDs de deux couleurs différente (blanc chaud et blanc froid) en simulant (de manière simplifié) un lever et un coucher de soleil.
L’allumage et l’extinction se faisant à heures fixes chaque jour.

Voici le code que je compte utiliser (commenter en anglais au cas où…) :

/*
 Fade cycle on 2 minutes for testingpurpose (instead of 24 hours)

 */
//Librairies :
#include <Wire.h>
#include "RTClib.h"

//Variables :
RTC_DS1307 rtc;
int ledWarmWhite = 9;   // the pin that the warm white LEDs are attached to
int ledCoolWhite = 10;  // the pin that the cool white LEDs are attached to

//Fonctions to be called in loop :
void fadeIn(int pinWarm, int pinCool){
  /* //For debbuging purpose
    Serial.println("Start fade in");
  */    

    int brightnessWarm=0;
    int brightnessCool=0;
   
    while(brightnessWarm<150){
      brightnessWarm++;
      analogWrite(pinWarm, brightnessWarm);
      delay(10546);
      /* //For debbuging purpose
      Serial.print("Warm : ");
      Serial.println(brightnessWarm);
      Serial.print("Cool : ");
      Serial.println(brightnessCool);
      */
    }
    while(brightnessWarm<255){
      brightnessWarm++;
      brightnessCool++;
      analogWrite(pinWarm, brightnessWarm);
      analogWrite(pinCool, brightnessCool);
      delay(10546);
      /* //For debbuging purpose
      Serial.print("Warm : ");
      Serial.println(brightnessWarm);
      Serial.print("Cool : ");
      Serial.println(brightnessCool);
      */
    }
    while(brightnessCool<255){
      brightnessCool++;
      analogWrite(pinCool, brightnessCool);
      delay(10546);
      /* //For debbuging purpose
      Serial.print("Warm : ");
      Serial.println(brightnessWarm);
      Serial.print("Cool : ");
      Serial.println(brightnessCool);
      */
    }
    
 //   delay(10546/720); //10546ms for a 45' fade

}

void fadeOut(int pinWarm,int pinCool){
  /* //For debbuging purpose
    Serial.println("Start fade out");
  */

    int brightnessWarm=255;
    int brightnessCool=255;
   
    while(brightnessCool>150){
      brightnessCool--;
      analogWrite(pinCool, brightnessWarm);
      delay(10546);
      /* //For debbuging purpose
      Serial.print("Warm : ");
      Serial.println(brightnessWarm);
      Serial.print("Cool : ");
      Serial.println(brightnessCool);
      */
    }
    while(brightnessCool>0){
      brightnessWarm--;
      brightnessCool--;
      analogWrite(pinWarm, brightnessWarm);
      analogWrite(pinCool, brightnessCool);
      delay(10546);
      /* //For debbuging purpose
      Serial.print("Warm : ");
      Serial.println(brightnessWarm);
      Serial.print("Cool : ");
      Serial.println(brightnessCool);
      */
    }
    while(brightnessWarm>0){
      brightnessWarm--;
      analogWrite(pinWarm, brightnessWarm);
      delay(10546);
      /* //For debbuging purpose
      Serial.print("Warm : ");
      Serial.println(brightnessWarm);
      Serial.print("Cool : ");
      Serial.println(brightnessCool);
      */
    }


    

}





// the setup routine runs once when you press reset:
void setup(){
/* //For debbuging purpose
  Serial.begin(9600);
*/
  Wire.begin();
  rtc.begin();

    // following line sets the RTC to the date & time this sketch was compiled
    //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 8, 13, 13, 58, 0));
pinMode(ledCoolWhite, OUTPUT);
pinMode(ledWarmWhite, OUTPUT);



}

void loop()  {
   DateTime now = rtc.now(); //Check time
    if(now.hour()==12 && now.minute()==30){
      fadeIn(ledWarmWhite, ledCoolWhite );
    }else
        if(now.hour()==20 && now.minute()==45){
      fadeOut(ledWarmWhite, ledCoolWhite);
    }
    
    
/* //For debbuging purpose


    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
*/ 
    delay(30000); // just to not run the loop too often

}

Et coté matériel j’en suis là :

Comme vous le voyez le montage est réduit à sa plus simple expression, je me suis contenter de ce que je comprenais, mais en regardant différents montages similaires je vois qu’il y a souvent des composant supplémentaire, à priori pas nécessaires puisque ça marche sans, mais probablement essentiels puisque tout le monde les utilises :slight_smile:
Du coup je me pose la question de l’intérêt des résistances “pull-up” sur les canaux I2C , elles sont généralement présentes sur des break-out du coup j’ai un doute puisque l’Arduino en a en interne.
Et pour la partie PWM, je vois souvent des montages plus complets (ou simplement plus complexe…) comme par exemple ici :

Bon là c’est le montage le plus compliquer que j’ai pu trouver :smiley:

Cependant je m’interroge : bien que je ne vois rien de gênant à l’œil nu, est-ce que ce type de montage peu apporter quelque chose ? (fiabilité, durée de vie…).

Et sinon toutes les critiques sur le projet sont les bienvenues.

En vous remerciant,

LaMain

salut bon de mon coté je ne vois pas ton image , pour le site que tu a mis comme exemple les compossant sont la car il y a interface entre l’arduino et la puissance pour les led au moyen d’un mosfet.

il semble que l’auteur est réalisé un montage comparable a un driveur de mosfet , pour ne pas subire ce que l’on appelle l’effet miller lier a la charge de la grille , il utilise donc deux transistor l’un pour charger corectement la grille du mosfet et l’autre pour la decharger , ce montage a pour bute d’obtenire un signal pwm bien franc et collant le plus possible au signal de l’arduino.
pour un premier montage ce n’est peut’etre pas néccésaire faut voir ce que tu cherche a obtenir .

utilise tu les meme composant ? cherche tu a avoir un signal de gradation mini tres bas ? car si tu ne cherche pas ( c’est un example) a avoir unsignal en desous de 10% avant d’eteindre alors peut’etre que ton montage ne sera pas affecter( de maniere visible) par le temps de charge et decharge.

C'est corriger pour l'image.

Je te remercie pour ta réponse, j'utilise des composant non pas identique mais similaire (je reste sur du MOSFET). Donc si je comprend bien l'avantage de ce montage est d'avoir un PWM plus propre, mais si je ne vois rien je peu très bien m'en passer ?

Pour l'instant j'utilise effectivement toute la plage (0-255), mais je ne vois rien de gênant à l'œil, ceci dit je n'ai tester que sur deux rubans de 5cm alors qu'au final je l'utiliserais avec 2m de blanc froid et 1m de blanc chaud et surtout sur une durée de 7 secondes là ou j'en aurais pour 45 minutes (je passerais de 28ms à 10s par pas).

Je ferais les tests visuels sur un aquarium pour voir ce que ça donne et si il faut que je supprime une partie de la plage ça n'est pas gênant, si vraiment la plage à supprimer est trop grande je m'équiperais pour ce type de montage.

Merci encore.

Bonjour,

Il y a quelque chose que me gêne dans ton montage : Il n'y a rien pour limiter le courant dans les diodes ? Il y a des résistances dans les rubans ? (Je pense que oui)

Ne jamais mettre une simple LED comme indiqué sur ton schéma. Cordialement Géryko

Faut relativiser. Le PWM de l'arduino tourne à 490Hz soit une période d'environ 2ms. analogWrite code la valeur sur 8 bits donc il y a 256 pas ce qui fait un pas d'à peu près 8µs. Donc le gain apporté par la paire de transistors n'est pas nul mais reste relativement minime. Dans beaucoup de cas cela n'a pas grosse importance.

fdufnews: Faut relativiser. Le PWM de l'arduino tourne à 490Hz soit une période d'environ 2ms. ...

bonsoir tiens d'ailleurs , ça c'est une question pour Krys, est ce que les/certaines "bestioles" 8) ne seraient pas perturbées par un dimming PWM LED de trop basse frequence ? on s'accorde assez facilement sur une recurrence mini de 25Hz pour l'homme , mais les animaux ?

Bonsoir,

geryko: Il n'y a rien pour limiter le courant dans les diodes ? Il y a des résistances dans les rubans ? (Je pense que oui)

Effectivement, j'ai représenter le ruban avec ce que j'ai trouver, et je n'ai pas penser à ajouter de résistances sur le schéma mais elles sont bien présentent dans les ruban.

fdufnews: le gain apporté par la paire de transistors n'est pas nul mais reste relativement minime. Dans beaucoup de cas cela n'a pas grosse importance.

C'est bien ce qu'il m'avait sembler, du moins concernant la qualité de la lumière pour mes petits yeux d'humain. Mais je me demandais si ça pouvait jouer sur le vieillissement des composant. Mais bon comme je le disait il s'agît du cas le plus compliqué et comme il le dit c'est sûrement purement esthétique :-)

Pour en revenir a des montages plus simples (résistances pull-up sur les connecteur I2C, et pull-down sur les mosfet) Vous pensez que c'est utile (ne serais-ce que par précaution) même si l'arduino a des pull-down internes (pour l'I2C) et si mes led sont bien éteinte quand mes pin pwm sont à 0 ? C'est vraiment juste pour comprendre, c'est pas 4 résistances qui vont faire exploser mon budget ni empêcher le projet de tenir sur une carte :-)

Pour ce qui est de savoir si les bestioles peuvent être déranger par ces basses fréquences, j'ai un peu fouillé, et je n'ai rien trouver à part chez les éleveur où la réponse est "d'après le peu d'expérience qu'on a, on n'a rien mis en évidence", donc la réponse m'intéresse notamment chez les amphibiens.

Vous pensez que c'est utile (ne serais-ce que par précaution) même si l'arduino a des pull-down internes (pour l'I2C)

Les résistances de tirage à l'alim interne au micro-controleur sont de l'ordre de 35kohms +/- 15 kohms.

Les résistances pour l'I2C sont généralement de l'ordre de 5kohms ou moins. Utiliser une résistance interne qui peut valoir jusqu'à 50kohms pour la charge du réseau I2C fonctionnera dans des cas simples où il y a peu de composants à commander. Mais comme tu n'es pas à une résistance près c'est une bonne habitude que d'utiliser des résistances de charge de l'I2C de l'ordre de 4 à 5 kohms. Parce que le jour où tu verra plus grand avec plein de composants cela risque de ne plus fonctionner et toi de ne plus te rappeler que c'est la faute des résistances trop élevées.

Artouste:

fdufnews: Faut relativiser. Le PWM de l'arduino tourne à 490Hz soit une période d'environ 2ms. ...

bonsoir tiens d'ailleurs , ça c'est une question pour Krys, est ce que les/certaines "bestioles" 8) ne seraient pas perturbées par un dimming PWM LED de trop basse frequence ? on s'accorde assez facilement sur une recurrence mini de 25Hz pour l'homme , mais les animaux ?

ba ecoute c'est effectivement une question intéréssante, pour beaucoup de chose on se base sur la reponse humaine mais pas sur les animeau on sait que certaine espece n'on pas le meme " rafraichisement " au niveau retine , les insecte il me semble sont plus rapide , apres rien ne dit qu'il ne puissent pas etre perturbé , car la référence c'est encor une fois le soleil qui fournie un spectre bien defini est continue , les differente espece eyan evoluer avec cette contrainte , il parai evident que certaine fréquence peuvent aboutire a des gene !

il me semble que sur les humain des test a haute fréquence on révélé des etat de nause voir d'augmentation de l'agresivité.

Bonsoir

Je ne suis pas d'accord avec fdufnews. Un composant électronique à généralement un courant maxi en régime continu et peut tolérer des pointes de courant dans des durées limitées. voir datasheet du composant.

Partir du principe qu'il faut éviter les "pointes" surtout qu'il s'agit là d'un régime répétitif. Le transistor MOSFET est à mon avis saturé donc passant 100% Voir à l'oscillo. J'en resterai là sur le sujet.

Sur tes rubans il y a des résistances. Donc pas de problème. Le ruban doit être prévu pour 12 V

Concernant les résistances pull-up sur les connecteur I2C, elles sont nécessaires, indispensables pour ramener le potentiel "Haut" après un "bas" établi par drain (collecteur) ouvert. Sinon l'entrée n'a pas de potentiel déterniné, or il faut un "1". Les pull-up internes aux microprocesseurs (20 kohms) peuvent être utilisées mais leur valeur est un peu trop élevée pour bien faire. Elles sont surtout utilisées pour éviter d'avoir une entrée "en l'air" ou "flotante". De plus, si l'entrée est modifiée en sortie, elle sera toujours à "1" (tant que pull-up non supprimé).

Concernant les bestioles : je ne sais pas. Souvent j'ai vu des aquariums éclairés par des tubes fluorescents. Dans ce cas c'est carrément du 100 hz qu'elles reçoivent ! ! !

Cordialement Géryko

c'est vrai sur des ballaste feromagnetique, mais sur les electronique ont est entre 10et 20khz.

geryko: Je ne suis pas d'accord avec fdufnews. Un composant électronique à généralement un courant maxi en régime continu et peut tolérer des pointes de courant dans des durées limitées. voir datasheet du composant.

Je ne vois pas le rapport il était là question du temps de monté de la gate du mosfet.

Les néons avec ballast fero-magnétiques on longtemps été la norme en aquariophilie (avec les HQL pour les gros bac et le marin), pour des raisons de disponibilité et de prix. C'est vrai que personne ne c'est jamais plains de souci de comportement lié à l'éclairage mais bon ça reste de l'observation amateur (même si parfois très éclairés).

Je commence à comprendre un peu mieux le pourquoi des résistances pull-up sur l'I2C vos explication (et un peu de recherche complémentaire) m'ont décidées.

Pour les pull-down : hier après quelques tests je n'ai pas défait mon circuit mais j'ai débrancher toutes les alimentations (Arduino et 12V), et une ou deux heures plus tard je me suis rendu compte que les led éclairaient encore... très faiblement mais bon, ça m'a fait bizarre. Je n'ai pas réussis a reproduire ce phénomène mais je crois comprendre que c'est le rôle des pull-down que d'éviter ce genre de cas (courant résiduels ) ?

Dans tout les cas ça me conforte dans mon idée : mon "truc qui marche" n'est pas encore prêt pour la mise en service !

Bonjour,

Pour fdufnews. Je pensais que tu répondais à mon post situé juste au dessus. Mea-culpa Cordialement

Pour Lamain Je débute en Arduino. Le principe doit être le même pour les pull-down : Je ne sais pas encore s'il y en a dans "Arduino" ? ? Ailleurs, voir les schémas. Sur ton schéma il n'y en a pas et à priori il n'en faut pas puisque ta commande du mosfet par Arduino est soit à 0 soit à 1 (+ 5V) . La grille n'est jamais en l'air. Il serait prudent d'y mettre une résistance en série ( par ex 1K) pour protéger Auduino en cas de C/Ct du mosfet. Cordialement

Géryko

@geryko OK je comprends mieux le sens de ta remarque.