Arduino Uno + Sim900+ time Alarms

Ahh ok o sea que lo que hice no sirvió para nada!!

Sube el código completo como adjunto, vamos que cuando un código no puede subirse se sube como adjunto y claro que esta bien asi hacerlo.

Sin el código no se puede evaluar nada.

ok, adjunto el código, lo pasé como un txt.
gracias

CodigoTXT.txt (25.2 KB)

Bueno, he logrado compilar el código agregando al comienzo las funciones que me daban error que te señalé antes.

El reporte de mi compilador dice

Program:   14218 bytes (43.4% Full)
(.text + .data + .bootloader)

Data:       1106 bytes (54.0% Full)
(.data + .bss + .noinit)
 [SUCCESS] Took 5.17 seconds

Lo que indica que estas al 54% de RAM en uso.

Necesito saber que Arduino usas, por lo visto es un UNO o un NANO no?

Estoy viendo el código.

Arduino UNO

Lo primero que no me gusta es la cantidad de Strings que usas y no veo que en ningún sitio los inicialices.

String horaDetectada;
String salida;
String dia;

String HoraEnviada;
String diaSemana;
String accionSalida;

String tiempoEnviado;
String programRecibido;

String estadoAlarmaA1;
String estadoAlarmaA2;

String estadoAlarmaB1;
String estadoAlarmaB2;

String estadoAlarmaC1;
String estadoAlarmaC2;

String estadoAlarmaD1;
String estadoAlarmaD2;

Posibildad de problemas conforme el código funciona.

Tienes comentados lugares donde los Strings eran puestos a 0 como este

if (elementoTiempo>=0)  {
      //Serial.println("llego mensaje");     
      //estadoAlarmaA1="";                   // <=== NO se porque lo comentaste
      capturaEvento(); 
      mensaje= programRecibido;        
      mensaje_sms(mensaje); 
             
      armoHoras();        
      setAlarmaIA1();        
    }

ese caso de la variable comentada, era para una vez que lee el sms, el estado vuelva a vacío.

Bueno, yo encararía varias cosas de otro modo pero no se si eso resuelve el problema y no se como probarlo sin tener que armar todo lo que tu tienes.
Ejemplo no usaría Strings al menos no tantos como tu usas.
Y si usaría vectores fijos de dimensión establecida y luego los armo con sprintf similar a tu composición de concatenación de datos usando + como por ejemplo acá

programRecibido = "#S"+accionSalida+"#D"+diaSemana+"#H"+HoraEnviada+"#T"+tiempoEnviado;

Se me dificulta probar el código y ver en que falla.

Veré si me hago un tiempo y monto la placa SIM para comprobarlo.

Entiendo lo que decis, pero como tu dices no creo que esto solucione el problema, gracias de todos modos

Olvidaré lo que dije antes y me concentro en tu consulta.
Las notificaciones.
Primero dices que con la secuencia NOTI ON se activa la notificacion = 1 y entonces devuelve un SMS. Okay y que eso lo recibe bien pero luego se detienen las Alarmas prefijadas.

Esto va para comprender tu código
Supongomos que enviaste NOTI ON y se activan las notificaciones.
Luego envias IA1 que supongo será para activar setAlarmaIA1
Si miras el código de setAlarmaIA1 te encuentras con que diaEnviado debe ser 0, porque? No veo que lo cambies en ningún momento y cuando lo envias puede valor desde 0 a 9? Tampoco entiendo porque 9

 void setAlarmaIA1(){  //Salida 1 : Alarma1
   //guardo valores: hora,minuto y hora minuto apagado
   //guard dia
    
    Serial.println("-----------");
    Serial.println(horaApagado);
    Serial.println(minutoApagado); 
    Serial.println("-----------");
    
    if (diaEnviado == 0){
        Serial.println("Cerooooo");  
        Alarm.disable(alarmaA1Onn);
        Alarm.free(alarmaA1Onn);
        Alarm.disable(alarmaA1Off);
        Alarm.free(alarmaA1Off);            
        alarmaA1Onn = Alarm.alarmRepeat(hora,minuto,0, enciendeReleA1);
        alarmaA1Off = Alarm.alarmRepeat(horaApagado,minutoApagado,0, apagaReleA1);
    }
}

Una pista, una cosa rara que pasa es que cuando envías el mensaje : con el texto "IA1"

ejecuta 2 veces el envio de sms, pero a mi me llega solamente uno.

Esto no pasa cuando envías el mensaje "NOTI-ONN"

No estará pasando que esto está bloqueando algo?????

Segunda vez que dices que el mensaje es "NOTI-ONN" pero no tienen ningún mensaje con esa etiqueta pero si
"NOTI-ON"

Estimados, estoy intentando usar otra librería para el manejo del sim900, hasta ahora lo hacía con comandos AT.

La duda que tengo, es que si el código es correcto, para obtener el sms y extraer los datos.
Desde ya muchas gracias,

#include "SIM900.h"
#include <SoftwareSerial.h>
//If not used, is better to exclude the HTTP library,
//for RAM saving.
//If your sketch reboots itself proprably you have finished,
//your memory available.
//#include "inetGSM.h"

//If you want to use the Arduino functions to manage SMS, uncomment the lines below.
#include "sms.h"
SMSGSM sms;

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to send and receive SMS.

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

int notificaciones;
char mensaje;
String nroDetectado;
String str;
char *p;

