Cambiar Delay por Millis (SOLUCIONADO)

Hola muy buenas, estoy con un proyecto de un tutorial que he visto en un tutorial de internet, se trata de que cuando se dispare una alarma le entra una señal al arduino y este, envía un mensaje de texto, en un principio todo funcionaba bien, enviaba mensajes bien y todo perfecto hasta ahí, pero… ¿que es lo que ocurría cuando esta mucho tiempo conectado? Pues arduino se bloquea, le instale Watchdog y claro hay una función que tiene un delay y cada vez que le entra señal arduino se resetea he intentado ponerle millis pero no me funciona bien sigue con reseteos os dejo e código a ver si me podéis echar una mano.

Gracias

#include <SoftReset.h>


#include <Adafruit_FONA.h>
unsigned long time;
/**
   GeekFactory - "INNOVATING TOGETHER"
   Distribucion de materiales para el desarrollo e innovacion tecnologica
   www.geekfactory.mx

   SKETCH PARA ENVIAR SMS CON ARDUINO UTILIZANDO LA LIBRERIA DE ADAFRUIT FONA.
   ESTE SKETCH SIMULA UNA ALARMA EN LA CUAL AL OPRIMIR UN BOTON SE ENVIA UN MENSAJE SMS
   ALERTANDO DE UNA INTRUSION. PODEMOS SUSTITUIR EL BOTON POR UN SENSOR MAGNETICO PARA
   PUERTAS Y VENTANAS, DE FORMA QUE ESTE EJEMPLO PUEDE VOLVERSE UNA ALARMA FUNCIONAL.
*/
#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"

// CONFIGURACION DE UART GSM
#define CONFIG_GSM_RXPIN 4
#define CONFIG_GSM_TXPIN 3
#define CONFIG_GSM_BAUDRATE 9600

// CONFIGURACION DEL NUMERO DESTINO DEL MENSAJE SMS
#define CONFIG_GSM_SMS_DESTINATION "+34XXXXXXXXX"

// PIN UTILIZADO COMO ENTRADA PARA DESENCADENAR EL ENVIO DE UN MENSAJE
#define CONFIG_ALARM_PIN 5

// PUERTO SERIE EMULADO: EL ARDUINO UNO TIENE SOLO 1 UART
// EN EL CONSTRUCTOR DE SOFTWARESERIAL SE ESPECIFICAN LOS PINES PARA RX Y TX
SoftwareSerial swseri = SoftwareSerial(CONFIG_GSM_RXPIN, CONFIG_GSM_TXPIN);

// OBJETO ADAFRUIT_FONA USADO PARA COMUNICARSE CON EL SIM800L
Adafruit_FONA fona = Adafruit_FONA(10);

void setup() {
  Serial.begin(9600);
 {
  wdt_disable(); // Desactivar el watchdog mientras se configura
  wdt_enable(WDTO_8S); // Configurar a dos segundos
}
  
  // PREPARAR PINES IO
  pinMode(CONFIG_ALARM_PIN, INPUT_PULLUP);

  // PREPARAR LOS PUERTOS SERIALES A LA VELOCIDAD CONFIGURADA
  swseri.begin(CONFIG_GSM_BAUDRATE);
  Serial.begin(CONFIG_GSM_BAUDRATE);

  // IMPRIMIR EL ENCABEZADO INCIAL
  Serial.println(F("----------------------------------------------------"));
  Serial.println(F("    EJEMPLO ALARMA CONTRA INTRUSOS CON ALERTA SMS   "));
  Serial.println(F("            http://www.geekfactory.mx              "));
  Serial.println(F("----------------------------------------------------"));

  // INICIAR LA COMUNICACION CON EL MODULO GSM
  // PASAMOS REFERENCIA AL PUERTO SERIE USADO PARA LA COMUNICACION CON EL MODEM
  if (fona.begin(swseri))
    Serial.println(F("MODULO GSM OK"));
  else
  {
    // BLOQUEAR LA EJECUCIÓN EN ESTE PUNTO SI NO SE ENCUENTRA MODULO GSM O FALLA LA COMUNICACIÓN CON ESTE
    Serial.println(F("NO SE ENCUENTRA MODULO GSM"));
    while (1);
  }

  // AQUI SE REALIZA EL ENVIO DEL MENSAJE SMS
  // INDICAMOS EL NUMERO DESTINO Y EL CUERPO DEL MENSAJE
  if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "Alarma encendiendo!!!")) {
    //Serial.println(F("ERROR"));
  } else {
    Serial.println(F("ENVIADO"));
  }
}

