Skip to content

JeanFD/theo-assistente-emocional

Repository files navigation

T.H.E.O. — Tecnologia Humanizada para Emoções e Observação

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.


Reconhecimentos

  • 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

O que faz

Quando uma criança se aproxima e toca a tela (ou pressiona qualquer tecla), o T.H.E.O. acorda e oferece dois caminhos:

  1. 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.
  2. 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.


Arquitetura

┌────────────────────────────────────────────────────────────┐
│  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  │
                              └─────────┘    └─────────────┘

Camadas

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

Estrutura do projeto

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

Estados da aplicação

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.


Como rodar

Requisitos

  • Python 3.10+
  • Raspberry Pi (recomendado) ou qualquer máquina com tela e suporte a pygame em modo FULLSCREEN
  • 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)

Aplicação cliente (Raspberry Pi)

python -m venv .venv

# Linux / Raspberry Pi
source .venv/bin/activate

# Windows
.venv\Scripts\activate

pip install -r requirements.txt
python main.py

A app abre em tela cheia. Sair: ESC.

Configuração

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/).

Porta serial do Arduino

Padrão: /dev/ttyACM0 (Linux). Em Windows, edite sensores/batimentos.py para a porta correta (ex.: COM8).

Backend Django

cd servidor
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver

Em 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.


Hardware

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.


Decisões de design

  • TTS não-sintetizado: usa áudios .wav pré-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 DORMINDO por 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_servidor roda 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.

Licença

MIT — ver LICENSE.

Autores

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors