E-nose: Detecção de Gases com IA e MEMS utilizando UNIHIKER K10 (ESP32 S3) no Arduino IDE
Introdução
Este projeto apresenta um dispositivo de detecção de gases com tecnologia da IA, baseado no DFRobot UNIHIKER K10. O equipamento utiliza quatro tipos de sensores de odor (Odor, Fumaça, VOC e H2S) para coletar dados em tempo real de alho e grãos de café. Esses dados são então utilizados para treinar um modelo da IA na plataforma Edge Impulse. Após o treinamento, o modelo é implementado no UNIHIKER K10, permitindo a diferenciação inteligente entre esses dois odores. Com uma interação sim ples do usuário, o dispositivo é capaz de identificar diferentes odores, tornando-o adequado para monitoramento inteligente de odores, detecção ambiental e diversas outras aplicações.
A funcionalidade principal do projeto consiste em controlar a tela de exibição por meio do hardware K10, fornecendo resultados de reconhecimento de odor em tempo real. Um botão aciona a coleta de dados odoríferos e o processamento de inferência, simplificando a experiência do usuário.
Link para download do código: GitHub Repository
Vídeo de operação: YouTube Link

Lista de Hardwareed
Fan, conectando fios e peças impressas em 3D
Componentes do Sistema
Plataforma de Hardware: O DFRobot UNIHIKER K10 serve como a plataforma de controle principal, utilizando o Arduino IDE como ambiente de programação. O dispositivo possui uma tela integrada e botões, permitindo a exibição dos resultados de inferência e o recebimento de entradas do usuário.

Sensores de Gás: Quatro tipos de sensores — Odor, Fumaça, VOC e H2S — são responsáveis pela captação de dados odoríferos do alho e dos grãos de café. Por meio da análise das variações nos dados dos sensores, o dispositivo é capaz de identificar as características específicas de cada odor
Edge Impulse: A plataforma Edge Impulse é utilizada para treinar o modelo de IA com os dados odoríferos coletados, criando assim um sistema de reconhecimento de odores.
Motor de Inferência: Implementado no UNIHIKER K10, o motor de inferência executa análises de IA em tempo real, convertendo os dados dos sensores em resultados interpretáveis.
Passo
1. Configuração do Ambiente
-Instale o Arduino IDE 1.8.19: Download Link
Passo 1: Adicione a K10 board no Arduino IDE
Passo 2: Ferramentas -> Gerenciador de Placas
Passo 3: Pesquise por "esp32" e instale
Passo 4: Concluído
* Este exemplo do Arduino IDE utiliza o idioma inglês como referência.

-Instalação da Biblioteca DFRobot_ADS1115 no Arduino IDE(Importação de biblioteca em formato .zip): https://docs.arduino.cc/software/ide-v1/tutorials/installing-libraries/ -Cadastro na Plataforma Edge Impulse:Edge Impulse Studio
-Instalação da Ferramenta Edge Impulse Data Forwarder:Documentation Link
2. Conexões de Hardware
- Preparação dos componentes:

- Conexão dos sensores de gás: Conecte os quatro sensores de gás ao módulo DFRobot ADS1115 utilizando os pinos VCC, GND e ADC. Cada sensor deve ser conectado a um canal de entrada analógica específico do ADS1115(Ordem de conexão A0-A3: H2S, VOC, Odor, Smoke)O UNIHIKER K10 deve ser conectado ao módulo ADS1115 por meio da interface I2C.
- Montagem do recipiente: Posicione o objeto a ser testado dentro do recipiente.

3. Coleta e Rotulagem de Dados
- Após ligar o dispositivo, o código no Arduino IDE (data.ino) inicializa o módulo ADS1115. A biblioteca DFRobot_ADS1115 lê os dados dos sensores e os converte em valores de tensão.
- O código utiliza a função drawLine() para exibir as alterações em tempo real dos dados dos sensores na tela do K10. Isso permite observar a tendência das variações de dados dos quatro sensores.

