Assistente emocional em formato de companheiro físico para apoio a crianças neurodivergentes. Executa em modo quiosque (tela cheia) sobre Raspberry Pi, combina rosto animado, voz pré-gravada, sensor de batimentos cardíacos via Arduino e backend Django para registro longitudinal de humor.
Status: protótipo funcional. Validado em hackathon, eventos científicos e com profissionais (psicólogos, famílias). Não é produto de prateleira.
- 1º lugar — III Desafio Maker IFSULDEMINAS (2025), tema "Conectividade e Sustentabilidade" — protótipo funcional desenvolvido em 6 horas
- Apresentado na 5ª SNEPT — Semana Nacional de Educação Profissional e Tecnológica, Brasília (2025)
- HackTown 2025 — Santa Rita do Sapucaí, como startup pré-incubada
Quando uma criança se aproxima e toca a tela (ou pressiona qualquer tecla), o T.H.E.O. acorda e oferece dois caminhos:
- Registrar humor — fluxo guiado de 3 a 4 perguntas (sentimento → tipo → intensidade) com botões grandes, cores associativas e voz que narra cada passo. O registro é enviado para o backend.
- Suporte imediato — duas técnicas de regulação emocional:
- Respiração guiada (4-2-4: inspire 4s, segure 2s, expire 4s) com círculo animado que cresce e diminui acompanhando o ritmo
- Grounding 5-4-3-2-1 — cinco perguntas sequenciais ("o que você consegue ver / ouvir / tocar / cheirar / saborear?")
O rosto animado muda de expressão (feliz, neutro, triste, ansioso, dormindo) conforme o estado, pisca a cada 2,4s, anima a boca enquanto fala e flutua suavemente.
Após período de inatividade configurável, o app entra em modo "dormindo" (tela escura, rosto em repouso) até a próxima interação.
┌────────────────────────────────────────────────────────────┐
│ Raspberry Pi (tela cheia, kiosk) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ app.py — State Machine + Game Loop (60 FPS) │ │
│ │ ┌────────────┬────────────┬─────────────┬────────┐ │ │
│ │ │ interface/ │ voz/ │ sensores/ │ comum/ │ │ │
│ │ │ face, ui, │ TTS via │ leitura BPM │ POST │ │ │
│ │ │ tema │ pygame │ via serial │ + JWT │ │ │
│ │ └────────────┴────────────┴─────┬───────┴───┬────┘ │ │
│ └─────────────────────────────────┼───────────┼───────┘ │
└────────────────────────────────────┼───────────┼──────────┘
│ │
┌──────▼──┐ ┌───▼─────────┐
│ Arduino │ │ Backend │
│ A0 (LM35│ │ Django REST │
│ + sensor│ │ + SQLite │
│ pulso) │ │ + JWT auth │
└─────────┘ └─────────────┘
| Camada | Responsabilidade | Tecnologia |
|---|---|---|
| Apresentação | Tela cheia, rosto animado, botões, fade entre estados | pygame (60 FPS) |
| Lógica de fluxo | Máquina de estados, captura de input, transições, timeout de inatividade | Enum + STATE_CONFIG em app.py |
| Voz | Reprodução de áudios pré-gravados em duas vozes (masculino / feminino) | pygame.mixer + thread daemon |
| Sensoriamento | Leitura serial de BPM pré-calculado pelo Arduino | pyserial |
| Persistência remota | Envio de registros para API com autenticação JWT | requests + thread daemon |
| Backend | API REST que recebe e armazena registros de humor e batimentos | Django + DRF + SQLite |
theo-assistente-emocional/
├── main.py # Entrypoint — instancia App e roda
├── app.py # Game loop + state machine + render
├── config.json # Sexo, idade, voz padrão
├── estado_alerta.json # Estado persistente entre execuções
├── requirements.txt
│
├── interface/
│ ├── face.py # Rosto ASCII animado (piscar, boca falando, flutuar)
│ ├── ui.py # Layout de botões, fade-in alpha, word wrap
│ ├── tema.py # Paleta de cores (sentimentos, fundo, texto)
│ └── transicao.py # Interpolação linear de cor para fade
│
├── voz/
│ ├── tts.py # Carrega .wav por chave, toca via pygame.mixer
│ ├── feminino/ # ~20 áudios pré-gravados (inicio, escala, grounding_q1..5, etc.)
│ └── masculino/ # Mesmas chaves, voz alternativa
│
├── sensores/
│ └── batimentos.py # Coleta BPM via serial durante N segundos
│
├── arduino/
│ └── sensor_batimento.ino # Leitura analógica A0 → Serial.println
│
├── comunicacao/
│ └── envio_dados.py # POST autenticado (JWT) em thread daemon
│
└── servidor/ # Backend Django (executa em separado)
├── manage.py
├── db.sqlite3
├── backend/ # settings, urls, wsgi
└── registro/ # App Django: models, views, serializers, admin
| Estado | Tela | Saída |
|---|---|---|
DORMINDO |
Fundo preto, rosto em repouso | Qualquer input → INICIO |
INICIO |
"O que deseja fazer?" + 2 botões | SELECIONAR_SENTIMENTO ou AJUDA_IMEDIATA |
SELECIONAR_SENTIMENTO |
4 botões coloridos: Feliz / Neutro / Triste / Ansioso | ESCALA, TIPO_SENTIMENTO (se ansioso) ou OBRIGADO (se neutro) |
TIPO_SENTIMENTO |
"Aconteceu algo bom ou ruim?" | ESCALA |
ESCALA |
5 botões (gradiente leve → intenso) | OBRIGADO |
OBRIGADO |
Mensagem de despedida | Auto → DORMINDO após 5 s |
AJUDA_IMEDIATA |
Respiração / Grounding / Voltar | Estado escolhido |
RESPIRACAO |
Círculo animado + ciclos 4-2-4 | "Estou melhor" → AJUDA_IMEDIATA |
GROUNDING |
Pergunta sequencial 1 a 5 | Após q5 → AJUDA_IMEDIATA |
Timeout global de inatividade leva qualquer estado de volta a DORMINDO.
- Python 3.10+
- Raspberry Pi (recomendado) ou qualquer máquina com tela e suporte a
pygameem modoFULLSCREEN - Arduino Uno/Nano com sensor de pulso em
A0(opcional — sem ele, app roda mas sem leitura cardíaca) - Backend Django rodando (opcional — sem ele, os registros ficam só no console)
python -m venv .venv
# Linux / Raspberry Pi
source .venv/bin/activate
# Windows
.venv\Scripts\activate
pip install -r requirements.txt
python main.pyA app abre em tela cheia. Sair: ESC.
config.json define perfil do usuário e voz ativa:
{
"sexo": "Masculino",
"idade": 20,
"voz": "feminino"
}A chave voz deve corresponder a uma pasta dentro de voz/ (masculino/ ou feminino/).
Padrão: /dev/ttyACM0 (Linux). Em Windows, edite sensores/batimentos.py para a porta correta (ex.: COM8).
cd servidor
python manage.py migrate
python manage.py createsuperuser
python manage.py runserverEm comunicacao/envio_dados.py, ajuste BASE_URL, USERNAME e PASSWORD para apontar para o backend. O envio é desativado por padrão (enviar_servidor está comentado em app.py) — descomente quando o servidor estiver no ar.
| Componente | Função |
|---|---|
| Raspberry Pi 4 (4 GB+) | Roda a aplicação principal |
| Display touchscreen | Interação com a criança (botões grandes, toque direto) |
| Arduino Uno / Nano | Lê sensor de pulso analógico e envia BPM via serial |
| Sensor de pulso | Coleta batimentos cardíacos durante interação |
| Caixa de som | Reprodução da voz pré-gravada |
A carcaça física do robô companheiro foi projetada separadamente e validada com famílias e profissionais durante o ciclo de prototipagem.
- TTS não-sintetizado: usa áudios
.wavpré-gravados em duas vozes (humano natural, com entonação acolhedora) em vez de TTS sintetizado em tempo real. Razão: qualidade emocional supera a flexibilidade — toda fala é cuidadosamente roteirizada para o público-alvo. - Estado
DORMINDOpor padrão: o T.H.E.O. é um companheiro presente, não um app que demanda. Espera ser procurado. - Botões grandes, alto contraste, paleta calma: acessibilidade visual e cognitiva — fluxo de no máximo 3 cliques até o registro completo.
- Persistência em background:
enviar_servidorroda em thread daemon, app nunca trava esperando rede. - Backend opcional: o app funciona offline (registros saem no console). O servidor é uma camada de observação para profissionais, não dependência crítica.
MIT — ver LICENSE.
- Jean Ferreira Dias — github.com/JeanFD
- Lara Domingos Viana