void loop() {

  {
  wdt_reset(); // Actualizar el watchdog para que no produzca un reinicio
}
  // ESPERAR CAMBIO DE ESTADO EN EL PIN
  if (!digitalRead(CONFIG_ALARM_PIN))
  {
    // RETARDO PARA LIDIAR CON REBOTES Y RUIDO
    unsigned long time;
    delay(100);
    // VOLVEMOS A REVISAR EL ESTADO DEL PIN
    if (!digitalRead(CONFIG_ALARM_PIN))
    {
      if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "ALERTA ALARMA ACTIVADA")) {
        Serial.println(F("ERROR AL ENVIAR MENSAJE DE ALARMA"));
      } else {
        Serial.println(F("MENSAJE DE ALARMA ENVIADO"));
      }
      // PARA NO ENVIAR DEMASIADOS MENSAJES SEGUIDOS
      Serial.print("Time: ");
      time = millis();
      Serial.println(time);
      delay(60000);
      
      }
      
  }
}

(

Si metes el delay(100) en un while() estas esperando que sueltes el botón.

if (!digitalRead(CONFIG_ALARM_PIN)){
   while (!digitalRead(CONFIG_ALARM_PIN)){
      delay(100);       //RETARDO PARA LIDIAR CON REBOTES Y RUIDO
   }
   //Si soltaste el boton y paso 1 min desde ultima alerta
   if (digitalRead(CONFIG_ALARM_PIN) && millis()-time > 60000){
      if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "ALERTA ALARMA ACTIVADA")) {
            Serial.println(F("ERROR AL ENVIAR MENSAJE DE ALARMA"));
      } else {
            Serial.println(F("MENSAJE DE ALARMA ENVIADO"));
            time = millis();
            Serial.print("Time: ");
            Serial.println(time);         
      }
   }
}

Bueno muchas gracias por vuestras respuestas, era sencillo, en el trayecto del trabajo a casa pensé en cambiar esto a ver qué pasaba:
// PARA NO ENVIAR DEMASIADOS MENSAJES SEGUIDOS

     Serial.print("Time: ");
     time = millis();
     Serial.println(time);

cambie delay(60000); por (1000);
y funciona, así el watchdog no detecta la secuencia y no se resetea, pero ahora me ocurre una cosa distinta, si mantengo la entrada pulsada no deja de enviar mensajes hasta que deja de tener señal, no sé si se podría hacer algo para que cada vez que tenga una entrada, solo envíe un mensaje, y cuando deje de entrar señal, tampoco envíe nada hasta que tenga otra señal de entrada.
Muchas gracias.

Hola he probado también lo tuyo KiKe y me da el siguiente error exit status 1
expected ')' before '{' token, se que es que no esta declarado el while, y he visto varios ejemplo de while y no consigo declararlo, todos los ejemplos que he visto son sobre pulsadores pero no de envíos, he visto también clases de milis y tampoco consigo que deje de enviar mensajes sin parar

Un saludo.

Esto no es esperar el cambio de estado, sino esperar un estado pero es semántica.

Porque en lugar de esperar un estado no esperas el FLANCO?

Cuando esperas un flanco, solo responde a ese cambio y a todoooooooo lo demás no se le presta atención.

mira que simple.. en lugar de

// ESPERAR CAMBIO DE ESTADO EN EL PIN
 if (!digitalRead(CONFIG_ALARM_PIN))

lees el estado, y guardas el estado anterior luego de actuar en función del flanco, y será asi
Voy a modificar todo tu código para que se vea la idea, donde haya cambio lo resaltaré con <=== CAMBIO

                    // transmisor led toggle (fijo)encender/apagar mismo boton

#include <SPI.h>                       // Librería para la comunicación SPI 
#include <nRF24L01.h>                  // Librerías para el funcionamiento del módulo NRF24L01
#include <RF24.h> 
RF24 radio(9,10);                      // Se crea el objeto tipo RF24

const uint64_t canal = 0xE8E8F0F0E1LL; // Se declara el canal (64 bits en hexadecimal) para transmisión RF 
unsigned int estado_pulsador1[1];       // Variable que enviamos mediante RF (de tipo string siempre) 
unsigned int estado_pulsador2[1];

