Use DTMF

Hello,
Is possible to receive DTMF command trough the new GSM SHIELD R3 with Quectel M10 ?
I can't find documentation about.
Thanks
kind regards
Giorgio

I can see AT commands that deal with DTMF and tone generation so I guess it's possible using AT commands.

I simply need to receive a call, and decode DTMF code, can you please explain me what I can do this with AT commands?

thanks
Giorgio

Sorry I can only point you to the right place, you'll have to do the rest because I have no experience with receiving calls and dealing with tones.

GSM library doesn't support DTMF functions of modem. You can use AT commands directly:

  • AT+VTS to generate DTMF tone.
  • AT+QLDTMF to generate local DTMF tone.
  • AT+QTONEDET to detect DTMF tones.
  • AT+QTONEP to set DTMF output.

Hello,
can please someone explain me how to use this at command directly in a sketch?

thanks
Giorgio

You can input commands directly through serial monitor with this sketch:

#include <SoftwareSerial.h>
#include <string.h>

char incoming_char = 0;
SoftwareSerial cell(2,3);

void setup()
{
  // Initialize serial ports for communication.
  Serial.begin(9600);

  // Reset
  Serial.println("Start Reset");
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  delay(12000);
  digitalWrite(7, LOW);
  delay(1000);
  Serial.println("End Reset");  

  cell.begin(9600);

  Serial.println("Enter your AT commands (with CR & NL)...");
  /*cell.println("AT+CFUN=4");
  delay(500);
  cell.println("AT+CFUN=4");
  delay(500);
  cell.println("AT+CFUN=4");
  delay(500);
  */
}

void loop()
{
  if(cell.available() > 0)
  {
    incoming_char = cell.read();
    if((incoming_char >= ' ') && (incoming_char<='z'))
      Serial.print(incoming_char);
    else
    {
      Serial.print("%");
      Serial.print((int) incoming_char);
      Serial.print("%");
      if(incoming_char == 10)
        Serial.println();
    }
  }

  if(Serial.available() > 0)
  {
    incoming_char = Serial.read();
    cell.print(incoming_char);
  }
}

I need to detect a DTMF during a call.. what I need to do please?
Thanks
Giorgio

For example, you can send commands from a sketch with:

theTTModemCore.genericCommand_rqc("AT+QDTONEDET=1", true); // Send command
_delay_ms(1000); // Wait for response
theTTModemCore.genericParse_rsp(resp); // parse response looking for a OK

// If OK
if(resp)
{
// Do a call and search for a modem response like "+QTONEDET: ..."
}

To check if a QTONEDET event happens, you have to development your own parser reading data from the buffer with:

char c = theGSM3ShieldV1ModemCore.theBuffer().read()

Hello,
thanks for help.
I can't understand:
why you use "theTTModemCore" and "theGSM3ShieldV1ModemCore"?
What is _delay_ms?
Where I need to declare "resp"?

many thanks
Giorgio

Giorgio:
Hello,
thanks for help.
I can't understand:
why you use "theTTModemCore" and "theGSM3ShieldV1ModemCore"?
What is _delay_ms?
Where I need to declare "resp"?

many thanks
Giorgio

Sorry. I would say theGSM3ShieldV1ModemCore. Replace _delay_ms with delay() function of Arduino (_delay_ms is an AVR funct
ion included in <util/delay.h>). Resp is a boolean variable to keep if parser executed succesfully.