↑
⬀ Avançado

🏠 Projeto Final β€” Casa DomΓ³tica Completa

IntegraΓ§Γ£o de todos os mΓ³dulos do Kit C num sistema domΓ³tico coerente e funcional.

⚠️

PrΓ©-requisitos

Antes de avanΓ§ar para o projeto final, certifica-te que jΓ‘ testaste cada mΓ³dulo individualmente e que a montagem estΓ‘ completa. Instala as bibliotecas Servo e LiquidCrystal_I2C.

Nesta pΓ‘gina

βœ… Funcionalidades do sistema

πŸ’‘
IluminaΓ§Γ£o automΓ‘tica

LDR β†’ LED branco liga ao escurecer. PIR β†’ LED permanece ligado 10s apΓ³s movimento.

πŸšͺ
Porta automΓ‘tica

BotΓ£o β†’ abre/fecha porta. Bluetooth β†’ controlo remoto da porta.

πŸͺŸ
Janela automΓ‘tica

Sensor de vapor β†’ fecha janela se detetar chuva.

πŸ’¨
Alarme de gΓ‘s

MQ-2 β†’ buzzer + LED amarelo piscam + ventoinha liga automaticamente.

πŸ–₯️
Painel LCD

Mostra luminosidade, estado da porta e alertas ativos.

πŸ“Ά
Controlo BT

Controla luzes, porta e ventoinha via smartphone.

πŸ—ΊοΈ Mapa de pinos final

Pino ArduinoMΓ³duloFunΓ§Γ£o no projeto
D2PIRDeteΓ§Γ£o de movimento β†’ mantΓ©m luz ligada
D3Ventoinha (sinal)IndicaΓ§Γ£o de estado (via relΓ©)
D4RelΓ©Liga/desliga ventoinha (ativo LOW)
D5LED BrancoIluminaΓ§Γ£o sala
D6LED AmareloAlarme gΓ‘s (pisca)
D7BotΓ£oPorta / campainha
D8BuzzerAlertas sonoros
D9Servo 1Porta
D10BT HM-10 (RX Arduino)Recebe comandos BT
D11BT HM-10 (TX Arduino)Envia estado via BT
D12Servo 2Janela
A0LDRLuminosidade ambiente
A1MQ-2DeteΓ§Γ£o de gΓ‘s
A2Sensor VaporDeteΓ§Γ£o de chuva
A3Sensor SoloHumidade do solo
A4LCD SDA (IΒ²C)Dados IΒ²C
A5LCD SCL (IΒ²C)Clock IΒ²C

πŸ’» CΓ³digo completo do projeto

πŸ’‘

O cΓ³digo usa millis() em vez de delay() para que todos os mΓ³dulos funcionem em simultΓ’neo sem bloquear uns aos outros. Este padrΓ£o chama-se "non-blocking" e Γ© essencial em projetos com mΓΊltiplos sensores.

casa_domotica_completa.ino
// ═══════════════════════════════════════════════════════
//  Kit C β€” Casa DomΓ³tica Completa
//  LED Portugal Β· PR.FT14_5
//  VersΓ£o corrigida β€” compatΓ­vel com placa de interface Kit C
// ═══════════════════════════════════════════════════════

#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>

// ── PINOS ─────────────────────────────────────────────
#define PIR         2
#define RELE        4
#define LED_BRANCO  5
#define LED_AMARELO 6
#define BOTAO       7
#define BUZZER      8
#define SERVO_PORTA  9
#define BT_RX       10   // D10 = RX Arduino ← TX HM-10
#define BT_TX       11   // D11 = TX Arduino β†’ RX HM-10
#define SERVO_JANELA 12
#define LDR         A0
#define MQ2         A1
#define VAPOR       A2
#define SOLO        A3