struct payload_t {
  byte pin;
  bool estado;
  bool estado_ant;
};

payload_t pulsador[6];
bool flag = false;
 
void setup() {
  for (byte i=0; i<6; i++) {
      pulsador[i].pin = i+2;          // comienzo en 2 hasta 8
      pinMode(pulsador[i].pin, INPUT);
  }
  radio.begin();                        // Inicialización de la comunicación RF 
  radio.openWritingPipe(canal);         // Se abre el canal para escritura
}
 
void loop() {
  //------------pulsador1----------
  for (byte i=0; i<6; i++) {
      pulsador[i].estado = digitalRead(pulsador[i].pin);  // Guardamos el estado actual del pulsador[i]     
      if (pulsador[i].estado && !pulsador[i].estado_ant) {       // Comparamos el estado actual y el anterior del pulsador1
          flag = true;                                    // si hay cambios activo el flag  
      }
      pulsador[i].estado_ant = pulsador[i].estado;
  }
  if (flag) {
      radio.write(pulsador, sizeof(pulsador));
      flag = false;
  }  
}

ignacio123:
exit status 1 expected ')' before '{' token

Te esta diciendo que faltaba un ) antes de abrir la llave {.

Edite mi mensaje, prueba otra vez.

Ok, voy y os cuento a todos.

Un saludo.

Bueno, llevo unas horas haciendo pruebas y esto es lo que ocurre, he probado el código de Kike y si dejo pulsada la entrada el arduino se resetea y no envía los mensajes de alarma, y después he probado el código de Surbite y me da el siguiente error:
expected constructor, destructor, or type conversion before '(' token
en esta linea:

// PREPARAR PINES IO
 pinMode(CONFIG_ALARM_PIN, INPUT_PULLUP);

y llevo mirando y comprobando cosas un par de horas, y no veo nada raro, los paréntesis veo que están bien.

Un saludo.

Dime que código te pasé porque evidentemente lo edité y en su lugar puse el código de otro hilo y no se que te escribí o modifiqué.
Si lo conservas postealo o bien me lo pasas por privado.

Hola Surbite, mira el codigo que me pasaste era este:

                    // transmisor led toggle (fijo)encender/apagar mismo boton

#include <SPI.h>                       // Librería para la comunicación SPI 
#include <nRF24L01.h>                  // Librerías para el funcionamiento del módulo NRF24L01
#include <RF24.h> 
RF24 radio(9,10);                      // Se crea el objeto tipo RF24

const uint64_t canal = 0xE8E8F0F0E1LL; // Se declara el canal (64 bits en hexadecimal) para transmisión RF 
unsigned int estado_pulsador1[1];       // Variable que enviamos mediante RF (de tipo string siempre) 
unsigned int estado_pulsador2[1];

struct payload_t {
  byte pin;
  bool estado;
  bool estado_ant;
};

payload_t pulsador[6];
bool flag = false;
 
void setup() {
  for (byte i=0; i<6; i++) {
      pulsador[i].pin = i+2;          // comienzo en 2 hasta 8
      pinMode(pulsador[i].pin, INPUT);
  }
  radio.begin();                        // Inicialización de la comunicación RF 
  radio.openWritingPipe(canal);         // Se abre el canal para escritura
}
 
void loop() {
  //------------pulsador1----------
  for (byte i=0; i<6; i++) {
      pulsador[i].estado = digitalRead(pulsador[i].pin);  // Guardamos el estado actual del pulsador[i]     
      if (pulsador[i].estado && !pulsador[i].estado_ant) {       // Comparamos el estado actual y el anterior del pulsador1
          flag = true;                                    // si hay cambios activo el flag  
      }
      pulsador[i].estado_ant = pulsador[i].estado;
  }
  if (flag) {
      radio.write(pulsador, sizeof(pulsador));
      flag = false;
  }  
}

y el codigo completo es este y asi lo he puesto yo:

#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>

#include <SPI.h>

#include <SoftReset.h>


#include <Adafruit_FONA.h>


  // transmisor led toggle (fijo)encender/apagar mismo boton

#include <SPI.h>                       // Librería para la comunicación SPI 
#include <nRF24L01.h>                  // Librerías para el funcionamiento del módulo NRF24L01
#include <RF24.h> 
RF24 radio(9,10);                      // Se crea el objeto tipo RF24

const uint64_t canal = 0xE8E8F0F0E1LL; // Se declara el canal (64 bits en hexadecimal) para transmisión RF 
unsigned int estado_pulsador1[1];       // Variable que enviamos mediante RF (de tipo string siempre) 
unsigned int estado_pulsador2[1];

struct payload_t {
  byte pin;
  bool estado;
  bool estado_ant;
};

payload_t pulsador[6];
bool flag = false;
/**
   GeekFactory - "INNOVATING TOGETHER"
   Distribucion de materiales para el desarrollo e innovacion tecnologica
   www.geekfactory.mx

   SKETCH PARA ENVIAR SMS CON ARDUINO UTILIZANDO LA LIBRERIA DE ADAFRUIT FONA.
   ESTE SKETCH SIMULA UNA ALARMA EN LA CUAL AL OPRIMIR UN BOTON SE ENVIA UN MENSAJE SMS
   ALERTANDO DE UNA INTRUSION. PODEMOS SUSTITUIR EL BOTON POR UN SENSOR MAGNETICO PARA
   PUERTAS Y VENTANAS, DE FORMA QUE ESTE EJEMPLO PUEDE VOLVERSE UNA ALARMA FUNCIONAL.
*/
#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"

// CONFIGURACION DE UART GSM
#define CONFIG_GSM_RXPIN 4
#define CONFIG_GSM_TXPIN 3
#define CONFIG_GSM_BAUDRATE 9600

// CONFIGURACION DEL NUMERO DESTINO DEL MENSAJE SMS
#define CONFIG_GSM_SMS_DESTINATION "+34670782817"

// PIN UTILIZADO COMO ENTRADA PARA DESENCADENAR EL ENVIO DE UN MENSAJE
#define CONFIG_ALARM_PIN 5

// PUERTO SERIE EMULADO: EL ARDUINO UNO TIENE SOLO 1 UART
// EN EL CONSTRUCTOR DE SOFTWARESERIAL SE ESPECIFICAN LOS PINES PARA RX Y TX
SoftwareSerial swseri = SoftwareSerial(CONFIG_GSM_RXPIN, CONFIG_GSM_TXPIN);

// OBJETO ADAFRUIT_FONA USADO PARA COMUNICARSE CON EL SIM800L
Adafruit_FONA fona = Adafruit_FONA(10);

void setup() {
  
 {
  wdt_disable(); // Desactivar el watchdog mientras se configura
  wdt_enable(WDTO_8S); // Configurar a dos segundos

   for (byte i=0; i<6; i++) {
      pulsador[i].pin = i+2;          // comienzo en 2 hasta 8
      pinMode(pulsador[i].pin, INPUT);
  }
  radio.begin();                        // Inicialización de la comunicación RF 
  radio.openWritingPipe(canal);         // Se abre el canal para escritura
}
}
  
  // PREPARAR PINES IO
  pinMode(CONFIG_ALARM_PIN, INPUT_PULLUP);

  // PREPARAR LOS PUERTOS SERIALES A LA VELOCIDAD CONFIGURADA
  swseri.begin(CONFIG_GSM_BAUDRATE);
  Serial.begin(CONFIG_GSM_BAUDRATE);

  // IMPRIMIR EL ENCABEZADO INCIAL
  Serial.println(F("----------------------------------------------------"));
  Serial.println(F("    EJEMPLO ALARMA CONTRA INTRUSOS CON ALERTA SMS   "));
  Serial.println(F("            http://www.geekfactory.mx              "));
  Serial.println(F("----------------------------------------------------"));

  // INICIAR LA COMUNICACION CON EL MODULO GSM
  // PASAMOS REFERENCIA AL PUERTO SERIE USADO PARA LA COMUNICACION CON EL MODEM
  if (fona.begin(swseri))
    Serial.println(F("MODULO GSM OK"));
  else
  {
    // BLOQUEAR LA EJECUCIÓN EN ESTE PUNTO SI NO SE ENCUENTRA MODULO GSM O FALLA LA COMUNICACIÓN CON ESTE
    Serial.println(F("NO SE ENCUENTRA MODULO GSM"));
    while (1);
  }

  // AQUI SE REALIZA EL ENVIO DEL MENSAJE SMS
  // INDICAMOS EL NUMERO DESTINO Y EL CUERPO DEL MENSAJE
  if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "El equipo continua en vigilancia")) {
    Serial.println(F("ERROR"));
  } else {
    Serial.println(F("ENVIADO"));
  }
}

