#include <SoftwareSerial.h>
#include <RF24.h>
#include <SPI.h>
// Pinos do módulo GSM
#define GSM_RX 7
#define GSM_TX 8
SoftwareSerial gsmSerial(GSM_RX, GSM_TX);
// Pinos do módulo de relé para sirene e giroflex
#define SIREN_RELAY_PIN 3
#define GYRO_RELAY_PIN 4
// Pino para monitoramento de bateria
#define BATTERY_PIN A0
// Configuração do módulo de rádio
RF24 radio(9, 10); // CE, CSN pinos
const byte addresses[][6] = {"1Node", "2Node", "3Node"};
bool alarmStatus = false;
// Timer para desligamento automático
unsigned long timerStart = 0;
unsigned long timerDuration = 30000; // 1 minuto (60.000 ms)
// Números de telefone autorizados
String authorizedNumbers[5] = {"+5511991195363", "", "", "", ""};
void setup() {
// Inicializa a comunicação serial
Serial.begin(9600);
gsmSerial.begin(9600);
// Inicializa os pinos do módulo de relé
pinMode(SIREN_RELAY_PIN, OUTPUT);
pinMode(GYRO_RELAY_PIN, OUTPUT);
// Inicializa o pino de monitoramento de bateria
pinMode(BATTERY_PIN, INPUT);
// Inicializa o módulo de rádio
radio.begin();
radio.openWritingPipe(addresses[0]); // Endereço do mestre
radio.openReadingPipe(1, addresses[1]); // Endereço do escravo 1
radio.openReadingPipe(2, addresses[2]); // Endereço do escravo 2
radio.setPALevel(RF24_PA_LOW);
Serial.println("Sistema de alarme iniciado.");
}
void loop() {
// Verifica se há SMS recebido
//Trocar Serial por gsmSerial
if (Serial.available()) {
String sms = Serial.readString(); //Trocar Serial por gsmSerial
processSMS(sms);
}
// Verifica se há dados de rádio recebidos
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.print("Recebido via rádio: ");
delay(5000);
Serial.println(text);
}
// Verifica se o timer de desligamento automático expirou
if (alarmStatus && (millis() - timerStart >= timerDuration)) {
desativarAlarme();
enviarSMS("Alarme desativado automaticamente após o tempo especificado.");
Serial.println("Alarme desativado automaticamente após o tempo especificado.");
}
}
void processSMS(String sms) {
// Extrai o número do remetente
String sender = extractSender(sms);
// Verifica se o número do remetente é autorizado
if (!isAuthorizedNumber(sender)) {
enviarSMS("Número não autorizado.");
Serial.println("Número não autorizado: ");
//return; APAGAR APOS TESTE
}
// Processa o comando
sms.trim();
if (sms.startsWith("ATIVAR")) {
ativarAlarme();
enviarSMS("Alarme ativado.");
Serial.println("Alarme ativado.");
} else if (sms.startsWith("DESATIVAR")) {
desativarAlarme();
enviarSMS("Alarme desativado.");
Serial.println("Alarme desativado.");
} else if (sms.startsWith("STATUS")) {
enviarStatus();
Serial.println("Status das torres.");
} else if (sms.startsWith("TIMER:")) {
Serial.println("COLOQUE QUANTOS SEGUNDOS PARA DESATIVAR");
int duration = sms.substring(6).toInt();
delay(5000);
Serial.println(duration);
if (duration > 0) {
timerDuration = duration * 1000; // Converter para milissegundos
enviarSMS("Timer ajustado para " + String(duration) + " segundos.");
} else {
enviarSMS("Valor de timer inválido.");
}
} else if (sms.startsWith("BATERIA")) {
enviarNivelBateria();
} else if (sms.startsWith("ADDNUM:")) {
String newNumber = sms.substring(7);
addAuthorizedNumber(newNumber);
Serial.println(newNumber);
} else {
enviarSMS("Comando desconhecido.");
}
}
void ativarAlarme() {
digitalWrite(SIREN_RELAY_PIN, HIGH);
digitalWrite(GYRO_RELAY_PIN, HIGH);
alarmStatus = true;
timerStart = millis(); // Inicia o timer
enviarComandoRadio("ATIVAR");
}
void desativarAlarme() {
digitalWrite(SIREN_RELAY_PIN, LOW);
digitalWrite(GYRO_RELAY_PIN, LOW);
alarmStatus = false;
enviarComandoRadio("DESATIVAR");
}
void enviarComandoRadio(String comando) {
radio.stopListening();
radio.write(&comando, sizeof(comando));
radio.startListening();
}
void enviarSMS(String mensagem) {
gsmSerial.print("AT+CMGF=1\r");
delay(100);
gsmSerial.print("AT+CMGS=\"+5511991195363\"\r"); // Substitua pelo número de telefone desejado
delay(100);
gsmSerial.print(mensagem);
delay(100);
gsmSerial.write(26); // Ctrl+Z
delay(100);
}
void enviarStatus() {
String status = "Status do Alarme:\n";
status += "Mestre - Sirene: " + String(digitalRead(SIREN_RELAY_PIN)) + ", Giroflex: " + String(digitalRead(GYRO_RELAY_PIN)) + "\n";
Serial.println(status);
// Envia um comando para os escravos pedindo o status
String comandoStatus = "STATUS";
radio.stopListening();
radio.write(&comandoStatus, sizeof(comandoStatus));
radio.startListening();
// Aguarda a resposta dos escravos
delay(500); // Ajuste o tempo conforme necessário
// Recebe o status dos escravos
if (radio.available()) {
char statusEscravo1[32] = "";
radio.read(&statusEscravo1, sizeof(statusEscravo1));
status += "Escravo 1 - Status: " + String(statusEscravo1) + "\n";
}
if (radio.available()) {
char statusEscravo2[32] = "";
radio.read(&statusEscravo2, sizeof(statusEscravo2));
status += "Escravo 2 - Status: " + String(statusEscravo2) + "\n";
}
enviarSMS(status);
}
void enviarNivelBateria() {
int nivelBateria = analogRead(BATTERY_PIN);
float voltage = nivelBateria * (5.0 / 1023.0); // Converte para tensão
enviarSMS("Nível da bateria: " + String(voltage) + "V");
Serial.println("Nível da bateria: " + String(voltage) + "V");
}
String extractSender(String sms) {
// Extrai o número do remetente do SMS
int startIndex = sms.indexOf("+") + 1;
int endIndex = sms.indexOf(",", startIndex);
return sms.substring(startIndex, endIndex);
}
bool isAuthorizedNumber(String number) {
for (int i = 0; i < 5; i++) {
if (authorizedNumbers[i] == number) {
return true;
}
}
return false;
}
void addAuthorizedNumber(String number) {
for (int i = 0; i < 5; i++) {
if (authorizedNumbers[i] == "") {
authorizedNumbers[i] = number;
enviarSMS("Número " + number + " adicionado.");
Serial.println("Número " + number + " adicionado.");
return;
}
}
enviarSMS("Lista de números autorizados cheia.");
Serial.println("Lista de números autorizados cheia.");
}