Go Down

Topic: Need sometime a reboot for receiving call/sms (Read 1 time) previous topic - next topic

Jul 04, 2014, 09:37 am Last Edit: Jul 04, 2014, 09:42 am by PierluigiRovere Reason: 1
Hi all!
I searched in this forum a problem like this, but i didn't found nothing.
I made a sketch for commanding 3 relays with a call or and sms.
I'm using Arduino UNO rev.3  with an original GSM Shield (with a Vodafone SIM that works correctly).
I don't understand why sometime i need to restart Arduino after the power on, because the "gsmSMS.available()" and "gsmCall.getvoiceCallStatus()" doesn't work (or 2 or 3 consecutive restart).
When i finally receive the first sms, Arduino starts to work correctly until the next Sketch upload or power OFF.


Code: [Select]

#include <GSM.h>

GSM gsmAccess;
GSMVoiceCall gsmCall;
//GSMScanner gsmNetwork;
GSM_SMS  gsmSMS;

const int intDefaultGSMDelay = 2000; // prima di ricontrollare un nuovo stato, devo attendere almeno un secondo
boolean blnGSMConnection = false;

char* lstAllowedPhone[3]={"123456","123456"};   //Contiene la linsta dei numeri abilitati ai comandi
char* lstAllowedPhonePlusNumber[2]={"+39123456,"+39123456"}; //Stessa lista di prima, ma con il carattere + iniziale

const int intPinGate = 8;
const int intPinSmallGate = 9;
const int intPinDoor = 10;
const int intPinGSMCom = 13;

const int intOpenSmallGate = 1;
const int intOpenGate = 2;
const int intOpenDoor = 3;

const int intDelayRelayCmd = 1500;
//-----------------------------------------------------------------------------------------------------CONFIGURAZIONE----------------------------------------------------------------------
void setup()
{
 //Serial.begin(9600);
 
 pinMode(intPinGate,OUTPUT);
 pinMode(intPinSmallGate,OUTPUT);
 pinMode(intPinDoor,OUTPUT);
 pinMode(intPinGSMCom,OUTPUT);
 
 digitalWrite(intPinGSMCom,LOW);  //Led di stato a Zero
 IniRelays();
 
 while(!blnGSMConnection)  
 {
   Serial.println(gsmAccess.getStatus());
   if (gsmAccess.begin("")==GSM_READY)  //gsmAccess.begin("",true,false), Inizializzazione Scheda SIM : PIN, Restart, Async
     blnGSMConnection = true;
   else
   {
     delay(1000);
   }  
 }
 
 gsmCall.hangCall();
 
 digitalWrite(intPinGSMCom,HIGH); //Set Up OK
}
//--------------------------------------------------------------------------------------------------------LOOP------------------------------------------------------------------------------------------      
void loop()
{
 OpenOutPut(intCheckIncomingAction());
 //gsmNetwork.getSignalStrength()); //Leggo la qualità del segnale [0-31]
}

//--------------------------------------------------------------------------------------------------------INVIO COMANDO----------------------------------------------------------------------------------------------
void OpenOutPut(int intType)
{
 switch (intType)
 {
   case intOpenSmallGate:
     SendCommand(intPinSmallGate);
     break;
   case intOpenGate:
     SendCommand(intPinGate);
     break;
   case intOpenDoor:
     SendCommand(intPinDoor);
     break;  
 }
}

//-------------------------------------------------------------------------------------------------------------GESTIONE RELE (PUSH BUTTON)---------------------------------------------------------------------------------------
void SendCommand(int intDevice)
{
 digitalWrite(intDevice,LOW);
 delay(intDelayRelayCmd);
 digitalWrite(intDevice,HIGH);  
}

//-------------------------------------------------------------------------------------------------------------INIZIALIZZAZIONE RELE (OFF)---------------------------------------------------------------------------------------
void IniRelays()
{
 digitalWrite(intPinSmallGate,HIGH);
 digitalWrite(intPinGate,HIGH);
 digitalWrite(intPinDoor,HIGH);  
}

//----------------------------------------------------------------------------------------------------------------SCANSIONE CHIAMATA/SMS----------------------------------------------------------------------------
int intCheckIncomingAction()
{
 int intResult = 0;
 boolean blnNumAllowed = false;
 char InComingNumtel[20]; //Contiene il numero del telefono chiamante o il mittente dell'sms
 
 if (gsmSMS.available())
 {
   gsmSMS.remoteNumber(InComingNumtel, 20);
   blnNumAllowed = blnCheckNumer(InComingNumtel);
    if (blnNumAllowed)
    {
      boolean blnFind = false;
      char chrSMSText;
      char strSMSText[255];
      int intIndex=0;
     
      while (chrSMSText = gsmSMS.read()) //devo compormi il messaggio, leggendo carattere per carattere
      {
        strSMSText[intIndex] = chrSMSText;
       intIndex = intIndex +1;
      }
     
      strlwr(strSMSText); // trasfromo la stringa in minuscolo
     
      if (strcmp(strSMSText,"cancelletto") == 0 || strcmp(strSMSText,"portina") == 0)
        intResult = intOpenSmallGate;
      else
      {
        if (strcmp(strSMSText,"cancello") == 0)
          intResult = intOpenGate;
        else
        {
          if (strcmp(strSMSText,"porta") == 0 || strcmp(strSMSText,"portone") == 0)
          intResult = intOpenDoor;
        }  
      }
       memset(strSMSText,0,sizeof(strSMSText)); //pulisco Array    
    }
    gsmSMS.flush(); //cancello l'sms
 }
 else
 {
   switch (gsmCall.getvoiceCallStatus())
   {
     case IDLE_CALL: // Nothing is happening  
       break;
       
     case RECEIVINGCALL: // Yes! Someone is calling us    
         gsmCall.retrieveCallingNumber(InComingNumtel, 20);  //Recupero il numero chiamante    
         blnNumAllowed = blnCheckNumer(InComingNumtel);
         if (blnNumAllowed)
           intResult = intOpenGate;            
         gsmCall.hangCall();  //Per rispondere alla chiamamta : gsmCall.answerCall()    
       break;
       
     case TALKING:  // In this case the call would be established  
       break;
   }
 }  
 
 delay(intDefaultGSMDelay);
 
 return intResult;
}


//-----------------------------------------------------------------------------------------AUTORIZZAZIONE UTENTE-----------------------------------------------------------------------------------
boolean blnCheckNumer(char* chNumber)
{
   boolean blnFind = false;
   for (int intIndex = 0; intIndex < sizeof(lstAllowedPhone)-1; intIndex++)
   {      
       if (strcmp(chNumber,lstAllowedPhone[intIndex]) == 0 || strcmp(chNumber,lstAllowedPhonePlusNumber[intIndex]) == 0)
       {
         blnFind = true;
         break;
       }        
   }
   
   return blnFind;    
}


note: if i enable the gsm debug it works correctly.  O_O'

this is the LOG:

00
AT%13%
0 9>AT%13%%13%%10%OK%13%%10%
AT+CGREG?%13%
9 40>AT+CGREG?%13%%13%%10%+CGREG: 0,2%13%%10%%13%%10%OK%13%%10%
AT+CGREG?%13%
40 71>AT+CGREG?%13%%13%%10%+CGREG: 0,2%13%%10%%13%%10%OK%13%%10%
AT+CGREG?%13%
71 102>AT+CGREG?%13%%13%%10%+CGREG: 0,2%13%%10%%13%%10%OK%13%%10%
AT+CGREG?%13%
102 5>AT+CGREG?%13%%13%%10%+CGREG: 0,1%13%%10%%13%%10%OK%13%%10%
AT+IFC=1,1%13%
5 22>AT+IFC=1,1%13%%13%%10%OK%13%%10%
AT+CMGF=1%13%
22 40>%19%%17%AT+CMGF=1%13%%13%%10%OK%13%%10%
AT+CLIP=1%13%
40 56>AT+CLIP=1%13%%13%%10%OK%13%%10%
ATE0%13%
56 67>ATE0%13%%13%%10%OK%13%%10%
AT+COLP=1%13%
67 73>%13%%10%OK%13%%10%
ATH%13%
73 79>%13%%10%OK%13%%10%
AT+CMGL="REC UNREAD",1%13%
79 85>%13%%10%OK%13%%10%
AT+CMGL="REC UNREAD",1%13%
85 91>%13%%10%OK%13%%10%
AT+CMGL="REC UNREAD",1%13%
91 97>%13%%10%OK%13%%10%
AT+CMGL="REC UNREAD",1%13%
97 103>%13%%10%OK%13%%10%
AT+CMGL="REC UNREAD",1%13%
103 109>%13%%10%OK%13%%10%
AT+CMGL="REC UNREAD",1%13%
109 4>%13%%10%OK%13%%10%%13%%10%+CMTI: "SM",1%13%%10%
AT+CMGL="REC UNREAD",1%13%
4 89>%13%%10%+CMGL: 1,"REC UNREAD","+393402631404","","2014/07/04 09:41:04+08"%13%%10%cancello%13%%10%%13%%10%OK%13%%10%
AT+CMGD=1%13%
89 95>%13%%10%OK%13%%10%
AT+CMGL="REC UNREAD",1%13%
95 101>%13%%10%OK%13%%10%
AT+CMGL="REC UNREAD",1%13%
101 107>%13%%10%OK%13%%10%
AT+CMGL="REC UNREAD",1%13%
107 113>%13%%10%OK%13%%10%



Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy