Firmwares para Raspberry Pi Pico W/BitDogLab que simulam o controle de um grow LED para um projeto de cultivo indoor desenvolvido na residencia EmbarcaTech.
O projeto usa duas placas:
grow_led_bitdoglab: placa sensora, le luminosidade e temperatura, calcula a potencia do grow LED e publica os dados via MQTT.receptor_mqtt: placa receptora, assina o topico MQTT, mostra os dados no OLED e replica a potencia na matriz WS2812.
A matriz WS2812 representa visualmente uma iluminacao do tipo grow light: quanto mais luz solar o sensor detecta, menor e a intensidade emitida pela matriz; quanto menos luz solar e detectada, maior e a intensidade dos LEDs.
- Leitura de luminosidade com sensor BH1750 via I2C.
- Leitura de temperatura pelo sensor interno do RP2040 na placa sensora.
- Media movel de 10 amostras para reduzir variacao da leitura.
- Controle proporcional inverso entre luz ambiente e intensidade da matriz.
- Simulacao visual de grow light em matriz WS2812 5x5 via PIO.
- MQTT entre placa sensora e placa receptora no topico
fazenda/sensores. - Display OLED 128x64 via I2C com lux atual, temperatura, potencia do grow LED e barra de intensidade.
- Saida serial via USB para monitoramento.
- Modo de seguranca: se o BH1750 falhar, os LEDs ficam em 100%.
Este projeto foi feito como uma simulacao embarcada para um sistema maior de cultivo em ambiente residencial/controlado. A ideia e demonstrar a logica de controle de iluminacao suplementar:
- sol forte: a matriz reduz a emissao;
- sol fraco ou ambiente escuro: a matriz aumenta a emissao;
- falha de leitura do sensor: a matriz assume potencia maxima.
Observacao: a matriz WS2812 RGB simula visualmente a cor/intensidade de grow LEDs. Para uma aplicacao agricola real, o espectro luminoso deve ser validado com LEDs apropriados e datasheet do fabricante.
O projeto usa pico_w como placa padrao no CMake.
| Modulo | Barramento / sinal | Pino |
|---|---|---|
| BH1750 | I2C0 SDA | GP0 |
| BH1750 | I2C0 SCL | GP1 |
| BH1750 | Endereco I2C | 0x23 |
| OLED SSD1306 | I2C1 SDA | GP14 |
| OLED SSD1306 | I2C1 SCL | GP15 |
| OLED SSD1306 | Endereco I2C | 0x3C |
| Matriz WS2812 5x5 | Dados | GP7 |
As duas placas usam a mesma pinagem para OLED e matriz. A placa sensora tambem usa o BH1750 em GP0/GP1.
flowchart LR
Pico["Raspberry Pi Pico W / BitDogLab"]
BH["BH1750\nSensor de luz"]
OLED["OLED SSD1306\n128x64"]
LEDS["Matriz WS2812\n5x5"]
Pico -- "GP0 / I2C0 SDA" --> BH
Pico -- "GP1 / I2C0 SCL" --> BH
Pico -- "GP14 / I2C1 SDA" --> OLED
Pico -- "GP15 / I2C1 SCL" --> OLED
Pico -- "GP7 / PIO data" --> LEDS
Os limites atuais estao definidos em grow_led_bitdoglab.c:
#define LUX_SOL_FRACO 50
#define LUX_SOL_FORTE 800<= 50 lux: grow LED em 100%.>= 800 lux: grow LED em 0%.- Entre esses valores: potencia proporcional inversa.
- Raspberry Pi Pico SDK 2.2.0 ou compativel.
- Toolchain
arm-none-eabi. - CMake e Ninja ou Make.
picotoolopcional, para gravar via linha de comando.
As credenciais de Wi-Fi e o endereco do broker MQTT ficam em secrets.h, que nao e versionado.
Antes de compilar, copie o exemplo e ajuste os valores:
cp secrets.example.h secrets.h#define WIFI_SSID "sua_rede"
#define WIFI_PASS "sua_senha"
#define MQTT_BROKER "192.168.0.100"Se o ambiente do Pico SDK ja estiver configurado:
cmake -S . -B build
cmake --build buildSe precisar informar o SDK manualmente:
cmake -S . -B build -DPICO_SDK_PATH=/caminho/para/pico-sdk
cmake --build buildOs firmwares serao gerados em:
build/grow_led_bitdoglab.uf2
build/receptor_mqtt.uf2
Grave grow_led_bitdoglab.uf2 na placa sensora e receptor_mqtt.uf2 na placa receptora.
Para compilar apenas um deles:
cmake --build build --target grow_led_bitdoglab
cmake --build build --target receptor_mqtt- Segure o botao
BOOTSELda placa. - Conecte a placa ao USB.
- Copie o UF2 desejado para o volume USB que aparecer.
Com a placa em modo BOOTSEL:
picotool load build/grow_led_bitdoglab.uf2 -fxPara a placa receptora:
picotool load build/receptor_mqtt.uf2 -fxA saida serial USB e habilitada no CMake:
pico_enable_stdio_usb(grow_led_bitdoglab 1)
pico_enable_stdio_uart(grow_led_bitdoglab 0)
pico_enable_stdio_usb(receptor_mqtt 1)
pico_enable_stdio_uart(receptor_mqtt 0)A placa sensora publica payloads MQTT como:
{"lux":450,"temp":26.4,"led":55}
A placa receptora espera esse payload no topico fazenda/sensores. A temperatura exibida no receptor vem da placa sensora pelo campo temp.
Os firmwares imprimem leituras como:
Wi-Fi:conectado (10.101.105.184) | MQTT:conectado | LUX:123.4 | TEMP:26.4 C | LED:90%
.
|-- CMakeLists.txt
|-- grow_led_bitdoglab.c
|-- receptor_mqtt.c
|-- lwipopts.h
|-- pico_sdk_import.cmake
|-- secrets.example.h
`-- ws2812.pio
- O display OLED e o BH1750 usam barramentos I2C diferentes.
- A ordem fisica da matriz WS2812 e tratada em zigue-zague pela funcao
matrix_index. - Nao ha mais leitura/publicacao de umidade neste projeto.
- O arquivo
secrets.he local e fica ignorado pelo Git.