mit SMS Relais schalten

Hallo,

ich habe einen Arduino Uno mit dem Ithead GSM Modul.

Ich würde gerne per SMS Relais schalten, z. B. mit einem T als SMS-Text Relais1 und mit einem G Relais2.

Folgenden Sketch benutze ich:

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

boolean started=false;
char smsbuffer[1];
char n;
char pos;
char error;
int Relais1=4;
int Relais2=5;
char Stefan = "+49175XXXXXXX";

void setup() 
{
  pinMode(Relais1, OUTPUT);
  digitalWrite(Relais1, HIGH); 
  pinMode(Relais2, OUTPUT);
  digitalWrite(Relais2, HIGH); 
 
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
 
  if (gsm.begin(2400))
  {
    Serial.println("\nstatus=READY");
    started=true;  
  }
    
  if(started)
  {
    for(int i=1; i<21; i++)
   {
     Serial.print("Loesche ");
     Serial.println(word(i));
     sms.DeleteSMS(i);
   }
  }
};

void loop() 
{
  if (started)
  {
    pos=sms.IsSMSPresent(SMS_UNREAD);
    if (pos) 
    {
      Serial.println("SMS empfangen");
      error = sms.GetSMS(pos, n, smsbuffer, 1);
      Serial.print("Pos: ");
      Serial.println(word(pos));
      Serial.print("Nummer: ");
      Serial.println(n);
      Serial.print("Text: ");
      Serial.println(smsbuffer);

      if (strcmp(n,Stefan)==0) 
      {
        Serial.println("SMS auth.");
        if (strcmp(smsbuffer,"0054")==0 || strcmp(smsbuffer,"0074")==0)
        {
          Serial.println("Tuer");
          digitalWrite(Relais1, LOW);  
          delay(3000);      
          digitalWrite(Relais1, HIGH);    
        }
        if (strcmp(smsbuffer,"0047")==0 || strcmp(smsbuffer,"0067")==0)
        {
          Serial.println("Garage");
          digitalWrite(Relais2, LOW);  
          delay(3000);      
          digitalWrite(Relais2, HIGH);    
        }
      }
      delay(1000);
//      Serial.println("Loesche SMS");
//      error=sms.DeleteSMS(pos);
//      Serial.print("Erg.: ");
//      Serial.println(word(error));
    } 
    delay(1000);
  }  
};

Zuerst wird das GSM-Modul initialisiert und die gespeicherten SMS auf der Karte gelöscht. Das funktioniert soweit. (nur zu Info: SMS senden geht, also das Modul ist in Ordnung)

Dann soll die Absenderhandynummer geprüft werden.
Anschließend der SMS-Text ausgewertet und entsprechend entweder Relais 1 oder 2 für 3 Sekunden eingeschaltet werden.

Wenn ich den Sketch mit dem Serial-Monitor verfolge, wird nicht einmal meine Handy-Nummer erkannt, geweige den der Text, so dass ein Relais schaltet. Die SMS kommt an, sieht man im Monitor.

Ich hab meine Handynummer als Konstante gespeichert, sowie der Monitor sie ausgibt.
Des weiteren bin ich mir nicht sicher, das der gesendete Buchstabe als Hex-Code ankommt.

Hat jemand eine Idee, was ich falsch gemacht habe?

Danke.

Gruß

Stefan

Mach deinen smsbuffer mal größer als nur ein Byte und fordere mal mehr als nur ein Byte.

Du forderst nur ein einziges Zeichen an und weiter unten willst du wissen, ob dieses eine Zeichen gleich deiner Zeichenkette ist. Das ist schon einmal eines der grundlegendes Problem.

Das nächste was auf jeden Fall jeder der hier Postet als erstes kritisieren wird, sind deine Delays :smiley:
schau dir mal das “Blink without delay” Beispiel aus der IDE an.

  char Stefan = "+49175XXXXXXX";

Dazu sagt mein Compiler: "invalid conversion from 'const char*' to 'char' [-fpermissive]"

