SIM808: ricevere SMS ed accendere LED

Ciao a tutti,

sono al primo post e alle prime armi con Arduino

Sto cercando di realizzare il mio primo progetto e sono a buon punto ma vorrei “rifinirlo” con la possibilità di conoscere lo stato della situazione semplicemente invia un SMS e per questo sto cercando di ricevere un messaggio con ArduinoUNO+SIM808 ed accendere un LED

ho trovato molti esempi ma nessun che funzioni (o più probabilmente non riesco io :slight_smile: )

questo di seguito è l’ultimo e forse il più completo che ho trovato ma, come gli altri, non riesco a farlo funzionare

come da istruzioni del sito ho modificato la libreria SoftwareSerial.h impostando il buffer da 64 a 128

il problema che ho notato dal serial monitor è che non ricevo nulla dalla lettura seriale (modificando il codice ho visto che ricevo sempre un valore -1 che credo equivalga a nessuna ricezione)

potete darmi una mano?

Grazie mille

#include <SoftwareSerial.h>
 

// EN: String buffer for the GPRS shield message
String msg = String("");
// EN: Set to 1 when the next GPRS shield message will contains the SMS message
int SmsContentFlag = 0;
//control pins of relay.
int relay_a=13;
int relay_b=5;
int relay_c=6;
int relay_d=7;

// EN: Code PIN of the SIM card (if applied)
//String SIM_PIN_CODE = String( "XXXX" );
 
void setup()
{
  Serial.begin(19200);                 // the GPRS baud rate
  // Initialize  PINs
  pinMode( 13, OUTPUT ); 
  pinMode( 5, OUTPUT ); 
  pinMode( 6, OUTPUT ); 
  pinMode( 7, OUTPUT ); 
  digitalWrite( 13, LOW ); 
  digitalWrite( 5, LOW ); 
  digitalWrite( 6, LOW );
  digitalWrite( 7, LOW );
 Serial.println( "AT+CMGF=1" ); 
 delay(200);
}
 
void loop()
{
    char SerialInByte;
    if(Serial.available())
    {       
        SerialInByte = (unsigned char)Serial.read();
       delay(5);
        
        // -------------------------------------------------------------------
        // EN: Program also listen to the GPRS shield message.
        // -------------------------------------------------------------------
       // EN: If the message ends with <CR> then process the message
        if( SerialInByte == 13 ){
          // EN: Store the char into the message buffer
          ProcessGprsMsg();
         }
         if( SerialInByte == 10 ){
            // EN: Skip Line feed
         }
         else {
           // EN: store the current character in the message string buffer
           msg += String(SerialInByte);
         }
     }   
}
// EN: Make action based on the content of the SMS. 
//     Notice than SMS content is the result of the processing of several GPRS shield messages.
void ProcessSms( String sms ){
  
  if( sms.indexOf("ona") >= 0 ){
    digitalWrite( relay_a, HIGH );
  }
   if( sms.indexOf("onb") >= 0 ){
    digitalWrite(  relay_b, HIGH );
  }
   if( sms.indexOf("onc") >= 0 ){
    digitalWrite(  relay_c, HIGH );
  }
  if( sms.indexOf("ond") >= 0 ){
    digitalWrite(  relay_d, HIGH );
  }
  if( sms.indexOf("offa") >= 0 ){
    digitalWrite(  relay_a, LOW );
  }
  if( sms.indexOf("offb") >= 0 ){
    digitalWrite(  relay_b, LOW );
  }
  if( sms.indexOf("offc") >= 0 ){
    digitalWrite(  relay_c, LOW );
  }
  if( sms.indexOf("offd") >= 0 ){
    digitalWrite(  relay_d, LOW );
  }
}
// EN: Request Text Mode for SMS messaging
void GprsTextModeSMS(){
  Serial.println( "AT+CMGF=1" );
}

void GprsReadSmsStore( String SmsStorePos ){
  Serial.print( "AT+CMGR=" );
  Serial.println( SmsStorePos );
}

// EN: Clear the GPRS shield message buffer
void ClearGprsMsg(){
  msg = "";
}

