/led-control

Iluminação IoT usando LEDs NeoPixel, controle remoto e mudança automática de iluminação

Primary LanguageGoMIT LicenseMIT

LED Control

Iluminação IoT usando LEDs NeoPixel, controle remoto e mudança automática de iluminação.

A intenção original era criar um sistema simples de iluminação dinâmica para o meu quarto, usando IoT, e também permitir controlar isso remotamente (já que não tenho interruptor próximo à minha cama...), além de mudar automaticamente a iluminação em certos momentos do dia.

Servidor no Raspberry Pi Pico W

Exemplo do circuito de LEDs em execução

Vamos usar o Raspberry Pi Pico W como um servidor HTTP 1.1 e também como um controlador para os LEDs NeoPixel. Esse dispositivo possui uma antena Wi-Fi, por isso ele é ideal para um servidor HTTP IoT.

Circuito

Os requisitos mínimos para montar o projeto são:

A montagem pode ser feita de acordo com essa esquemática.

Instalação

O projeto encontra-se na pasta rpi-pico-w.

  1. Baixe a IDE Thonny.
  2. Conecte seu Raspberry Pi Pico W e instale o MicroPython.
  3. Vá ao menu Ferramentas > Gerenciar pacotes. Instale os pacotes picozero e neopixel.
  4. Abra o arquivo main.py. Altere as variáveis SSID e PASSWD para as suas credenciais do seu Wi-Fi.
  5. Você poderá executar a aplicação para testar nesse momento. Para fazer com que o MicroPython fique responsivo novamente, basta parar a aplicação.
  6. Após testar, selecione a opção para salvar o script, e salve-o no seu Raspberry Pi Pico W, exatamente com o nome main.py.

Caso você tenha acesso à sua configuração do roteador, recomendo definir um IP estático para o Raspberry Pi Pico W.

Comportamento e Rotas

Abaixo temos uma breve descrição dos comportamentos do servidor e das rotas que podem ser usadas.

Todas as rotas retornam um documento JSON com o seguinte formato:

{
    "blinking": true,
    "program": 2,
    "dim": 0.1474,
    "color": "ffa648"
}
  • blinking: Se os LEDs estão ligados ou não.
  • program: Programa sendo executado. Os programas são sempre um dos números 0 (modo Natal), 1 (modo Rastro) e 2 (modo Lâmpada -- padrão).
  • dim: Nível de intensidade da luz. Deve ser um número entre 0.02 e 1.0.
  • color: Cor atual dos LEDs (apenas para o modo Lâmpada). Trata-se de uma string com valores hexadecimais no formato ffffff.

Os valores de program, dim e color podem ser alterados e retornados normalmente, mesmo que o LED esteja desativado. Igualmente, o valor de color também pode ser alterado e retornado, mesmo que o equipamento não esteja no modo Lâmpada.

Caso você realize uma requisição em uma rota desconhecida, o servidor retornará um erro 404.

Status do servidor

  • GET /led

Retorna o status da aplicação, sem realizar nenhuma modificação.

Ligar/Desligar

  • POST /led/on
  • POST /led/off
  • POST /led/toggle

Liga ou desliga os LEDs. Desligar os LEDs não desligará o servidor. A terceira rota inverte o estado atual de ligado/desligado.

Mudar programação

  • POST /led/program/{id}
  • POST /led/change

Muda a atual programação dos LEDs. A primeira rota coloca uma programação em específico, e a segunda muda para a próxima programação na ordem. O id dever corresponder ao número do programa, como descrito mais acima.

Mudar intensidade

  • POST /led/dim/{valor}

Muda a intensidade da luz dos LEDs, em qualquer modo. O valor deve ser um valor entre 0.02 e 1.0.

Mudar cor

  • POST /led/color/{hex}

Define a cor dos LEDs, apenas para o modo Lâmpada. O hex deve ser uma cor em hexadecimal no formato ffffff.

Controle Remoto

Controle remoto para o servidor HTTP

O controle remoto foi projetado para que seja possível controlar o servidor de LEDs remotamente, interagindo via requisições HTTP, especialmente pelo celular Android, mas também pode ser utilizado no desktop ou em outros sistemas. Ele funcionará normalmente caso você esteja conectado à mesma rede do seu Raspberry Pi Pico W.

Testando a aplicação

Para compilar a aplicação, você precisa ter o compilador de Go 1.21.0 ou superior. Para compilar para o Android, instale Docker e a ferramenta fyne-cross.

Comece abrindo o arquivo internal/wsclient/wsclient.go. Altere a constante BASEURL para o IP fixo do seu Raspberry Pi Pico W.

Em seguida, para testar a aplicação, execute:

go run .

Compilando para Android

Você poderá compilar sua aplicação para Android entrando na pasta LEDControl e executando o comando make, caso você tenha o GNU Makefile instalado. Caso contrário, use diretamente o fyne-cross:

fyne-cross android \
    -app-id com.luksamuk.ledcontrol \
    -icon Icon.png

NOTA: Para o Go 1.21.0, em 16/10/2023, a compilação com fyne-cross está quebrada. Recomendo instalar o fyne-cross, e instalar Go 1.20 através da ferramenta GVM.

Serviço Web

Documentação em breve.