IntegraΓ§Γ£o de todos os mΓ³dulos do Kit C num sistema domΓ³tico coerente e funcional.
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.
LDR β LED branco liga ao escurecer. PIR β LED permanece ligado 10s apΓ³s movimento.
BotΓ£o β abre/fecha porta. Bluetooth β controlo remoto da porta.
Sensor de vapor β fecha janela se detetar chuva.
MQ-2 β buzzer + LED amarelo piscam + ventoinha liga automaticamente.
Mostra luminosidade, estado da porta e alertas ativos.
Controla luzes, porta e ventoinha via smartphone.
| Pino Arduino | MΓ³dulo | FunΓ§Γ£o no projeto |
|---|---|---|
| D2 | PIR | DeteΓ§Γ£o de movimento β mantΓ©m luz ligada |
| D3 | Ventoinha (sinal) | IndicaΓ§Γ£o de estado (via relΓ©) |
| D4 | RelΓ© | Liga/desliga ventoinha (ativo LOW) |
| D5 | LED Branco | IluminaΓ§Γ£o sala |
| D6 | LED Amarelo | Alarme gΓ‘s (pisca) |
| D7 | BotΓ£o | Porta / campainha |
| D8 | Buzzer | Alertas sonoros |
| D9 | Servo 1 | Porta |
| D10 | BT HM-10 (RX Arduino) | Recebe comandos BT |
| D11 | BT HM-10 (TX Arduino) | Envia estado via BT |
| D12 | Servo 2 | Janela |
| A0 | LDR | Luminosidade ambiente |
| A1 | MQ-2 | DeteΓ§Γ£o de gΓ‘s |
| A2 | Sensor Vapor | DeteΓ§Γ£o de chuva |
| A3 | Sensor Solo | Humidade do solo |
| A4 | LCD SDA (IΒ²C) | Dados IΒ²C |
| A5 | LCD SCL (IΒ²C) | Clock IΒ²C |
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.
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// 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(" ");
}
}| Comando | AΓ§Γ£o | Resposta BT |
|---|---|---|
'1' | Liga luz da sala | Sala ON |
'0' | Desliga luz da sala | Sala OFF |
'2' | Liga luz do quarto | Qt ON |
'3' | Desliga luz do quarto | Qt OFF |
'A' | Abre porta | Porta aberta |
'F' | Fecha porta | Porta fechada |
'V' | Liga ventoinha | Vent ON |
'v' | Desliga ventoinha | Vent OFF |
'S' | Pede estado completo | Luz:NNN Gas:NNN Solo:NNN |
Adiciona um sensor DHT11 ou DHT22 (temperatura e humidade real) e mostra os valores no LCD. Aciona a ventoinha quando temperatura > 30Β°C.
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.
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.
Automatiza a rega da planta: sensor de solo > limiar β abre relΓ© para bomba de Γ‘gua 5V durante 3 segundos. Regista eventos via Bluetooth.