https://github.com/a5ur4/pickbyvoice
Projeto de um pick by voice, feito em arduino uno para a disciplina de Microcontroladores
https://github.com/a5ur4/pickbyvoice
arduino c fastapi logistics
Last synced: 4 days ago
JSON representation
Projeto de um pick by voice, feito em arduino uno para a disciplina de Microcontroladores
- Host: GitHub
- URL: https://github.com/a5ur4/pickbyvoice
- Owner: a5ur4
- Created: 2026-06-05T20:27:32.000Z (24 days ago)
- Default Branch: main
- Last Pushed: 2026-06-05T21:14:37.000Z (24 days ago)
- Last Synced: 2026-06-05T23:07:23.090Z (24 days ago)
- Topics: arduino, c, fastapi, logistics
- Language: Python
- Homepage: https://www.tinkercad.com/things/6f0p3xCrnIk-modelo-pickbyvoice
- Size: 381 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Pick By Voice — Low Cost 🎙️📦
Sistema de separação de pedidos (Picking) por comandos de voz de baixo custo, integrado com **Oracle Database**, **FastAPI** e **Arduino**.
Este projeto permite que operadores de armazém realizem a coleta de itens de forma "hands-free", recebendo instruções via áudio e confirmando localizações/quantidades por voz, com feedback visual e sonoro através de um módulo Arduino conectado via Bluetooth.
---
## 🏗️ Arquitetura do Sistema
O ecossistema é dividido em três camadas principais:
1. **Backend (API + DB)**: Centraliza as regras de negócio, controle de estoque e ordens de serviço.
2. **Cliente de Voz (Python)**: Roda em um dispositivo móvel (Android/PC) e faz a ponte entre o operador (STT/TTS) e a API.
3. **Interface de Hardware (Arduino)**: Fornece sinais visuais (LED/LCD) e sonoros (Buzzer) baseados no status da coleta.
---
## 📂 Estrutura do Projeto
```text
pickbyvoice/
├── api/ # Backend FastAPI (Assíncrono)
│ ├── core/ # Configurações e Exceções
│ ├── database/ # Conexão e Pool (SQLAlchemy + OracleDB)
│ ├── migrations/ # Versionamento de banco (Alembic)
│ ├── models/ # Modelos SQLAlchemy 2.0 (Mapped/Identity)
│ ├── routes/ # Endpoints da API (Operadores, Ordens, Coleta)
│ ├── schemas/ # Schemas Pydantic (Validação de dados)
│ └── services/ # Lógica de negócio e Stored Procedures
├── arduino/ # Firmware C++ para o Arduino Uno
├── db/ # Scripts SQL originais (Tabelas, Views, Procs, Seed)
├── docs/ # Documentação do projeto
├── .env # Variáveis de ambiente (DB, API)
└── README.md # Este arquivo
```
---
## 🛠️ Tecnologias Utilizadas
* **Linguagens**: Python 3.12+ (Backend/Client) e C++ (Arduino).
* **Banco de Dados**: Oracle Database XE (rodando em Docker).
* **ORM**: SQLAlchemy 2.0 (Modo Assíncrono).
* **Migrations**: Alembic.
* **Framework Web**: FastAPI (Uvicorn).
* **Voz**: Vosk (Speech-to-Text Offline) e pyttsx3 (Text-to-Speech).
---
## 🚀 Como Rodar o Projeto
### 1. Banco de Dados (Oracle XE)
Certifique-se de ter o Docker instalado e rode o container:
```bash
docker-compose up -d
```
A imagem `gvenzl/oracle-xe` inicializará o banco e criará o usuário configurado no `.env`.
### 2. Preparar o Ambiente Python
```bash
python -m venv .venv
source .venv/bin/activate
pip install -r api/requirements.txt
```
### 3. Migrações e Dados Iniciais
Aplique as migrações para criar as tabelas e execute o seed se necessário:
```bash
cd api
export ORACLE_DSN="localhost:1521?service_name=XEPDB1"
alembic upgrade head
```
### 4. Executar a API
Na raiz do projeto:
```bash
source .venv/bin/activate
export ORACLE_DSN="localhost:1521?service_name=XEPDB1"
fastapi run api/main.py
```
Acesse `http://localhost:8000/docs` para ver a documentação interativa (Swagger).
### 5. Arduino
* Carregue o arquivo `arduino/pick_by_voice.ino` no seu Arduino Uno.
* Conecte um módulo Bluetooth (ex: HC-05) aos pinos de Serial.
* Pinos padrão: LED OK (8), LED ERRO (9), Buzzer (10), LCD I2C (0x27).
---
## 📢 Demonstração do Sistema

Link para acesso a demonstração no Tinkcard: [PickByVoiceDemo](https://www.tinkercad.com/things/6f0p3xCrnIk-modelo-pickbyvoice?sharecode=3qxVWNa7DNa1RetHDgUN01mvTk6TLsJKgWb01gIXjD4)
---
## 📝 Roteiro de Exentesão
O roteiro de extensão do projeto está disponível na pasta `docs/` com o nome `ROTEIRO DE EXTENSÃO - PICKBYVOICE.pdf`.
Caso queira, pode acessar a versão do Google Docs através do seguinte link: [Roteiro de Extensão - PickByVoice](https://docs.google.com/document/d/1862g0fcIZiqdanSQVqO9xreU7wXJL9zYPSLBLme-9OA/edit?usp=sharing)
---
## 🗣️ Funcionamento do Pick By Voice
1. **Login**: O operador informa sua matrícula via voz.
2. **Início**: O sistema atribui a ordem de maior prioridade ao operador.
3. **Instrução**: A voz sintetizada diz o endereço (Rua, Coluna, Nível) e o produto.
4. **Ação no Arduino**: O endereço é exibido no LCD e o LED de alerta acende.
5. **Confirmação**: O operador fala o código de verificação presente na prateleira.
6. **Validação**: A API valida o código. Se correto, o Arduino apita e acende o LED verde. Se errado, acende o LED vermelho e solicita nova tentativa.
7. **Finalização**: Ao concluir todos os itens, o sistema guia o operador para a expedição.
---
## 🛡️ Decisões Técnicas
* **Async Oracle**: Utilizamos `oracledb_async` para garantir que a API não bloqueie durante chamadas de banco pesadas ou execuções de stored procedures.
* **Identity Columns**: Utilizamos o recurso nativo do Oracle 12c+ (`GENERATED AS IDENTITY`) mapeado no SQLAlchemy para garantir chaves primárias seguras e eficientes.
* **Alembic Async**: O script de migração foi customizado para utilizar o driver assíncrono, mantendo a consistência com o restante da aplicação.