void loop() {

  {
  wdt_reset(); // Actualizar el watchdog para que no produzca un reinicio
}
 
  //------------pulsador1----------
  for (byte i=0; i<6; i++) {
      pulsador[i].estado = digitalRead(pulsador[i].pin);  // Guardamos el estado actual del pulsador[i]     
      if (pulsador[i].estado && !pulsador[i].estado_ant) {       // Comparamos el estado actual y el anterior del pulsador1
          flag = true;                                    // si hay cambios activo el flag  
      }
      pulsador[i].estado_ant = pulsador[i].estado;
  }
  if (flag) {
      radio.write(pulsador, sizeof(pulsador));
      flag = false;
  }  
}

Un saludo.

No te has dado cuenta la cantidad de repeticiones que tienes?

He limpiado el código pero aún asi no puedo probarlo porque no tengo tus librerías

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>

#include <SoftReset.h>
#include <Adafruit_FONA.h>

// transmisor led toggle (fijo)encender/apagar mismo boton
RF24 radio(9,10);                      // Se crea el objeto tipo RF24

const uint64_t canal = 0xE8E8F0F0E1LL; // Se declara el canal (64 bits en hexadecimal) para transmisión RF 

struct payload_t {
  byte pin;
  bool estado;
  bool estado_ant;
};

