5
votes
 #include <Password.h> 
#include <Keypad.h> 
#include <Servo.h> 
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"

Servo myservo; 
Password password = Password( "1234" ); //password to unlock box, can be changed
SMSGSM sms;
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

const byte ROWS = 4; 
const byte COLS = 4; 

// Define the Keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 9, 8, 7, 6 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 5, 4, 3, 2 };
int x=0;


// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()     //if i add sms(); function it workssss
{ 

   Serial.begin(9600); //Start a Serial COM

   Serial.println(F("ARDUINO SECURITY SYSTEM V1.0"));

   Serial.print(F("Checking GSM COM..."));

  if (gsm.begin(9600)) //Start the GSM COM
  {
    (sms.SendSMS("+XXXXX","Your Home Security system is powered up"));
    Serial.println(F("Good To GO!!"));
  }
  else
  {
    Serial.println(F("Could not connect to GSM modem"));
  }

  Serial.write(254);
  Serial.write(0x01);
  delay(200); 
  pinMode(11, OUTPUT);  //green light
  pinMode(12, OUTPUT);  //red light
  myservo.attach(13); //servo on digital pin 9 //servo
  keypad.addEventListener(keypadEvent);//add an event listener for this keypad

  }

void loop(){
  keypad.getKey();
  myservo.write(0);
  }
  //take care of some special events
  void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
  case PRESSED:

  Serial.print("Enter : ");
  Serial.println(eKey);
  delay(10);

  Serial.write(254);

  switch (eKey){
    case 'A': checkPassword(); delay(1); break;
    case 'C': checkPassword(); delay(1); break;
    case 'D': checkPassword(); delay(1); break;
    case 'B': password.reset(); delay(1); break;
    case '*': checkPassword(); break;
    case '#': password.reset(); break;

    default: password.append(eKey); delay(1);
  }
 }
}
void checkPassword(){

if (password.evaluate()){  //if password is right open box

    Serial.println("Accepted");
    Serial.write(254);delay(50);
    //Add code to run if it works
    myservo.write(5); //160deg

        digitalWrite(11, HIGH);//turn on
    delay(2000); //wait 5 seconds
    digitalWrite(11, LOW);// turn off   
}
else
{

    Serial.println("Denied"); //if passwords wrong keep box locked
    Serial.write(254);delay(10);
    x++;

    if(x==3)
    //add code to run if it did not work
   {
    myservo.write(0);
    digitalWrite(12, HIGH); 
    delay(500); 
    digitalWrite(12, LOW);  
  if (gsm.begin(9600)) 
  {
    (sms.SendSMS("+XXXXX","Your Home Security system is being bridged"));

    Serial.println("USER WARNED");
   }

}
}
}
;
}

In the picture the same code doesn't seem to work when I place the lines

if (gsm.begin(9600)) //Start the GSM COM
  {
    (sms.SendSMS("+8613668914901","Your Home Security system is being bridged"));

but this lines work great inside the void setup function.

Image

How can I fix this problem? Inside the void setup the sketch works fine but when I also put the code in the function CheckPassword it doesn't send SMS.

I also tried to create a function let's say void SMS and call it in the checkPassword function but it doesn't solve the problem, btw the same function when called in the void setup works fine.

1

1 Answers

1
votes

You are supposed to initialize the gsm only once, in the setup function.

In your code you attempt to initialize it again in the checkPassword method, and that is obviously not going to work.

Thus you should remove the line gsm.begin(9600) from the checkPassword function.


UPDATE 1:

In your scheme you reserve the pins 9, 8, 7, 6, 5, 4, 3, 2 for the Keyboard. However, at the same time you reserve pins 2, 3 for your GSM module (see GSM.cpp):

 #define _GSM_TXPIN_ 2
 #define _GSM_RXPIN_ 3

Using the same pins for multiple purposes can often result (if not done properly) in undefined behaviour which in the best scenario means that your sketch isn't doing what it is supposed to do, and in the worst scenario it might damage your components.

You are already using pins 0, 1 for the Serial library, but according to your code the pins 10, 11, 13 should still be free if you want to relocate the existing pins to your components.

Notice also the following warnings inside the GSM library:

[3] My shield doesn't work. Why?

Check this steps and then ask for support on the issues' page on google code.

1) SIM900 and SIM908 require about 1 A during the hardest tasks. You should have an external power source that can provide about 1 A at 8-12 V

2) If the SIM90X blinks (1 Hz) for some seconds and then turn off, probably it's a communication's problem. Check the switch/jumpers for Serial communication.

3) Arduino Uno has 2 KB of RAM. Library takes about 80% (we are working to reduce it), if you use more than 20% left, Arduino can restart or print on serial strange strings.

4) Check the jumper of communication, power source (battery or externel) and charge.