Go Down

Topic: GSM900 , no consigo que reciba una llamada y envie un SMS correctamente. (Read 4274 times) previous topic - next topic

zapata123

Feb 13, 2015, 03:56 pm Last Edit: Feb 16, 2015, 12:39 pm by zapata123 Reason: Por no estar conforme a las reglas del foro
Es mi primer montaje con Arduino para activar por medio de una llamada de telefono el que se encienda/apague la calefacción. Una vez activada/desactivada el módulo GSM900 deberá enviar un mensaje con el estado de la calefacción.
Suponía que no tendría gran dificultad, mas que todo porque estos montajes están en la página,

http://tronixstuff.com/2014/01/08/tutorial-arduino-and-sim900-gsm-modules/

pero al implementarlo me encuentro con un problema, posiblemente por no saber manejar los comandos AT del módulo. Siempre repite la orden aunque no reciba ninguna llamada para cambiar el estado de la calefacción, esto es; con una llamada se activa la salida D13 ( en este caso), pero al rato se desactiva sin haber recibido una nueva llamada. Observo que si el telefono que recibe el mensaje es distinto del que hace la llamada, entonces va bien. Debe ser algo relacionado con algún registro o buffer de llamada que mantiene el número cuando corre de nuevo el bucle  void loop(). He probado en cada llamada apagar y encender el módulo GSM900, entrar el comando AT de identificación de llamada, pero nada de nada.

Aquí dejo el código, que no es mas que una copia del que hay en tronixstuff, por si alguien me puede ayudar.

Muchas gracias por vuestra atención.


Un saludo,

Zapata


Code: [Select]
#include <SoftwareSerial.h>
char inchar; // Will hold the incoming character from the GSM shield
SoftwareSerial SIM900(7, 8);

int onoff=0; // 0 = off, 1 = on

void setup()
{
 Serial.begin(19200);
 // set up the digital pins to control
 pinMode(12, OUTPUT);
 pinMode(13, OUTPUT); // LEDs - off = red, on = green
 digitalWrite(12, HIGH);
 digitalWrite(13, LOW);

 // wake up the GSM shield
 SIM900power();
 SIM900.begin(19200);
 delay(20000);  // give time to log on to network.
 SIM900.print("AT+CLIP=1\r"); // turn on caller ID notification
 delay(100);  
}

void SIM900power()
// software equivalent of pressing the GSM shield "power" button
{
 digitalWrite(9, HIGH);
 delay(1000);
 digitalWrite(9, LOW);
 delay(7000);
}

void SendSMS0()  //Envia mensage indicando CAL. apagada
{
 SIM900.print("AT+CMGF=1\r");                                                        // AT command to send SMS message
 delay(100);
 SIM900.println("AT + CMGS = \"+123456789\"");                                     // recipient's mobile number, in international format
 delay(100);
 SIM900.println("CALEFACCION APAGADA.");        // message to send
 delay(100);
 SIM900.println((char)26);                       // End AT command with a ^Z, ASCII code 26
 delay(100);
 SIM900.println();
 delay(5000);                                     // give module time to send SMS
}


void SendSMS1()  //Envia mensage indicando CAL. encendida
{
 SIM900.print("AT+CMGF=1\r");                                                        // AT command to send SMS message
 delay(100);
 SIM900.println("AT + CMGS = \"+123456789\"");                                     // recipient's mobile number, in international format
 delay(100);
 SIM900.println("CALEFACCION ENCENDIDA.");        // message to send
 delay(100);
 SIM900.println((char)26);                       // End AT command with a ^Z, ASCII code 26
 delay(100);
 SIM900.println();
 delay(5000);                                     // give module time to send SMS
}



void doSomething()
{
 if (onoff==0)
 {
   onoff=1;
   digitalWrite(12, HIGH);
   digitalWrite(13, LOW);
   Serial.println("D12 high D13 low");
   delay(100);
   SendSMS1();  //Llama a la función SMS1 para encender la cal.
 }
 else
   if (onoff==1)
   {
     onoff=0;
     digitalWrite(12, LOW);
     digitalWrite(13, HIGH);
     Serial.println("D12 low D13 high");
    delay(100);
    SendSMS1();  //Llama a la función SMS0 para apagar la cal.

   }
}

void loop()
{
 if(SIM900.available() >0)
 {  
   inchar=SIM900.read();
   if (inchar=='1')
   {
     delay(10);
     inchar=SIM900.read();
     if (inchar=='2')
     {
       delay(10);
       inchar=SIM900.read();
       if (inchar=='3')
       {
         delay(10);
         inchar=SIM900.read();
         if (inchar=='4')
         {
           delay(10);
           inchar=SIM900.read();
           if (inchar=='5')
           {
             delay(10);
             inchar=SIM900.read();
             if (inchar=='6')
             {
               delay(10);
               inchar=SIM900.read();
               if (inchar=='7')
               {
                 delay(10);
                 inchar=SIM900.read();
                 if (inchar=='8')
                   {
                     delay(10);
                     inchar=SIM900.read();
                     if (inchar=='9')
                     {
                       Serial.println("do sometehing");
                       delay(10);
                       // now the number is matched, do something
                       doSomething();
                       // arbitrary delay so the function isn't called again on the same phone call
                       delay(60000);
                     }
                   }
                 }
               }
             }
           }
         }
       }
     }
   }
 }
}






surbyte

Zapata date una vuelta por las Normas del Foro y edita tu post en 3 puntos