payload_t pulsador[6];
bool flag = false;
/**
   GeekFactory - "INNOVATING TOGETHER"
   Distribucion de materiales para el desarrollo e innovacion tecnologica
   www.geekfactory.mx

   SKETCH PARA ENVIAR SMS CON ARDUINO UTILIZANDO LA LIBRERIA DE ADAFRUIT FONA.
   ESTE SKETCH SIMULA UNA ALARMA EN LA CUAL AL OPRIMIR UN BOTON SE ENVIA UN MENSAJE SMS
   ALERTANDO DE UNA INTRUSION. PODEMOS SUSTITUIR EL BOTON POR UN SENSOR MAGNETICO PARA
   PUERTAS Y VENTANAS, DE FORMA QUE ESTE EJEMPLO PUEDE VOLVERSE UNA ALARMA FUNCIONAL.
*/
#include <SoftwareSerial.h>

// CONFIGURACION DE UART GSM
#define CONFIG_GSM_RXPIN 4
#define CONFIG_GSM_TXPIN 3
#define CONFIG_GSM_BAUDRATE 9600

// CONFIGURACION DEL NUMERO DESTINO DEL MENSAJE SMS
#define CONFIG_GSM_SMS_DESTINATION "+34670782817"

// PIN UTILIZADO COMO ENTRADA PARA DESENCADENAR EL ENVIO DE UN MENSAJE
#define CONFIG_ALARM_PIN 5

// PUERTO SERIE EMULADO: EL ARDUINO UNO TIENE SOLO 1 UART
// EN EL CONSTRUCTOR DE SOFTWARESERIAL SE ESPECIFICAN LOS PINES PARA RX Y TX
SoftwareSerial swseri = SoftwareSerial(CONFIG_GSM_RXPIN, CONFIG_GSM_TXPIN);

// OBJETO ADAFRUIT_FONA USADO PARA COMUNICARSE CON EL SIM800L
Adafruit_FONA fona = Adafruit_FONA(10);

