首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从Arduino读取SMS并让LED打开或关闭

如何从Arduino读取SMS并让LED打开或关闭
EN

Stack Overflow用户
提问于 2013-04-09 15:36:58
回答 4查看 27.1K关注 0票数 2
代码语言:javascript
复制
#include <SoftwareSerial.h>
char inchar; //Will hold the incoming character from the serial port.
SoftwareSerial cell(2,3); //Create a 'fake' serial port. Pin 2 is the Rx pin, pin 3 is the Tx pin.

 int led1 = A2;

 void setup()
 {
     // Prepare the digital output pins
     pinMode(led1, OUTPUT);
     digitalWrite(led1, HIGH);

     //Initialize GSM module serial port for communication.
     cell.begin(19200);
     delay(30000); // Give time for GSM module to register on network, etc.
     cell.println("AT+CMGF=1"); // Set SMS mode to text
     delay(200);
     cell.println("AT+CNMI=3,3,0,0"); // Set module to send SMS data to serial out upon receipt 
     delay(200);
 }

 void loop() 
 {
     //If a character comes in from the cellular module...
     if(cell.available() >0)
     {
         delay(10);
         inchar=cell.read(); 
         if (inchar=='a')
         {
             delay(10);
             inchar=cell.read();
             if (inchar=='0')
             {
                 digitalWrite(led1, LOW);
             } 
             else if (inchar=='1')
             {
                 digitalWrite(led1, HIGH);
             }
             delay(10);
             delay(10);
         }
         cell.println("AT+CMGD=1,4"); // Delete all SMS
     }
 }

这是从蜂窝网络接收SMSes的代码。我正在使用Arduino Gboard和SIM900。代码中没有错误,但主板上的LED不会在收到短信时打开或关闭。

为什么?

EN

回答 4

Stack Overflow用户

发布于 2018-08-19 18:56:57

这是一个使用Arduino和GSM通过SMS发送命令的全功能代码,它还将回复灯光的状态。

代码语言:javascript
复制
#include <SoftwareSerial.h>
SoftwareSerial GPRS(10, 11);
String textMessage;
String lampState;
const int relay = 12; //If you're using a relay to switch, if not reverse all HIGH and LOW on the code

void setup() {  
  pinMode(relay, OUTPUT);
  digitalWrite(relay, HIGH); // The current state of the light is ON

  Serial.begin(9600); 
  GPRS.begin(9600);
  delay(5000);
  Serial.print("GPRS ready...\r\n");
  GPRS.print("AT+CMGF=1\r\n"); 
  delay(1000);
  GPRS.print("AT+CNMI=2,2,0,0,0\r\n");
  delay(1000);
}

void loop(){
  if(GPRS.available()>0){
    textMessage = GPRS.readString();
    Serial.print(textMessage);    
    delay(10);
  } 
  if(textMessage.indexOf("ON")>=0){ //If you sent "ON" the lights will turn on
    // Turn on relay and save current state
    digitalWrite(relay, HIGH);
    lampState = "ON";
    Serial.println("Lamp set to ON\r\n");  
    textMessage = "";
    GPRS.println("AT+CMGS=\"+631234567890\""); // RECEIVER: change the phone number here with international code
    delay(500);
    GPRS.print("Lamp was finally switched ON.\r");
    GPRS.write( 0x1a );
    delay(1000);
  }
  if(textMessage.indexOf("OFF")>=0){
    // Turn off relay and save current state
    digitalWrite(relay, LOW);
    lampState = "OFF"; 
    Serial.println("Lamp set to OFF\r\n");
    textMessage = "";
    GPRS.println("AT+CMGS=\"+631234567890\""); /// RECEIVER: change the phone number here with international code
    delay(500);
    GPRS.print("Lamp was finally switched OFF.\r");
    GPRS.write( 0x1a );
    delay(1000);
  }
  if(textMessage.indexOf("STATUS")>=0){
    String message = "Lamp is " + lampState;
    GPRS.print("AT+CMGF=1"); 
    delay(1000);
    Serial.println("Lamp state resquest");
    textMessage = "";
    GPRS.println("AT+CMGS=\"+631234567890\""); // RECEIVER: change the phone number here with international code
    delay(500);
    GPRS.print("Lamp is currently ");
    GPRS.println(lampState ? "ON" : "OFF"); // This is to show if the light is currently switched on or off
    GPRS.write( 0x1a );
    delay(1000);
  }
}
票数 2
EN

Stack Overflow用户

发布于 2017-07-08 19:22:06

最简单的方法就是最好的方法。

代码语言:javascript
复制
// if You use SoftwareSerial lib, declare object for GSM
SoftwareSerial gsm(8,9); // TX, RX
void setup(){
     // initialise UART and GSM communication between Arduino and modem
     Serial.begin(115200);
     gsm.begin(115200);
     // wait 5-10sec. for modem whitch must connect to the network
     delay(5000);
     // configure modem - remember! modem didn't remeber Your's configuration!
     gsm.print("at+cmgf=1\r"); // use full functionality (calls, sms, gprs) - see app note
     gsm.print("at+clip=1\r"); // enable presentation number
     gsm.print("at+cscs=\"GSM\"\r"); // configure sms as standard text messages
     gsm.print("at+cnmi=1,2,0,0,0\r"); // show received sms and store in sim (probobly, I don't compre this settings with app note but it's working :)
}
void loop(){
     String response = gsmAnswer();
    if(response.indexOf("+CMT:") > 0 ) { // SMS arrived
    // Now You can parse Your Message, if You wont controll only LED, just write
       if(response.indexOf("LED ON") > 0) {
          digitalWrite(LED_PIN, HIGH); // enable it
       }else if(response.indexOf("LED OFF") > 0) {
          digitalWrite(LED_PIN, LOW); // turn off
       }
       delay(1000);
    }
}


String gsmAnswer(){
   String answer;
   while(!gsm.available());
   while(gsm.available()){
     delay(5);
     if(Serial.available() > 0){
       char s = (char)gsm.read();
       answer += s;
     }
  }
  return answer;
}

再想一想,进来的短信格式如下:

代码语言:javascript
复制
+CMT: "+48xxxxxxxxx","","17/07/07,21:57:04+08"
Test of arrived messages
票数 1
EN

Stack Overflow用户

发布于 2013-05-13 15:08:28

在尝试解析它之前,您应该首先确切地知道响应是什么。

尝试一些简单的代码,比如下面的代码(注意:未测试!)要了解您应该寻找什么,请执行以下操作:

代码语言:javascript
复制
void loop() {
    if(cell.available() > 0) {
        char ch = cell.read();
        Serial.print(ch);
    }
}

我猜你看到的不仅仅是一个'0‘或'1’:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15896019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档