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 e o controle por aplicativo para automatizar de forma inteligente a decisão de expor e recolher roupas no varal.
- Tela principal com animações de fundo dinâmicas, baseadas na condição climática real e horário do dia.
- Menu recolhido:
- Texto info de Data + local e seção com previsão horária via OpenWeatherMap
- Seleção de região por modal:
- Fluxo País → Estado → Município.
- Opção de definir local padrão.
- Botão flutuante RECOLHER / EXPOR na divisa do menu, com animação de linhas irradiando.
- Menu expandido:
- Seção de calendário:
- Escolha de dia.
- Previsão horária filtrada com base no mesmo payload.
- Seção de Histórico do varal:
- Registro de mudanças entre recolhido/expandido.
- Identificação da origem da mudança (manual, automático, chuva ou fim do dia).
- Seção de calendário:
- Integração em tempo real com módulo Arduino via API local:
- Leitura periódica de status do varal (estendido, chuva, roupa detectada).
- Leitura ativa de comandos do botão RECOLHER / EXPOR
- Regras de segurança no controle do varal:
- Confirmação para estender em caso de chuva.
- Confirmação quando não há roupa detectada.
guardaRoupaApp/
├── app/ # Roteamento (Expo Router)
│ ├── _layout.jsx # Carregar fontes, 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
├── assets/
│ ├── animations/ # Animações para as diferentes condições de clima
│ │ ├── clouds.json
│ │ ├── night.json
│ │ ├── rain.json
│ │ └── sunny.json
│ ├── fonts/ # Fontes customizadas
│ │ ├── croogla-bold.otf
│ │ ├── croogla-extralight.otf
│ │ ├── croogla-light.otf
│ │ ├── croogla-medium.otf
│ │ └── croogla-regular.otf
│ └── images/ # Logo do projeto
│ └── guarda-roupa-logo.png
├── constants/
│ ├── theme.js # Paleta, cores e tokens visuais
│ └── typography.js # Sistema de tipografia com variantes de fonte Croogla
├── 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
│ │ └── WeatherBackdropAnimation.jsx # Fundo animado por condição climática
│ ├── 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
├── .editorconfig
├── .env.example
├── CHANGELOG.md
├── eslint.config.js
├── metro.config.js
├── package.json
├── tsconfig.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 startNote
O comando npm start foi configurado para abrir o Expo em modo túnel por padrão.
-
Para abrir no navegador desktop, pressione
w. -
Para configurar o teste em celular físico, leia Ajuste de rede para teste em celular físico.
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" }
- Se quiser testar com seu celular, defina
EXPO_PUBLIC_ARDUINO_API_URLno.envcom o IP da máquina que roda a API, não comlocalhost(ex.:http://10.50.64.251:3000). - Celular e computador precisam estar na mesma rede local ou na mesma VPN que alcance esse IP
- Depois de alterar o
.env, reinicie o Expo com cache limpo para recompilar as variáveis públicas - Para abrir e testar, use o Expo Go no celular:
- Instale o Expo Go (App Store ou Google Play).
- Rode
npm startna raiz do projeto. - Abra o Expo Go no celular e escaneie o QR code mostrado no terminal.
-
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.