SIM 800l – dobry moduł GSM

Gdy chcesz panować nad funkcjami swojego Arduino jest klika metod komunikacji. Kabel, WIFI, Bluetooth, RS485 radio lub GSM. Moduł gms jest bardzo sprawny, pomimo tego, że kosztuje jego utrzymanie, ale jest niezawodny, dostępny i responsywny, tzn odpowieda na nasze wezwania w ten sam sposób, np poprzez SMS. I od chwili zaimplementowania tego modułu życie staje się prostsze.

Ja na swoje potrzeby zdecydowałem się na moduł SIM800L. Szukałem różnych innych ale ten wydał się najprostszy i najdostępniejszy. Szukałem jakiegoś, kótego nie trzeba by napędzac dodatkowym źródłem prądu , ale nie ma takich. Każdy moduł GSM trzebb zasilać lepszym prądem niż tym, co płynie w żyłach arduino. Zewnętrzne 5v w moim przypadku płynie z zasialacza sieciowego 1A. Istotną kwestia przy urządzeniach działający na komendach AT jest fakt, bardzo ważny fakt, żę RX łączymy do TX a TX do RX. Trzba o tym pamietać.

Urządzenie łdnie łapie sygnał w ciągu 10 sekund za pośrednictwem zewnętrznej anteny i w swoim przypadku używam jedynie polecen sms wysyłanych z prywatnego telefonu. Wiąże się to z tym, że to takiego modułu trzeba włożyć kartę sim na prepaidzie lub też nie. Na początku mogło się wydawać podstępne którą strona to włożyć, ale tylko w jeden sposób będzie działać. Większym problemem było zmuszenie moduły do odpowiedzi na moje komendy. Cały układ działa na komendach AT z mikrokontrolerem więc potrzebowałem kodu, jtóry będzie wysyłał odpowiednie komendy w odpowiednim czasie. Na szczęście nie musiałem tego sam pisac, udało się znaleźć i dostosować do swoich potrzeb.

#define TIMEOUT 5000


//sim800L
enum _parseState {
  PS_DETECT_MSG_TYPE,
  PS_IGNORING_COMMAND_ECHO,
  PS_READ_CMTI_STORAGE_TYPE,
  PS_READ_CMTI_ID,
  PS_READ_CMGR_STATUS,
  PS_READ_CMGR_NUMBER,
  PS_READ_CMGR_SOMETHING,
  PS_READ_CMGR_DATE,
  PS_READ_CMGR_CONTENT
};

byte state = PS_DETECT_MSG_TYPE;
char buffer[80];
byte pos = 0;
int lastReceivedSMSId = 0;
boolean validSender = false;

void resetBuffer() {
  memset(buffer, 0, sizeof(buffer));
  pos = 0;
}


void setup() {

  delay(2000);
  Serial.begin(9600);
  delay(2000);

  //sim 800l
  Serial2.begin(9600);
  Serial2.setTimeout(TIMEOUT);
  delay(1000);

  Serial2.write("AT+CMGF=1\r\n");
  delay(1000);
  Serial.println("serialSIM800 Setup Complete!");
  delay(1000);


}

void loop() {
  // put your main code here, to run repeatedly:
  while (Serial2.available()) {
    parseATText(Serial2.read());
    //Serial.write(Serial2.read());
  }

  respondSMS(0);
  delay(60000);

}





