Salve a tutti!
Ecco il mio problema: sms.flush() secondo me non funziona.
Una volta che ricevo un sms, controllo se il numero del mittente appartiene ad una lista di persone autorizzate, e se la cosa và a buon fine, comando dei relè.
Sia nel caso di autorizzazione concessa, sia negata, cancello l’sms con il comando sms.flush().
L’altra settimana Arduino ha smesso di funzionare con gli sms, ma le chiamate funzionavano (ho implementato l’apertura di un cancello con la chiamata).
Ho preso la sim, l’ho messa in un telefono e ho cancellato degli sms.
Reiserita nell’Arduino il sistema è impazzito: tutti gli sms pendenti sono stati ricevuti, eccitando i relativi Relè del modulo.
Il comando sms.flush() cancella la memoria dello shield. Ma la SIM sembra non essere toccata!
Come faccio ad eliminare gli SMS anche sulla SIM?
Ho incluso un file.h personale in cui ci sono dei parametri per il funzionamento.
Posto solo lo sketch per avere un minimo di riferimento!
#include <GSM.h>
#include "FloRoBa.h"
GSM gsmAccess;
GSMVoiceCall gsmCall;
//GSMScanner gsmNetwork;
GSM_SMS gsmSMS;
//-----------------------------------------------------------------------------------------------------CONFIGURAZIONE----------------------------------------------------------------------
void setup()
{
pinMode(intPinGSMCom,OUTPUT);
digitalWrite(intPinGSMCom,HIGH); //Led di stato a uno
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();
gsmSMS.flush(); //cancello l'sms
digitalWrite(intPinGSMCom,LOW); //Set Up OK
}
//--------------------------------------------------------------------------------------------------------LOOP------------------------------------------------------------------------------------------
void loop()
{
lngScanTime = millis();
strActionType ActionFromGSM = CheckGSMAction();
switch (ActionFromGSM)
{
case NoActionFromGSM:
break;
case OpenSmallGate:
SendCommand(intPinSmallGate);
break;
case OpenGate:
SendCommand(intPinGate);
break;
case OpenDoor:
SendCommand(intPinDoor);
break;
case OpenHome:
SendCommand(intPinDoor);
SendCommand(intPinSmallGate);
break;
}
//gsmNetwork.getSignalStrength()); //Leggo la qualità del segnale [0-31]
}
//----------------------------------------------------------------------------------------------------------------SCANSIONE CHIAMATA/SMS----------------------------------------------------------------------------
strActionType CheckGSMAction()
{
strActionType Result = NoActionFromGSM;
if (lngScanTime-lngLastTimeGSM>lngNextTimeToCheckGSM)
{
lngLastTimeGSM = lngScanTime;
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 chrArraySMSText[255];
String strSMS;
int intIndex=0;
memset(chrArraySMSText, 0, sizeof(chrArraySMSText)); //potrei trovarmi l'array sporco. Conviene pulirlo!
while (chrSMSText = gsmSMS.read()) //devo compormi il messaggio, leggendo carattere per carattere
{
chrArraySMSText[intIndex] = chrSMSText;
intIndex = intIndex +1;
}
strSMS = strlwr(chrArraySMSText); // trasfromo la stringa in minuscolo
Serial.println(strSMS);
if (strSMS =="cancelletto" || strSMS == "portina")
Result = OpenSmallGate;
else
{
if (strSMS =="cancello")
{
Result = OpenGate;
}
else
{
if (strSMS =="porta" || strSMS == "portone")
Result = OpenDoor;
else
{
if (strSMS =="casa")
Result = OpenHome;
}
}
}
}
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(String(InComingNumtel));
if (blnNumAllowed)
Result = OpenGate;
gsmCall.hangCall(); //Per rispondere alla chiamamta : gsmCall.answerCall()
break;
case TALKING: // In this case the call would be established
break;
}
}
}
return Result;
}
//-----------------------------------------------------------------------------------------AUTORIZZAZIONE UTENTE-----------------------------------------------------------------------------------
boolean blnCheckNumer(String chNumber)
{
boolean blnFind = false;
if (chNumber.startsWith("+39")) //Se il numero di telefono inizia per + devo togliere i primi 3 caratteri per eliminare il prefisso (ad esempio "+39")
chNumber = chNumber.substring(3,chNumber.length());
if (chNumber.startsWith("39")) //Se il numero di telefono inizia per 39 devo togliere i primi 2 caratteri per eliminare il prefisso (ad esempio "39")
chNumber = chNumber.substring(2,chNumber.length());
for (int intIndex = 0; intIndex < sizeof(strAllowedPhone)-1; intIndex++)
{
if(chNumber == strAllowedPhone[intIndex])
{
blnFind = true;
break;
}
}
return blnFind;
}
Grazie