Le variateur de tension AC est un module permettant de faire varier la puissance d’un courant alternatif. Il a la même utilité qu’un transistor en courant continu. Il permet notamment de faire varier la luminosité d’une lampe alimentée en 220V ou faire varier la vitesse d’un ventilateur, par exemple.
Matériel
- Ordinateur
- Arduino UNO
- Câble USB A Mâle/B Mâle
- AC Light Dimmer
Principe de fonctionnement
Le variateur de lumière AC est constitué d’un triac(équivalent du transistor en courant continu) et d’un détecteur de passage à zéro de la phase afin de synchroniser la variation de tension et la phase du courant alternatif.
Schéma
Pour ce qui est du schéma électrique, le module est relié au secteur via le bornier AC-IN et l’ampoule se branche au bornier LOAD. Côté électronique, les broches se connectent comme suit:
- Vcc à la broche 5 ou 3.3V du microcontrôleur
- GND à la masse GND du microcontrôleur
- Z-C à la broche 2
- PWM à la broche 3
Si vous utilisez plusieurs variateurs, les broches Z-C sont toutes reliées à la même broche du microcontrôleur (dans notre cas D2). La librairie RBDdimmer utilisent certaines broches en particulier, selon le microcontrôleur utilisé. Vérifiez bien dans la documentation de la librairie les broches que vous pouvez utiliser.
Code
Pour utiliser le module AC Light Dimmer, nous utilisons la librairie RBDdimmer.h. La librairie va gérer la synchronisation entre le signal PWM, qui règle la puissance, et la phase du courant alternatif. Une fois la librairie importée et le module initialisé, il ne nous reste qu’à choisir le niveau de puissance entre 0 et 100%.
//Libraries #include <RBDdimmer.h>//https://github.com/RobotDynOfficial/RBDDimmer //Parameters const int zeroCrossPin = 2; const int acdPin = 3; int MIN_POWER = 0; int MAX_POWER = 80; int POWER_STEP = 2; //Variables int power = 0; //Objects dimmerLamp acd(acdPin); void setup(){ //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); acd.begin(NORMAL_MODE, ON); } void loop(){ testDimmer(); } void testDimmer(){/* function testDimmer */ ////Sweep light power to test dimmer for(power=MIN_POWER;power<=MAX_POWER;power+=POWER_STEP){ acd.setPower(power); // setPower(0-100%); Serial.print("lampValue -> "); Serial.print(acd.getPower()); Serial.println("%"); delay(100); } for(power=MAX_POWER;power>=MIN_POWER;power-=POWER_STEP){ acd.setPower(power); // setPower(0-100%); Serial.print("lampValue -> "); Serial.print(acd.getPower()); Serial.println("%"); delay(100); } }
Résultat
La luminosité de l’ampoule varie en fonction de la valeur ‘power’ envoyée au module. Il est bon de noter que ce module fonctionne avec des charges ‘dimmables’ et fonctionne mieux avec des ampoules à incandescences. J’utilise une ampoule à LED et la variation fonctionne bien entre 6% et 40%. En dessous de 6%, la lampe s’éteint, au delà, je n’observe pas de changement de luminosité et l’ampoule s’éteint au-dessus de 85%.
Bonus: Gestion de deux variateurs de tension AC
Si vous souhaitez utiliser un autre variateur de tension AC en même temps, il suffit de brancher la broche Z-C à la broche 2 (sur UNO) et la broche PWM à la broche 5 (ou une autre broche PWM).
Dans le code, pour gérer deux modules, il faut déclarer un objet dimmerLamp supplémentaire en initialisant la bonne broche de sortie.
//Libraries #include <RBDdimmer.h>//https://github.com/RobotDynOfficial/RBDDimmer //Constants #define nbACD 2 //Parameters const int zeroCrossPin = 2; const int acdPin[nbACD] ={3,5}; int MIN_POWER[nbACD] ={0,0}; int MAX_POWER[nbACD] ={80,80}; int POWER_STEP[nbACD] ={1,1}; //Variables int power[nbACD] ={0,0}; dimmerLamp acd[nbACD] ={dimmerLamp(acdPin[0]),dimmerLamp(acdPin[1])}; void setup(){ //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); for(int i=0;i<nbACD;i++) acd[i].begin(NORMAL_MODE, ON); } void loop(){ testDimmer(); } void testDimmer(){/* function testDimmer */ ////Sweep light power to test dimmer for(int i=0;i<nbACD;i++){ for(power[i]=MIN_POWER[i];power[i]<=MAX_POWER[i];power[i]+=POWER_STEP[i]){ acd[i].setPower(power[i]); // setPower(0-100%); Serial.print(F("lampValue "));Serial.print(i);Serial.print(F(" -> ")); Serial.print(acd[i].getPower()); Serial.println(F("%")); delay(100); } for(power[i]=MAX_POWER[i];power[i]>=MIN_POWER[i];power[i]-=POWER_STEP[i]){ acd[i].setPower(power[i]); // setPower(0-100%); Serial.print(F("lampValue "));Serial.print(i);Serial.print(F(" -> ")); Serial.print(acd[i].getPower()); Serial.println(F("%")); delay(100); } } }
Les deux lampes s’allument et s’éteignent de manière progressive, l’une après l’autre. Vous pouvez, à présent, appliquer ce tutoriel pour gérer toutes les lampes de votre maison.
Applications
- Contrôler la luminosité d’une chambre en fonction de l’heure de la journée
- Contrôler la vitesse d’un ventilateur en fonction de la température de la pièce
Sources
- https://robotdyn.com/ac-light-dimmer-module-1-channel-3-3v-5v-logic-ac-50-60hz-220v-110v.html
- https://github.com/RobotDynOfficial/RBDDimmer
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Excellent ! Enfin un qui fonctionne !!!
Bonjour,
j’ai copié le code mais quand je vérifie, j’ai une erreur qui s’affiche « stray /302 »
si vous savez pourquoi je suis preneur… merci!
Bonjour, l’erreur « stray /302 » correspond à un caractère invisible qui s’est inséré dans votre code.
Cela peut arriver lorsqu’on copie-colle un code d’un site internet.
Certains éditeurs de texte comme notepad2e permettent de repérer rapidement ces caractères et de les supprimer.
Bonjour,
Tout d’abord je suis un débutant amateur d’Arduino,
une erreur s’affiche :
» exit status 1
request for member ‘begin’ in ‘acdPin’, which is of non-class type ‘const int’ »
Pouvez-vous m’aider ?
Bonjour,
la fonction est acd.begin(NORMAL_MODE, ON); et non pas acdPin.begin(NORMAL_MODE, ON);
Merci !
Bonjour, merci pour ce travail.
Est-il possible de faire une variation par train d’onde afin de ne pas générer de parasite et de prolonger la duré de vie de la résistance électrique.
Utilisation pour un ballon d’eau chaude afin de stocké un surplus solaire quand les batterie sont pleine.
Bonne journée.
Bonjour,
Lors de la compilation j’ai le message d’erreur suivant:
Arduino : 1.8.13 (Windows 10), Carte : « Arduino Uno »
loading libs from C:\Users\jodo1\OneDrive\Documents\Arduino\libraries: loading library from C:\Users\jodo1\OneDrive\Documents\Arduino\libraries\RBDDimer: loading library.properties: Error reading file (C:\Users\jodo1\OneDrive\Documents\Arduino\libraries\RBDDimer\library.properties:6): Invalid line format, should be ‘key=value’
Erreur de compilation pour la carte Arduino Uno
Quelqu’un peut-il m’aider?
Merci
Il semble y avoir un problème d’installation de la librairie RBDDimer. Où avez vous trouvé la librairie et comment l’avez-vous installée?
La librairie devrait s’appeler RBDDimmer avec deux « m ».
Bonjour,
value= analogRead(A0);
power = map(x, 0, 1023, 0, 100);
acd.setPower(power);