GSM Shield und Arduino UNO R3

Hallo zusammen,

ich habe bisher viele kleinere Projekte mit Arduino gemacht. Das hier fordert mich aber heraus!
Mein Ziel ist es mit einer SMS ein Relais zu schalten.

GSM Modul hat einen SIM900 Chip/ Mit Vodafone SIM-Karte ohne PIN

Diesen Code hab ich aus dem Internet.

#include <SoftwareSerial.h>
SoftwareSerial GPRS(7, 8); // RX, TX

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()
{
  GPRS.begin(9600);
  Serial.begin(9600);

  // Set as appropriate for your case
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  digitalWrite(2, HIGH);
  digitalWrite(4, HIGH);

  for (int i = 1; i <= 21; i++) {
    GPRS.print("AT+CMGD=");
    GPRS.println(i);
    delay(200);

    // Not really necessary but prevents the serial monitor from dropping any input
    while(GPRS.available()) 
      Serial.write(GPRS.read());
  }
}

void loop()
{
  while(GPRS.available()) {
    parseATText(GPRS.read());
  }
}

void parseATText(byte b) {

  buffer[pos++] = b;

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

  /*
   // Detailed debugging
   Serial.println();
   Serial.print("state = ");
   Serial.println(state);
   Serial.print("b = ");
   Serial.println(b);
   Serial.print("pos = ");
   Serial.println(pos);
   Serial.print("buffer = ");
   Serial.println(buffer);*/

  switch (state) {
  case PS_DETECT_MSG_TYPE: 
    {
      if ( b == '\n' )
        resetBuffer();
      else {        
        if ( pos == 3 && strcmp(buffer, "AT+") == 0 ) {
          state = PS_IGNORING_COMMAND_ECHO;
        }
        else if ( pos == 6 ) {
          //Serial.print("Checking message type: ");
          //Serial.println(buffer);

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

        GPRS.print("AT+CMGR=");
        GPRS.println(lastReceivedSMSId);
        //delay(500); don't do this!

        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, "\"+49XXXXXXXXXXX\",") == 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);

        parseSMSContent();

        GPRS.print("AT+CMGD=");
        GPRS.println(lastReceivedSMSId);
        //delay(500); don't do this!

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

void parseSMSContent() {

  char* ptr = buffer;

  while ( strlen(ptr) >= 2 ) {

    if ( ptr[0] == 'r' ) {
      if ( ptr[1] == '1' )
        digitalWrite(2, HIGH);
      else
        digitalWrite(2, LOW);
    }

    if ( ptr[0] == 'y' ) {
      if ( ptr[1] == '1' )
        digitalWrite(4, HIGH);
      else
        digitalWrite(4, LOW);
    }

    ptr += 2;
  }
}

Mit "r" oder "y" soll jeweils mit "1" oder "0" ein- bzw. ausgeschaltet werden

Funktioniert auf jeden Fall nicht

Danach hab ich folgendes getestet:

#include <SoftwareSerial.h>
SoftwareSerial GPRS(7, 8); // RX, TX

void setup()
{
  GPRS.begin(9600);
  Serial.begin(9600);
}

void loop()
{
  while(GPRS.available()) 
    Serial.write(GPRS.read());

  while (Serial.available()) 
      GPRS.write(Serial.read());
}

Und wenn ich die SMS lesen will bekomme ich folgende Antwort.

AT

OK

+CMTI: "SM",2
AT+CMGR=2

+CMGR: 0,"",23
0791947122723033040C9194712350909800000240401132438004D4F29C0E

OK
⸮⸮⸮⸮⸮⸮⸮

Wieso bekomme ich keinen Text zurück sonder nur Zahlen? In der verschickten SMS steht "Test"

Ich habe mich bereits durch viele Supports gelesen und Google befragt, aber diesen Fehler habe ich noch nirgends gesehen.
:slight_smile:

Diesen Code hab ich aus dem Internet

Dann ist es also jetzt deiner.
Ich bin sicher der Code funktioniert und macht genau was du programmiert hast.

Da sind übrigens so viele Serial.print Debug_Ausgaben drin, dass ich (wenn es mein Code wäre, mir das wenigstens mal angesehen hätte. Bzw. wenn selbst da nix kommt, gibt es nicht viel zu suchen)

@michael_x

Bitte entschuldige, dass ich etwas neues ausprobieren wollte!

Ich danke dir für deinen "hilfreichen" Post der leider nichts mit meiner Frage zu tun hat. Es ist schön wenn auf Kleinigkeiten herumgehackt wird und dabei vom Thema abgekommen wird.

Um es besser zu verstehen:

Wieso zeigt mir "0791947122723033040C9194712350909800000240401132438004D4F29C0E" an, obwohl der Inhalt der SMS "Text" war?

Dass du etwas neues ausprobieren willst, finde ich gut. Dass du dafür um Entschuldigung bittest, nicht so sehr. Aber von mir aus: Entschuldigung angenommen.

Also, ganz konkret:
Wo dein "0791947122723033040C9194712350909800000240401132438004D4F29C0E"
herkommt, kann ich nicht beurteilen.
Immerhin scheint überhaupt etwas anzukommen. Das ist schonmal eine wichtige und neue Aussage.

Wo ist das Ergebnis von deinem Serial.print("state = "); ?
Und was kommt danach?