char ist nur ein Byte, also ein Zeichen lang. Da paßt Deine Telefonnummer nicht rein.

"invalid conversion from 'const char*' to 'char' [-fpermissive]"

Diese Konversion willst ja auch nicht, denn du meinst eigentlich

const char* Stefan= "+4917512345467";

Wobei du evtl. woanders Gemecker kriegst, weil bei üblichen Arduino-Libraries gern mal dasconstvergessen wird. char* Stefan= "+4917512345467"; ... geht jedenfalls ohne Gemecker

(Die Variablechar n;ist übrigens Teil 2 deines Problems...)

Hallo,

erstmalDanke für die Antworten.

Ich habe den Sketch jetzt umgeändert:

boolean started=false;
char* smsbuffer[160];
char* n;
char pos;
char error;
int Relais1=4;
int Relais2=5;
char* Stefan = "+49175123456";

Leider findet der Compiler die Routine mit dem GetSMS nicht mehr:

no matching function for call to 'SMSGSM::GetSMS(char&, char*&, char* [160], int)'

Stimmen die Variablen jetzt nicht mehr überein?

Gruß

Stefan

Warum deklarierst du nur ein Zeiger auf den smsbuffer und kein c string? char* n das gleiche.

no matching function for call to 'SMSGSM::GetSMS(char&, char*&, char* [160], int)'

Stimmen die Variablen jetzt nicht mehr überein?

So rufst du eine Funktion auf, die es so aber nicht gibt.

z.B. char* smsbuffer[160]; scheint mir fragwürdig, aber das kannst nur du wissen, weil du die sms.hDatei hast.

Ausserdem sollte eine einigermassen brauchbare Library wenn schon keine Doku, so doch zumindest ein Beispiel für die Verwendung haben.

char* smsbuffer[160]; reserviert doch 160 Zeiger, oder?

Hab ich auch erst gedacht, ist aber falsch.

(*smsbuffer) ist ein char [160] smsbuffer ist also ein Zeiger darauf ( oder der Anfang eines Arrays aus solchen Zeigern )

Könnte gehen, aber ohne die Library ist das geraten. Eine Funktion mit der Deklarationvoid  GetSMS(char&, char*&, char* [160], int);  könnte Sinn machen, aber die bietet seine Library ja wohl offensichtlich nicht.

Ja diese ganzen Geschichten mit den Variablen-Typen in C++ ist schon ziehmlich krass xD.

Mach aus "char* smsbuffer[160]" mal "char smsbuffer[160]"

Das reicht allerdings noch nicht du müsstet in deiner Loop unten dieser Get-Funktion von der GSM Bib anstatt 1 Zeichen die Gesamtanzahl an Zeichen, die die SMS die du verschickst hat, übergeben.

Wenn ich die Funktionsweise der Funktion richtig interpretiere

stefan681: ich habe einen Arduino Uno mit dem Ithead GSM Modul.

Auf der itead seite zu deren SIM900 gibt es einen Link zu https://github.com/itead/ITEADLIB_Arduino_SIMCom/blob/master/SIM900.h

Mit einer Funktion boolean readSMS(char* msg, int msglength, char* number, int nlength);

Und einem trivialen Example dazu https://github.com/itead/ITEADLIB_Arduino_SIMCom/blob/master/examples/GSM_GPRSLibrary_SMS/GSM_GPRSLibrary_SMS.ino

Hast du zu deinem sketch auch ein funktionierendes Beispielcode? Dann sollte es doch ein Klacks sein, statt diesem Beispiel:

char smsbuffer[160];
char n[20];

void setup() {...}

void loop(){
          //Read if there are messages on SIM card and print them.
          if(gsm.readSMS(smsbuffer, 160, n, 20)) {
               Serial.println(n);
               Serial.println(smsbuffer);
          }
          delay(1000);
}

...dein Beispiel ans laufen zu kriegen. Und dann anstelle der Serial.println() Funktionen Telefon-Nummer und Nachricht per strcmp mit etwas erwartetem zu vergleichen und dann die Relais anzusteuern?