#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WebServer.h>
WiFiServer server(80);
String httpRequest = "";
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define LUZ_PIN 4
#define PORTAO_PIN 18
#define CAMERA_PIN 19
bool luz = false;
bool portao = false;
bool camera = false;
unsigned long agendarLuz = 0;
unsigned long agendarPortao = 0;
unsigned long agendarCamera = 0;
unsigned long tempoInicial;
bool cameraAuto = false;
void atualizarLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Luz:");
lcd.print(luz ? "ON " : "OFF");
lcd.setCursor(8, 0);
lcd.print("Port:");
lcd.print(portao ? "ON" : "OFF");
lcd.setCursor(0, 1);
lcd.print("Cam:");
lcd.print(camera ? "ON " : "OFF");
}
void ligarLuz() {
luz = true;
digitalWrite(LUZ_PIN, HIGH);
Serial.println("Luz ligada");
atualizarLCD();
}
void desligarLuz() {
luz = false;
digitalWrite(LUZ_PIN, LOW);
Serial.println("Luz desligada");
atualizarLCD();
}
void ligarPortao() {
portao = true;
digitalWrite(PORTAO_PIN, HIGH);
Serial.println("Portão aberto");
atualizarLCD();
}
void fecharPortao() {
portao = false;
digitalWrite(PORTAO_PIN, LOW);
Serial.println("Portão fechado");
atualizarLCD();
}
void ligarCamera() {
camera = true;
digitalWrite(CAMERA_PIN, HIGH);
Serial.println("Câmera ligada");
atualizarLCD();
}
void desligarCamera() {
camera = false;
digitalWrite(CAMERA_PIN, LOW);
Serial.println("Câmera desligada");
atualizarLCD();
}
void processarComando(String cmd) {
cmd.toLowerCase();
if (cmd.startsWith("agendar")) {
int espaco1 = cmd.indexOf(' ');
int espaco2 = cmd.indexOf(' ', espaco1 + 1);
if (espaco1 == -1 || espaco2 == -1) {
Serial.println("Formato invalido! Use: agendar luz (Nº em seg.)");
return;
}
String dispositivo = cmd.substring(espaco1 + 1, espaco2);
int tempo = cmd.substring(espaco2 + 1).toInt();
unsigned long agora = millis();
if (tempo <= 0) {
Serial.println("O tempo deve ser positivo.");
return;
}
if (dispositivo == "luz") {
agendarLuz = agora + (tempo * 1000UL);
if (luz) {
Serial.print("Luz será DESLIGADA em ");
Serial.print(tempo);
Serial.println(" segundos.");
} else {
Serial.print("Luz será LIGADA em ");
Serial.print(tempo);
Serial.println(" segundos.");
}
}
else if (dispositivo == "portao") {
agendarPortao = agora + (tempo * 1000UL);
if (portao) {
Serial.print("Portão será FECHADO em ");
Serial.print(tempo);
Serial.println(" segundos.");
} else {
Serial.print("Portão será ABERTO em ");
Serial.print(tempo);
Serial.println(" segundos.");
}
}
else if (dispositivo == "camera") {
agendarCamera = agora + (tempo * 1000UL);
if (camera) {
Serial.print("Câmera será DESLIGADA em ");
Serial.print(tempo);
Serial.println(" segundos.");
} else {
Serial.print("Câmera será LIGADA em ");
Serial.print(tempo);
Serial.println(" segundos.");
}
}
else {
Serial.println("Dispositivo desconhecido!");
}
return;
}
if (cmd == "luz on") ligarLuz();
else if (cmd == "luz off") desligarLuz();
else if (cmd == "portao on") ligarPortao();
else if (cmd == "portao off") fecharPortao();
else if (cmd == "camera on") ligarCamera();
else if (cmd == "camera off") desligarCamera();
else {
Serial.println("Comando inválido!");
}
}
void setup() {
Serial.begin(115200);
WiFi.softAP("CasaControl", "12345678");
Serial.println("WiFi criado!");
Serial.print("Acesse: http://");
Serial.println(WiFi.softAPIP());
server.begin();
Serial.println("Servidor iniciado porta 80");
lcd.init();
lcd.backlight();
pinMode(LUZ_PIN, OUTPUT);
pinMode(PORTAO_PIN, OUTPUT);
pinMode(CAMERA_PIN, OUTPUT);
Serial.println("Sistema de Controle Doméstico Iniciado!");
Serial.println("Comandos ON/OFF:");
Serial.println(" luz on/off");
Serial.println(" portao on/off");
Serial.println(" camera on/off");
Serial.println("Agendamentos:");
Serial.println(" agendar luz (Nº em seg.)");
Serial.println(" agendar portao (Nº em seg.)");
Serial.println(" agendar camera (Nº em seg.)");
tempoInicial = millis();
atualizarLCD();
}
void processarHTTP(String req) {
req.toLowerCase();
if (req.indexOf("luz/on") != -1) { ligarLuz(); }
else if (req.indexOf("luz/off") != -1) { desligarLuz(); }
else if (req.indexOf("portao/on") != -1) { ligarPortao(); }
else if (req.indexOf("portao/off") != -1) { fecharPortao(); }
else if (req.indexOf("camera/on") != -1) { ligarCamera(); }
else if (req.indexOf("camera/off") != -1) { desligarCamera(); }
else if (req.indexOf("/agendar/") != -1) {
int p1 = req.indexOf("/agendar/") + 9;
int p2 = req.indexOf('/', p1);
int p3 = req.indexOf(' ', p2);
String dispositivo = req.substring(p1, p2);
int tempo = req.substring(p2 + 1, p3).toInt();
unsigned long agora = millis();
if (dispositivo == "luz") {
agendarLuz = agora + tempo * 1000UL;
Serial.println("[WEB] Agendamento luz OK");
}
else if (dispositivo == "portao") {
agendarPortao = agora + tempo * 1000UL;
Serial.println("[WEB] Agendamento portão OK");
}
else if (dispositivo == "camera") {
agendarCamera = agora + tempo * 1000UL;
Serial.println("[WEB] Agendamento câmera OK");
}
}
else {
Serial.println("[WEB] Comando desconhecido.");
}
}
void loop() {
WiFiClient client = server.available();
if (client) {
String header = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
header += c;
if (c == '\n') {
if (header.length() > 10) {
processarHTTP(header);
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/plain");
client.println("Connection: close\n");
client.println("Comando recebido!");
}
break;
}
}
}
client.stop();
}
unsigned long agora = millis();
if (agendarLuz > 0 && agora >= agendarLuz) {
if (luz) desligarLuz();
else ligarLuz();
Serial.println("[AUTO] Ação da luz executada por agendamento.");
agendarLuz = 0;
}
if (agendarPortao > 0 && agora >= agendarPortao) {
if (portao) fecharPortao();
else ligarPortao();
Serial.println("[AUTO] Ação do portão executada por agendamento.");
agendarPortao = 0;
}
if (agendarCamera > 0 && agora >= agendarCamera) {
if (camera) desligarCamera();
else ligarCamera();
Serial.println("[AUTO] Ação da câmera executada por agendamento.");
agendarCamera = 0;
}
if (!cameraAuto && agora - tempoInicial >= 15000) {
ligarCamera();
Serial.println("[SISTEMA] Câmera ligada automaticamente.");
cameraAuto = true;
}
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
processarComando(cmd);
}
}