void setup() 
{
  notificaciones = 0;
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
  
  if(started){
    //Enable this two lines if you want to send an SMS.
    //if (sms.SendSMS("1111111111", "Arduino SMS"))
    //Serial.println("\nSMS sent OK");
  }

};

void loop() 
{
  
  if(started)
  {
    if(gsm.readSMS(smsbuffer, 160, n, 20))
    {
      Serial.println(n);
      Serial.println(smsbuffer);
      
      String str2(smsbuffer);
      str = str2;
      Serial.println("---------------");
      Serial.println(str);
      Serial.println("---------------");
      int elenotion = str.indexOf("NOTI-ON"); //para encender notificaciones
   
      if (elenotion>=0)
      {
      Serial.println("notificacinoes");  
      notificaciones = 1; //habilita notificaciones 
      mensaje = "NOTIF ON";
      mensaje_sms(mensaje);
      }
    }
    
  }
  
}

void capturaNroEnviado()
{
  int elementoComilla = str.indexOf('5');  
  int elementoSegundaComilla =  str.indexOf('"',elementoComilla); 
  
  nroDetectado = str.substring(elementoComilla,21);   
  delay(100);
  }


void mensaje_sms(char mensaje){
  if(started){
     capturaNroEnviado();
     string2char(nroDetectado);     

    //Enable this two lines if you want to send an SMS.
    if (sms.SendSMS(p, mensaje))
    Serial.println("\nSMS sent OK");
  }
}

  
char* string2char(String command){
    if(command.length()!=0){
        p = const_cast<char*>(command.c_str());
        return p;
    }
}

El código esta bien. Podría manejarse sin el uso de Strings pero con ellos te sientes cómodo asi que adelante.

Hola @Japiroz recientemente en otro programa he tenido problemas con la libreria Time Alarms,
no se si se tu caso, pero me daba mucha lata, asi que tuve que regresar a la vieja escuela y armarme mis timmers a mano, igual, si puedes probarlo estaría mas que bien.

Saludos.
-Alex.

TimeAlarms permite 255 alarmas de modo que el problema pasa por otro lado siempre.
Y generalmente son el uso y abuso de Strings.
Pero acá el problema era que hay que esperar que el módulo SIM900 responda con un caracter ">" y jazpiroz no lo sabía.
Por eso ahora esta intentando trabajar con una librería GSMlib porque en lugar de poner delays sin criterio o excesivos, el sistema implementa la lectura del módulo SIM900 a cada comando AT enviado.

Estimados, luego de la sugerencia de Subtype de usar la librería GSMSHIELD, logré estabilidad en mi proyecto, mas el tema de tener demasiado manejo de Strings, este combo hacía cosas raras.

Ahora bien, existe alguna forma de generar alarmas dinámicas?? con time alarms??

La idea sería la siguiente:

Declarar solamente 2 alarmas una para prender y otra para apagar, pero usar esto:

Alarm.alarmRepeat(dayofweek, hours, minutes, seconds, function);

donde dayofweek pueda ir cambiándolo yo, es decir crear una variable que tenga dayofweek y setee esto en la función.

Alarm.alarmRepeat(VariableDayofweek, hours, minutes, seconds, function);

Porque esto?? por las limitantes de memoria disponible que tengo,

desde ya mucha gracias a todos,

Saludos
Juan

Estimados, estoy con problemas de memoria, estimo.

El Sketch usa 19216 bytes (59%) del espacio de almacenamiento de programa. El máximo es 32256 bytes.
Las variables Globales usan 1605 bytes (78%) de la memoria dinámica, dejando 443 bytes para las variables locales. El máximo es 2048 bytes.
Poca memoria disponible, se pueden producir problemas de estabilidad.

Estoy usando las siguiente librerías:

#include <SoftwareSerial.h>
#include "SIM900.h"
SoftwareSerial mySerial(7, 8);
#include "sms.h"
SMSGSM sms;
#include <TimeLib.h>
#include <TimeAlarms.h>
#include "RTClib.h"

Ahora bien existe alguna forma de recortar estas librerías????. tanto time alarms como smsgsm consumen un montón de memoria.

Aluna idea???
gracias!!

Estimados, la solución fue pasarme para el Arduino Mega. Ahora tengo otros problemas.
Voy a abrir otro hilo para consultar.
Gracias,

Tengo problema para conectar el sim900 al MEGA. De la forma que lo tengo conectado es jumper para habilitar 7 y 8 en el sim900. En el MEGA pin 7 y 8. Pin 9 del sim900 al pin 9 del MEGA para prendido automático.

La librería que había bajado y funcionaba correctamente para el UNO, para el MEGA no compilaba, Encontré en el foro que alguíen la había modificado para el MEGA por un error del serialH y la bajé. El scketch quedó compilado correctamente.

En el archivos GSM.ccp definí:

#define _GSM_TXPIN_ 7
#define _GSM_RXPIN_ 8

Cabe aclarar que no cambié nada está todo igual a como lo tenía en el UNO y funcionaba correctamente.

Desde ya muchas gracias!!!! a quien pueda arrojar un poco de luz!! :confused:

El serial monitor me devuelve esto:

Trying to force the baud-rate to 9600

1200
2400
4800
9600
19200
38400
57600
115200
ERROR: SIM900 doesn't answer. Check power and serial pins in GSM.cpp

En el Sketch:

SoftwareSerial mySerial(7, 8);