Moduli GSM serie SIM800 - FLProg.

Nel programma FLProg ho creato due blocchi per comunicare con i moduli GSM della serie SIM800. Il codice comune si basa su due funzioni - sendCommands() e waitAnswer(): 

  1. La prima funzione è progettata per inviare un comando al modulo. Nella funzione sendCommands(String command, bool waiting), il primo parametro contiene il comando da inviare, mentre il secondo parametro, bool waiting, specifica se il programma deve attendere o meno una risposta dal modulo GSM.
  2. La seconda funzione è progettata per attendere una risposta e restituire il risultato entro il periodo specificato dal parametro <PERIOD>.

Parametri generali:

  1. SERIAL_GSM - il parametro viene utilizzato per selezionare l'UART per la comunicazione con il modulo.
  2. WAITING_TIME - durata del timeout in millisecondi massimi per attendere i dati seriali. Il valore predefinito è 1000 millisecondi.
  3. SPEED - il parametro serve per selezionare la velocità di scambio dati con il modulo.
  4. PIN_TX - il parametro serve per assegnare il pin TX (SoftwareSerial), abilitato con la condizione COND_SSERIAL quando selezioniamo la porta UART - SoftwareSerial, dal parametro SERIAL_GSM.
  5. PIN_RX* - il parametro serve per assegnare il pin RX (SoftwareSerial), abilitato con la condizione COND_SSERIAL quando selezioniamo la porta UART - SoftwareSerial, dal parametro SERIAL_GSM.
  6. PERIOD - il parametro viene utilizzato per impostare il periodo di attesa per la risposta da parte del modulo. Per impostazione predefinita è impostato su 10 secondi.
Condizioni generali:
  1. COND_SSERIAL - la condizione viene utilizzata per abilitare il protocollo UART - SoftwareSerial.

