Input and store phone number using arduino keypad

Hello everyone,

I'm new to arduino and I'm working on a project which requires me to enter a phone number using the arduino 4x4 keypad and then store it to send messages using the arduino GSM shield.
Could anyone help me out with a general logic. I've tried using the sample codes to modify it to help solve this problem. It doesn't work properly.
As soon as I run the code on the serial monitor, the code directly goes to the message sending part and doesn't allow me to enter the phone number using the keypad.
I really appreciate your help. :confused:

As soon as I run the code on the serial monitor, the code directly goes to the message sending part and doesn't allow me to enter the phone number using the keypad.

There is something wrong with your code, then.

Which unfortunately we cannot see, not being telepathic.

The simplest way would be to read characters from the keypad and add each of them to an array of chars until the "end of input", perhaps a #, character is received. You can then do what you want with the array of chars containing the number including using it to dial the number. Note that if it is used with functions that expect the array of chars to be terminated with '\0' (aka C style strings) then you will need to add the trailing '0' to the array.

It would help tremendously if you posted the code that you have tried.

This is the code I've written. Please let me know what is wrong and how I could solve the problem.

// Include the GSM library
#include <GSM.h>
#include <Keypad.h>
char remoteNum[10];

#define PINNUMBER ""
const byte numRows = 4; //four rows
const byte numCols = 4; //four columns
//define the cymbols on the buttons of the keypads
char keymap[numRows][numCols] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'#','0','*','D'}
};
byte rowPins[numRows] = {12,11, 10, 9}; //connect to the row pinouts of the keypad
byte colPins[numCols] = {8, 6, 5, 4}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

// initialize the library instance
GSM gsmAccess;
GSM_SMS sms;

void setup()
{
// initialize serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

Serial.println("SMS Messages Sender");

// connection state
boolean notConnected = true;

// Start GSM shield
// If your SIM has PIN, pass it as a parameter of begin() in quotes
while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else
{
Serial.println("Not connected");
delay(1000);
}
}

Serial.println("GSM initialized");
}

void loop()
{
Serial.print("Enter a mobile number: ");
int i;
for (i=0; i<10; i++) {
char keypressed = myKeypad.getKey();
if (keypressed != NO_KEY) {
remoteNum = keypressed ;

  • Serial.print(keypressed);*
  • myKeypad.setDebounceTime(250);*
  • char keypressed=myKeypad.waitForKey();*
  • }*
    _ remoteNum = '\0'; _
    _
    }
    _
    }

* // sms text*
* Serial.print("Now, enter SMS content: ");*
* char txtMsg[200];*
* readSerial(txtMsg);*
* Serial.println("SENDING");*
* Serial.println();*
* Serial.println("Message:");*
* Serial.println(txtMsg);*

* // send the message*
* sms.beginSMS(remoteNum);*
* sms.print(txtMsg);*
* sms.endSMS();*
* Serial.println("\nCOMPLETE!\n");*

}
/*
* Read input serial*
*/
int readSerial(char result[])
{
* int i = 0;*
* while(1)*
* {*
* while (Serial.available() > 0)*
* {*
* char inChar = Serial.read();*
* if (inChar == '\n')*
* {*
_ result = '\0';
* Serial.flush();
return 0;
}
if(inChar!='\r')
{
result = inChar;
i++;
}
}
}
}*_

Please use code tags.

Read this before posting a programming question

How to use this forum

Please let me know what is wrong and how I could solve the problem.

What happens when you run the program ?

  for (i = 0; i < 10; i++)
  {
    char keypressed = myKeypad.getKey();
    if (keypressed != NO_KEY)
    {
      remoteNum[i] = keypressed ;
      Serial.print(keypressed);
      myKeypad.setDebounceTime(250);
      char keypressed = myKeypad.waitForKey();
    }
    remoteNum[i] = '\0';
  }

This for loop puts a '\0' in every position in the array.

You need to wait for a key, put the value in the array then put '\0' in the next array position. You could read the keypress using the waitForKey() method alone. Why are you using getKey() ?