Contrôleur LED Z-Wave avec encodeur. Encodeur Z-Uno + MOSFET +



Dans la pièce où l'enfant joue, j'ai installé un éclairage supplémentaire sous la forme d'une bande LED. Au départ, j'avais prévu de contrôler la luminosité de la bande, ce qui est pratique pour régler l'éclairage de nuit. J'avais déjà un gradateur Z-Wave pour 220V, il était donc moins cher d'acheter un transformateur dimmable pour 12V pour 1000r qu'un contrôleur RGBW spécial de Fibaro pour 5500r.

Cette solution fonctionne, mais il y a des inconvénients:

  • Délai de gradation
  • Vous ne pouvez pas définir un niveau de luminosité très faible.

Après un an d'utilisation, j'ai décidé de réaliser mon contrôleur LED Z-Wave, mais avec un encodeur et un boitier variateur, pour une installation dans une prise.

Le schéma électrique de l'appareil est élémentaire; un codeur à 3 broches est directement connecté à Z-Uno: broche A, broche B et bouton. Mosfet se connecte à la broche PWM.



Matériaux et prix:
Non.MatièreLa photoPrix
1Carte Z-Wave Z-Uno3500 r
2MOSFET IRLR872927 r
3Encodeur EC1150 r

La carte Z-Wave Z-Uno est programmée dans l'environnement Arduino, l'esquisse pour le traitement des signaux de l'encodeur et le contrôle du mosfet ne prend que 143 lignes de code avec commentaires. Un croquis fonctionne comme suit:

Toutes les 128 μs, par interruption de la minuterie, nous vérifions dans quelle direction la roue est tournée, nous nous protégeons du rebond par un contrôle d'état quadruple. Dans la loupe, vérifiez que le bouton est enfoncé, chaque fois que vous appuyez sur, éteignez la bande ou activez le niveau de luminosité précédent. La luminosité peut être réglée à partir de l'encodeur et d'un téléphone ou d'un autre commutateur Z-Wave.



Code de commande du variateur à DEL
#define PUSH_BUTTON 23 #define ENCODER_CHA_PIN 19 #define ENCODER_CHB_PIN 20 #define LEV_SHIFT 8 #define ENCODER_DEBONCE 4 #define STATE_IDLE 0xFF #define STATE_SKIP 0xFE ZUNO_SETUP_ISR_GPTIMER(gpt_handler); ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_MULTILEVEL(getter, setter)); byte level = 0; byte last_reported_level = 0; byte g_state = STATE_IDLE; byte g_pins = 0; byte g_debounce_time = 0; byte last_push_button_state = HIGH; byte stored_level = 0; dword last_level_changed_time = 0; // Runs every 128 μs void gpt_handler() { byte pins = 0; pins = !digitalRead(ENCODER_CHA_PIN); if(!digitalRead(ENCODER_CHB_PIN)) pins |= 2; if(g_pins == pins) { // Is the state stable? g_debounce_time++; if(g_debounce_time>ENCODER_DEBONCE) { if(g_state == STATE_IDLE) { g_state = pins; } else if(g_state == STATE_SKIP) { if(pins == 0) g_state = 0; } else { if((g_state == 0 && pins == 1) || (g_state == 1 && pins == 3) || (g_state == 3 && pins == 2) || (g_state == 2 && pins == 0) ) { if (level < 39) { level++; } else if ((level + LEV_SHIFT) <= 255) { level += LEV_SHIFT; } else if ((level + LEV_SHIFT) > 255){ level = 255; } } else if((g_state == 0 && pins == 2) || (g_state == 2 && pins == 3) || (g_state == 3 && pins == 1) || (g_state == 1 && pins == 0) ) { if (level <= 39 && level !=0) { level--; } else if (level >= LEV_SHIFT) { level -= LEV_SHIFT; } else if (level < 0) { level = 0; } } if(g_state != pins) g_state = STATE_SKIP; } g_debounce_time = 0; } } else { g_debounce_time = 0; } g_pins = pins; } void setup() { Serial.begin(); pinMode(PUSH_BUTTON, INPUT_PULLUP); pinMode(ENCODER_CHA_PIN, INPUT); pinMode(ENCODER_CHB_PIN, INPUT_PULLUP); zunoGPTInit(ZUNO_GPT_SCALE1024|ZUNO_GPT_CYCLIC); // 32 MHz/1024 = 31.25 kHz (tick is 32 μs) zunoGPTSet(4); // 32 μs * 4 = 128 μs zunoGPTEnable(1); } void loop() { // Do we need to report the level? if(last_reported_level != level) { if (level > 0) { stored_level = level; } last_reported_level = level; analogWrite(PWM1, level); last_level_changed_time = millis(); Serial.print("Level: "); Serial.println(level); } // Button handler byte current_push_button_state = digitalRead(PUSH_BUTTON); if (current_push_button_state != last_push_button_state) { last_push_button_state = current_push_button_state; // if button pressed if (last_push_button_state == LOW) { // if LED turned ON, turn OFF if (level > 0) { analogWrite(PWM1, 0); level = 0; } // Restore last level else { analogWrite(PWM1, stored_level); level = stored_level; } } } // Send report if 2 seconds level not changed if (last_level_changed_time && millis() > last_level_changed_time + 2000) { last_level_changed_time = 0; zunoSendReport(1); } } void setter(byte value) { if (value > 99) { value = 99; } level = (long)value * 255 / 99; analogWrite(PWM1, level); } byte getter(void) { return last_reported_level * 99 / 255; } 


