GSM Shield SMS Auswertung

Moin,
komm da nicht ganz weiter hab ein ARDUINO GSM SHIELD 2.
https://store.arduino.cc/arduino-gsm-shield-2-integrated-antenna
jetzt möchte ich die SMS die ankommt auswerten aber bloß wie?

/*
 SMS receiver

 This sketch, for the Arduino GSM shield, waits for a SMS message
 and displays it through the Serial port.

 Circuit:
 * GSM shield attached to and Arduino
 * SIM card that can receive SMS messages

 created 25 Feb 2012
 by Javier Zorzano / TD

 This example is in the public domain.

 http://www.arduino.cc/en/Tutorial/GSMExamplesReceiveSMS

*/

// include the GSM library
#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER ""

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array to hold the number a SMS is retreived from
char senderNumber[20];

void setup() {
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("SMS Messages Receiver");

  // connection state
  boolean notConnected = true;

  // Start GSM connection
  while (notConnected) {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
      notConnected = false;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");
  Serial.println("Waiting for messages");
}

void loop() {
  char c;

  // If there are any SMSs available()
  if (sms.available()) {
    Serial.println("Message received from:");

    // Get remote number
    sms.remoteNumber(senderNumber, 20);
    Serial.println(senderNumber);

    // An example of message disposal
    // Any messages starting with # should be discarded
    if (sms.peek() == '#') {
      Serial.println("Discarded SMS");
      sms.flush();
    }

    // Read message bytes and print them
    while (c = sms.read()) {
      Serial.print(c);
    }

    Serial.println("\nEND OF MESSAGE");

    // Delete message from modem memory
    sms.flush();
    Serial.println("MESSAGE DELETED");
  }

  delay(1000);

}

Das ist der Code um SMS zu empfangen.
Und hier spielt für mich die musik:

    // Read message bytes and print them
    while (c = sms.read()) {
      Serial.print(c);
    }

wie kann ich jetzt die byte weise auslesung in ein int schreiben?
Ich werde nur Zahlen empfangen.
Danke geht schon mal raus :slight_smile:

Du musst erst mal ein Endekennzeichen vereinbaren, z.B. LF ('\n'), sonst weißt Du ja nicht, wann die Zahl zuende ist.
Wenn Du mehrere Zahlen mit unterschiedlicher Bedeutung senden willst, musst Du Dir noch ein paar Gedanken mehr machen.

Gruß Tommy

Tommy56:
Du musst erst mal ein Endekennzeichen vereinbaren, z.B. LF ('\n'), sonst weißt Du ja nicht, wann die Zahl zuende ist.
Wenn Du mehrere Zahlen mit unterschiedlicher Bedeutung senden willst, musst Du Dir noch ein paar Gedanken mehr machen.

Gruß Tommy

Ich werde nur z.B 1111 oder 0000 also 4 zahlen empfangen die als gemeinsames in einer if frage etwas ausführen sollen

Das sieht eher nach 4 Bits aus? Mach mal Butter bei die Fische - was willst Du machen?

Gruß Tommy

Also Tommy ich will per SMS das öffnen und schließen.
Ich hab mir gedacht ich verschicke 1111 zum öffnen und 0000 zum schließen.
Ganz einfach aber ist woll nicht so.

Warum dann nicht einfach '0' und '1'?

Gruß Tommy

Tommy56:
Warum dann nicht einfach '0' und '1'?

Gruß Tommy

Das wäre auch okey nur wie kann ich da einen vergleich machen ich hab es mit 1 versucht aber es ging nicht so wie es mir vorgestellt hab
if(c == "1")
{o();}

Hi

FUnktioniert denn der Sketch oben?
Also bekommst Du angezeigt, welche SMS empfangen wurde?
Dann kannst Du mit dem Bereich

// Read message bytes and print them
    while (c = sms.read()) {
      Serial.print(c);
    }

die Zeichen in der Variable c auswerten.
Bedenke, daß auch fehlgeleitete SMS bei Deinem Empfänger ankommen können - also bei 0 AUSschalten, bei 1 EINschalten und bei 9 den roten Knopf zur Selbstzerstörung drücken würde ich nur, wenn der Aufbau der SMS stimmt und ggf. einige Prüf-Zeichen/Ziffern ebenfalls gepasst haben,

Klar, anfänglich reicht Es, wenn die 0 (oder 0000) bzw. 1 (1111) als zusammen hängender Text erkannt werden und drauf reagiert wird.
In der späteren Anwendung wäre mir Das aber 'zu jauche'.

MfG

PS

"1" -> 1/n
'1' -> 1

Zumindest ist c als char deklariert

calik97:
Das wäre auch okey nur wie kann ich da einen vergleich machen ich hab es mit 1 versucht aber es ging nicht so wie es mir vorgestellt hab
if(c == "1")
{o();}

if (c=='1') { tu was}

Char, nicht Zeichenkette.

Gruß Tommy

Tommy56:

if (c=='1') { tu was}

Char, nicht Zeichenkette.

Gruß Tommy

Das klappt auch nicht
if(c == '1'){
o();
}

Dann gib Dir doch mal auf Seriell aus, was in c steht.

Gruß Tommy

Edit: Ich vermute, in der SMS steht noch viel mehr.

Da steht 1
mein Code sieht jetzt so aus:

void smss()
{
    // Get remote number
    sms.remoteNumber(senderNumber, 20);
    Serial.println(senderNumber);
    if(strcmp(senderNumber, a) == 0)
    {
    // Read message bytes and print them
    while (c = sms.read()) {
      Serial.print(c);
    }  
    if(c == '1'){
      o();
    }

    sms.flush();
    }
    else
    {
      Serial.print("Falsch");
    }
}

void o(){ //Öffnet das Tor über das Relais mit dem Pin 4
  digitalWrite(offnen, HIGH);
  delay(1000);
  digitalWrite(offnen, LOW);
}

Die Ausgabe sagt 1 aber die if Schleife tut nicht

Ändere mal Serial.print(c); in Serial.print(c,HEX);

Da sind bestimmt noch mehr Zeichen.
Zeige uns mal, was da raus kommt.

Gruß Tommy

Tommy56:
Ändere mal Serial.print(c); in Serial.print(c,HEX);

Da sind bestimmt noch mehr Zeichen.
Zeige uns mal, was da raus kommt.

Gruß Tommy

31

Das kam jetzt raus

Das ist '1'.

Dann sollte die if-Bedingung erfüllt sein. Wo ist c deklariert?
Das ist der Nachteil wenn man nur Fragmente bekommt.

Gruß Tommy

// include the GSM library
#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER "2002"

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array to hold the number a SMS is retreived from
char senderNumber[20], c, a[20] ="+nummer", n[4] = "1", m[4] = "0";
int e=1, offnen = 4, schliessen = 5;


void setup() {
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("SMS Messages Receiver");
  initGSM();
  Serial.println("GSM initialized");
  Serial.println("Waiting for messages");
}

void loop() {
  if (sms.available()) {
    smss();}
}

void initGSM(){
    // connection state
  boolean notConnected = true;
  // Start GSM connection
  while (notConnected) {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
      notConnected = false;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }
}

void smss()
{
    // Get remote number
    sms.remoteNumber(senderNumber, 20);
    Serial.println(senderNumber);
    if(strcmp(senderNumber, a) == 0)
    {
    // Read message bytes and print them
    while (c = sms.read()) {
      Serial.print(c, HEX);
    }
    //c = sms.read();
    if(c == '1 '){
      o();
    }
    sms.flush();
    }
    else
    {
      Serial.print("Falsch");
    }
}

void o(){ //Öffnet das Tor über das Relais mit dem Pin 4
  digitalWrite(offnen, HIGH);
  delay(1000);
  digitalWrite(offnen, LOW);
}
void s(){ //Schließt das Tor über Relais mit dem Pin 5
  digitalWrite(schliessen, HIGH);
  delay(1000);
  digitalWrite(schliessen, LOW);
}

so das ist der ganze code so weit bin ich

ok, da müssen wir uns weiter vortasten.

    if(c == '1 '){
      Serial.println("Das war eine 1");
      o();
    }

Kommt das?

Gruß Tommy

nein leider

dann stimmt was nicht.

Jetzt erst gesehen:
Du:

if(c == '1 ')

Das Lerzeichen nach der 1 muss weg:

if(c == '1')

Gruß Tommy

nein leider es geht immer noch nicht :frowning: