buenas tardes, que tal soy nuevo en el foro, estoy trabajando en un proyecto sencillo con el modulo sim800l y un nodeMCU8266 para la activacion de unas sirenas a traves de SMS pero que solamente sea un numero especifico el que pueda activarlo, quisiera saber como puedo agregar un tipo de array para almacenar los numeros telefonicos autorizados y verificar si el que envia el mensaje esta autorizado, agrego el codigo que tengo hasta ahora ya con todas las funciones:
#include <SoftwareSerial.h>
const byte ON = D4; // cuando se activo la alarma
const byte relay2 = D6; // activa el relay 2
const byte activo = D3; // cuando el sim esta online
const byte relay = D5; // activa el relay
SoftwareSerial sim800l(D1, D2); // D1 tx D2 rx
const unsigned long TIMEOUT = 60000; // tiempo en milisegundos (1 minuto)
unsigned long panicoTime = 0; // tiempo de recepción del mensaje de pánico
bool panicoReceived = false; // bandera que indica si se recibió el mensaje de pánico
void setup() {
Serial.begin(9600);
pinMode(ON, OUTPUT);
digitalWrite(ON, LOW);
pinMode(activo, OUTPUT);
digitalWrite(activo, LOW);
pinMode(relay, OUTPUT);
digitalWrite(relay, LOW);
pinMode(relay2, OUTPUT);
digitalWrite(relay2, LOW);
sim800l.begin(9600);
Serial.println("Initializing SIM800L...");
// Parpadear el LED hasta que el SIM800L esté listo
while(!sim800l.available()) {
sim800l.println("AT");
delay(3000);
}
// Limpiar el buffer de respuesta
while(sim800l.available()) {
sim800l.readString();
}
sim800l.println("AT+CMGF=1"); // Configuración del SIM800L para SMS
delay(1000);
sim800l.println("AT+CNMI=1,2,0,0,0");
delay(1000);
Serial.println("Listo para recibir SMS");
Serial.println("SIM800L en línea");
}
void loop() {
if (sim800l.available()) {
String sms = sim800l.readString();
digitalWrite(activo, HIGH);
Serial.print("Mensaje recibido: ");
Serial.println(sms);
if (sms.indexOf("PANICO") != -1) { // se recibió la palabra "panico" en el mensaje
digitalWrite(relay, HIGH);
digitalWrite(relay2, HIGH);
for (int i = 0; i < 12; i++) { // parpadear el LED 3 veces antes de dejarlo encendido
digitalWrite(ON, HIGH);
delay(250);
digitalWrite(ON, LOW);
delay(250);
}
digitalWrite(ON, HIGH);
panicoTime = millis(); // se guarda el tiempo de recepción del mensaje de pánico
panicoReceived = true; // se marca la bandera
Serial.println("LED encendido");
} else if (sms.indexOf("DETENER") != -1) { // se recibió la palabra "detener" en el mensaje
digitalWrite(ON, LOW);
digitalWrite(relay, LOW);
digitalWrite(relay2, LOW);
Serial.println("LED apagado");
panicoReceived = false; // se reinicia la bandera
}
}
if (panicoReceived && (millis() - panicoTime > TIMEOUT)) { // si ya se recibió el mensaje de pánico y han pasado TIMEOUT milisegundos
digitalWrite(ON, LOW);
digitalWrite(relay, LOW);
digitalWrite(relay2, LOW);
Serial.println("Timeout - LED apagado");
panicoReceived = false; // se reinicia la bandera
}
delay(1000); // se espera 1 segundo antes de volver a verificar los mensajes
Serial.println("Esperando mensaje");
}
Después de "Mensaje recibido: " tienes un Serial.print: ¿Has mirado lo que has recibido?
Ahí debe aparecer el número que ha enviado el SMS. Haz caso solo si es ese número. mas o menos....
if (sim800l.available()) {
String sms = sim800l.readString();
digitalWrite(activo, HIGH);
Serial.print("Mensaje recibido: ");
Serial.println(sms);
if (sms.indexOf("xxx xxx xxx") != -1){ // numero correcto
if (sms.indexOf("PANICO") != -1) {
.
.
.
Hola que tal buenas tardes, disculpa la demora, fijate que lo que me comentas de ver que me muestra en el monitor serial despues de mensaje recibido es el numero de telefono + hora de recepción y seguido del mensaje, en este caso las palabras "PANICO" o "DETENER", voy a probar lo que me comentas y te comento de nuevo para ver como me fue.
Saludos!!
y por cierto, como podria hacer para crear un directorio autorizado, para que solamente los numeros que tenga ahi registrados puedan tener interacción con el sistema? me puse a leer y vi que podria hacer un tipo de array con todos los numeros que podrian activar/desactivar la alarma y que cualquiera que no este en ese directorio simplemente no pasaria nada. espero tu respuesta saludos!!
oh ya @bosoft , era sobre la respuesta de @mancera1979 que me recomendaba mover la instruccion panicoTime = millis(); para que no pase tanto tiempo. una disculpa, estoy adecuandome al foro, es mi primera publicación jejeje y con respecto a la lista, podrias apoyarme en como iria la estructura del for para el sms.indexOf y la lista por favor, saludos!!
Hola que tal @bosoft intentare lo que me comentas y luego te cuento como me va, muchas gracias saludos!! por cierto tengo otra duda con respecto a los numeros de telefono, ya que son de 10 digitos, puedo colocar los ultimos 7 digitos de los numeros que estarna en la agenda y aun asi el codigo los lograria identificar? Saludos!!
A ver si me explico:
Suponte que el número 'real' es +34123456789.
Si pones en la lista 123456789 serán correctos todos los del mundo iguales, puesto que no hay identificador de país (+34).
Si pones 56789, serán correctos todos los del mundo terminados en 56789. Una barbaridad. Con 7 serían unos millones menos.
No entiendo la pregunta. Yo pondría el número 'real' completo, por ser único. Estamos hablando de usar 12 bytes de memoria por teléfono.
Saludos