1) Título. Nopuede llevar la palabra AYUDA y menos tener este título por dios!!
Por favor, necesito ayuda para mi proyecto con GSM900 !!!!

Punto 6. de las normas

2) Los enlaces deben llevar tags

3) Los códigos deben llevar tags.  Punto 7 de las normas

Corrige estos puntos y te brindaremos ayuda.

PeterKantTropus

En la subfunción doSomething() llamas en ambos casos a SendSMS1() en uno de los casos debería  ser SendSMS0()

Saludos
"Si no entra como tornillo, entra como clavo"

zapata123

Gracias por tu contestación Peter. Así es. Realmente este código no es el que está cargado en el Arduino sino uno que he recopilado para este post.

zapata123


PeterKantTropus

No tengo ese modulo, pero yo empezaria haciendo un flush despues de enviar el mensaje Para asegurarme de limpiar el buffer.


Code: [Select]
#include <SoftwareSerial.h>
char inchar; // Will hold the incoming character from the GSM shield
SoftwareSerial SIM900(7, 8);
 
int onoff=0; // 0 = off, 1 = on
 
void setup()
{
  Serial.begin(19200);
  // set up the digital pins to control
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT); // LEDs - off = red, on = green
  digitalWrite(12, HIGH);
  digitalWrite(13, LOW);
 
  // wake up the GSM shield
  SIM900power();
  SIM900.begin(19200);
  delay(20000);  // give time to log on to network.
  SIM900.print("AT+CLIP=1\r"); // turn on caller ID notification
  delay(100);  
}
 
void SIM900power()
// software equivalent of pressing the GSM shield "power" button
{
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(7000);
}

void SendSMS0()  //Envia mensage indicando CAL. apagada
{
  SIM900.print("AT+CMGF=1\r");                                                        // AT command to send SMS message
  delay(100);
  SIM900.println("AT + CMGS = \"+123456789\"");                                     // recipient's mobile number, in international format
  delay(100);
  SIM900.println("CALEFACCION APAGADA.");        // message to send
  delay(100);
  SIM900.println((char)26);                       // End AT command with a ^Z, ASCII code 26
  delay(100);
  SIM900.println();
  delay(5000);   // give module time to send SMS
  SIM900.flush();
}


void SendSMS1()  //Envia mensage indicando CAL. encendida
{
  SIM900.print("AT+CMGF=1\r");                                                        // AT command to send SMS message
  delay(100);
  SIM900.println("AT + CMGS = \"+123456789\"");                                     // recipient's mobile number, in international format
  delay(100);
  SIM900.println("CALEFACCION ENCENDIDA.");        // message to send
  delay(100);
  SIM900.println((char)26);                       // End AT command with a ^Z, ASCII code 26
  delay(100);
  SIM900.println();
  delay(5000);  // give module time to send SMS
  SIM900.flush();
}


 
void doSomething()
{
  if (onoff==0)
  {
    onoff=1;
    digitalWrite(12, HIGH);
    digitalWrite(13, LOW);
    Serial.println("D12 high D13 low");
    delay(100);
    SendSMS1();  //Llama a la función SMS1 para encender la cal.
  }
  else
    if (onoff==1)
    {
      onoff=0;
      digitalWrite(12, LOW);
      digitalWrite(13, HIGH);
      Serial.println("D12 low D13 high");
     delay(100);
     SendSMS0();  //Llama a la función SMS0 para apagar la cal.

    }
}
 
void loop()
{
  if(SIM900.available() >0)
  {  
    inchar=SIM900.read();
    if (inchar=='1')
    {
      delay(10);
      inchar=SIM900.read();
      if (inchar=='2')
      {
        delay(10);
        inchar=SIM900.read();
        if (inchar=='3')
        {
          delay(10);
          inchar=SIM900.read();
          if (inchar=='4')
          {
            delay(10);
            inchar=SIM900.read();
            if (inchar=='5')
            {
              delay(10);
              inchar=SIM900.read();
              if (inchar=='6')
              {
                delay(10);
                inchar=SIM900.read();
                if (inchar=='7')
                {
                  delay(10);
                  inchar=SIM900.read();
                  if (inchar=='8')
                    {
                      delay(10);
                      inchar=SIM900.read();
                      if (inchar=='9')
                      {
                        Serial.println("do sometehing");
                        delay(10);
                        // now the number is matched, do something
                        doSomething();
                        // arbitrary delay so the function isn't called again on the same phone call
                        delay(60000);
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
"Si no entra como tornillo, entra como clavo"

zapata123

¡¡¡ MUCHAS GRACIAS!!! Peter. Era el comando que faltaba. Mira que había buscado un flush en el manual de comandos AT y no fui capaz de encontrarlo. Ahora va perfecto. Repito mi agradecimiento al foro y a tí en especial por tu ayuda.


PeterKantTropus

No hay porque darlas. Te aclaro algo mas que te puede ser útil, me parece que no estabas buscando en el lugar correcto. Las propiedades .begin() .flush() .avaible() .write() .read() y algunas otras, son   de la libreria   SoftwareSerial.h. No del modulo.
En la sentencia "SoftwareSerial SIM900(7, 8);" declaraste que vas a utilizar los pines 7 y 8 para comunicación serial y nombraste  SIM900 al objeto hijo de software serial, con sus propiedades asociadas.
"Si no entra como tornillo, entra como clavo"

Go Up