- Durante cada coleta de dados, as leituras de tensão dos sensores são armazenadas no array sensorData. Para garantir atualizações em tempo real, os dados antigos são sobrescritos quando novos dados são armazenados, mantendo um máximo de 8 conjuntos de dados. A cada 100ms, os valores dos quatro sensores são exibidos no monitor serial.
- Abra o Windows PowerShell e execute a ferramenta Edge Impulse data-forwarder, introduz:
$edge-impulse-data-forwarder --frequency 10
Utilize a ferramenta de aquisição de dados da plataforma Edge Impulse para coletar e rotular os dados seriais.
Rótulos: coffeebeans, garlic
Longitude da amostra: 800ms
Sensores: H2S, VOC, Odor, SMOKE
Os dados de treinamento são usados para treinar seu modelo, e os dados de teste são usados para verificar a precisão do modelo após o treinamento. Recomendamos uma proporção aproximada de 80/20 entre dados de treinamento e teste para cada classe (ou rótulo) em seu conjunto de dados, embora conjuntos de dados particularmente grandes possam exigir menos dados de teste.
* Como o Edge Impulse atualmente (em 2025) não possui uma interface oficial completa em Português Brasileiro, a demonstração a seguir usará o ambiente em inglês como exemplo.

4. Treinar modelo
- Após coletar dados para seu projeto, você pode agora criar seu Impulso. Um Impulso completo consistirá em 3 blocos principais: bloco de entrada, bloco de processamento e bloco de aprendizado. Um projeto pode conter múltiplos impulsos, ou Experimentos, onde cada impulso contém a mesma ou uma combinação diferente de blocos. Isso permite visualizar a precisão e resultados de previsão do modelo para vários blocos de aprendizado e processamento usando os mesmos conjuntos de dados de treinamento e teste.

- O bloco Flatten realiza análise estatística do sinal. É útil para médias de variação lenta, como dados de temperatura, em combinação com outros blocos.
Parâmetros do Flatten
- Escala dos eixos: Multiplica os eixos por este número
- Média: Calcula o valor médio para a janela
- Mínimo: Calcula o valor mínimo na janela
- Máximo: Calcula o valor máximo na janela
- Raiz quadrada média: Calcula o valor RMS da janela
- Desvio padrão: Calcula o desvio padrão da janela
- Assimetria: Calcula a assimetria da janela
- Curtose: Calcula a curtose da janela
- Número de Janelas para Média Móvel: Calcula a média móvel mantendo uma média rolante das últimas N janelas. Observe que não há preenchimento zero, o bloco acumulará médias até N janelas. (Ex.: para a primeira janela em uma amostra, a média móvel será igual à média). A média móvel é reiniciada para cada amostra durante o treinamento e, durante a inferência, quando run_classifier_init() é chamado. Observe que, se você habilitar isso, provavelmente não desejará janelas sobrepostas para treinamento.

Na maioria de nossos blocos DSP, você tem a opção de calcular a importância dos recursos. O Edge Impulse Studio então exibirá uma lista de Importância de Recursos que ajudará a determinar quais eixos gerados pelo seu bloco DSP são mais significativos para analisar quando você deseja treinar um modelo.

Após extrair características relevantes do sinal bruto através do processamento de sinais, você pode agora treinar seu modelo utilizando um bloco de aprendizado.

A classificação em tempo real permite validar seu modelo com dados capturados diretamente de qualquer dispositivo ou placa de desenvolvimento compatível. Isso fornece uma visão de como seu modelo irá performar com dados do mundo real.

Os impulsos podem ser implantados como uma biblioteca Arduino. Isso empacota todos os seus blocos de processamento de sinal, configuração e blocos de aprendizado em um único pacote. Você pode incluir este pacote em seus sketches para executar o impulso localmente. Neste tutorial, você exportará um impulso e o integrará em um sketch para classificar dados de sensores.

