Skip to content

jpaullopes/sensorflow-firmware

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SensorFlow Firmware

Linguagem Plataforma SDK Build Licença

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.


📑 Índice


⚡ Quick Start

Configuração rápida em 5 minutos:

  1. Instale o ambiente: VS Code + Extensão Raspberry Pi Pico + Pico SDK

  2. Clone e configure:

    git clone https://github.com/jpaullopes/sensorflow-firmware.git
    cd sensorflow-firmware
  3. Crie o arquivo secrets.cmake com 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")
  4. Conecte os sensores conforme tabela de conexões

  5. Compile e envie:

    • Abra no VS Code, pressione Ctrl+Shift+PCMake: Build
    • Coloque Pico W em modo BOOTSEL e arraste build/main.uf2 para RPI-RP2

Pronto! Monitore via Serial para ver os logs de conexão e envio de dados.


📜 Visão Geral

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.

✨ Funcionalidades

  • 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.

🛠️ Hardware Necessário

  • 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

📋 Especificações Técnicas

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

🔌 Esquema de Ligação

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)

⚙️ Configuração do Ambiente

Este projeto foi desenvolvido utilizando o SDK oficial do Raspberry Pi Pico e o Visual Studio Code.

1. Pré-requisitos

  • 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

2. Configuração do Projeto

  1. Clone o repositório:

    git clone https://github.com/jpaullopes/sensorflow-firmware.git
    cd sensorflow-firmware
  2. Crie o arquivo de segredos: O projeto utiliza um arquivo secrets.cmake para 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.cmake na 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")

🔧 Desenvolvimento e Modificação

Adicionando Novos Sensores

Para adicionar um novo sensor ao projeto:

  1. Crie um novo driver em inc/novo_sensor/:

    // inc/novo_sensor/novo_sensor.h
    void novo_sensor_init(void);
    float novo_sensor_read(void);
  2. 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;
  3. 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

Modificando a Comunicação HTTP

Para alterar o formato JSON ou adicionar novos campos:

  1. 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
  2. Atualize a estrutura sensor_data_t se necessário.

🚀 Compilar e Enviar

Com o ambiente e o projeto configurados, você pode compilar e enviar o firmware para a sua Pico W.

Método 1: Via VS Code (Recomendado)

  1. Abra o projeto no VS Code. A extensão do Raspberry Pi Pico deve detectar e configurar o projeto automaticamente.
  2. Compile o projeto:
    • Pressione Ctrl+Shift+P e execute CMake: Build
    • Ou pressione F7 (se configurado)
  3. Envie o firmware:
    • Coloque sua Pico W em modo BOOTSEL (segure o botão BOOTSEL e conecte o cabo USB).
    • Pressione Shift+F5 para iniciar o upload (ou use a tarefa Run Project).
    • Alternativamente, arraste o arquivo build/main.uf2 para o drive RPI-RP2 que aparece no seu computador.

Método 2: Via Terminal

# 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 BOOTSEL

🐛 Debugging e Troubleshooting

Monitoramento via Serial

O firmware envia logs detalhados via USB Serial. Para monitorar:

  1. No VS Code: Abra o terminal serial através do menu Terminal > New Terminal
  2. Aplicativos externos: Use qualquer terminal serial (PuTTY, Arduino Serial Monitor, etc.) na porta COM correspondente

📝 Exemplo de Output Normal

====================================================
=           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...

Mensagens de Log Comuns

  • [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

📝 Logs de Erro Comuns

  • [ERRO] Falha ao conectar ao Wi-Fi.

    • Verifique as credenciais no arquivo secrets.cmake.
    • Certifique-se de que a rede está acessível.
  • [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.

Problemas Comuns

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.cmake existe

📁 Estrutura do Projeto

.
├── .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

🏗️ Arquitetura Modular

O firmware foi organizado em módulos independentes para facilitar manutenção e expansão:

📡 WiFi Manager (inc/wifi_manager/)

  • Responsabilidade: Gerenciar conexão/desconexão Wi-Fi
  • Funções principais:
    • wifi_init(): Inicializa e conecta ao Wi-Fi
    • wifi_cleanup(): Desconecta e limpa recursos

🌐 HTTP Client (inc/http_client/)

  • 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

📊 Sensor Manager (inc/sensor_manager/)

  • Responsabilidade: Centralizar leitura de todos os sensores
  • Funções principais:
    • sensors_init(): Inicializa todos os sensores
    • sensors_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

🔧 Drivers de Sensores (inc/aht10/, inc/bmp280/)

  • 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

❓ FAQ

1. O firmware não conecta ao Wi-Fi. O que fazer?

  • 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.

2. Os sensores não estão funcionando. Como resolver?

  • Confirme as conexões I2C e a alimentação dos sensores.
  • Teste a continuidade dos fios com um multímetro.

3. O servidor não responde às requisições HTTP. O que verificar?

  • 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 ping ou curl.

📡 API Reference

Exemplo de Requisição HTTP

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"
}

Exemplo de Resposta Esperada

{
  "status": "success",
  "message": "Dados recebidos com sucesso."
}

📄 Licença

Este projeto está licenciado sob a licença MIT. Veja o texto completo da licença em LICENSE.

About

Firmware em C para Raspberry Pi Pico W projetado para coletar dados de sensores e enviá-los para uma API remota via HTTP POST.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors