XIAO ESP32-C3 iBeacon com Sensor BME680 Usando ESP-IDF
Neste tutorial, vamos construir um sistema de monitoramento de temperatura de baixo consumo que transmite dados ambientais usando Bluetooth Low Energy (BLE) no formato iBeacon. Usaremos o Seeed Studio XIAO ESP32-C3, a placa de expansão XIAO e um sensor ambiental Grove BME680. Este projeto demonstra como construir aplicações embarcadas robustas usando ESP-IDF — o framework de desenvolvimento oficial da Espressif.
Visão Geral
Nosso sistema irá:
- Ler temperatura, umidade e pressão do sensor BME680
- Empacotar esses dados em pacotes de anúncio BLE
- Acordar periodicamente, realizar medições, anunciar dados e voltar ao modo de suspensão para economizar energia da bateria
Fluxograma do Sistema
Este fluxograma ilustra o ciclo de operação principal do nosso sistema, desde o despertar até o retorno ao modo de suspensão profunda.
Requisitos de Hardware
| Seeed Studio XIAO ESP32C3 | Seeed Studio Grove Base para XIAO | Sensor Ambiental Grove BME680 |
|---|---|---|
![]() | ![]() | ![]() |
- Cabo USB Tipo-C
- Computador com ESP-IDF instalado
Requisitos de Software
- ESP-IDF (v5.0 ou posterior)
- Git
- Repositório GitHub do Projeto
Passo 1: Configuração do Hardware
-
Conecte o sensor BME680 à Placa de Expansão XIAO:
- Conecte o sensor Grove BME680 a uma das portas I2C da Placa de Expansão XIAO.
- O sensor se comunica via I2C, portanto qualquer porta Grove compatível com I2C funcionará.
-
Monte o XIAO ESP32-C3 na placa de expansão:
- Alinhe cuidadosamente e insira o módulo XIAO ESP32-C3 na placa de expansão.
- Certifique-se de que os pinos estejam corretamente alinhados e o módulo esteja firmemente encaixado.
-
Conecte ao seu computador:
- Use um cabo USB Tipo-C para conectar a placa de expansão XIAO ao seu computador.
Passo 2: Configurando o Ambiente de Desenvolvimento
-
Instale o ESP-IDF: Siga as instruções oficiais de instalação para o seu sistema operacional.
Para Linux, você pode usar:
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh
. ./export.sh -
Clone o repositório do projeto:
cd ~/Desktop
git clone --recurse-submodules https://github.com/Priyanshu0901/xiao_ibeacon.git
cd xiao_ibeaconcuidadoO flag
--recurse-submodulesé fundamental, pois o projeto depende de bibliotecas externas incluídas como submódulos Git. Sem isso, a compilação falhará.Se você já clonou sem os submódulos, execute:
git submodule update --init --recursive
Passo 3: Estrutura do Projeto e Compreensão dos Componentes
O projeto consiste em três componentes principais:
-
Componente do Sensor BME680 (
sensor_t_a_h):- Gerencia a comunicação com o sensor BME680
- Gerencia a inicialização, leitura e processamento de dados do sensor
- Fornece dados de temperatura, umidade e pressão
-
Componente BLE Beacon (
ble_beacon):- Configura a pilha BLE
- Cria e transmite anúncios BLE com dados do sensor
- Gerencia a inicialização e limpeza do BLE
-
Componente de Gerenciamento de Energia (
power_manager):- Gerencia a funcionalidade de suspensão profunda
- Gerencia a operação eficiente em termos de energia
- Controla as fontes de despertar e a duração do sono
Interação entre Componentes
Este diagrama mostra como os diferentes componentes de software interagem com os elementos de hardware do sistema.
Passo 4: Compreendendo a Configuração
Antes de compilar, vamos entender as configurações principais:
-
Configurações da Aplicação Principal (em
main.c):ADV_TIME_MS: Duração do anúncio BLE (500ms)POLL_INTERVAL_MS: Com que frequência consultar o sensor (150ms)TIMEOUT_MS: Tempo máximo de espera pelas leituras do sensor (2000ms)SLEEP_TIME_MS: Quanto tempo dormir entre as medições (~29,3 segundos)
-
Configuração do Sensor (em
components/sensor_t_a_h/Kconfig):menu "BME68X Configuration"
config BME68X_I2C_ADDR
hex "BME68X I2C Address"
default 0x76
help
I2C address of the BME68X sensor. Default is 0x76.
Use 0x77 if SDO pin is pulled high.
choice BME68X_INTERFACE
prompt "BME68X Interface"
default BME68X_USE_I2C
help
Select the interface to use with BME68X sensor.
config BME68X_USE_I2C
bool "I2C Interface"
config BME68X_USE_SPI
bool "SPI Interface"
endchoice
if BME68X_USE_I2C
config BME68X_I2C_PORT
int "I2C Port Number"
range 0 1
default 0
help
I2C port number for BME68X.
config BME68X_I2C_SDA_PIN
int "I2C SDA GPIO"
range 0 48
default 12
help
GPIO pin for I2C SDA.
config BME68X_I2C_SCL_PIN
int "I2C SCL GPIO"
range 0 48
default 13
help
GPIO pin for I2C SCL.
config BME68X_I2C_CLOCK_SPEED
int "I2C Clock Frequency (Hz)"
range 100000 400000
default 100000
help
I2C clock frequency for BME68X. Standard mode (100 KHz) or Fast mode (400 KHz).
endif
endmenu -
Configuração BLE (em
components/ble_beacon/common.h): O nome do dispositivo BLE é definido no arquivocommon.h:#define DEVICE_NAME "Xiao_TempSensor"
Modificando Parâmetros de Configuração
Usando a Ferramenta menuconfig do ESP-IDF
O framework ESP-IDF fornece uma poderosa ferramenta de configuração chamada menuconfig, que oferece uma interface de usuário baseada em texto para modificar as configurações do projeto. Esta ferramenta é baseada no Kconfig, o mesmo sistema de configuração usado pelo kernel Linux.
Para iniciar a interface de configuração:
idf.py menuconfig
Isso exibirá uma interface de usuário baseada em texto com categorias de configuração:
Application Configuration --->
ESP-IDF Components --->
SDK tool configuration --->
Compiler options --->
Component config --->
Bootloader config --->
Serial flasher config --->
Navegação no menuconfig:
- Use as setas
↑e↓para navegar - Pressione
Enterpara entrar em um submenu - Pressione
Escpara voltar - Pressione
Spacepara alternar opções - Pressione
Ypara 'Sim' eNpara 'Não' em opções booleanas - Pressione
?para obter ajuda sobre a opção atualmente selecionada - Pressione
QouEscvárias vezes para sair, depoisYpara salvar as alterações
Encontrando a Configuração do Sensor:
- Navegue até
Component config - Role para baixo para encontrar
BME68X Configuration - Pressione
Enterpara visualizar as configurações do sensor
Encontrando a Configuração BLE:
- Navegue até
Component config - Encontre e entre em
Bluetooth - Selecione
NimBLE Options - Aqui você pode configurar vários parâmetros BLE
Configurando os Pinos I2C para o BME680
Para configurar os pinos I2C para o sensor BME680:
- No menuconfig, navegue até:
Component config→BME68X Configuration - Selecione
I2C SDA GPIOpara alterar o pino SDA - Insira o número do GPIO para SDA (o padrão é 12, mas para o XIAO ESP32-C3 com a placa de expansão, use 6)
- Selecione
I2C SCL GPIOpara alterar o pino SCL - Insira o número do GPIO para SCL (o padrão é 13, mas para o XIAO ESP32-C3 com a placa de expansão, use 7)
- Se o seu sensor tiver um endereço I2C diferente, selecione
BME68X I2C Addresse modifique-o
Configurando Parâmetros BLE via menuconfig
Embora o nome do dispositivo seja definido no código, outros parâmetros BLE podem ser configurados via menuconfig:
- Navegue até:
Component config→Bluetooth→NimBLE Options - Aqui você pode modificar:
- Número máximo de conexões simultâneas
- Função BLE (Central/Periférico/Observador/Transmissor)
- Configurações de segurança
- Parâmetros GAP e GATT
- Alocações de memória para a pilha BLE
Opções Avançadas de Configuração
Para usuários avançados, opções adicionais de configuração estão disponíveis:
-
Gerenciamento de Energia:
- Navegue até:
Component config→Power Management - Ativar/desativar sleep leve automático
- Configurar DFS (Escalonamento Dinâmico de Frequência)
- Navegue até:
-
Criptografia de Flash:
- Navegue até:
Security features - Configurar opções de criptografia de flash para implantações seguras
- Navegue até:
-
Tabela de Partições:
- Navegue até:
Partition Table - Modificar o particionamento de flash para diferentes necessidades de aplicação
- Navegue até:
-
Registro de Log:
- Navegue até:
Component config→Log output - Configurar níveis de log de depuração e destinos de saída
- Navegue até:
Após fazer suas alterações, pressione Q para sair e Y para salvar as alterações. Em seguida, reconstrua o projeto com:
idf.py build
Alterando o Nome do Dispositivo BLE
Para alterar o nome do dispositivo BLE, você precisa modificar a macro DEVICE_NAME em components/ble_beacon/common.h:
-
Abra o arquivo:
nano components/ble_beacon/common.h -
Encontre a definição de
DEVICE_NAMEe altere para o nome desejado:#define DEVICE_NAME "MyCustomSensor" -
Salve o arquivo e reconstrua o projeto.
Passo 5: Compilando e Gravando o Projeto
-
Navegue até o diretório do projeto:
cd ~/Desktop/xiao_ibeacon -
Configure o projeto:
idf.py set-target esp32c3
idf.py menuconfigNavegue pelo menu para verificar ou ajustar as configurações:
- Component Config → BME680 Sensor Settings
- Component Config → BLE Beacon Settings
- Component Config → Power Management
-
Compile o projeto:
idf.py build -
Grave o projeto no XIAO ESP32-C3:
idf.py -p /dev/ttyUSB0 flashNota: Sua porta pode ser diferente (Windows: COM3, COM4, etc.)
-
Monitore a saída (opcional):
idf.py -p /dev/ttyUSB0 monitorPressione Ctrl+] para sair do monitor.
Passo 6: Testando o iBeacon
-
Baixe um aplicativo de Scanner BLE no seu smartphone:
- iOS: "LightBlue" ou "nRF Connect"
- Android: "nRF Connect" ou "BLE Scanner"
-
Abra o aplicativo e escaneie dispositivos BLE:
- Procure por um dispositivo chamado "Xiao_TempSensor"
- Selecione o dispositivo para visualizar seus dados de anúncio
-
Entenda os Dados de Anúncio: O anúncio BLE contém:
- Temperatura (em graus Celsius, escalonada por 100)
- Umidade (em porcentagem)
- Pressão (em hPa, escalonada por 10)
-
Comportamento Esperado:
- O dispositivo acorda aproximadamente a cada 30 segundos
- Realiza leituras do sensor BME680
- Transmite esses dados por 500ms
- Em seguida, entra em deep sleep para economizar energia
Scripts de Teste em Python
O projeto inclui scripts Python para ajudar a testar e validar a funcionalidade do beacon BLE. Vamos explorá-los:
Configurando o Ambiente Python
-
Navegue até o diretório de scripts de teste:
cd ~/Desktop/xiao_ibeacon/test_scripts -
Execute o script de configuração para criar e configurar um ambiente virtual:
# On Linux/macOS
chmod +x setup_venv.sh
./setup_venv.sh
# On Windows
setup_venv.bat -
Ative o ambiente virtual:
# On Linux/macOS
source venv/bin/activate
# On Windows
venv\Scripts\activate
O script de configuração instalará os pacotes necessários:
bleak: Para comunicação BLEcolorama: Para saída colorida no terminal
Usando o Script de Scanner BLE
O script de scanner BLE (ble_beacon_scanner.py) escaneia anúncios BLE e exibe dados do sensor do nosso beacon.
Principais funcionalidades do scanner:
- Procura por um dispositivo chamado "Xiao_TempSensor"
- Decodifica os dados específicos do fabricante para extrair temperatura, umidade e pressão
- Exibe os valores em uma interface de terminal formatada
- Atualiza continuamente conforme novos anúncios são recebidos
Para executar o scanner:
python ble_beacon_scanner.py
O script exibirá uma saída bem formatada com as leituras mais recentes do sensor:
╔═══════════════════════════════════════════════╗
║ Xiao Temperature Sensor Beacon Scanner ║
╠═══════════════════════════════════════════════╣
║ Last Update: 15:42:27 ║
║ Signal Strength: -63 dBm ║
╠═══════════════════════════════════════════════╣
║ Temperature: 23.45 °C ║
║ Humidity: 48 % ║
║ Pressure: 1013.2 hPa ║
╠═══════════════════════════════════════════════╣
║ Press Ctrl+C to exit ║
╚═══════════════════════════════════════════════╝
Se você ativar o modo de depuração no script definindo DEBUG_MODE = True, verá informações adicionais sobre os anúncios BLE e a análise de dados.
Formato dos Dados do Beacon
O beacon transmite dados em um formato comprimido para caber dentro das limitações do anúncio BLE:
- ID da Empresa: 0x02E5 (Espressif Systems)
- Temperatura: inteiro com sinal de 16 bits, escalonado por 100 (divida por 100 para obter °C)
- Umidade: inteiro sem sinal de 8 bits (valor percentual direto)
- Pressão: inteiro sem sinal de 16 bits, escalonado por 10 (divida por 10 para obter hPa)
O script Python decodifica esse formato e exibe os valores reais.
Fluxo do Processo de Teste
Passo 7: Como Funciona - Análise Detalhada
Inicialização e Leitura do Sensor
O sensor BME680 é inicializado com as seguintes etapas:
- Configuração I2C: Configura a comunicação I2C nos pinos apropriados (para XIAO ESP32-C3 com a placa de expansão, GPIO6/GPIO7 para SDA/SCL)
- Inicialização do Sensor: Configura o sensor BME680 com ajustes para medições de temperatura, umidade, pressão e gás
- Processo de Leitura: Inicia uma medição e aguarda os dados ficarem prontos
- Processamento de Dados: Converte os valores brutos do sensor em medições legíveis por humanos
Anúncio BLE
A funcionalidade BLE opera da seguinte forma:
- Inicialização da Pilha BLE: Configura a pilha BLE do ESP32
- Configuração de Anúncio: Configura os parâmetros de anúncio (intervalo, formato de dados)
- Empacotamento de Dados: Recebe as leituras do sensor e as empacota em dados específicos do fabricante
- Início/Parada do Anúncio: Controla o tempo de anúncio
Gerenciamento de Energia
O sistema de gerenciamento de energia utiliza as capacidades de sleep integradas do ESP32-C3:
- Configuração de Deep Sleep: Usa a API de sleep do ESP-IDF (
esp_sleep_enable_timer_wakeup()) para configurar o temporizador de despertar - Fonte de Despertar: Configura o temporizador como única fonte de despertar (o sistema acordará após uma duração especificada)
- Entrada em Sleep: Desliga com segurança os periféricos ativos antes de entrar em deep sleep com
esp_deep_sleep_start() - Processo de Despertar: Quando o temporizador expira, o sistema realiza um reset e reinicia a aplicação desde o início
O componente de gerenciamento de energia (power_manager.c) fornece uma interface simples para lidar com modos de sleep:
// Initialize power manager
power_manager_init();
// Later, when it's time to sleep:
power_manager_enter_deep_sleep(30000); // Sleep for 30 seconds
Quando o dispositivo entra em deep sleep, o consumo de energia cai drasticamente (para cerca de 10-20 μA), permitindo uma longa vida útil da bateria. O dispositivo desliga completamente e reiniciará quando o temporizador expirar, portanto, qualquer estado que precise ser preservado deve ser armazenado na memória RTC ou em armazenamento não volátil.
Perfil de Consumo de Energia
Configuração de Perfilamento de Energia
Perfis de Energia
O sistema possui fases distintas de uso de energia, conforme mostrado no perfil de energia abaixo:
Fases de Energia:
- Fase de Sleep: ~150μA no modo deep sleep (controlador RTC do ESP32-C3 ativo + sleep do bme680)
- Despertar e Inicializar: ~40mA durante a inicialização e inicialização do sensor
- Publicidade BLE Ativa: pico de ~16mA durante a transmissão BLE
- Limpeza e Entrada em Sleep: ~5mA durante a limpeza de recursos antes da entrada em sleep
Cálculo de Vida Útil da Bateria:
- Corrente média em deep sleep (28 seg): 150μA
- Corrente média durante a fase ativa (2 seg): ~40mA
- Corrente média efetiva: 3,92 mA (medida ao longo de 1 minuto)
- Com uma bateria Li-Ion típica de 1500 mAh:
- 1500 mAh ÷ 3,92 mA ≈ 382 horas ≈ 15,9 dias
Dicas de Otimização de Energia:
- Reduza o tempo de anúncio para minimizar os períodos de alta corrente
- Use a menor potência de anúncio viável
- Desative periféricos não utilizados
- Otimize o processo de leitura do sensor
- Considere estender a duração do sleep
Passo 8: Personalizando o Projeto
Você pode personalizar vários aspectos do projeto:
-
Alterar a Duração do Sleep:
- Edite
SLEEP_TIME_MSemmain.cpara ajustar a frequência das leituras
- Edite
-
Modificar Configurações do Sensor:
- Use
idf.py menuconfigpara alterar taxas de amostragem, filtros, etc. do sensor
- Use
-
Ajustar Parâmetros BLE:
- Altere o nome do dispositivo ou o intervalo de anúncio no componente de beacon BLE
-
Adicionar Sensores Adicionais:
- Estenda o componente de sensor para incluir outros sensores Grove
Adicionando Seu Próprio Sensor
Para integrar um sensor diferente neste projeto, siga estas etapas:
-
Criar um Novo Componente de Sensor:
# Create component directory structure
mkdir -p components/my_new_sensor/include
touch components/my_new_sensor/CMakeLists.txt
touch components/my_new_sensor/Kconfig
touch components/my_new_sensor/my_new_sensor.c
touch components/my_new_sensor/include/my_new_sensor.h -
Implementar a Interface do Componente:
- Defina a função de inicialização
- Crie funções de leitura de dados
- Configure qualquer configuração necessária
Exemplo de arquivo de cabeçalho (
my_new_sensor.h):#pragma once
#include <stdbool.h>
#include "esp_err.h"
typedef struct {
float value1;
float value2;
// Additional sensor values
} my_sensor_data_t;
/**
* @brief Initialize the sensor
* @return ESP_OK on success
*/
esp_err_t my_sensor_init(void);
/**
* @brief Read data from the sensor
* @param data Pointer to structure to store readings
* @return ESP_OK on success
*/
esp_err_t my_sensor_read(my_sensor_data_t *data); -
Configurar o Sistema de Build: Exemplo de
CMakeLists.txt:idf_component_register(
SRCS "my_new_sensor.c"
INCLUDE_DIRS "include"
REQUIRES driver
) -
Atualizar a Aplicação Principal:
- Adicione seu componente às dependências da aplicação principal
- Inicialize seu sensor no fluxo da aplicação principal
- Inclua as leituras do seu sensor nos dados de anúncio BLE
Exemplo de integração em
main.c:#include "my_new_sensor.h"
void app_main(void) {
// Initialize other components
// ...
// Initialize your new sensor
ESP_ERROR_CHECK(my_new_sensor_init());
// Read from your sensor
my_sensor_data_t sensor_data;
ESP_ERROR_CHECK(my_sensor_read(&sensor_data));
// Modify BLE data to include your sensor readings
// ...
} -
Estender os Dados de Anúncio BLE:
- Atualize o componente de beacon BLE para incluir os dados do seu sensor nos anúncios
- Atribua IDs de tipo de dados apropriados para suas novas medições
-
Atualizar a Configuração:
- Adicione opções Kconfig para seu sensor em
components/my_new_sensor/Kconfig - Isso permite que os usuários configurem seu sensor através do menuconfig
- Adicione opções Kconfig para seu sensor em
Seguindo essa abordagem estruturada, você pode integrar sensores adicionais de forma contínua, mantendo a arquitetura modular do projeto.
Solução de Problemas
Dicas Importantes
Sem Saída Serial Durante a Operação Normal
Para eficiência energética ideal, o dispositivo não exibe informações de depuração pela porta serial durante a operação normal. O LED também não piscará quando o dispositivo estiver em modo de deep sleep. Isso é intencional para minimizar o consumo de energia.
Regravando o Dispositivo
Para regravar o dispositivo:
- Pressione o botão de reset na placa XIAO quando iniciar o processo de gravação
- Sincronize seu comando de gravação com o breve período ativo (quando o dispositivo não está em deep sleep)
- Alternativamente, mantenha o botão de reset pressionado, inicie o comando de gravação e solte o botão de reset quando a gravação começar
Reativando a Saída de Depuração para Desenvolvimento
Ao desenvolver seus próprios módulos ou depurar, você pode reativar a saída serial:
- Execute
idf.py menuconfig - Navegue até
Component config→Log output - Defina o nível de log padrão como
INFOouDEBUG - Configure o destino de saída do log como
UART0 - Lembre-se de desativar o log detalhado novamente antes de implantar para preservar a vida útil da bateria
Sensor Não Detectado
Se você encontrar problemas com a detecção do sensor:
-
Verificar Conexões:
- Certifique-se de que o cabo Grove está corretamente conectado ao sensor e à placa de expansão
- Verifique se você está usando uma porta Grove I2C
-
Problemas de Endereço I2C:
- O endereço I2C padrão para o BME680 é 0x76. Alguns módulos podem usar 0x77.
- Edite o endereço I2C na configuração se necessário
-
Problemas de Energia:
- Certifique-se de que o XIAO está recebendo energia suficiente
- Tente um cabo USB ou porta diferente
BLE Não Está Anunciando
Se os anúncios BLE não forem detectados:
-
Verificar o Aplicativo de Scanner BLE:
- Tente um aplicativo de scanner BLE diferente
- Certifique-se de que o Bluetooth está ativado no seu telefone
-
Monitorar a Saída de Depuração:
- Use
idf.py monitorpara verificar mensagens de erro
- Use
-
Duração do Anúncio:
- A configuração padrão anuncia apenas por 500ms. Se você perder, aumente
ADV_TIME_MSemmain.c
- A configuração padrão anuncia apenas por 500ms. Se você perder, aumente
Falhas de Build ou Gravação
Se você encontrar problemas de build ou gravação:
-
Versão do ESP-IDF:
- Certifique-se de estar usando ESP-IDF v5.0 ou mais recente
- Execute
. $IDF_PATH/export.sh(Linux/macOS) ou%IDF_PATH%\export.bat(Windows) antes dos comandos
-
Conexão USB:
- Verifique se a conexão USB está estável
- Tente pressionar o botão de reset na placa de expansão XIAO antes de gravar
-
Problemas de Porta:
- Identifique a porta correta com
ls /dev/tty*(Linux/macOS) ou Gerenciador de Dispositivos (Windows) - Use a flag
-pcom a porta correta
- Identifique a porta correta com
Conclusão
Você construiu um sistema de monitoramento ambiental eficiente em energia que usa BLE para transmitir dados de temperatura, umidade, pressão e qualidade do ar. Este projeto demonstra vários conceitos importantes:
- Integração de Sensores: Trabalhando com sensores I2C no ESP-IDF
- Comunicação BLE: Criando e gerenciando anúncios BLE
- Gerenciamento de Energia: Implementando deep sleep para operação eficiente em bateria
- Desenvolvimento ESP-IDF: Usando o framework oficial da Espressif para desenvolvimento ESP32
Arquitetura Geral do Sistema
Esta base pode ser estendida para criar nós de sensores IoT mais complexos, sistemas de monitoramento ambiental ou soluções de rastreamento de ativos.
Recursos
✨ Projeto de Contribuidor
- Este projeto é apoiado pelo Projeto de Contribuidores da Seeed Studio.
- Um agradecimento especial a Priyanshu Roy pelo seu esforço dedicado. Seu trabalho será exibido.
Suporte Técnico e Discussão de Produtos
Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.


