- Introdução
- Descrição do Projeto
- Estrutura do Código
- Configurações e Variáveis Importantes
- Como Utilizar o Código
- Testes Unitários
- Considerações sobre a Organização do Código
- Licença
Este projeto implementa um relógio holográfico utilizando um ESP32, LEDs NeoPixel e um sensor para detecção de movimento. O objetivo é criar uma visualização holográfica de imagens pré-definidas ou enviadas via interface web, sincronizando a exibição dos LEDs com a rotação do dispositivo.
O sistema consiste em:
- ESP32: Microcontrolador responsável por gerenciar a lógica do sistema, controle dos LEDs e comunicação Wi-Fi.
- NeoPixel LEDs: Uma matriz de LEDs RGB controlados individualmente para exibir as imagens.
- Sensor: Utilizado para detectar a posição do dispositivo e sincronizar a exibição dos LEDs.
- Servidor Web: Permite controlar o dispositivo remotamente, ligar/desligar LEDs e enviar novas imagens.
O código lê o sensor para determinar o tempo de rotação, calcula o tempo por setor (t_arco
) e atualiza os LEDs para exibir a imagem desejada sincronizada com a rotação.
O código foi modularizado para melhorar a organização, manutenção e escalabilidade. A estrutura de pastas é a seguinte:
- projeto/
- main/
- main.cpp
- src/
- sensor_control.cpp
- utilities.cpp
- web_server_handlers.cpp
- include/
- config.h
- image_data.h
- sensor_control.h
- utilities.h
- web_server_handlers.h
- test/
- test_sensor_control.cpp
- test_utilities.cpp
- test_web_server_handlers.cpp
- main.cpp: Contém as funções
setup()
eloop()
, e inicia as configurações iniciais do sistema. - config.h: Armazena constantes e variáveis globais que são utilizadas em múltiplos arquivos.
- sensor_control.h e sensor_control.cpp: Gerenciam a leitura do sensor e o cálculo dos tempos de rotação.
- utilities.h e utilities.cpp: Contêm funções utilitárias, como o filtro e o parsing de strings.
- web_server_handlers.h e web_server_handlers.cpp: Definem as funções relacionadas ao servidor web e suas rotas.
- image_data.h: Armazena os dados da imagem
imagem1
a ser exibida. - test/: Contém os testes unitários para os diferentes módulos do código.
ssid
: Nome da rede Wi-Fi que o ESP32 irá criar ou conectar.password
: Senha da rede Wi-Fi.
serverPort
: Porta em que o servidor web irá operar (padrão é 80).
LED_PIN
: Pino do ESP32 conectado aos LEDs NeoPixel.LED_COUNT
: Número total de LEDs no projeto.
SENSOR_PIN
: Pino do ESP32 conectado ao sensor.NUM_SETORES
: Número de setores em que o círculo é dividido para sincronização (calculado como3 * largura
).
detect
: Contador de detecções do sensor.N_giro
: Número de giros contabilizados.tempoSensor
: Tempo em microssegundos desde a última detecção do sensor.tempo
: Tempo base para sincronização.t_giro[]
: Array que armazena os tempos dos últimos giros.t_arco
: Tempo calculado para cada setor.M_giro_antes
eM_giro_atual
: Utilizados no cálculo do tempo médio de giro, aplicando o filtro.
-
Hardware:
- ESP32.
- LEDs NeoPixel (mínimo de 36 LEDs).
- Sensor conectado ao pino especificado em
SENSOR_PIN
.
-
Software:
- Arduino IDE ou PlatformIO.
- Bibliotecas:
- Adafruit NeoPixel: Para controle dos LEDs.
- WiFi.h: Para conexão Wi-Fi.
- WebServer.h: Para criar o servidor web.
-
Clone o Repositório: Faça o download ou clone o repositório para sua máquina local.
-
Configuração do Wi-Fi:
- Edite o arquivo
config.h
localizado na pastainclude/
. - Altere as constantes
ssid
epassword
para corresponder à sua rede Wi-Fi.
- Edite o arquivo
-
Montagem do Hardware:
- Conecte os LEDs NeoPixel ao pino definido em
LED_PIN
. - Conecte o sensor ao pino definido em
SENSOR_PIN
. - Certifique-se de que todos os componentes estão alimentados corretamente.
- Conecte os LEDs NeoPixel ao pino definido em
-
Compilação e Upload:
- Abra o projeto no Arduino IDE ou no seu ambiente preferido.
- Certifique-se de que todas as bibliotecas necessárias estão instaladas.
- Compile e faça o upload do código para o ESP32.
-
Operação:
- Após o upload, o ESP32 irá se conectar à rede Wi-Fi especificada.
- Abra o monitor serial para visualizar mensagens de depuração.
- Anote o endereço IP exibido no monitor serial.
-
Interação via Servidor Web:
- Abra um navegador web e acesse
http://<endereço_ip_do_esp32>/
. - Utilize as opções disponíveis para ligar/desligar os LEDs ou enviar uma nova imagem.
- Abra um navegador web e acesse
- Ligar LEDs: Acesse
http://<endereço_ip_do_esp32>/led/on
. - Desligar LEDs: Acesse
http://<endereço_ip_do_esp32>/led/off
. - Enviar Imagem:
- Navegue até a página principal.
- Utilize o formulário para enviar uma string representando a imagem.
- A string deve estar no formato
{R1,G1,B1,A1,R2,G2,B2,A2,...}
.
Os testes unitários foram criados utilizando o framework AUnit para Arduino. Eles permitem verificar o correto funcionamento das funções e módulos do código.
test_sensor_control.cpp
: Testes para o módulo de controle do sensor.test_utilities.cpp
: Testes para as funções utilitárias.test_web_server_handlers.cpp
: Testes para as rotas e funções do servidor web.
-
Instalar o Framework AUnit:
- Abra o Arduino IDE.
- Vá em Sketch > Incluir Biblioteca > Gerenciar Bibliotecas.
- Pesquise por AUnit e instale.
-
Configurar o Projeto para Testes:
- Abra o arquivo de teste que deseja executar (por exemplo,
test_utilities.cpp
). - Certifique-se de que os caminhos para os arquivos
.h
estão corretos.
- Abra o arquivo de teste que deseja executar (por exemplo,
-
Compilar e Carregar:
- Selecione a placa correta (ESP32).
- Compile e faça o upload do código de teste para o ESP32.
-
Visualizar os Resultados:
- Abra o monitor serial.
- O resultado dos testes será exibido, indicando quais passaram e quais falharam.
- Mocks e Simulações: Como o ESP32 interage com hardware real, os testes utilizam mocks para simular o comportamento do hardware.
- Isolamento dos Testes: Cada teste é independente para garantir a confiabilidade dos resultados.
- Limitações de Memória: Certifique-se de que o ESP32 possui memória suficiente para executar os testes.
A organização do código em múltiplos arquivos e pastas tem como objetivo:
- Modularidade: Facilitar a manutenção e compreensão separando funcionalidades distintas em módulos.
- Reutilização de Código: Funções utilitárias e configurações globais podem ser reutilizadas em diferentes partes do projeto.
- Escalabilidade: Permitir a adição de novas funcionalidades sem tornar o código monolítico.
- Testabilidade: Facilitar a criação de testes unitários para cada módulo.
main/
: Contém o ponto de entrada do programa (main.cpp
).src/
: Implementações das funções e classes.include/
: Arquivos de cabeçalho com declarações e definições.test/
: Arquivos relacionados aos testes unitários.
- Clareza: Separar o código em pastas lógicas torna mais fácil para outros desenvolvedores entenderem o projeto.
- Manutenção: Facilita a localização e correção de bugs ou adição de novas funcionalidades.
- Colaboração: Em equipes, uma estrutura organizada permite que múltiplas pessoas trabalhem em diferentes partes do projeto simultaneamente.