How to read an SMS from Arduino and get LED to switch on or off

27,312

Solution 1

Here's a fully functional code for sending a command thru SMS using Arduino and GSM, it will also reply the state of the light.

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

Solution 2

Change

AT+CNMI=3,3,0,0

to:

AT+CNMI=2,2,0,0,0

Solution 3

The simplest way is the best way.

// 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;
}

One think more, incomming sms has the following format:

+CMT: "+48xxxxxxxxx","","17/07/07,21:57:04+08"
Test of arrived messages
Share:
27,312
jalpan
Author by

jalpan

Updated on August 20, 2020

Comments

  • jalpan
    jalpan almost 4 years
    #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
         }
     }
    

    This is the code for receiving SMSes from the cellular network. I am using the Arduino Gboard with SIM900. There is no error in the code, but the LED on the board doesn't switch on or off in response to an SMS.

    Why?

  • mehmet
    mehmet almost 4 years
    hi, GPRS.print("AT+CMGF=1\r\n"); or GPRS.print("AT+CMGF=1\r"); why did you use \n, is that necessary.