Luz nocturna programada

imagen

Con el nacimiento de un niño, surgió la pregunta sobre una lámpara de noche. En algún lugar leyeron que es necesario un sueño tranquilo. Rápidamente solía dormir con una luz tenue. Es muy conveniente despertarse de los gritos y aullidos en medio de la noche y ver de qué se queja el bebé (si puede entenderlo). Además, con poca luz, puede balancearse, voltearse y continuar durmiendo.

Inicialmente, se hizo una muestra de prueba de la lámpara a partir de un trozo de tira de LED amarillo (12 voltios), que se utilizó durante 1,5 años.


imagen

Además del diseño endeble, comenzó a molestar todas las mañanas para quitar la fuente de alimentación de la lámpara del tomacorriente. Me levanto por la mañana, entra suficiente luz desde la calle. Por lo tanto, la lámpara se desperdicia durante varias horas todos los días. Una vez más, en medio año, el controlador de cinta RGB chino olvidó la configuración actual y tuvo que buscar el panel de control para recordarle cómo trabajar. Decidí hacer una nueva lámpara con apagado automático, con ajuste de color usando potenciómetros y radio.

Ensambló rápidamente un prototipo basado en arduino nano. Depurar la funcionalidad básica.

imagen

Aproveché esta oportunidad para probar Fritzing. No me gustó, pero las imágenes son claras y "divertidas". Aparentemente no se ha inventado nada nuevo.

imagen

Reemplazó "nano" por un módulo poco conocido, compatible con Arduino, con un transceptor de radio incorporado (controlador de 8 bits, el rendimiento y el relleno es comparable a "Nana"). En casa, ya tengo un dispositivo funcionando a una frecuencia de 868 MHz, este será el segundo. Breves especificaciones del sitio web del fabricante:

Breves caracteristicas
imagen


imagen

No veo grandes problemas para hacer lo mismo en ESP8266 (hay un conveniente recopilador de firmware en línea para scripts en LUA). Un poco más complicado en Bluetooth (para actualizar el módulo HM-10 necesita un programador económico, un entorno de desarrollo y una comprensión del protocolo). Aunque puedes usar el módulo Bluetooth con el arduino. Pero usé ZUNo, porque ha estado mintiéndome y esperándome durante mucho tiempo, y toda la infraestructura está lista para conectarse y administrar dispositivos similares en una red (estoy hablando del controlador de red doméstica inteligente).
Para todas las patas usadas en arduino, se encontraron análogos en el módulo.

imagen

Para trabajar con el módulo desde el IDE de Arduino, debe configurarlo (la descripción de la configuración se encuentra en el sitio web del fabricante). No sucedió ningún milagro. Al intentar compilar, recibí el error "¡no admite la declaración" for "con columnas vacías o sin cuerpo!" Usé la biblioteca Adafruit_NeoPixel. Me subí a él, vi cuántos ciclos había en él y lo cerré. Tuve que volver al sitio web del fabricante y buscar ejemplos de trabajo con LED (se encontró rápidamente un ejemplo). Entonces no soy el primero en encontrar un problema similar.

Para que esta lámpara sea controlada por radio en el código Arduino, debe agregar una macro e implementar varias funciones:

ZUNO_SETUP_CHANNELS( ZUNO_SWITCH_MULTILEVEL(getRed, setRed), ZUNO_SWITCH_MULTILEVEL(getGreen, setGreen), ZUNO_SWITCH_MULTILEVEL(getBlue, setBlue), ZUNO_SWITCH_BINARY(switch_getter, switch_setter) ); 

Esta macro describe un dispositivo Z-Wave con tres interruptores de niveles múltiples (control RGB) y un interruptor simple (encendido / apagado simple).

Tengo la implementación más simple de funciones (como en los ejemplos en el sitio web del fabricante). Puedes verlo en el listado adjunto.

Selección de caso


Ya tuve un caso. Sellado con una cubierta transparente . Debajo de la tapa caben 25 LED. Las pruebas fueron exitosas. La lámpara tiene un gran margen de brillo para mi habitación. La cubierta de este estuche es transparente, así que decidí difuminar un poco la luz.

imagen

Bolas de colores esbozadas y cubos acrílicos, rellenos de epoxi transparente. La pintura de las cuentas coloreadas se disolvió bajo la influencia de la resina.

imagen

