отправить смс с sim900 с помощью arduino

 #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");
   }

}
}
}
;
}

На картинке тот же код, кажется, не работает, когда я помещаю строки

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

но эти строки отлично работают внутри функции настройки void.

Изображение

Как я могу исправить эту проблему? Внутри настройки void скетч работает нормально, но когда я также помещаю код в функцию CheckPassword, он не отправляет SMS.

Я также попытался создать функцию, скажем void SMS и вызвать ее в функции checkPassword, но это не решает проблему, кстати, та же функция при вызове в настройке void работает нормально.


person drexxx    schedule 15.04.2016    source источник


Ответы (1)


Вы должны инициализировать gsm только один раз в функции setup.

В вашем коде вы пытаетесь снова инициализировать его в методе checkPassword, и это, очевидно, не сработает.

Таким образом, вы должны удалить строку gsm.begin(9600) из функции checkPassword.


ОБНОВЛЕНИЕ 1:

В вашей схеме вы зарезервировали контакты 9, 8, 7, 6, 5, 4, 3, 2 для клавиатуры. Однако в то же время вы резервируете контакты 2, 3 для своего модуля GSM (см. GSM.cpp):

 #define _GSM_TXPIN_ 2
 #define _GSM_RXPIN_ 3

Использование одних и тех же выводов для нескольких целей часто может привести (если не сделано должным образом) к неопределенному поведению, что в лучшем случае означает, что ваш скетч не выполняет то, что должен делать, а в худшем случае он может повредить ваши компоненты.

Вы уже используете контакты 0, 1 для библиотеки Serial, но в соответствии с вашим кодом контакты 10, 11, 13 по-прежнему должны быть свободными. если вы хотите переместить существующие контакты в свои компоненты.

Обратите внимание на следующие предупреждения в библиотеке GSM:

[3] Мой щит не работает. Почему?

Проверьте эти действия, а затем обратитесь за поддержкой на странице проблем в коде Google.

1) SIM900 и SIM908 требуют около 1 А во время самых сложных задач. У вас должен быть внешний источник питания, который может обеспечить около 1 А при 8-12 В.

2) Если SIM90X мигает (1 Гц) в течение нескольких секунд, а затем выключается, возможно, это проблема со связью. Проверьте переключатель / перемычки для последовательной связи.

3) Arduino Uno имеет 2 КБ ОЗУ. Библиотека занимает около 80% (мы работаем над ее сокращением), если вы используете более 20% оставшихся, Arduino может перезапустить или распечатать последовательные странные строки.

4) Проверить перемычку связи, источника питания (аккумулятор или внешний аккумулятор) и заряда.

person Patrick Trentin    schedule 15.04.2016
comment
Я удалил gsm.begin (9600) из функции checkPassword, скетч работает нормально, но сообщение все еще не отправлено, похоже, выполняется строка (sms.SendSMS (+ xxxxx, xxxxx) и выводится следующая строка User Warned, но она на самом деле не отправляет сообщение! Как я могу решить эту проблему сейчас! признателен за вашу помощь - person drexxx; 16.04.2016
comment
Если вы предоставите мне ссылку на используемую вами библиотеку, которую я не смог найти, то я смогу помочь вам @drexxx - person Patrick Trentin; 16.04.2016
comment
могу я отправить его вам? - person drexxx; 16.04.2016
comment
я только что отправил это по почте! Большое спасибо! - person drexxx; 16.04.2016
comment
@drexxx Я только что обновил свой ответ. Обновите свой скетч и дайте мне знать, работает ли он или необходимы дальнейшие проверки. Если это не сработает, обновите вопрос, указав самую новую версию вашего кода / проблемы. - person Patrick Trentin; 16.04.2016
comment
Я изменил контакты 2,3 в функции клавиатуры на 10,13; и оставьте контакты 2,3 только для библиотеки gsm, и код работает нормально, благодарю за вашу помощь! Большое спасибо! - person drexxx; 16.04.2016
comment
Мой проект также включает дисплей lcd16x02, некоторые реле датчиков, не могли бы вы предложить какой-нибудь хороший способ избежать проблем с контактами, потому что мне всегда нужно было бы использовать одни и те же контакты для других функций, большое спасибо - person drexxx; 16.04.2016
comment
В общем, решение состоит в использовании мультиплексора, когда это возможно. Или @drexxx, вы можете купить плату большего размера, например, Arduino Mega. В вашем случае, я думаю, вам следует попытаться разместить клавиатуру в схеме, которая использует только 1 контакт, например, следуя этим инструкциям plays.arduino.cc/Code/OneWireKeyPad. Если вы погуглите, существуют ЖК-устройства, которые тоже используют только 2 контакта. - person Patrick Trentin; 16.04.2016
comment
Большое спасибо, чувствую себя намного лучше, проект убивал меня, теперь он стал похож на Arduino. - person drexxx; 16.04.2016