// ── LIMIARES ─────────────────────────────────────────
#define LIM_ESCURO    600   // LDR: acima disto Γ© escuro
#define LIM_GAS       400   // MQ-2: ajustar apΓ³s calibrar
#define LIM_CHUVA     500   // Vapor: abaixo = chuva
#define TEMPO_LUZ  10000   // ms que a luz fica ligada apΓ³s movimento
#define TEMPO_PIR  30000   // ms de calibraΓ§Γ£o do PIR

// ── OBJETOS ──────────────────────────────────────────
Servo porta;
Servo janela;
LiquidCrystal_I2C lcd(0x27, 16, 2);
SoftwareSerial btSerial(BT_RX, BT_TX);

// ── ESTADO ───────────────────────────────────────────
bool portaAberta    = false;
bool janelaAberta   = true;
bool alarmeGas      = false;
bool ultimoBotao    = HIGH;
unsigned long tMovimento = 0;
unsigned long tLCD      = 0;
unsigned long tAlarme   = 0;

// ═════════════════════════════════════════════════════
void setup() {
  // Pinos
  pinMode(PIR, INPUT);
  pinMode(BOTAO, INPUT_PULLUP);
  pinMode(LED_BRANCO, OUTPUT);
  pinMode(LED_AMARELO, OUTPUT);
  pinMode(RELE, OUTPUT);
  digitalWrite(RELE, HIGH);  // Ventoinha OFF

  // Servos
  porta.attach(SERVO_PORTA);
  janela.attach(SERVO_JANELA);
  porta.write(0);    // Fechada
  janela.write(90);  // Aberta

  // ComunicaΓ§Γ£o
  Serial.begin(9600);
  btSerial.begin(9600);

  // LCD
  lcd.init();
  lcd.backlight();
  lcd.print("Casa Inteligente");
  lcd.setCursor(0,1);
  lcd.print("A calibrar PIR..");

  // CalibraΓ§Γ£o PIR + prΓ©-aquecimento MQ-2
  delay(TEMPO_PIR);

  lcd.clear();
  lcd.print("Sistema pronto!");
  btSerial.println("Casa pronta! Comandos: 1/0 2/3 A/F V/v");
  delay(1500);
}

