
En la habitación donde está jugando el niño, instalé iluminación adicional en forma de tira de LED. Inicialmente, planeé controlar el brillo de la cinta, esto es conveniente para configurar la iluminación nocturna. Ya tenía un atenuador Z-Wave de 220V, por lo que era más barato comprar un transformador regulable de 12V para 1000r que un controlador especial Fibaro RGBW para 5500r.
Esta solución funciona, pero hay inconvenientes:
- Retardo de atenuación
- No puede establecer un nivel de brillo muy bajo.
Después de un año de uso, decidí hacer mi controlador LED Z-Wave, pero con un codificador y una caja de atenuación, para instalarlo en un zócalo.
El diagrama del circuito del dispositivo es elemental; un codificador con 3 pines está conectado directamente a Z-Uno: pin A, pin B y botón. Mosfet se conecta al pin PWM.

Materiales y precios:
La placa Z-Wave Z-Uno está programada en el entorno Arduino, el boceto para procesar señales del codificador y controlar el mosfet solo toma 143 líneas de código con comentarios. Un boceto funciona de la siguiente manera:
Cada 128 μs, por interrupción del temporizador, verificamos en qué dirección gira la rueda, nos protegemos del rebote mediante una verificación de estado de 4 veces. En la lupa, verifique que el botón esté presionado, cada vez que presione, apague la cinta o encienda el nivel de brillo anterior. El brillo se puede configurar tanto desde el codificador como desde un teléfono u otro interruptor Z-Wave.
Código de control LED de atenuador rotativo#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; }
Para cambiar el brillo de la cinta usando el atenuador que solía usar, tenía que mantener presionada la tecla hacia arriba o hacia abajo, no es muy conveniente, es difícil ajustar el nivel de brillo deseado. Y el atenuador se ve como un interruptor ordinario, y no como un atenuador clásico con una rueda a la que muchos están acostumbrados.

Para el nuevo controlador LED Z-Wave, modifiqué la caja del atenuador: taladré un agujero para el codificador y cambié ligeramente el montaje del marco para usar el marco de otro interruptor. No patear por el diseño, hecho de materiales improvisados. Puede usar la carcasa terminada de un atenuador convencional para lucir estéticamente agradable.

LUT decide! Para la fabricación de una sola instancia de la placa, es mejor que LUTA. No conozco la tecnología, por lo que hice 2 placas que encajan perfectamente en el caso del viejo dimmer. En la parte inferior hay Z-Uno, un mosfet y un bloque para conectar la alimentación y la cinta, por cierto, el mosfet está diseñado para voltajes de hasta 30V, por lo que la cinta se puede usar como 12V o 24V, sin un radiador, la corriente no debe exceder más de 5A.

Solo el codificador se encuentra en la parte superior.

Después de conectar un emparedado de las placas y colocarlo en la caja, obtenemos un controlador LED Z-Wave.

Por el momento, el controlador LED Z-Wave no está instalado en el zócalo y se encuentra en un soporte de TV. Por un tiempo probaré el trabajo.

Pero ahora la conveniencia de controlar la tira de LED ha aumentado considerablemente, cuando se controla desde una rueda o un interruptor de cabecera, el brillo cambia instantáneamente. En Z-Wave, la escala de atenuación está en el rango de 0 a 99, puede usar la rueda para seleccionar el nivel de brillo de 0 a 255. Cuando gira 1 división después de 0, los LED se iluminan un poco, no despertará a nadie por la noche, pero ayudará a no pisar un objeto olvidado al azar Cubo LEGO en el suelo.
Se necesitaron 3 pm para hacer el dispositivo, 1 tarde escribiendo firmware, 1 tarde LUT, 1 tarde trabajando con un archivo.
ACTUALIZADO 21/01/2018
Hay varias ideas para finalizar el diseño, me gustaría recibir comentarios.
Idea 1. En alik pediré un hermoso atenuador terminado con un panel de vidrio y reemplazaré el relleno, puedo manejar esto.
Idea 2. Use un giro con una pantalla similar al control de clima en un automóvil; se mostrará el nivel de brillo actual. El problema es que no puedo encontrar el giro con una pantalla separada del control de clima.
ACTUALIZADO 23/01/2018
En la placa de montaje, Schneider Electric Odace (80 r en la instalación eléctrica) ensambló un circuito controlador LED.

El marco Odace 90 p es (que no está en la foto), pero el giro no se vende por separado, pero lo tenía en stock. No se planifica una vivienda adicional; el dispositivo está completamente listo.