void parseATText(byte b) {

  buffer[pos++] = b;

  if ( pos >= sizeof(buffer) )
    resetBuffer(); // just to be safe

  switch (state) {
    case PS_DETECT_MSG_TYPE:
      {
        if ( b == '\n' )
          resetBuffer();
        else {
          if ( pos == 3 & amp; & strcmp(buffer, "AT+") == 0 ) {
            state = PS_IGNORING_COMMAND_ECHO;
          }
          else if ( pos == 6 ) {
            if ( strcmp(buffer, "+CMTI:") == 0 ) {
              Serial.println("Received CMTI");
              state = PS_READ_CMTI_STORAGE_TYPE;
            }
            else if ( strcmp(buffer, "+CMGR:") == 0 ) {
              Serial.println("Received CMGR");
              state = PS_READ_CMGR_STATUS;
            }
            resetBuffer();
          }
        }
      }
      break;

    case PS_IGNORING_COMMAND_ECHO:
      {
        if ( b == '\n' ) {
          //Serial.print("Ignoring echo: ");
          //Serial.println(buffer);
          state = PS_DETECT_MSG_TYPE;
          resetBuffer();
        }
      }
      break;

    case PS_READ_CMTI_STORAGE_TYPE:
      {
        if ( b == ',' ) {
          Serial.print("SMS storage is ");
          Serial.println(buffer);
          state = PS_READ_CMTI_ID;
          resetBuffer();
        }
      }
      break;

    case PS_READ_CMTI_ID:
      {
        if ( b == '\n' ) {
          lastReceivedSMSId = atoi(buffer);
          Serial.print("SMS id is ");
          Serial.println(lastReceivedSMSId);
          Serial2.print("AT+CMGR=");
          Serial2.println(lastReceivedSMSId);
          state = PS_DETECT_MSG_TYPE;
          resetBuffer();
        }
      }
      break;

    case PS_READ_CMGR_STATUS:
      {
        if ( b == ',' ) {
          Serial.print("CMGR status: ");
          Serial.println(buffer);
          state = PS_READ_CMGR_NUMBER;
          resetBuffer();
        }
      }
      break;

    case PS_READ_CMGR_NUMBER:
      {
        if ( b == ',' ) {
          Serial.print("CMGR number: ");
          Serial.println(buffer);
          // Uncomment these two lines to check the sender's cell number
          validSender = false;
          if ( strcmp(buffer, "\"+48501999999\",") == 0 )
            validSender = true;

          state = PS_READ_CMGR_SOMETHING;
          resetBuffer();
        }
      }
      break;

    case PS_READ_CMGR_SOMETHING:
      {
        if ( b == ',' ) {
          Serial.print("CMGR something: ");
          Serial.println(buffer);
          state = PS_READ_CMGR_DATE;
          resetBuffer();
        }
      }
      break;

    case PS_READ_CMGR_DATE:
      {
        if ( b == '\n' ) {
          Serial.print("CMGR date: ");
          Serial.println(buffer);
          state = PS_READ_CMGR_CONTENT;
          resetBuffer();
        }
      }
      break;

    case PS_READ_CMGR_CONTENT:
      {
        if ( b == '\n' ) {
          Serial.print("CMGR content: ");
          Serial.print(buffer);
          //delete all msgs
          Serial2.write("AT+CMGD=1,4\r\n");
          if (validSender) {
            String str(buffer);
            str.trim();
            if (str.equals("0")) {
              respondSMS(0);
            }
          }

          state = PS_DETECT_MSG_TYPE;
          resetBuffer();
        }
      }
      break;
  }
}


void respondSMS(int request) {

  delay(1000);
  Serial2.write("AT+CMGS=\"501999999\"\r\n");
  delay(1000);

  if (request == 0) { //test

    Serial2.write("hello\r\nworld");

  }

  delay(1000);
  Serial2.write((char)26);
  delay(1000);
  // Serial.println("SMS has been sent");
}

W tym przykładzie należy zauważyć, że komunikacja odbywa się po dwóch Serialach Serial1 i Serial2, jest to charakterystyczne dla Arduino Mega, gdzie jest dostępnych więcej niż 1 port hardwarowy i SoftwareSerial jest zbędny. Co minutę zostanie wywołana metoda respondSMS z parametrem 0, kóry jest odpowiedzialny za wysłanie do zdefiniowanego numeru 501999999 wysłania „hello world”. Zwróć uwage na zmienną validSender, która ogranizaczas działanie smsów do zdefiniowanego numeru (Twojego numeru), żeby nikt inny nie wydawał polecen twojemu programowi.

sim800l

Powinno działać, powodzenia


Opublikowano: 7 kwietnia, 2017 przez Pan z Pogodna

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *