Le Schéma :

Commençons par faire le tour de la propriété ! Le coeur du montage est un Arduino Nano, qui, en plus d'être bon marché, compacte, et pré-câblé, offre des sorties PWM (Modulation de largeur d'impulsions) en grand nombre. C'est ces dernières que nous allons utiliser pour varier chaque couleur. Vous l'aurez compris, on ne travaille pas sur la tension d'alimentation de leds mais sur le temps d'éclairement de celles-ci en dépassant largement la persistance rétinienne pour éviter tout phénomène de papillotement ou de scintillement . L'énergie étant fournie par un bloc secteur 12 volts, on nettoie l'arrivée par C1; les autres tensions sont fabriquées par l'Arduino.
On dispose de 3 boutons poussoir (Montée, descente de l'éclairage et Ok validation) sur 3 entrées digitales, tirées à "0" par des résistances de pull-down sur chacune; les valeurs ne sont pas critiques. Arduino permet de déclarer des résistances de pull-up internes, mais il faut inverser le niveau actif des entrées et mon circuit était déjà tracé .
Les sorties PWM viennent attaquer un opto-coupleur 4N35 via la résistance de limitation 470R afin d'assurer la séparation galvanique du 5 volts et de la puissance en 12 volts.
Les opto-couleurs pilotent des transistors Mos-Fet (IRLZ44N) via des résistances de limitation, des résistances de mise au potentiel bas, et des leds qui, en plus de servir de témoin de visualisation, abaissent l'impédence d'entrée et absorbent au pire des cas les courants inverses présentés sur le gate du transistor, tout en réduisant l'effet capacitif gate/source ! J'ai choisi volontairement un Mos-Fet pour leur basse résistance Drain/Source (RDSon) afin de bénéficier d'un plein rendement et d'un échauffement quasi nul ...
Le circuit imprimé :

L'implantation des composants:

Les CMS sont montés côté soudure et les composants traversants, de l'autre côté .


Le programme :
Pas de remarque concernant le programme; Le tout a été développé avec le logiciel Arduino en freeware et j'ai volontairement enrichi les commentaires pour éviter un descriptif hors page .
/* Programme de simulation de télé en fonctionnement en absence,
* et de commande de leds multicolores pour ambiance lumineuse.
* Par B.LECLERC/FEELGOOD
*/
const int UpButton = 7; // Déclaration d' Entrees
const int DwButton = 8;
const int OkButton = 12;
int ledRed = 3; // Déclaration de Sorties
int ledGrn = 5;
int ledBlu = 6;
int val0 = 0; // variables à valeurs aléatoires
int val1 = 0;
int val2 = 0;
int tmp;
int Nbr = 0;
int Rng = 0;
void setup()
{
pinMode(ledRed, OUTPUT); // Direction des pinuches
pinMode(ledGrn, OUTPUT);
pinMode(ledBlu, OUTPUT);
pinMode(UpButton, INPUT);
pinMode(DwButton, INPUT);
pinMode(OkButton, INPUT);
}
void loop(){
Debut: // Sous programme de mise sous tention--> simulation télé en marche !
val1 = random (0,255); // Genération de valeurs aléatoires calibrées pour simulation télé !
val2 = random (0,255);
val0 = random (0,255);
tmp = random (300,3000);
if (digitalRead(OkButton)==HIGH){ // Contrôle de la demande d'accès au réglage manuel de luminosité !
val1 = 0; // R à Z des couleurs si demande d'accès aux réglages manuels de luminosité !
val2 = 0;
val0 = 0;
goto usage; // Saute au sous programme du réglage manuel de luminosité !
}
analogWrite(ledRed, val1); // Ecriture des valeurs aléatoires sur les sorties leds, pendant un certain temps !
analogWrite(ledGrn, val2);
analogWrite(ledBlu, val0);
delay (tmp);
goto Debut; // Retour au debut et ainsi de suite !
usage: // Label de sous programme de demande de réglage manuel !
if (digitalRead(OkButton)==HIGH){ // Choix de la couleur à régler !
Rng = Rng + 1;
if (Rng == 4)(Rng = 1); // Remise à la 1° couleur!
delay (500);
}
if (digitalRead(UpButton)==HIGH){ // Monte de 0 à 255 par pas de 10 !
Nbr = Nbr + 10;
if (Nbr > 255)(Nbr = 0); // Trop Grand --> RàZ !
delay (200);
}
if (digitalRead(DwButton)==HIGH){ // Descend de 255 à 0 par pas de 10
Nbr = Nbr - 10;
if (Nbr < 1)(Nbr = 0); // Trop Petit --> Valeur maxi !
delay (200);
}
if (Rng == 3){ // Attribution de la valeur à la couleur !
(val1 = Nbr);
}
if (Rng == 1){ // Attribution de la valeur à la couleur !
(val2 = Nbr);
}
if (Rng == 2){ // Attribution de la valeur à la couleur !
(val0 = Nbr);
}
analogWrite(ledRed, val0); // Ecriture des valeurs réglées sur les sorties leds !
analogWrite(ledGrn, val2);
analogWrite(ledBlu, val1);
if (digitalRead(UpButton) == HIGH && digitalRead(DwButton) == HIGH) { // Remise en mode aléatoire en appuyant sur plus et moins simultanément !
goto Debut;
}
goto usage; // Et retour au sous-programme de réglage manuel !
}
Les premiers tests:

Les fichiers Originaux sont Zipés ici :
Cde led (71.29 Ko)