void setup() {
  wdt_disable(); // Desactivar el watchdog mientras se configura
  wdt_enable(WDTO_8S); // Configurar a dos segundos

  for (byte i=0; i<6; i++) {
      pulsador[i].pin = i+2;          // comienzo en 2 hasta 8
      pinMode(pulsador[i].pin, INPUT);
  }
  radio.begin();                        // Inicialización de la comunicación RF 
  radio.openWritingPipe(canal);         // Se abre el canal para escritura

  
  // PREPARAR PINES IO
  pinMode(CONFIG_ALARM_PIN, INPUT_PULLUP);

  // PREPARAR LOS PUERTOS SERIALES A LA VELOCIDAD CONFIGURADA
  swseri.begin(CONFIG_GSM_BAUDRATE);
  Serial.begin(CONFIG_GSM_BAUDRATE);

  // IMPRIMIR EL ENCABEZADO INCIAL
  Serial.println(F("----------------------------------------------------"));
  Serial.println(F("    EJEMPLO ALARMA CONTRA INTRUSOS CON ALERTA SMS   "));
  Serial.println(F("            http://www.geekfactory.mx              "));
  Serial.println(F("----------------------------------------------------"));

  // INICIAR LA COMUNICACION CON EL MODULO GSM
  // PASAMOS REFERENCIA AL PUERTO SERIE USADO PARA LA COMUNICACION CON EL MODEM
  if (fona.begin(swseri))
      Serial.println(F("MODULO GSM OK"));
  else   {
      // BLOQUEAR LA EJECUCIÃÆ'ƒâ€œN EN ESTE PUNTO SI NO SE ENCUENTRA MODULO GSM O FALLA LA COMUNICACIÃÆ'ƒâ€œN CON ESTE
      Serial.println(F("NO SE ENCUENTRA MODULO GSM"));
      while (1);
  }

  // AQUI SE REALIZA EL ENVIO DEL MENSAJE SMS
  // INDICAMOS EL NUMERO DESTINO Y EL CUERPO DEL MENSAJE
  if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "El equipo continua en vigilancia")) {
      Serial.println(F("ERROR"));
  } else {
      Serial.println(F("ENVIADO"));
  }
}

void loop() {
  wdt_reset(); // Actualizar el watchdog para que no produzca un reinicio

  //------------pulsador1----------
  for (byte i=0; i<6; i++) {
      pulsador[i].estado = digitalRead(pulsador[i].pin);  // Guardamos el estado actual del pulsador[i]     
      if (pulsador[i].estado && !pulsador[i].estado_ant) {       // Comparamos el estado actual y el anterior del pulsador1
          flag = true;                                    // si hay cambios activo el flag  
      }
      pulsador[i].estado_ant = pulsador[i].estado;
  }
  if (flag) {
      radio.write(pulsador, sizeof(pulsador));  // no se si acá quieres enviar el dato por SMS
      flag = false;
  }  
}

NOTA: no se si quieres enviar algún dato o advertencia por SMS cuando hay un pulsador presionado.

 if (flag) {
      radio.write(pulsador, sizeof(pulsador));  // no se si acá quieres enviar el dato por SMS
      flag = false;
  }

EDITO: Cometí un error y puse el código de otro hilo en este por eso mezclo cosas. No seguir este post.

Hola he probado el código y no me envía ningún mensaje le he cambiado esto }

 if (flag) {
     radio.write(pulsador, sizeof(pulsador));  // no se si acá quieres enviar el dato por SMS
     flag = false; =======esto por true 
 }

y no me manda nada, ningún mensaje de alerta.

Un saludo.

El comando que envia un sms es

fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "El equipo continua en vigilancia")

Eso debería estar dentro de

if (flag) {
      radio.write(pulsador, sizeof(pulsador));  // no se si acá quieres enviar el dato por SMS
      fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "El equipo continua en vigilancia");
      flag = false;

  }

NOTA: cuando coloques códigos aunque sea una línea usa etiquetas. Edita tu post#11

Hola muy buenas, según esta el código no envía mensajes, se queda como si estuviera transmitiendo todo el rato, la luz verde del tx del Nano se enciende y apaga de manera intermitente.

Un saludo.

Bueno a ver si esto enmienda mi confusión entre tu hilo y el de otra persona. El código no se corresponde con lo que pides.

Acá esta corregido.

//#include <SoftReset.h>
#include <Adafruit_FONA.h>
unsigned long time;

/**
   GeekFactory - "INNOVATING TOGETHER"
   Distribucion de materiales para el desarrollo e innovacion tecnologica
   www.geekfactory.mx

   SKETCH PARA ENVIAR SMS CON ARDUINO UTILIZANDO LA LIBRERIA DE ADAFRUIT FONA.
   ESTE SKETCH SIMULA UNA ALARMA EN LA CUAL AL OPRIMIR UN BOTON SE ENVIA UN MENSAJE SMS
   ALERTANDO DE UNA INTRUSION. PODEMOS SUSTITUIR EL BOTON POR UN SENSOR MAGNETICO PARA
   PUERTAS Y VENTANAS, DE FORMA QUE ESTE EJEMPLO PUEDE VOLVERSE UNA ALARMA FUNCIONAL.
*/
#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"