// EN: interpret the GPRS shield message and act appropiately
void ProcessGprsMsg() {
  if( msg.indexOf( "Call Ready" ) >= 0 ){
   //  Serial.println( "*** GPRS Shield registered on Mobile Network ***" );
     GprsTextModeSMS();
  }
  
  // EN: unsolicited message received when getting a SMS message
  if( msg.indexOf( "+CMTI" ) >= 0 ){
   //  Serial.println( "*** SMS Received ***" );
     // EN: Look for the coma in the full message (+CMTI: "SM",6)
     //     In the sample, the SMS is stored at position 6
     int iPos = msg.indexOf( "," );
     String SmsStorePos = msg.substring( iPos+1 );
   //  Serial.print( "SMS stored at " );
  //   Serial.println( SmsStorePos );     
     // EN: Ask to read the SMS store
     GprsReadSmsStore( SmsStorePos );
  }
  
  // EN: SMS store readed through UART (result of GprsReadSmsStore request)  
  if( msg.indexOf( "+CMGR:" ) >= 0 ){
    // EN: Next message will contains the BODY of SMS
    SmsContentFlag = 1;
    // EN: Following lines are essentiel to not clear the flag!
    ClearGprsMsg();
    return;
  }
  
  // EN: +CMGR message just before indicate that the following GRPS Shield message 
  //     (this message) will contains the SMS body 
  if( SmsContentFlag == 1 ){
 //   Serial.println( "*** SMS MESSAGE CONTENT ***" );
 //   Serial.println( msg );
 //   Serial.println( "*** END OF SMS MESSAGE ***" );
    ProcessSms( msg );
  }
  
  ClearGprsMsg();
  // EN: Always clear the flag
  SmsContentFlag = 0; 
}

Buongiorno,
essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

Se ricevi come carattere il valore -1 significa che stai leggendo la seriale senza prima aver verificato se c’è qualche cosa da leggere … ovvero, prima di OGNI lettura occorre verificare se sulla seriale (o sulla seriale virtuale creata con la libreria SoftwareSerial) c’è qualche cosa con il metodo available().

Comunque, guardando il tuo codice … NON vedo istanze alla SoftwareSerial e vedo solo letture dalla vera seriale :o

Lascia la vera seriale libera per il debug e collegata alla USB del PC, usa la SoftwareSerial usando come pin di RX il 10 e di TX il 11 e collega TX ed RX del SIM808 incrociandoli ovvero …

Arduino RX (10) <---- SIM808 TX
Arduino TX (11) ----> SIM808 RX

Inoltre … fai ricerche qui sul forum e su Google, perché di collegamenti con moduli GSM/GPS ed Arduino se ne è parlato decine e decine di volte.

Guglielmo

Ciao Guglielmo,

mi sono presentato come mi hai suggerito

avevo ipotizzato che nel codice la seriale fosse usata "male"...

quando mi suggerisci di usare i pin 9 e 10 è per standard o???
da quanto ho letto sulle specifiche della scheda GPRS/GPS che ho acquistato (wiki qui) ho visto che dovrei usare i pin 7 e 8 (tramite i quali riesco a mandare correttamente mail ed sms)

mi faccio un giro anche nel forum ma credo che il problema sia la mia mancanza di basi e non riferito alla scheda in se :confused:

grazie
G.

GiancaB:
quando mi suggerisci di usare i pin 9 e 10 è per standard o???
da quanto ho letto sulle specifiche della scheda GPRS/GPS che ho acquistato (wiki qui) ho visto che dovrei usare i pin 7 e 8 (tramite i quali riesco a mandare correttamente mail ed sms)

Io suggerisco sempre il 10 e 11 per ragioni di compatibilità con tutti i modelli di Arduino … difatti, se guardi nella SoftwareSerial che ti ho linkato, sono indicati i pin che si possono usare il funzione delle varie schede.

Detto questo, se hai già una libreria che usa il pin 7 e 8, su Arduino UNO va bene ugualmente, non su Arduino Mega (ma sulla Mega ha poco senso usare la SoftwareSerial visto che ha 4 vere seriali).

Se segui il WiKi non dovresti avere problemi …

Guglielmo

Nel wiki c'e' anche un esempio "Using Sms to Control an LED Status"

Grazie Guglielmo

Brunello:
Nel wiki c'e' anche un esempio "Using Sms to Control an LED Status"

si ma purtroppo non funziona... o ancora non so come usarla a dovere

per adesso sto studiando la comunicazione seriale come suggerito da Guglielmo ad un altro utente per poi passare alla parte SMS

vediamo se riesco... non mollo :smiling_imp:

GiancaB:
per adesso sto studiando la comunicazione seriale come suggerito da Guglielmo ad un altro utente per poi passare alla parte SMS

Senza avere la piena padronanza di quella si va poco lontano ...

... mentre, una volta che ti destreggi bene con la seriale e la ricezione di caratteri, beh, ti consiglio di buttare via qualsiasi libreria, prendere i manuali del SIM808 da QUI (ti devi registrare per scaricare tutta la documentazione), studiarteli bene e fare da solo, usando quei quattro comandi AT che servono :smiley:

Guglielmo

Mi metto a studiare ma non escludo che vi disturberò ancora :slight_smile: