【问题标题】:send sms with sim900 using arduino使用arduino用sim900发送短信
【发布时间】:2016-04-15 04:34:48
【问题描述】:
 #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 setup 函数中效果很好。

我该如何解决这个问题?在 void 设置中,草图工作正常,但是当我也将代码放入函数 CheckPassword 时,它不会发送 SMS。

我还尝试创建一个函数,比如说 void SMS 并在 checkPassword 函数中调用它,但它并没有解决问题,顺便说一句,在 void 设置中调用相同的函数可以正常工作。

【问题讨论】:

    标签: arduino arduino-uno sim900


    【解决方案1】:

    您应该只在 setup 函数中初始化一次 gsm

    在您的代码中,您尝试在 checkPassword 方法中再次对其进行初始化,这显然行不通。

    因此,您应该从 checkPassword 函数中删除行 gsm.begin(9600)


    更新 1:

    在您的方案中,您为键盘保留 pin 9、8、7、6、5、4、3、2。但是,与此同时,您为 GSM 模块保留引脚 2、3(请参阅 GSM.cpp):

     #define _GSM_TXPIN_ 2
     #define _GSM_RXPIN_ 3
    

    为多种目的使用相同的引脚通常会导致(如果未正确完成)未定义的行为,这在最好的情况下意味着您的草图没有按照应有的方式进行,而在最坏的情况下可能会损坏你的组件。

    您已经在 Serial 库中使用了引脚 0、1,但根据您的代码,引脚 10、11、13 应该如果您想将现有引脚重新定位到您的组件,仍然是免费的。

    请注意 GSM 库中的以下警告

    [3] 我的盾牌不起作用。为什么?

    检查此步骤,然后在 Google 上的问题页面上寻求支持 代码。

    1) SIM900 和 SIM908 在最困难的任务中需要大约 1 A。 你应该有一个可以提供大约 8-12 V 时为 1 A

    2) 如果 SIM90X 闪烁 (1 Hz) 几秒钟然后关闭, 可能是沟通的问题。检查开关/跳线 用于串行通信。

    3) Arduino Uno 有 2 KB 的 RAM。图书馆占用约 80%(我们正在努力 减少它),如果您使用超过 20% 剩余,Arduino 可以重新启动 或在串行奇怪的字符串上打印。

    4) 检查通讯、电源(电池或外接)和充电的跳线。

    【讨论】:

    • 我从 checkPassword 函数中删除了 gsm.begin(9600),草图运行良好但仍然没有发送消息,它似乎执行了行 (sms.SendSMS("+xxxxx","xxxxx ") 并打印下一行“用户警告”,但它实际上并没有发送消息!我现在该如何解决!感谢您的帮助
    • 如果你能给我一个你正在使用的图书馆的链接,我找不到,那么我可以帮助你@drexxx
    • 我可以邮寄给你吗?
    • 我刚刚邮寄了!非常感谢!
    • @drexxx 我刚刚更新了我的答案。请更新您的草图并让我知道它是否有效,或者需要进一步检查。如果它不起作用,请使用最新版本的代码/问题更新问题。
    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 2016-06-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多