// ═════════════════════════════════════════════════════
void loop() {
  unsigned long agora = millis();

  // ─── LEITURAS ──────────────────────────────────────
  int luz    = analogRead(LDR);
  int gas    = analogRead(MQ2);
  int vapor  = analogRead(VAPOR);
  int solo   = analogRead(SOLO);
  bool mov   = digitalRead(PIR);
  bool botao = digitalRead(BOTAO);

  // ─── BOTΓƒO β€” Porta ─────────────────────────────────
  if (botao == LOW && ultimoBotao == HIGH) {
    portaAberta = !portaAberta;
    porta.write(portaAberta ? 90 : 0);
    tone(BUZZER, 1200, 100);
    btSerial.println(portaAberta ? "Porta aberta" : "Porta fechada");
    delay(50); // Anti-bounce
  }
  ultimoBotao = botao;

  // ─── PIR β€” Registo de movimento ────────────────────
  if (mov) tMovimento = agora;

  // ─── LDR + PIR β€” IluminaΓ§Γ£o automΓ‘tica ────────────
  if (luz > LIM_ESCURO || (agora - tMovimento < TEMPO_LUZ)) {
    digitalWrite(LED_BRANCO, HIGH);
  } else {
    if (!alarmeGas) digitalWrite(LED_BRANCO, LOW);
  }

  // ─── MQ-2 β€” Alarme de gΓ‘s ──────────────────────────
  alarmeGas = (gas > LIM_GAS);
  if (alarmeGas) {
    digitalWrite(RELE, LOW);  // Ventoinha ON
    if (agora - tAlarme > 600) {
      digitalWrite(LED_AMARELO, !digitalRead(LED_AMARELO)); // Pisca
      tone(BUZZER, (agora % 1200) + 400);  // Sirene
      tAlarme = agora;
    }
    btSerial.print("GAS: "); btSerial.println(gas);
  } else {
    digitalWrite(RELE, HIGH); // Ventoinha OFF
    digitalWrite(LED_AMARELO, LOW);
    noTone(BUZZER);
  }

  // ─── Vapor β€” Janela automΓ‘tica ─────────────────────
  if (vapor < LIM_CHUVA && janelaAberta) {
    janela.write(0); janelaAberta = false;
    btSerial.println("Chuva: janela fechada");
  } else if (vapor >= LIM_CHUVA && !janelaAberta) {
    janela.write(90); janelaAberta = true;
    btSerial.println("Seco: janela aberta");
  }

  // ─── Bluetooth β€” Comandos ──────────────────────────
  if (btSerial.available()) {
    char cmd = btSerial.read();
    Serial.print("BT: "); Serial.println(cmd);
    switch(cmd) {
      case '1': digitalWrite(LED_BRANCO,HIGH);  btSerial.println("Sala ON");   break;
      case '0': digitalWrite(LED_BRANCO,LOW);   btSerial.println("Sala OFF");  break;
      case '2': digitalWrite(LED_AMARELO,HIGH); btSerial.println("Qt ON");    break;
      case '3': digitalWrite(LED_AMARELO,LOW);  btSerial.println("Qt OFF");   break;
      case 'A': portaAberta=true;  porta.write(90); btSerial.println("Porta aberta");  break;
      case 'F': portaAberta=false; porta.write(0);  btSerial.println("Porta fechada"); break;
      case 'V': digitalWrite(RELE,LOW);   btSerial.println("Vent ON");  break;
      case 'v': digitalWrite(RELE,HIGH);  btSerial.println("Vent OFF"); break;
      case 'S': // Estado completo
        btSerial.print("Luz:"); btSerial.print(luz);
        btSerial.print(" Gas:"); btSerial.print(gas);
        btSerial.print(" Solo:"); btSerial.println(solo);
        break;
    }
  }

  // ─── LCD β€” Painel de estado (atualiza a cada 1s) ───
  if (agora - tLCD > 1000) {
    tLCD = agora;
    lcd.setCursor(0, 0);
    if (alarmeGas) {
      lcd.print("** ALARME GAS **");
    } else {
      lcd.print("Luz:");
      lcd.print(luz);
      lcd.print(" Porta:");
      lcd.print(portaAberta ? "AB" : "FE");
      lcd.print("   ");
    }
    lcd.setCursor(0, 1);
    lcd.print(mov ? "Mov:SIM " : "Mov:nao ");
    lcd.print(vapor < LIM_CHUVA ? "Chuva" : "Seco ");
    lcd.print("  ");
  }
}

πŸ“± Comandos Bluetooth

ComandoAΓ§Γ£oResposta BT
'1'Liga luz da salaSala ON
'0'Desliga luz da salaSala OFF
'2'Liga luz do quartoQt ON
'3'Desliga luz do quartoQt OFF
'A'Abre portaPorta aberta
'F'Fecha portaPorta fechada
'V'Liga ventoinhaVent ON
'v'Desliga ventoinhaVent OFF
'S'Pede estado completoLuz:NNN Gas:NNN Solo:NNN

πŸš€ ExtensΓ΅es e desafios

🌑️ Desafio 1

Adiciona um sensor DHT11 ou DHT22 (temperatura e humidade real) e mostra os valores no LCD. Aciona a ventoinha quando temperatura > 30Β°C.

πŸ“Š Desafio 2

Cria uma app Android com MIT App Inventor que mostra o estado da casa em tempo real via Bluetooth e tem botΓ΅es para cada funΓ§Γ£o.

⏰ Desafio 3

Adiciona um mΓ³dulo RTC DS3231 (relΓ³gio em tempo real) e programa iluminaΓ§Γ£o automΓ‘tica por horΓ‘rio β€” luzes ligam Γ s 20h e desligam Γ s 7h.

🌱 Desafio 4

Automatiza a rega da planta: sensor de solo > limiar β†’ abre relΓ© para bomba de Γ‘gua 5V durante 3 segundos. Regista eventos via Bluetooth.