Z-Wave LED Controller mit Encoder. Z-Uno + MOSFET + Encoder

Published on January 18, 2018

Z-Wave LED Controller mit Encoder. Z-Uno + MOSFET + Encoder

  • Tutorial


In dem Raum, in dem das Kind spielt, habe ich eine zusätzliche Leuchte in Form eines LED-Bandes installiert. Anfangs plante ich, die Helligkeit des Bandes zu regeln, es ist zweckmäßig, das Nachtlicht einzustellen. Ich hatte bereits einen Z-Wave 220V-Dimmer, daher war es billiger, einen dimmbaren 12V-Transformator für 1000r zu kaufen als einen speziellen RGBW-Controller von Fibaro für 5500r.

Diese Lösung funktioniert, aber es gibt Nachteile:

  • Dimmverzögerung
  • Sie können keine sehr geringe Helligkeit einstellen.

Nach einem Jahr des Gebrauchs entschied ich mich, meinen Z-Wave LED-Controller herzustellen, aber mit einem Encoder und in einem Gehäuse aus einem Dimmer zum Einbau in eine Power-Box.

Die Prinzipdarstellung des Gerätes ist elementar, der Geber wird mit 3 Pins direkt an den Z-Uno angeschlossen: Pin A, Pin B und eine Taste. Mosfet verbindet sich mit PWM pinu.



Materialien und Preise:
Nein Material Foto Preis
1 Z-Wave Z-Uno Board 3500 r
2 MOSFET IRLR8729 27 r
3 Encoder EC11 50 r

Die Z-Wave Z-Uno-Karte ist in der Arduino-Umgebung programmiert. Die Skizze zur Verarbeitung der Signale vom Encoder und zur Steuerung der Mosfets benötigt nur 143 Codezeilen mit Kommentaren. Die Skizze funktioniert wie folgt:

Alle 128 µs prüfen wir durch Unterbrechung des Timers, in welche Richtung das Rad gedreht wird, und schützen es durch eine 4-fache Zustandsüberprüfung vor Abprall. In der Lupe überprüfen wir den Knopfdruck, bei jedem Druck schalten wir das Band aus oder auf die vorherige Helligkeitsstufe ein. Die Helligkeit kann entweder über den Encoder oder über ein Telefon oder einen anderen Z-Wave-Schalter eingestellt werden.



LED-Steuercode für Drehdimmer
#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;
}


Um die Helligkeit des Bands mit einem von mir verwendeten Dimmer zu ändern, musste die Taste nach oben oder unten gedrückt werden. Dies ist nicht sehr praktisch. Es ist schwierig, die gewünschte Helligkeitsstufe einzustellen. Ja, der Dimmer sieht aus wie ein normaler Schalter und nicht wie ein klassischer Dimmer mit einem Rad, an das viele gewöhnt sind.



Für den neuen Z-Wave LED-Controller habe ich das Dimmergehäuse modifiziert - ich habe ein Loch für den Encoder gebohrt und die Rahmenbefestigung leicht geändert, um einen Rahmen von einem anderen Schalter zu verwenden. Für das Design nicht treten, aus Schrott hergestellt. Sie können den fertigen Körper vom üblichen Dimmer benutzen, um ästhetisch auszusehen.



LUT entscheidet! Für die Herstellung einer einzelnen Kopie der Platine kenne ich die Technologie nicht besser als die LUT, daher habe ich zwei Platinen hergestellt, die perfekt in den Fall des alten Dimmers passen. Im unteren Teil befindet sich ein Z-Uno, ein Mosfet und ein Block zum Anschließen des Netzteils und des Bandes. Die Mosfets sind übrigens für Spannungen bis 30 V ausgelegt, daher kann das Band sowohl für 12 V als auch für 24 V verwendet werden, ohne einen Heizkörper ist es besser, 5 A nicht zu überschreiten.



Im oberen Teil befindet sich nur der Encoder.



Wir kombinieren ein Sandwich aus den Platinen und legen es in das Gehäuse. Wir haben einen Z-Wave LED-Controller.



Der Z-Wave LED-Controller ist derzeit nicht im Plug-In installiert und liegt auf dem TV-Schrank auf. Irgendwann werde ich die Arbeit noch testen.



Aber auch jetzt ist der Bedienkomfort des LED-Bandes erheblich gestiegen: Wenn es über das Rad oder den Nachtschalter gesteuert wird, ändert sich die Helligkeit sofort. Bei Z-Wave liegt die Dimmskala im Bereich von 0 bis 99, mit Hilfe des Rades können Sie die Helligkeitsstufe von 0 bis 255 einstellen. Beim Drehen um 1 Division nach 0 leuchten die LEDs ein wenig, nachts wecken sie niemanden auf, helfen aber nicht, auf das versehentlich Vergessene zu treten LEGO Würfel auf dem Boden.

Es dauerte 3 Abende, um das Gerät zu erstellen, 1 Abend - Schreiben der Firmware, 1 Abend LUT, 1 Abend Arbeit mit einer Datei.

UPDATED 01/21/2018
Es gibt mehrere Ideen für die Fertigstellung des Designs, ich möchte Kommentare erhalten.
Idee 1. Ich bestelle einen schönen Dimmer mit einer Glasscheibe auf alik und ersetze die Füllung, ich kann damit umgehen.
Idee 2. Um eine Drehung mit einem Display wie der Klimasteuerung in einem Auto zu verwenden, zeigt das Display die aktuelle Helligkeitsstufe an. Das Problem ist, dass ich keinen Spinner mit einem Display finden kann, der von der Klimaanlage getrennt ist.

UPDATED 01/23/2018
Auf der Montageplatte von Schneider Electric Odace (80 r in der elektrischen Installation) wurde eine LED-Steuerschaltung montiert.



Frame Odace 90 p steht (was nicht auf dem Foto ist), aber der Twirl ist nicht separat erhältlich, aber ich hatte es auf Lager. Jeder weitere Fall ist nicht geplant, das Gerät ist komplett einsatzbereit.