5. Implantação
- Implantação do Modelo TensorFlow Lite Treinado: O modelo TensorFlow Lite treinado (utilizando a biblioteca enose2025_inferencing) é implantado no UNIHIKER K10 através do ambiente de desenvolvimento Arduino IDE (Importação de Biblioteca .zip): Arduino IDE Library Installation Guide
- Carregamento do Programa (enose.ino): Quando o usuário pressiona o botão, o sistema inicia a coleta de dados dos sensores e os armazena no array features. A função run_classifier() é chamada para inferência, e o modelo prevê se o odor atual é de alho ou grãos de café com base nos dados de entrada.
- Exibição dos Resultados: O ícone correspondente ao odor detectado (alho ou grãos de café) é exibido na tela do K10, conforme a probabilidade do resultado da inferência. O tempo de inferência e os resultados também são impressos através do monitor serial.


Instruções
- Passo 1: Insira a sonda de odor no frasco contendo alho ou grãos de café e aguarde até que as leituras dos sensores se estabilizem.
- Passo 2: Pressione o botão A no K10. A tela exibirá "Carregando" e iniciará a coleta de dados de odor.
- Passo 3: Após a conclusão da coleta, o dispositivo realizará automaticamente a inferência e exibirá o resultado (alho ou grãos de café) na tela.
- Passo 4: Após testar um objeto, utilize um ventilador para dissipar odores residuais da sonda, preparando-a para a próxima rodada de testes.
- Observação: Quando não estiver em uso, evite deixar a sonda dentro do frasco por longos períodos, pois isso pode contaminar os sensores e afetar testes futuros.
Vídeo de Operação: YouTube Link
Análise do Código
O código do projeto está dividido em vários módulos funcionais, contendo principalmente as seguintes partes:
1. Importação de Bibliotecas e Variáveis Globais:
- DFRobot_ADS1115: Utilizada para leitura dos valores de tensão do conversor analógico-digital ADS1115, sendo adequada para coleta de dados dos sensores de gás.
- unihiker_k10: Responsável pelo controle da tela do K10, fornecendo funções de desenho e exibição.
- enose2025_inferencing: Biblioteca de inferência para reconhecimento de odores.
2. Variáveis Globais:
Inclui configurações para a direção da tela, arrays para armazenamento de dados dos sensores e arrays para armazenamento de dados de características.
3. Dados de Imagem e Arrays de Características:
O array image_data armazena imagens para o plano de fundo, tela de carregamento e resultados de inferência, utilizadas na exibição da interface do usuário.
O array features armazena os dados de características coletados dos sensores, que são utilizados no processo de inferência.
4. Definições de Funções:
- setup(): Inicializa a comunicação serial, a tela do K10, define a imagem de fundo e configura a função de callback do botão.
- loop(): O loop principal realiza a leitura em tempo real dos dados dos sensores e atualiza a exibição. Quando os dados atingem 8 conjuntos, os mais antigos são removidos, mantendo apenas os 8 conjuntos mais recentes.
- drawLine(): Desenha curvas dos dados dos sensores em tempo real, facilitando a observação das tendências dos dados.
- onButtonAPressed(): Quando o usuário pressiona o botão A, o sistema inicia a coleta de dados dos sensores e chama a função de inferência run_classifier(). Com base no resultado da inferência, exibe a imagem correspondente.
5. Processamento dos Resultados da Inferência:
Com base na probabilidade do resultado da inferência, o sistema determina se o odor corresponde a alho ou grãos de café, exibindo a imagem correspondente na tela. Adicionalmente, são impressos no monitor serial o tempo de inferência e quaisquer detecções de anomalias potenciais.
Conclusão
Este dispositivo de detecção de odores com tecnologia de IA, baseado no hardware K10, realiza todo o processo desde a coleta de dados até a inferência de IA. Ao utilizar quatro sensores de gás para coletar dados de alho e grãos de café, treinar o modelo na plataforma Edge Impulse e implantar o modelo no hardware K10, o sistema é capaz de realizar reconhecimento de odores.
Referências
1.https://docs.edgeimpulse.com/docs
2.https://github.com/polamaxu/enose_K10
3.https://www.unihiker.com/wiki/K10
Tutoriais Relacionados
1. How to use TensorFlow Lite Micro on UNIHIKER K10 (ESP32 S3) with Arduino IDE
