GSM and type as a keyboard


I need to do a little project for a local shop

when people call them (they only have mobile gsm phone) i need a "thing" that can grab the number and remove +45 from the number and then type it as if the staff typed number on keyboard and press enter

i looked for a gsm shield in the shop and the leonardo board but the only gsm shield/board is Arduino MKR GSM 1400

can this one also act as a keyboard to the pc? or do i need an extra board and if so which one?

Check out the Keyboard library


i'm a fool

The keyboard functions enable 32u4 or SAMD micro based boards to send keystrokes to an attached computer through their micro’s native USB port.

with some help from the examples i have tried to stitch together a code that takes the incomming phone number and types it as if it was done on a keyboard

now i just need to make sure the number is only typed once for each call

ie if the phone is not picked up after the frist ring number should only be typed once

once the phone has been picked up the module will not get more rings

and of course i need to ask the phone company if we can get a 2nd sim card for the same number

but code so far

#include <MKRGSM.h>

// PIN Number
#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess; // include a 'true' parameter for debug enabled
GSMVoiceCall vcs;

char numtel[20];           // buffer for the incoming call

void setup()
  // initialize serial communications
  // initialize control over the keyboard:
  Serial.println("Receive Voice Call");

  // connection state
  boolean notConnected = true;

  // Start GSM shield
  // If your SIM has PIN, pass it as a parameter of begin() in quotes
      notConnected = false;
      Serial.println("Not connected");

  // This makes sure the modem notifies correctly incoming events

  Serial.println("Waiting Call");

void loop()
  // Check the status of the voice call
  switch (vcs.getvoiceCallStatus()) 
    case IDLE_CALL: // Nothing is happening


    case CALLING: // This should never happen, as we are not placing a call


    case RECEIVINGCALL: // Yes! Someone is calling us

      Serial.println("RECEIVING CALL");

      // Retrieve the calling number
      vcs.retrieveCallingNumber(numtel, 20);

      // Print the calling number
      //Send the message
      Keyboard.write(0x0d);  // that's a CR

    case TALKING:  // In this case the call would be established

      Serial.println("TALKING. Enter line to interrupt.");
      Serial.println("HANG. Waiting Call.");      

EDIT: changed the method of typing to Keyboard.println
EDIT2: added a “enter” press after sending the phone number

assuming that the code above works like this

it waits for a call
when the call comes it takes the number and types it as if it was typed on a real keyboard
it then presses enter

this means that the staff needs to make sure that the cursor is ready each time they leave the pc

benefits is that if a call is in place no new calls comes in

the only thing to worry about is if staff does not pick up after first ring i need to make sure that number is only typed once

Something like this?

  // Check the status of the voice call
  bool waitingForCall;

  switch (vcs.getvoiceCallStatus()) 
    case IDLE_CALL: // Nothing is happening
      waitingForCall = true;

    case RECEIVINGCALL: // Yes! Someone is calling us

      if (waitingForCall) {           
         // do stuff
         waitinForCall = false;

yeah i think that will do it

it will set waitingForCall to true and just wait

when a call comes it will do its thing and set waitingForCall to false hense it will not do its thing again

but lets say a customer calls and they just let it ring, will that prevent it from going to the case IDLE_CALL ?

but at least i know it's now possible, it only depends on the phone company willing to issue a 2nd sim card for the same number