Go Down

Topic: Cambiar Delay por Millis (SOLUCIONADO) (Read 483 times) previous topic - next topic

ignacio123

#15
Jun 25, 2019, 12:38 am Last Edit: Jun 25, 2019, 01:04 am by ignacio123
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

surbyte

#16
Jun 25, 2019, 01:13 am Last Edit: Jun 25, 2019, 01:43 am by surbyte
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.

ignacio123

#17
Jun 25, 2019, 03:11 pm Last Edit: Jun 25, 2019, 03:12 pm by ignacio123
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:

Code: [Select]
// 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.

surbyte

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.

ignacio123

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.

surbyte

Y como la ancondicionas para que la conectes al pin del arduino?

Por lo que cuentas un simple debounce sería suficiente y no tener que poner 45 seg de espera, claro luego del debounce usar el flanco

ignacio123

Bueno la conexión es fácil, se puede hacer con un relé y utilizando los 9 voltios de entrada a arduino, que lleva un integrado, condensadores, diodos et. si estas interesado te puedo hacer un esquema, para que lo veas.

Un saludo

surbyte

No hace falta al menos para mi. De todos modos recuerda que nosotros no estamos delante de tu trabajo asi que toda información que ayude siempre debes facilitarla para entender mejor el contexto del problema.


Esta modificación resulve tu problema y puedes ajustar el tiempo antirebotes a tu gusto
Code: [Select]

#include <Bounce2.h>    // https://github.com/thomasfredericks/Bounce2
#include <Adafruit_FONA.h>
#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 "+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);

Bounce debouncer = Bounce(); // Instantiate a Bounce object

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
  
  debouncer.attach(CONFIG_ALARM_PIN,INPUT_PULLUP);  // Attach the debouncer to a pin with INPUT_PULLUP mode
  debouncer.interval(100);                          // Usa intervalo antirebote x 100 milliseconds

  // 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
  
  debouncer.update(); // Update the Bounce instance

  if ( debouncer.fell() ) {  // si pasa de 1 a 0 luego de 100 mseg entonces enviar msg
      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"));
  }
}

ignacio123

Hola Surbite, esta funcionando perfectamente, sin ningun rebote y genial, muchas gracias por tu ayuda, edito el tema y le pongo solucionado.

Un saludo y de nuevo gracias.

Go Up