Skip to content

juletopi/guardaRoupaApp

Repository files navigation

Guarda-roupa-logo

Guarda-Roupa

App mobile que salva suas roupas antes que seja tarde demais.


Sobre   •   Estrutura   •   Instalação   •   Changelog

Sobre o projeto

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.

Funcionalidades

  • 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

Tecnologias utilizadas

Core e navegação

ReactNative-badge Expo-badge ExpoRouter-badge

Interface e animações

Reanimated-badge ExpoLinearGradient-badge ExpoVectorIcons-badge ReactNativeSVG-badge VT323-badge

Dependências externas

OpenWeatherMap-badge ExpoLocation-badge Axios-badge AsyncStorage-badge Express-badge SerialPort-badge

Estrutura do projeto

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

Instalação

Important

Certifique-se de ter os seguintes requisitos antes de iniciar:

Node-badge NPM-badge ExpoCLI-badge
  1. Clone o repositório
git clone https://github.com/seu-usuario/guardaRoupaApp.git
cd guardaRoupaApp
  1. Instale as dependências do projeto
npm install
  1. Instale o Expo CLI globalmente (caso não tenha)
npm install -g expo-cli
  1. Inicie o projeto
npm start
  1. Abra no dispositivo escaneando o QR code com o Expo Go, ou pressione w para abrir no navegador.

API de clima (OpenWeatherMap)

O app usa a API OpenWeatherMap. Sem chave, a previsão não carrega.

  1. Crie uma conta em openweathermap.org/api e gere uma API key (plano gratuito já satisfaz casos de teste do app).

  2. Na raiz do projeto, copie o exemplo e crie o arquivo .env:

    cp .env.example .env
  3. Edite .env e defina:

    EXPO_PUBLIC_OWM_API_KEY=sua_chave_aqui
    
  4. Reinicie o bundler (Ctrl+C e npm start de novo). Variáveis EXPO_PUBLIC_* só entram após reiniciar o Expo.

  5. No dispositivo/emulador, permita localização quando o app pedir (o clima usa GPS).

Módulo Arduino (API local + firmware)

O controle físico do varal funciona em 3 camadas:

  1. App Expo envia/consulta estado via HTTP
  2. API local Node/Express (ponte serial) converte HTTP para comandos da serial
  3. Arduino executa o movimento e responde status em JSON

1) Suba o firmware no Arduino

  • Abra o arquivo Arduino/Arduino.ino na IDE do Arduino
  • Conecte o hardware (motor de passo + sensor ultrassônico + sensor de chuva)
  • Faça upload para a placa

2) Configure e rode a API local

  1. Ajuste a porta serial no arquivo Arduino-api/server.js (ex.: COM3, COM9, /dev/ttyACM0)

  2. Inicie a API na raiz do projeto:

    node Arduino-api/server.js
  3. A API sobe na porta 3000 com endpoints:

    • GET /status → retorna { estendido, chuva, roupa }
    • POST /command com { "action": "E" } ou { "action": "R" }

3) Ajuste de rede para teste em celular físico

  • Em src/services/arduinoService.js, troque http://localhost:3000 pelo IP da máquina que roda a API (ex.: http://192.168.1.15:3000)
  • Celular e computador precisam estar na mesma rede local

Protocolo serial usado

  • 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}

Changelog

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.

About

App mobile em React Native + componentes Arduíno que recolhe ou expõe suas roupas no varal antes de ser tarde demais.

Topics

Resources

Stars

Watchers

Forks

Contributors