// CONFIGURACION DE UART GSM
#define CONFIG_GSM_RXPIN 4
#define CONFIG_GSM_TXPIN 3
#define CONFIG_GSM_BAUDRATE 9600

// CONFIGURACION DEL NUMERO DESTINO DEL MENSAJE SMS
#define CONFIG_GSM_SMS_DESTINATION "+34XXXXXXXXX"

// PIN UTILIZADO COMO ENTRADA PARA DESENCADENAR EL ENVIO DE UN MENSAJE
#define CONFIG_ALARM_PIN 5

// PUERTO SERIE EMULADO: EL ARDUINO UNO TIENE SOLO 1 UART
// EN EL CONSTRUCTOR DE SOFTWARESERIAL SE ESPECIFICAN LOS PINES PARA RX Y TX
SoftwareSerial swseri = SoftwareSerial(CONFIG_GSM_RXPIN, CONFIG_GSM_TXPIN);

// OBJETO ADAFRUIT_FONA USADO PARA COMUNICARSE CON EL SIM800L
Adafruit_FONA fona = Adafruit_FONA(10);
bool estado, estado_ant = true;

void setup() {
  Serial.begin(9600);

  // no hace falta watchdog sino descomenta
  // wdt_disable(); // Desactivar el watchdog mientras se configura
  // wdt_enable(WDTO_8S); // Configurar a dos segundos

  
  // PREPARAR PINES IO
  pinMode(CONFIG_ALARM_PIN, INPUT_PULLUP);

  // PREPARAR LOS PUERTOS SERIALES A LA VELOCIDAD CONFIGURADA
  swseri.begin(CONFIG_GSM_BAUDRATE);
  Serial.begin(CONFIG_GSM_BAUDRATE);

  // IMPRIMIR EL ENCABEZADO INCIAL
  Serial.println(F("----------------------------------------------------"));
  Serial.println(F("    EJEMPLO ALARMA CONTRA INTRUSOS CON ALERTA SMS   "));
  Serial.println(F("            http://www.geekfactory.mx              "));
  Serial.println(F("----------------------------------------------------"));

  // INICIAR LA COMUNICACION CON EL MODULO GSM
  // PASAMOS REFERENCIA AL PUERTO SERIE USADO PARA LA COMUNICACION CON EL MODEM
  if (fona.begin(swseri))
      Serial.println(F("MODULO GSM OK"));
  else  {
      // BLOQUEAR LA EJECUCIÃÆ'ƒâ€œN EN ESTE PUNTO SI NO SE ENCUENTRA MODULO GSM O FALLA LA COMUNICACIÃÆ'ƒâ€œN CON ESTE
      Serial.println(F("NO SE ENCUENTRA MODULO GSM"));
      while (1);
  }

  // AQUI SE REALIZA EL ENVIO DEL MENSAJE SMS
  // INDICAMOS EL NUMERO DESTINO Y EL CUERPO DEL MENSAJE
  if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "Alarma encendiendo!!!")) {
      Serial.println(F("ERROR"));
  } else {
      Serial.println(F("ENVIADO"));
  }
}

void loop() {
  
  //wdt_reset(); // Actualizar el watchdog para que no produzca un reinicio

  // ESPERAR CAMBIO DE ESTADO EN EL PIN
  if (!digitalRead(CONFIG_ALARM_PIN))  {
    // RETARDO PARA LIDIAR CON REBOTES Y RUIDO
    unsigned long time;
    
    // VOLVEMOS A REVISAR EL ESTADO DEL PIN
    estado = digitalRead(CONFIG_ALARM_PIN);
    if (!estado && estado_ant) {
        if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "ALERTA ALARMA ACTIVADA")) {
            Serial.println(F("ERROR AL ENVIAR MENSAJE DE ALARMA"));
        else 
            Serial.println(F("MENSAJE DE ALARMA ENVIADO"));
        
    }
    estado_ant = estado;
  }
}

Hola Surbite, ahora si envía Sms bien, pero las primeras veces que tiene una entrada los envía cuando tiene una de señal de entrada y cuando pierde la señal entrada, en lugar de enviar solo cuando tiene la entrada y y no enviar ningún Sms hasta que no tenga otra entrada,y algunas veces solo envía mensajes cuando pierde la entrada, no cuando le entra la señal de entrada.

