Controllo DTMF tramite modulo GSM serie SIM800 - FLProg.
Lavorare con i codici dei toni dei pulsanti - DTMF.
Il modulo GSM della serie SIM800 ha la capacità di decodificare il segnale DTMF in codici specifici. Per utilizzare questa funzionalità è necessario abilitare la modalità di riconoscimento DTMF utilizzando il comando AT+DDET=1. Il comando ed i suoi parametri sono descritti in dettaglio nella tabella:
Comando | Descrizione | Struttura della risposta | Risposta non richiesta |
---|---|---|---|
AT+DDET=<mode>[,<interval>][,<reportMode>][,<ssdet>] | Impostazione della modalità di rilevamento del segnale DTMF | Risposta: AT+DDET=<mode>[,<interval>][,<reportMode>][,<ssdet>] OK o ERROR Parametri: <mode> - disabilita o abilita il controllo del rilevamento DTMF: 0 - disabilita 1 - abilita <interval> - l'intervallo minimo in millisecondi tra due pressioni dello stesso tasto (intervallo di valori valido 0-10000). L'impostazione predefinita è 0. <reportMode> - modalità di fornitura delle informazioni: 0 - solo il codice del pulsante premuto 1 - codice del pulsante premuto e tempo di pressione prolungata, in ms <ssdet> - controllo della funzione di rilevamento del suono a frequenza singola: 0 - disabilita 1 - abilita Moalità di salvataggio dei parametri: AT&W_SAVE |
Se <reportMode>=0, allora: +DTMF: <key> Se <reportMode>=1, allora: +DTMF: <key>,<last time> <key> - identificatore del pulsante premuto (0-9, *, #, A, B, C, D) <last time> - durata della pressione del pulsante, in ms. |
Nel codice comune dei blocchi, viene aggiunta la funzione setTimeout() per impostare i millisecondi massimi di attesa per i dati seriali.
Cosa succede senza utilizzare questa funzione.
Dopo aver avviato il controller, tutto sembrava funzionare se i pulsanti venivano premuti raramente. Ma se premi rapidamente più pulsanti di seguito il controller elaborerà solo il primo dei comandi ricevuti e salterà il resto.
Ciò accade perché i dati provenienti da sequenze di tasti diverse arrivano alla porta in un lotto e la funzione readString() chiamata nella funzione waitResponse() completa il suo lavoro solo quando si verifica un timeout di 1 secondo (Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\Stream.cpp):
#define PARSE_TIMEOUT 1000 //default number of milliseconds to wait.
Utilizzando la funzione setTimeout() possiamo impostare un valore di timeout inferiore, ad esempio 100 ms.
Con questo valore di timeout, le altre notifiche non avranno il tempo di arrivare e il modulo elaborerà correttamente ciascuna notifica.
Ora, sapendo come abilitare questa modalità, puoi visualizzare le notifiche non richieste inviate dal modulo come reazione alla pressione di vari pulsanti.
Implementazione nel programma FLProg.
Schema di collegamento per le prove.
- Per attivare le impostazioni, tenere premuto il pulsante "Setting" per 3 secondi.
- Successivamente, seleziona la voce di menu per le impostazioni utilizzando il pulsante "Menu".
- Per selezionare il parametro utilizzare il pulsante "Parameter".
- Per selezionare il valore utilizzare il pulsante "Select".
- Per inviare il comando premere il pulsante "Send".
- Tenendo premuto il pulsante "Menu", "Parameter" o "Select" per un secondo cambia la direzione della selezione.