Pour changer la luminosité de la bande à l'aide du variateur que j'avais l'habitude d'utiliser, il fallait maintenir la touche vers le haut ou vers le bas, ce n'est pas très pratique, il est difficile de régler le niveau de luminosité souhaité. Et le gradateur ressemble à un interrupteur ordinaire, et non à un gradateur classique avec une roue à laquelle beaucoup sont habitués.



Pour le nouveau contrôleur LED Z-Wave, j'ai modifié le boîtier du gradateur - j'ai percé un trou pour l'encodeur et j'ai légèrement changé le support du cadre pour utiliser le cadre à partir d'un autre commutateur. Ne frappez pas pour la conception, faite de matériaux improvisés. Vous pouvez utiliser le boîtier fini d'un gradateur conventionnel pour avoir une apparence esthétique.



LUT décide! Pour la fabrication d'une seule instance de la carte, c'est mieux que LUTA je ne connais pas la technologie, j'ai donc fait 2 cartes qui s'intègrent parfaitement dans le cas de l'ancien gradateur. En bas, il y a Z-Uno, un mosfet et un bloc pour connecter l'alimentation et la bande, par la façon dont le mosfet est conçu pour des tensions jusqu'à 30V, de sorte que la bande peut être utilisée en 12V ou 24V, sans radiateur, le courant ne doit pas dépasser 5A.



Seul l'encodeur est situé en haut.



Après avoir connecté un sandwich des cartes et le placer dans le boîtier, nous obtenons un contrôleur LED Z-Wave.



Pour le moment, le contrôleur LED Z-Wave n'est pas installé dans la prise et repose sur un meuble TV. Pendant un certain temps, je vais tester le travail.



Mais maintenant, la commodité de contrôler la bande LED a considérablement augmenté, lors du contrôle à partir d'une roue ou d'un interrupteur de chevet, la luminosité change instantanément. Dans Z-Wave, l'échelle de variation est dans la plage de 0 à 99, vous pouvez utiliser la molette pour sélectionner le niveau de luminosité de 0 à 255. Lorsque vous tournez 1 division après 0, les LED s'allument un peu, cela ne réveillera personne la nuit, mais vous aidera à ne pas marcher sur un oubli Cube LEGO sur le sol.

Il a fallu 15 heures pour fabriquer l'appareil, 1 soirée d'écriture de firmware, 1 soirée de LUT, 1 soirée de travail avec un fichier.

MISE À JOUR 21/01/2018
Il y a plusieurs idées pour finaliser la conception, j'aimerais recevoir des commentaires.
Idée 1. Sur alik je vais commander un beau gradateur fini avec un panneau en verre et remplacer le remplissage, je peux gérer cela.
Idée 2. Utilisez une torsion avec un affichage similaire à la climatisation dans une voiture, le niveau de luminosité actuel sera affiché. Le problème est que je ne trouve pas la torsion avec un écran séparé de la climatisation.

MISE À JOUR 23/01/2018
Dans la plaque de montage, Schneider Electric Odace (80 r dans l'installation électrique) a assemblé un circuit contrôleur LED.



Le cadre Odace 90 p est (ce qui n'est pas sur la photo), mais la torsion n'est pas vendue séparément, mais je l'avais en stock. Aucun logement supplémentaire n'est prévu, l'appareil est complètement prêt.

Source: https://habr.com/ru/post/fr409727/


All Articles