Firmware modular para a placa Raspberry Pi Pico W projetado para ler dados de sensores de ambiente (temperatura, pressão e humidade) e enviá-los para um servidor remoto. Este projeto faz parte da solução SensorFlow e utiliza uma arquitetura modular para facilitar manutenção e expansão.
- ⚡ Quick Start
- 📜 Visão Geral
- ✨ Funcionalidades
- 🛠️ Hardware Necessário
- 📋 Especificações Técnicas
- 🔌 Esquema de Ligação
- ⚙️ Configuração do Ambiente
- 🚀 Compilar e Enviar
- 📡 API Reference
- 🐛 Debugging e Troubleshooting
- 📁 Estrutura do Projeto
- 📄 Licença
Configuração rápida em 5 minutos:
-
Instale o ambiente: VS Code + Extensão Raspberry Pi Pico + Pico SDK
-
Clone e configure:
git clone https://github.com/jpaullopes/sensorflow-firmware.git cd sensorflow-firmware -
Crie o arquivo
secrets.cmakecom suas credenciais Wi-Fi:set(WIFI_SSID "SuaRedeWiFi") set(WIFI_PASSWORD "SuaSenha") set(TARGET_SERVER_IP "192.168.1.100") set(TARGET_PORT 8000) set(TARGET_PATH "/api/temperature_reading") set(API_KEY "SuaChaveAPI")
-
Conecte os sensores conforme tabela de conexões
-
Compile e envie:
- Abra no VS Code, pressione
Ctrl+Shift+P→CMake: Build - Coloque Pico W em modo BOOTSEL e arraste
build/main.uf2paraRPI-RP2
- Abra no VS Code, pressione
✅ Pronto! Monitore via Serial para ver os logs de conexão e envio de dados.
O firmware inicializa os sensores, conecta-se a uma rede Wi-Fi e, em intervalos regulares, envia os dados coletados para uma API backend através de requisições HTTP POST. Cada dispositivo é unicamente identificado pelo ID da placa. O código foi organizado em módulos independentes para melhor organização e reutilização.
- Leitura de Sensores:
- Temperatura e Pressão com o sensor BMP280.
- Humidade com o sensor AHT10.
- Conectividade:
- Conexão a redes Wi-Fi (WPA2-PSK).
- Comunicação com um servidor via TCP/IP.
- Envio de Dados:
- Construção de corpo de requisição em formato JSON.
- Envio dos dados via método HTTP POST.
- Identificação única do dispositivo usando o ID da placa.
- Arquitetura Modular:
- WiFi Manager: Gerencia conexão e desconexão Wi-Fi.
- HTTP Client: Gerencia requisições TCP/HTTP para o servidor.
- Sensor Manager: Centraliza a leitura de todos os sensores.
- Drivers de Sensores: Drivers separados para BMP280 e AHT10.
- Raspberry Pi Pico W (RP2040 + CYW43439)
- Sensor BMP280 - Pressão e Temperatura (I2C)
- Sensor AHT10 - Umidade relativa (I2C)
- Fios jumper e protoboard para conexões
- Cabo USB Micro-B para programação
| Componente | Especificação | Observações |
|---|---|---|
| Pico W | 3.3V, ~100mA | Inclui Wi-Fi 802.11n |
| BMP280 | 1.8-3.6V, <1mA | Pressão: 300-1100 hPa |
| AHT10 | 2.0-5.5V, <1mA | Umidade: 0-100% RH |
| Total | 3.3V, ~102mA | Alimentação via USB ou external |
| Sensor | Pino no Pico W |
|---|---|
| BMP280 (I2C0) | |
| VCC | 3V3 (OUT) |
| GND | GND |
| SCL | GP1 (I2C0_SCL) |
| SDA | GP0 (I2C0_SDA) |
| AHT10 (I2C1) | |
| VCC | 3V3 (OUT) |
| GND | GND |
| SCL | GP3 (I2C1_SCL) |
| SDA | GP2 (I2C1_SDA) |
Este projeto foi desenvolvido utilizando o SDK oficial do Raspberry Pi Pico e o Visual Studio Code.
- VS Code: Versão 1.80+ com a extensão Raspberry Pi Pico.
- Pico SDK: Versão 2.1.1+ - Siga o guia oficial para instalar o SDK, a toolchain ARM GCC e as outras dependências.
- CMake: Versão 3.13+ (normalmente incluído com o Pico SDK)
- Git: Para clonar o repositório
-
Clone o repositório:
git clone https://github.com/jpaullopes/sensorflow-firmware.git cd sensorflow-firmware -
Crie o arquivo de segredos: O projeto utiliza um arquivo
secrets.cmakepara armazenar informações sensíveis como credenciais de Wi-Fi e chaves de API. Este arquivo não é versionado pelo Git para sua segurança.- Crie o arquivo
secrets.cmakena raiz do projeto e preencha com as suas informações:# Credenciais da rede Wi-Fi set(WIFI_SSID "NOME_DA_SUA_REDE") set(WIFI_PASSWORD "SENHA_DA_SUA_REDE") # Configurações do Servidor de Destino set(TARGET_SERVER_IP "192.168.1.100") # IP do seu servidor set(TARGET_PORT 8000) # Porta do seu servidor set(TARGET_PATH "/api/temperature_reading") # Caminho da API set(API_KEY "SUA_CHAVE_DE_API_SECRETA")
- Crie o arquivo
Para adicionar um novo sensor ao projeto:
-
Crie um novo driver em
inc/novo_sensor/:// inc/novo_sensor/novo_sensor.h void novo_sensor_init(void); float novo_sensor_read(void);
-
Atualize o Sensor Manager:
// inc/sensor_manager/sensor_manager.h typedef struct { float temperature_c; float humidity_percent; float pressure_hpa; float novo_valor; // Adicione aqui } sensors_reading_t;
-
Atualize o CMakeLists.txt:
add_executable(main src/main.c inc/bmp280/bmp280.c inc/aht10/aht10.c inc/novo_sensor/novo_sensor.c # Adicione aqui # ... outros arquivos
Para alterar o formato JSON ou adicionar novos campos:
-
Edite o HTTP Client (
inc/http_client/http_client.c):// Modifique a função callback_connected() snprintf(json_body, sizeof(json_body), "{\"temperature\":%.2f, \"humidity\":\"%.2f\", \"pressure\":\"%.2f\", \"sensor_id\":\"%s\", \"novo_campo\":\"valor\"}", // ... parâmetros
-
Atualize a estrutura
sensor_data_tse necessário.
Com o ambiente e o projeto configurados, você pode compilar e enviar o firmware para a sua Pico W.
- Abra o projeto no VS Code. A extensão do Raspberry Pi Pico deve detectar e configurar o projeto automaticamente.
- Compile o projeto:
- Pressione
Ctrl+Shift+Pe executeCMake: Build - Ou pressione
F7(se configurado)
- Pressione
- Envie o firmware:
- Coloque sua Pico W em modo
BOOTSEL(segure o botão BOOTSEL e conecte o cabo USB). - Pressione
Shift+F5para iniciar o upload (ou use a tarefaRun Project). - Alternativamente, arraste o arquivo
build/main.uf2para o driveRPI-RP2que aparece no seu computador.
- Coloque sua Pico W em modo
# Configurar o build
cmake -B build
# Compilar
cmake --build build
# O arquivo main.uf2 estará em build/
# Arraste-o para o drive RPI-RP2 quando a Pico estiver em modo BOOTSELO firmware envia logs detalhados via USB Serial. Para monitorar:
- No VS Code: Abra o terminal serial através do menu
Terminal > New Terminal - Aplicativos externos: Use qualquer terminal serial (PuTTY, Arduino Serial Monitor, etc.) na porta COM correspondente
====================================================
= MONITOR DE SENSOR | RASPBERRY PI PICO =
= ID Unico da Placa: e660c0e687254725 =
====================================================
[INFO] Inicializando Wi-Fi...
[INFO] Conectando a rede "MinhaRede"...
[OK] Wi-Fi conectado com sucesso!
[INFO] Endereco IP: 192.168.1.105
[INFO] Inicializando sensores...
[OK] Sensor BMP280 inicializado.
[OK] Sensor AHT10 inicializado.
[OK] Sensores inicializados com sucesso.
[INFO] Iniciando ciclos de envio a cada 5 segundos.
[DADOS] Leitura dos sensores -> Temp: 23.45 C | Hum: 56.78 % | Pres: 1013.25 hPa
****************************************************
* INICIANDO CICLO DE ENVIO *
****************************************************
[INFO] Tentando conectar ao servidor 192.168.1.100:8000...
[OK] Conexao TCP estabelecida.
[DADOS] Preparando o seguinte JSON para envio:
-> {"temperature":23.45, "humidity":56.78, "pressure":1013.25, "sensor_id":"e660c0e687254725"}
[INFO] Enviando requisicao POST...
[OK] Requisicao enviada. Aguardando resposta.
[INFO] Conexao fechada pelo servidor.
[INFO] Ciclo de envio concluido. A libertar memoria.
A aguardar 5 segundos para o proximo envio...
[INFO] Inicializando Wi-Fi...- Iniciando conexão Wi-Fi[OK] Wi-Fi conectado com sucesso!- Conectado ao Wi-Fi[DADOS] Leitura dos sensores -> ...- Dados lidos dos sensores[INFO] Tentando conectar ao servidor...- Iniciando envio HTTP[OK] Requisicao enviada. Aguardando resposta.- Dados enviados com sucesso[ERRO] ...- Indica problemas que precisam ser investigados
-
[ERRO] Falha ao conectar ao Wi-Fi.- Verifique as credenciais no arquivo
secrets.cmake. - Certifique-se de que a rede está acessível.
- Verifique as credenciais no arquivo
-
[ERRO] Sensor não responde.- Verifique as conexões I2C e a alimentação do sensor.
- Confirme se o endereço I2C do sensor está correto.
-
[ERRO] Falha na requisição HTTP.- Verifique a conectividade com o servidor.
- Certifique-se de que o servidor está ativo e configurado corretamente.
Wi-Fi não conecta:
- Verifique SSID e senha no
secrets.cmake - Certifique-se que a rede é WPA2-PSK
- Verifique se a rede está no alcance
Sensors não funcionam:
- Verifique as conexões I2C
- Confirme se os sensores estão alimentados (3.3V)
- Teste a continuidade dos fios
HTTP falha:
- Verifique se o servidor está rodando
- Confirme IP e porta no
secrets.cmake - Teste a conectividade de rede
Compilação falha:
- Certifique-se que o Pico SDK está instalado corretamente
- Verifique se todos os caminhos estão configurados
- Confirme que o arquivo
secrets.cmakeexiste
.
├── .vscode/ # Configurações do VS Code (tasks, launch, settings)
├── build/ # Diretório dos arquivos de compilação (gerado)
├── inc/ # Bibliotecas, drivers e módulos
│ ├── aht10/ # Driver do sensor de humidade AHT10
│ │ ├── aht10.h
│ │ └── aht10.c
│ ├── bmp280/ # Driver do sensor de temperatura/pressão BMP280
│ │ ├── bmp280.h
│ │ └── bmp280.c
│ ├── wifi_manager/ # Módulo de gerenciamento Wi-Fi
│ │ ├── wifi_manager.h
│ │ └── wifi_manager.c
│ ├── http_client/ # Módulo cliente HTTP/TCP
│ │ ├── http_client.h
│ │ └── http_client.c
│ └── sensor_manager/ # Módulo de gerenciamento de sensores
│ ├── sensor_manager.h
│ └── sensor_manager.c
├── src/ # Código fonte principal
│ └── main.c # Arquivo principal da aplicação
├── CMakeLists.txt # Script de compilação do CMake
├── lwipopts.h # Configurações da pilha TCP/IP LwIP
├── secrets.cmake # Arquivo de configurações sensíveis (Wi-Fi, API)
└── README.md # Este arquivo
O firmware foi organizado em módulos independentes para facilitar manutenção e expansão:
- Responsabilidade: Gerenciar conexão/desconexão Wi-Fi
- Funções principais:
wifi_init(): Inicializa e conecta ao Wi-Fiwifi_cleanup(): Desconecta e limpa recursos
- Responsabilidade: Gerenciar comunicação HTTP/TCP com o servidor
- Funções principais:
http_send_sensor_data(): Envia dados dos sensores via HTTP POST
- Características:
- Callbacks TCP assíncronos
- Timeout de 20 segundos
- Gerenciamento automático de memória
- Responsabilidade: Centralizar leitura de todos os sensores
- Funções principais:
sensors_init(): Inicializa todos os sensoressensors_read_all(): Lê dados de todos os sensores de uma vez
- Vantagens:
- Interface unificada para múltiplos sensores
- Tratamento centralizado de erros
- Estrutura de dados consolidada
- Responsabilidade: Interface direta com os sensores via I2C
- Características:
- Drivers independentes e reutilizáveis
- Calibração automática
- Estruturas de dados específicas para cada sensor
- Verifique se o SSID e a senha estão corretos no arquivo
secrets.cmake. - Certifique-se de que a rede Wi-Fi utiliza WPA2-PSK.
- Verifique se o dispositivo está dentro do alcance da rede.
- Confirme as conexões I2C e a alimentação dos sensores.
- Teste a continuidade dos fios com um multímetro.
- Certifique-se de que o servidor está ativo e acessível.
- Verifique o IP, porta e caminho da API no arquivo
secrets.cmake. - Teste a conectividade com o servidor usando ferramentas como
pingoucurl.
POST /api/temperature_reading HTTP/1.1
Host: 192.168.1.100:8000
Content-Type: application/json
API-Key: SuaChaveAPI
{
"temperature": 23.45,
"humidity": 56.78,
"pressure": 1013.25,
"sensor_id": "e660c0e687254725"
}{
"status": "success",
"message": "Dados recebidos com sucesso."
}Este projeto está licenciado sob a licença MIT. Veja o texto completo da licença em LICENSE.