*Library SoftwareSerial presenta le seguenti limitazioni: 

  1. Non è possibile ricevere dati contemporaneamente da più porte contemporaneamente. Solo un porto alla volta può farlo.
  2. Gli interrupt non sono supportati su tutti i pin Mega e Mega2560, quindi è possibile utilizzare solo i seguenti per RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 ( 63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
  3. Gli interrupt non sono supportati su tutti i pin Leonardo e Micro, quindi per RX è possibile utilizzare solo i seguenti: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
  4. Su Arduino/Genuino 101, la velocità massima di trasferimento dati tramite il pin RX è 57600 bps.
  5. Su Arduino/Genuino 101, RX sul pin 13 non funziona.
Se il tuo progetto richiede la comunicazione simultanea su più porte contemporaneamente, utilizza la libreria AltSoftSerial sviluppata da Paul Stoffregen. Risolve altri problemi di SoftwareSerial, ma presenta i suoi limiti.

Codice comune:

Librery SoftwareSerial#include <SoftwareSerial.h> //Dichiarazione della libreria per l'implementazione software dello scambio tramite il protocollo UART. Il codice viene abilitato con la condizione COND_SSERIAL quando selezioniamo la porta UART - SoftwareSerial, dal parametro SERIAL_GSM.

Object SoftwareSerial: SoftwareSerial SSerial(<PIN_RX>, <PIN_TX>); //Dichiarazione dell'oggetto software e assegnazione dei pin. Il codice viene abilitato con la condizione COND_SSERIAL quando selezioniamo la porta UART - SoftwareSerial, dal parametro SERIAL_GSM.

Function prototypeString sendCommands(String command, bool wait); String waitAnswer(); //Dichiarazione dei prototipi di funzioni. È buona norma dichiarare le funzioni separatamente dall'implementazione.

Module initialization<SERIAL_GSM>.begin(<SPEED>); //Velocità di scambio dati con il modulo.

Set the maximum number of milliseconds to wait: <SERIAL_GSM>.setTimeout(<WAITING_TIME>); //Imposta i millisecondi massimi di attesa per i dati seriali.

Function sendCommand

//Funzione per l'invio di comandi.
String sendCommands(String command, bool waiting) 
{
  String _answer = ""; //Variabile per memorizzare il risultato.
  <SERIAL_GSM>.println(command); //Invia un comando al modulo.
  if (waiting) //Se devi attendere una risposta...
  {
    _answer = waitAnswer(); // ... attende l'invio della risposta.
  }
  return _answer; // Restituisce il risultato. Vuoto se c'è un problema.
}

Function waitAnswer:
// Funzione per attendere una risposta e restituire il risultato.
String waitAnswer() 
{
  String _answer = ""; //Variabile per memorizzare il risultato.
  long _timeout = millis() + <PERIOD>; //Variabile per il timeout.
  //Aspettiamo una risposta entro il termine specificato.
  while (!<SERIAL_GSM>.available() && millis() < _timeout) {};
  if (<SERIAL_GSM>.available()) //Se c'è qualcosa da leggere...
  {
    _answer = <SERIAL_GSM>.readString(); //... leggi e memorizza.
  }
  return _answer; //Restituisce il risultato. Vuoto se c'è un problema.
}

Blocchi di esecuzione.

Blocco "Send command".

Il blocco è progettato per inviare il comando al modem, può essere posizionato in qualsiasi punto dello schema. 
Questo blocco può essere utilizzato più volte nel progetto.
Parametri:
WAITING - il parametro specifica se il programma deve attendere o meno una risposta dal modulo GSM. Abilita inoltre l'output "Answer" e i codici corrispondenti, se vogliamo ottenere la risposta dal comando inviato.
Condizioni:
COND_WAITIHG - condizioni per abilitare l'output "Answer" e i codici corrispondenti.
Codice di blocco:
Invio del comando. Il codice e abilitato quando la condizione è false.
if (<Send> == true) //Abilita l'invio del comando.
{
  sendCommands(<Command>,<WAITIHG>); //Invio di comandi.
}
Invio del comando e ottieni una risposta. Il codice e abilitato quando la condizione è true.
if (<Send> == true//Abilita l'invio del comando.
{
  <Answer> = sendCommands(<Command>,<WAITIHG>); //Invia comandi e ottieni la risposta.
}
Input:
Send - se l'input è a livello logico alto (true) abilita l'invio del comando.
Command - input per i comandi da inviare al modem.
Output:
Answer - output per la risposta dal comando, il output e abilitato quando la condizione è true.

Blocco "Get unsolicited notifications".

Il blocco è progettato per ricevere notifiche non richieste (Unsolicited Result Code). Si tratta di messaggi che, come suggerisce il nome, possono arrivare senza che l'utente faccia alcuna azione. Questo blocco può essere utilizzato solo una volta nel progetto.
Codice di blocco:
if (<SERIAL_GSM>.available()) //Se il modem ha inviato qualcosa...
{
  <Get> = waitAnswer(); //Ottieni una risposta dal modem per l'analisi.
}
Output:
Get - output per la risposta del modem per ulteriori analisi.

Blocchi per identificare la stringa per l'analisi.

Blocco "Remove extra spaces"
trim()
String.trim(); -rimuove gli spazi dall'inizio e dalla fine di una stringa. Agisce sulla stringa a cui è applicato.
Codice di blocco:
<StringIn>.trim();
<StringOut> = <StringIn>;
Input:
StringIn - stringa ottenuta dal modem.
Output:
StringOut - stringa per ulteriori analisi.

Blocco "Starts with"
startsWith()
myString1.startsWith(myString2); - controlla se myString1 inizia con i caratteri di myString2. Restituisce true se c'è una corrispondenza.
Codice di blocco:
if (<StringIn>.startsWith(<With>)) //Inizia con.
{ 
  <StringOut> = <StringIn>; 
}
Input:
StringIn - stringa ottenuta dal modem.
With - se la stringa inizia con.
Output:
StringOut - stringa per ulteriori analisi.
Crea il tuo sito web gratis! Questo sito è stato creato con Webnode. Crea il tuo sito gratuito oggi stesso! Inizia