Un saludo.

PD. y muchas gracias

Guauau que complicada esta esa señal de entrada.

Pregunta tu código lo hacía bien?

Puntualiza mejor los errores, porque no entiendo.

Tu seÑal de entrada es activa LOW, o sea mientras este en LOW tu detectas eso. En tu código esperabas 100 mseg para confirmar y esa fue la razón de tu consulta. Cambiar eso por millis()

Yo lo que hice fue mirar solo el flanco pero si la señal es mala porque tiene rebotes entonces hay que hacer caso a esos 100 mseg.

Confirma y lo hacemos.

Te cuento, el código inicial tenía un delay(100) para evitar rebotes y después tiene otro delay(5000) para no enviar demasiados mensajes, te lo pongo para que lo veas:

// AQUI SE REALIZA EL ENVIO DEL MENSAJE SMS
  // INDICAMOS EL NUMERO DESTINO Y EL CUERPO DEL MENSAJE
  if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "Alarma SMS encendiendo!!!")) {
    Serial.println(F("ERROR"));
  } else {
    Serial.println(F("ENVIADO"));
  }
}
 
void loop() {
  // ESPERAR CAMBIO DE ESTADO EN EL PIN
  if (!digitalRead(CONFIG_ALARM_PIN))
  {
    // RETARDO PARA LIDIAR CON REBOTES Y RUIDO
    delay(100);
    // VOLVEMOS A REVISAR EL ESTADO DEL PIN
    if (!digitalRead(CONFIG_ALARM_PIN))
    {
      if (!fona.sendSMS(CONFIG_GSM_SMS_DESTINATION, "MENSAJE DE ALERTA DEL SISTEMA DE ALARMA DOMESTICA!!!")) {
        Serial.println(F("ERROR AL ENVIAR MENSAJE DE ALARMA"));
      } else {
        Serial.println(F("MENSAJE DE ALARMA ENVIADO"));
      }
      // PARA NO ENVIAR DEMASIADOS MENSAJES SEGUIDOS
      delay(5000);
    }
  }
}

Después de eso, mi alarma en disparo esta sonando 45 segundos ¿Qué es lo que hice yo? pues el dely(5000) lo puse en delay(60000) de tal manera que hasta el minuto no envía otro mensaje, tampoco era necesario el minuto entero, con 50 segundos podría valer, pero bueno por redondear lo deje en 1 minuto, hasta ahí todo bien, pero ahora pasamos a la prueba del banco de trabajo, tenemos el arduino en prueba con la fuente conectada varios días, después de 48-72 horas el arduino deja de enviar mensajes, cuando le provoco una alarma, y tengo que resetearlo, a partir de ahí, decido instalar el watchdog, pero como watchdog solo llega hasta 8 segundos el arduino se resetea, y en el código inicial tiene una parte que cada vez que se enciende el arduino, se supone que tiene que enviar un mensaje de alarma encendiendo, que de toda formas al encender no lo hacía, solo cada que watchdog reseteaba el equipo, que me enviaba mensajes de alarma conectada constantemente, y por eso pensé que el delay si lo quito y le pongo millis, resultaría mejor

Un saludo.

Sigues sin explicar la señal que dispara estos SMS.

Porque no haces un grafico indicando como se comporta.
Asumo que tienes rebotes, okay, no entiendo porque a menos que sea algo electromecánico que este conectado a tu entrada del arduino. Pero luego que tiene que ver que no escuches por 50 segundos..?

Debo suponer que tu señal de disparo se acciona con rebotes y permanece activa LOW x 50 segundos?
Si es asi, entonces lo único que debes hacer es parte de lo que has hecho, o sea, descartar rebotes pero luego esperar a que cambie. No poner un delay o con hacerlo con millis() de 50 segundos.
Esa es mi visión de lo que planteas si es que te comprendo bien.

Si te refieres a que tipo de señal es la que envía la alama en fase de disparo, es una señal negativa de 12 voltios, y esta señal manda negativo mientras este la sirena sonando, que es 45 segundos, y cuando se para la sirena, no tiene ninguna señal ni de positivo ni negativo de 12 voltios.

Un saludo.