Um aplicativo web completo para medir, registrar e compartilhar a acessibilidade de ambientes públicos em relação a ruído e luminosidade. Desenvolvido especialmente para pessoas autistas e outras neurodiversidades que precisam encontrar espaços adequados ao seu perfil sensorial.
Esse aplicativo foi pensado das regras de negócio até a produção de prototipo para o Hackathon atip 2025, com o tema de acessibilidade.
- Visão Geral
- Características
- Arquitetura do Projeto
- Pré-requisitos
- Instalação
- Como Usar
- API Endpoints
- Estrutura de Pastas
- Tecnologias Utilizadas
- Documentação Técnica
- Contribuindo
Ambientes Acessíveis é uma plataforma que permite aos usuários:
- Registrar medições de ruído e luminosidade em locais públicos
- Visualizar ambientes em um mapa interativo
- Consultar dados coletados pela comunidade
- Classificar ambientes de forma simples e intuitiva
O app utiliza sensores nativos do navegador (microfone e câmera) para capturar dados em tempo real, eliminando a necessidade de aplicativos externos.
- 👤 Pessoas autistas (TEA)
- 👤 Pessoas com TDAH
- 👤 Neurodivergentes em geral que precisam encontrar espaços seguros
- 👤 Administradores de espaços públicos que desejam adequar seus ambientes
- Registro e login com email
- Tokenização JWT segura
- Sessões persistentes com localStorage
- Perfil de usuário com informações de neurodiversidade
- Visualização em tempo real com OpenStreetMap
- Marcadores coloridos indicando nível de acessibilidade
- 🟢 Verde: Bom (< 45 dB)
- 🟡 Laranja: Ok (45-55 dB)
- 🔴 Vermelho: Atenção/Ruim (> 55 dB)
- Zoom e navegação fluída
- Detalhes do local ao clicar em marcador
- Ruído: Captura via Web Audio API
- Análise FFT em tempo real
- Resultado em decibéis (dB)
- Classificação automática
- Luminosidade: Captura via câmera
- Análise de pixels em tempo real
- Resultado em lux (Lux)
- Correção gama automática
- Busca por nome ou endereço do local
- Filtro por tipo de ambiente
- Resultados em tempo real
- Classificação rápida: Bom / Ok / Atenção / Ruim
- Salva automaticamente após medição por sensores
- Histórico de medições
- Local recebe "Selo Acessível" após 100 registros bom/ok no último mês
- Indica que o espaço é adequado para neurodivergentes
sensorial_app/
├── estrutura-back/ # Backend API (FastAPI)
│ ├── main.py # Servidor principal com todos os endpoints
│ ├── run_with_test_data.py # Script para iniciar com dados de teste
│ ├── requirements.txt # Dependências Python
│ └── db.py # Configuração de banco (MongoDB)
├── frontend_teste/ # Frontend (HTML5/CSS3/JS)
│ ├── index.html # Interface principal
│ ├── script.js # Lógica da aplicação
│ ├── sensores.js # Classe SensorManager
│ ├── styles.css # Estilos responsivos
│ └── serve_frontend.py # Servidor local para frontend
└── docs/ # Documentação técnica
├── ARQUITETURA.md # Visão geral da arquitetura
├── MAPA_OPENSTREETMAP.md # Implementação do mapa
├── FLUXO_MEDICOES.md # Fluxo de medições
├── SENSORES_TECNICO.md # Detalhes técnicos dos sensores
└── TESTE_COM_DADOS_REAIS.md # Guia de testes
┌─────────────────┐
│ Frontend │ (HTML/CSS/JS)
│ - UI/UX │
│ - Sensores │
│ - Mapa │
└────────┬────────┘
│ HTTP/REST
↓
┌─────────────────┐
│ Backend │ (FastAPI)
│ - API REST │
│ - Validação │
│ - Classificação│
│ - Persistência │
└────────┬────────┘
│
↓
┌─────────────────┐
│ Database │ (MongoDB*)
│ - Usuários │
│ - Locais │
│ - Registros │
└─────────────────┘
* Atualmente em-memória (estrutura pronta para MongoDB)
- Python 3.9+ (testado em 3.12.2)
- Node.js (opcional, apenas se quiser usar gerenciadores de pacotes)
- Navegador moderno (Chrome, Firefox, Safari, Edge)
- Permissões para:
- ✅ Microfone (para medir ruído)
- ✅ Câmera (para medir luminosidade)
- ✅ Localização/GPS (para encontrar endereço)
git clone https://github.com/codeonthespectrum/sensorial_app.git
cd sensorial_app# macOS/Linux
python3 -m venv .venv
source .venv/bin/activate
# Windows
python -m venv .venv
.venv\Scripts\activatepip install -r estrutura-back/requirements.txt# Opção A: Com dados de teste pré-carregados
cd estrutura-back
python run_with_test_data.py
# Opção B: Backend limpo (sem dados)
cd estrutura-back
python main.pyO backend estará disponível em: http://localhost:8000
cd frontend_teste
python serve_frontend.pyO frontend estará disponível em: http://localhost:3000
- O frontend descrito como
/front_testsão testes para visualização funcional do backend. A versão final ficará disponivel em 27/10/2025.
Abra seu navegador e acesse: http://localhost:3000
-
Registre uma conta
- Clique em "Não tem conta? Crie uma"
- Preencha: Nome, Email, Senha, Cidade, Neurodiversidade
- Clique em "Registrar"
-
Escolha seu tipo de neurodiversidade
- TEA (Transtorno do Espectro Autista)
- TDAH
- Outro
- Não informado
-
Visualizar Locais
- Vá para a aba "Buscar"
- O mapa carregará automaticamente
- Vê marcadores coloridos dos ambientes registrados
-
Filtrar Locais
- Digite um nome ou endereço na busca
- Filtre por tipo de ambiente (Restaurante, Biblioteca, etc.)
- O mapa se atualiza em tempo real
-
Ver Detalhes
- Clique em um marcador no mapa
- Verá: Nome, Endereço, Última medição, Total de registros
- Vá para aba "Sensores"
- Para Medir Ruído:
- Clique em "Medir Ruído"
- Conceda permissão de microfone
- Mantenha silêncio por 3 segundos
- Resultado em dB aparecerá
- Para Medir Luminosidade:
- Clique em "Medir Luminosidade"
- Conceda permissão de câmera
- Aponte para o ambiente
- Resultado em Lux aparecerá
- Vá para aba "Registrar"
- Selecione um local
- Escolha: Bom / Ok / Atenção / Ruim
- Clique em "Registrar"
- Vá para aba "Perfil"
- Veja suas informações e histórico
POST /auth/registro
Content-Type: application/json
{
"nome": "João Silva",
"email": "[email protected]",
"senha": "senha123",
"cidade": "São Paulo",
"neurodiversidade": "TEA"
}
Response: 201 Created
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "bearer"
}POST /auth/login
Content-Type: application/json
{
"email": "[email protected]",
"senha": "senha123"
}
Response: 200 OK
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "bearer"
}GET /auth/me
Authorization: Bearer <token>
Response: 200 OK
{
"nome": "João Silva",
"email": "[email protected]",
"cidade": "São Paulo",
"neurodiversidade": "TEA"
}GET /locais/proximos?latitude=-23.5505&longitude=-46.6333&raio_km=5&tipo_ambiente=Restaurante
Response: 200 OK
{
"locais": [
{
"place_id": "starbucks_paulista",
"nome_local": "Starbucks Paulista",
"tipo_ambiente": "Cafeteria",
"coordenadas": {
"latitude": -23.5612,
"longitude": -46.6560
},
"nivel_ruido_atual": "Ok",
"nivel_luz_atual": "Bom",
"ultima_atualizacao": "2025-10-21T15:30:00",
"selo_acessivel": false
}
],
"total": 1
}GET /locais/{place_id}
Response: 200 OK
{
"place_id": "starbucks_paulista",
"nome_local": "Starbucks Paulista",
"tipo_ambiente": "Cafeteria",
"coordenadas": {...},
"nivel_ruido_atual": "Ok",
"total_registros": 25,
"selo_acessivel": false,
"ultimos_5_registros": [...],
"estatisticas_horario": [...]
}POST /registros
Authorization: Bearer <token>
Content-Type: application/json
{
"place_id": "starbucks_paulista",
"nome_local": "Starbucks Paulista",
"endereco": "Av. Paulista, 1000",
"tipo_ambiente": "Cafeteria",
"coordenadas": {
"latitude": -23.5612,
"longitude": -46.6560
},
"ruido_db": 48.5,
"luminosidade_lux": 250
}
Response: 201 Created
{
"mensagem": "Registro criado com sucesso",
"id": 15,
"nivel_ruido": "Ok",
"nivel_luz": "Bom"
}POST /sensores/processar-audio
Content-Type: application/json
{
"frequencias": [100, 200, 300, ...],
"energia_media": 0.245
}
Response: 200 OK
{
"db_estimado": 48.5,
"energia_media": 0.245,
"quantidade_frequencias": 128,
"classificacao": "Ok"
}POST /sensores/processar-luminosidade
Content-Type: application/json
{
"r": 200,
"g": 210,
"b": 190
}
Response: 200 OK
{
"lux_estimado": 285.5,
"luminancia": 0.478,
"rgb": {"r": 200, "g": 210, "b": 190},
"classificacao": "Bom"
}GET /health
Response: 200 OK
{
"status": "ok",
"timestamp": "2025-10-21T15:35:20",
"usuarios_cadastrados": 15,
"locais_cadastrados": 42,
"registros_totais": 287
}GET /tipos-ambiente
Response: 200 OK
{
"tipos": [
{
"valor": "Restaurante",
"limites_ruido": {
"bom": [0, 45],
"ok": [45, 50],
"atencao": [50, 55],
"ruim": [55, 120]
},
"limites_luz": {...}
},
...
]
}GET /sensores/info
Response: 200 OK
{
"ruido": {
"metodo": "Web Audio API",
"descricao": "Captura áudio do microfone e analisa frequências",
"precisao": "±3-5 dB",
"limitacoes": [...]
},
"luminosidade": {...}
}sensorial_app/
│
├── 📄 README.md # Este arquivo
├── 📄 .gitignore
├── 📄 LICENSE
│
├── 📁 estrutura-back/ # Backend FastAPI
│ ├── 📄 main.py # API principal (588 linhas)
│ ├── 📄 run_with_test_data.py # Startup com dados de teste
│ ├── 📄 requirements.txt # Dependências Python
│ ├── 📄 db.py # Config MongoDB (template)
│ ├── 📄 api_test.sh # Scripts de teste
│ ├── 📄 test_api_interativo.py
│ ├── 📄 docker-compose.yml # Config Docker (template)
│ └── 📁 __pycache__/
│
├── 📁 frontend_teste/ # Frontend Web
│ ├── 📄 index.html # Template HTML (5 abas)
│ ├── 📄 script.js # Lógica principal (856 linhas)
│ ├── 📄 sensores.js # Classe SensorManager
│ ├── 📄 styles.css # Estilos responsivos
│ ├── 📄 serve_frontend.py # Servidor local
│ └── 📄 sensores.js
│
├── 📁 docs/ # Documentação Técnica
│ ├── 📄 ARQUITETURA.md # Visão geral do sistema
│ ├── 📄 MAPA_OPENSTREETMAP.md # Docs do mapa
│ ├── 📄 FLUXO_MEDICOES.md # Fluxo de medições
│ ├── 📄 SENSORES_TECNICO.md # Detalhes técnicos
│ ├── 📄 GUIA_USO.md # Manual do usuário
│ └── 📄 TESTE_COM_DADOS_REAIS.md # Guia de testes
│
└── 📁 .git/ # Versionamento Git
- FastAPI - Framework web assíncrono moderno
- Uvicorn - Servidor ASGI
- Pydantic - Validação de dados
- PyJWT - Tokenização JWT
- Python 3.12 - Linguagem
- HTML5 - Markup semântico
- CSS3 - Estilos responsivos (Grid/Flexbox)
- JavaScript Vanilla - Zero dependências
- Leaflet.js v1.9.4 - Mapa interativo
- OpenStreetMap - Tiles de mapa
- Web Audio API - Captura e análise de áudio
- getUserMedia API - Acesso à câmera
- Canvas API - Processamento de imagens
- Em-memória (Python dicts) - Desenvolvimento
- MongoDB - Produção (estrutura pronta)
- Docker - Containerização (template incluso)
- Git - Versionamento
Acesse a documentação detalhada em docs/:
- ARQUITETURA.md - Visão geral da arquitetura e fluxos
- MAPA_OPENSTREETMAP.md - Implementação do mapa com Leaflet.js
- FLUXO_MEDICOES.md - Fluxo detalhado de medições
- SENSORES_TECNICO.md - Detalhes técnicos dos sensores
- TESTE_COM_DADOS_REAIS.md - Guia completo de testes
- GUIA_USO.md - Manual do usuário final
# Terminal 1: Backend com dados de teste
cd estrutura-back
python run_with_test_data.py
# Terminal 2: Frontend
cd frontend_teste
python serve_frontend.py
# Abrir browser
open http://localhost:3000Credenciais de Teste:
- Email:
[email protected]| Senha:senha123 - Email:
[email protected]| Senha:senha123 - Email:
[email protected]| Senha:senha123
curl http://localhost:8000/health | python3 -m json.toolhttp://localhost:8000/docs
- ✅ JWT tokens para autenticação
- ✅ Hash SHA256 para senhas (em produção, use bcrypt)
- ✅ CORS habilitado para desenvolvimento
- ✅ Validação de entrada com Pydantic
- ✅ Limites de valor para sensores (dB: 0-120, Lux: 0-10000)
Para Produção:
- Configure
.envcom variáveis seguras - Use bcrypt com passlib
- Configure CORS mais restritivo
- Implemente rate limiting
- Use HTTPS
- Configure MongoDB com autenticação
| Ambiente | Bom | Ok | Atenção | Ruim |
|---|---|---|---|---|
| Restaurante | 0-45 | 45-50 | 50-55 | 55+ |
| Biblioteca | 0-35 | 35-40 | 40-45 | 45+ |
| Shopping | 0-50 | 50-55 | 55-60 | 60+ |
| Hospital | 0-35 | 35-40 | 40-45 | 45+ |
| Escritório | 0-45 | 45-50 | 50-55 | 55+ |
| Ambiente | Bom | Ok | Atenção | Ruim |
|---|---|---|---|---|
| Restaurante | 200-300 | 150-200 | 100-150 | 0-100 |
| Biblioteca | 300-500 | 250-300 | 200-250 | 0-200 |
| Escritório | 500-750 | 400-500 | 300-400 | 0-300 |
- ✅ Autenticação e perfil de usuário
- ✅ Mapa interativo com marcadores
- ✅ Web Audio API para ruído
- ✅ Camera API para luminosidade
- ✅ Busca e filtro de locais
- ✅ Registro manual
- 🔄 Persistência em MongoDB
- 🔄 Calibração de sensores por usuário
- 🔄 Histórico gráfico de medições
- 🔄 Estatísticas por horário
- 📋 App mobile (React Native/Flutter)
- 📋 Notificações em tempo real
- 📋 Comunidades por bairro
- 📋 Relatórios para administradores
- 📋 Integração com Google Places API
Contribuições são bem-vindas! Por favor:
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/NovaFeature) - Commit suas mudanças (
git commit -m 'Adiciona NovaFeature') - Push para a branch (
git push origin feature/NovaFeature) - Abra um Pull Request
- Código deve estar bem documentado
- Testes devem passar
- Siga a style guide do projeto
- Atualize a documentação conforme necessário
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
- Gabrielly Gomes - Dev Backend
- Katiene Souza - Dev Frontend
- Stefanni Nascimento - UI Designer
- Jefferson Lima - UX Designer
- Beatriz Ferreira - Business
- Giovana - Business
- 🐛 Encontrou um bug? Abra uma issue
- 💡 Tem uma sugestão? Comente em Discussions
- 📧 Email: [email protected]
- OpenStreetMap pelos mapas
- FastAPI pela excelente documentação
- Comunidade autista por inspirar este projeto
- Todos os contribuidores e testadores
Desenvolvido com ❤️ para tornar o mundo mais acessível para neurodivergentes.
Última atualização: 21 de outubro de 2025