Luz noturna agendada

imagem

Com o nascimento de um filho, surgiu a pergunta sobre uma lâmpada noturna. Em algum lugar, eles leem que é necessário um sono tranquilo. Rapidamente usado para dormir com pouca luz. É muito conveniente acordar de gritos e uivos no meio da noite e ver do que o bebê está reclamando (se é que você consegue entender). Além disso, com pouca luz, você pode balançar, virar e continuar dormindo.

Inicialmente, uma amostra de teste da lâmpada foi feita a partir de um pedaço de fita LED amarela (12 volts), que foi usada por 1,5 anos.


imagem

Além do design frágil, começou a incomodar todas as manhãs para remover a fonte de alimentação da lâmpada da tomada. Levanto-me de manhã, luz suficiente entra na sala da rua. Assim, a lâmpada é desperdiçada por várias horas todos os dias. Mais uma vez, em meio ano, o controlador de fita RGB chinês esqueceu a configuração atual e foi necessário procurar um painel de controle para lembrá-lo de como trabalhar. Decidi fazer uma nova lâmpada com desligamento automático, com ajuste de cor usando potenciômetros e rádio.

Montou rapidamente um protótipo baseado no arduino nano. Depure a funcionalidade básica.

imagem

Aproveitei esta oportunidade para experimentar o Fritzing. Não gostei, mas as imagens são claras e "engraçadas". Aparentemente, nada de novo foi inventado.

imagem

Substituiu "nano" por um módulo pouco conhecido e compatível com arduino por um transceptor de rádio embutido (controlador de 8 bits, desempenho e enchimento são comparáveis ​​a "Nana"). Em casa, eu já tenho um dispositivo operando na frequência de 868 MHz, este será o segundo. Breves especificações no site do fabricante:

Breves características
imagem


imagem

Não vejo grandes problemas fazendo o mesmo no ESP8266 (existe um coletor de firmware on-line conveniente para scripts no LUA). Um pouco mais complicado no Bluetooth (para atualizar o módulo HM-10, você precisa de um programador barato, ambiente de desenvolvimento e entendimento do protocolo). Embora você possa usar o módulo Bluetooth com o arduino. Mas eu usei o ZUNo, porque ele está mentindo e me esperando há muito tempo, e toda a infraestrutura está pronta para conectar e gerenciar dispositivos semelhantes em uma rede (estou falando do controlador de rede doméstica inteligente).
Para todas as pernas usadas no arduino, foram encontrados análogos no módulo.

imagem

Para trabalhar com o módulo do IDE do Arduino, é necessário configurá-lo (a descrição das configurações está no site do fabricante). Nenhum milagre aconteceu. Ao tentar compilar, recebi o erro "não suporta" for "instrução com colunas vazias ou sem corpo!" Eu usei a biblioteca Adafruit_NeoPixel. Entrei nele, vi quantos ciclos havia nele e o fechei. Eu tive que ir novamente ao site do fabricante e procurar exemplos de trabalho com LEDs (um exemplo foi encontrado rapidamente). Portanto, não sou o primeiro a encontrar um problema semelhante.

Para que esta lâmpada seja controlada por rádio no código do Arduino, você precisa adicionar uma macro e implementar várias funções:

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 descreve um dispositivo Z-Wave com três comutadores de vários níveis (controle RGB) e um comutador simples (ligar / desligar simples).

Eu tenho a implementação mais simples de funções (como nos exemplos no site do fabricante). Você pode vê-lo na lista em anexo.

Seleção de caso


Eu já tive um caso. Selado com uma tampa transparente . Sob a tampa, ajuste 25 LEDs. Os testes foram bem sucedidos. A lâmpada possui uma grande margem de brilho no meu quarto. A capa deste gabinete é transparente, então decidi difundir um pouco a luz.

imagem

Contas coloridas esboçadas e cubos de acrílico, preenchidos com epóxi transparente. A tinta das contas coloridas se dissolveu sob a influência da resina.

imagem

O mais interessante é que a tampa da caixa selada vazou e quase toda a resina vazou. Não sei onde consegui bater na tampa, mas depois de secar a fenda é claramente visível.

imagem

A placa de circuito impresso foi feita pelo método fotorresistivo.

imagem

imagem

Após decapagem e usinagem

imagem

O módulo com o microcontrolador foi substituído por seu protótipo, que estava no armário (porque não é uma pena, mas o ZUNo precisa ser protegido). A primeira versão do ZUNo, mas as dimensões são maiores e piores que a antena, e você já não pode comprá-lo. Os testes foram mais ou menos bem-sucedidos. O último segmento teve que ser soldado novamente. Foi originalmente soldado para o lado errado. E ajuste o número de LEDs no firmware.

imagem

imagem

Aqui está o que aconteceu:

imagem

Rádio controle


Janela principal com canais de controle da lâmpada

imagem

Ajustar o brilho de um canal da faixa de LED

imagem

Definir o desligamento matinal da luz noturna

imagem

Conclusão


O dispositivo está funcionando. É compacto e arrumado. É alimentado pelo carregamento de um telefone celular.
Dos problemas observados:

  • durante a montagem, retire parte das faixas em resistores variáveis; portanto, no modo manual, você pode controlar apenas um canal.
  • apenas 20 dos 25 LEDs funcionam normalmente. Eu tenho muito disso, então provavelmente deixarei identificar falhas mais graves

Esboço de luz noturna
 #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/pt433194/


All Articles