O Guarda-Roupa é um aplicativo mobile que resolve um problema cotidiano: recolher ou expor roupas no varal sem depender de "achismos" sobre o tempo antes de ser tarde demais.
A ideia central é combinar uma API de clima em tempo real com um módulo Arduino físico para automatizar (ou pelo menos facilitar) a decisão de expor e recolher roupas.
- Tela principal com gradiente dinâmico de fundo (baseado na condição climática real)
- Seção "Hoje" com previsão climática horária horizontal via API OpenWeatherMap (probabilidade de chuva por hora, campo
pop, em vez de temperatura no card) - Menu expandido com calendário: escolha de dia e previsão horária filtrada a partir do mesmo payload
/forecast - Local manual: toque no título com cidade para abrir modal (País → Estado → Município); opção de local padrão e botão para voltar à localização atual (GPS)
- Menu inferior animado com dois estados: recolhido (~20% da tela) e expandido (~90%)
- Botão flutuante RECOLHER / EXPOR na divisa do menu, com animação de linhas irradiando
- Integração em tempo real com módulo Arduino via API local: leitura periódica de status do varal (estendido, chuva, roupa detectada)
- Regras de segurança no controle do varal: bloqueio para estender em caso de chuva e confirmação do usuário quando não há roupa detectada
guardaRoupaApp/
├── app/ # Roteamento (Expo Router)
│ ├── _layout.jsx # Fontes Nunito, loading inicial, StatusBar, Stack
│ └── index.jsx # Rota inicial → MainScreen
├── Arduino/
│ └── Arduino.ino # Firmware: motor + sensores + protocolo serial (E/R/S)
├── Arduino-api/
│ └── server.js # API local (Express) de ponte entre App e Arduino via porta serial
├── src/
│ ├── components/
│ │ ├── ExpandMenuBtn.jsx # Botão expandir/recolher menu
│ │ ├── ForecastCalendar.jsx # Calendário mensal, navegação de mês e seleção de dia (integrado à API)
│ │ ├── HourlyForecast.jsx # Lista horizontal: hora, ícone, precipitação (%)
│ │ ├── LocationSelectModal.jsx # Modal: local manual (país/estado/município) e local padrão
│ │ └── ToggleVaralBtn.jsx # Botão de toggle recolher/expor varal
│ ├── data/
│ │ ├── locationOptions.js # Opções encadeadas para seleção de local na modal
│ │ ├── clotheslineHistory.json # Histórico persistido em JSON durante a execução
│ │ └── mockData.js # Dados mockados
│ ├── hooks/
│ │ ├── useClotheslineHistoryTracker.js # Rastreador de mudanças no estado do varal
│ │ └── useWeather.js # GPS/manual, local padrão (AsyncStorage), OWM (clima + /forecast + cidade)
│ ├── screens/
│ │ └── MainScreen.jsx # Céu + menu, data selecionada, clima carregado e exibido
│ ├── services/
│ │ ├── arduinoService.js # Cliente HTTP para API local do Arduino (/status e /command)
│ │ ├── clotheslineHistoryService.js # Persistência em memória/AsyncStorage do histórico do varal
│ │ └── weatherService.js # OpenWeatherMap: clima atual, previsão 5d/3h, reverse geocoding (cidade)
│ └── utils/
│ ├── forecastDateUtils.js # Datas PT-BR, grade do calendário, itens horários (incl. precipitação pop)
│ ├── historyUtils.js # Formatação e helpers do histórico de atividade
│ ├── timeUtils.js # Formatação de horários
│ └── weatherUtils.js # Gradiente do céu, ícones e texto de condição
├── constants/
│ └── theme.js # Paleta, fontes
├── .editorconfig
├── .env.example
├── CHANGELOG.md
├── eslint.config.js
├── package.json
└── README.md
- Clone o repositório
git clone https://github.com/seu-usuario/guardaRoupaApp.git
cd guardaRoupaApp- Instale as dependências do projeto
npm install- Instale o Expo CLI globalmente (caso não tenha)
npm install -g expo-cli- Inicie o projeto
npm start- Abra no dispositivo escaneando o QR code com o Expo Go, ou pressione
wpara abrir no navegador.
O app usa a API OpenWeatherMap. Sem chave, a previsão não carrega.
-
Crie uma conta em openweathermap.org/api e gere uma API key (plano gratuito já satisfaz casos de teste do app).
-
Na raiz do projeto, copie o exemplo e crie o arquivo
.env:cp .env.example .env
-
Edite
.enve defina:EXPO_PUBLIC_OWM_API_KEY=sua_chave_aqui -
Reinicie o bundler (
Ctrl+Cenpm startde novo). VariáveisEXPO_PUBLIC_*só entram após reiniciar o Expo. -
No dispositivo/emulador, permita localização quando o app pedir (o clima usa GPS).
O controle físico do varal funciona em 3 camadas:
- App Expo envia/consulta estado via HTTP
- API local Node/Express (ponte serial) converte HTTP para comandos da serial
- Arduino executa o movimento e responde status em JSON
- Abra o arquivo
Arduino/Arduino.inona IDE do Arduino - Conecte o hardware (motor de passo + sensor ultrassônico + sensor de chuva)
- Faça upload para a placa
-
Ajuste a porta serial no arquivo
Arduino-api/server.js(ex.:COM3,COM9,/dev/ttyACM0) -
Inicie a API na raiz do projeto:
node Arduino-api/server.js
-
A API sobe na porta
3000com endpoints:GET /status→ retorna{ estendido, chuva, roupa }POST /commandcom{ "action": "E" }ou{ "action": "R" }
- Em
src/services/arduinoService.js, troquehttp://localhost:3000pelo IP da máquina que roda a API (ex.:http://192.168.1.15:3000) - Celular e computador precisam estar na mesma rede local
-
E: estender varal -
R: recolher varal -
S: solicitar status atual -
Resposta do Arduino: JSON em linha única, por exemplo:
{"estendido":true,"chuva":false,"roupa":true}
O projeto mantém um histórico de alterações detalhado para cada versão, incluindo:
- Novas funcionalidades adicionadas
- Alterações em funcionalidades existentes
- Correções de bugs
Consulte o CHANGELOG.md para ver o histórico completo de alterações.