Lo más interesante es que la tapa de la carcasa sellada se filtró y casi toda la resina se filtró. No sé dónde logré golpear la tapa, pero después de secar la grieta es claramente visible.

imagen

La placa de circuito impreso fue hecha por el método fotorresistivo.

imagen

imagen

Después de decapado y mecanizado

imagen

El módulo con el microcontrolador fue reemplazado por su prototipo, que yacía en el armario (porque no es una pena, pero ZUNo necesita protección). La primera versión de ZUNo, pero las dimensiones son más grandes y peores que la antena, y ya no puedes comprarla. Las pruebas fueron más o menos exitosas. El último segmento tuvo que volverse a soldar. Originalmente fue soldado al lado equivocado. Y ajuste la cantidad de LED en el firmware.

imagen

imagen

Esto es lo que sucedió:

imagen

Radio control


Ventana principal con canales de control de la lámpara.

imagen

Ajuste el brillo de un canal de la tira de LED

imagen

Configurar el apagado matutino de la luz nocturna

imagen

Conclusión


El dispositivo esta funcionando. Es compacto y ordenado. Se alimenta cargando un teléfono móvil.
De los problemas notados:

  • durante el ensamblaje, arrancó parte de las pistas en resistencias variables, por lo que en modo manual puede controlar solo un canal.
  • solo 20 de los 25 LED funcionan normalmente. Tengo mucho de esto, así que lo dejaré para identificar fallas más serias

Bosquejo de luz nocturna
 #include "ZUNO_NeoPixel.h" #define MAX_PIXELS 20 // NB! Z-Uno can not control more than 25 WS2811 without harming RF communications #define PIXEL_SIZE 3 // Three colors per pixel #define BUFF_SIZE (MAX_PIXELS * PIXEL_SIZE) byte pixel_buff[BUFF_SIZE]; NeoPixel pixels(pixel_buff, BUFF_SIZE); #define B_PRESSED 1 #define BUTTON_PIN 1 // Digital IO pin connected to the button. This will be #define DEF_RED 30 #define DEF_GREEN 20 byte red = DEF_RED; byte green = DEF_GREEN; byte blue = 0; #define POWER_ON 1 #define POWER_OFF 0 byte light_power = POWER_ON; byte last_light_power = POWER_OFF; ZUNO_SETUP_CHANNELS( ZUNO_SWITCH_MULTILEVEL(getRed, setRed), ZUNO_SWITCH_MULTILEVEL(getGreen, setGreen), ZUNO_SWITCH_MULTILEVEL(getBlue, setBlue), ZUNO_SWITCH_BINARY(switch_getter, switch_setter) ); void switch_setter(byte value) { Serial.println("switch"); Serial.print("value= "); Serial.println(value); if(value > 1) light_power = POWER_ON; else light_power = POWER_OFF; } byte switch_getter() { return light_power; } int getRed() { return red/2.56; } int getGreen() { return green/2.56; } int getBlue() { return blue/2.56; } void setRed(byte value) { red = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void setGreen(byte value) { green = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void setBlue(byte value) { blue = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void set_LEDS() { for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); } void read_resistors() { red = (analogRead(A0) >> 2) & 0xff; green = (analogRead(A1) >> 2) & 0xff; blue = (analogRead(A3) >> 2) & 0xff; Serial.print(red); Serial.print(" "); Serial.print(green); Serial.print(" "); Serial.print(blue); Serial.print(" "); Serial.println(); set_LEDS(); } #define DEBOUNCE_ACK 10 byte check_button() { static bool oldState = HIGH; byte debounce_cnt = 0; static byte ret = 0; if(digitalRead(BUTTON_PIN) == LOW) { if(ret != B_PRESSED) while(digitalRead(BUTTON_PIN) == LOW) { if(debounce_cnt == DEBOUNCE_ACK) { ret = B_PRESSED; break; } else debounce_cnt++; delay(10); } } else { debounce_cnt = 0; ret = 0; } return ret; } void setup() { Serial.begin(9600); pixels.begin(); pixels.clear(); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { if(check_button() == B_PRESSED) read_resistors(); if(last_light_power != light_power) { Serial.println("set power"); if(light_power == POWER_OFF) { Serial.println("power off"); red = 0; green = 0; blue = 0; } else { Serial.println("power on"); red = DEF_RED; green = DEF_GREEN; blue = 0; } set_LEDS(); last_light_power = light_power; } } 

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


All Articles