GSM Modul

Ok Danke werde es mal ausprobieren

Wieso stellst du die Frage erneut.

Ich hatte dir doch hier schon geantwortet.

Die vorherige Frage war nicht deutlich formuliert. Hab mir noch eine andere möglichkeit überlegt man könnte die Nummer einfach in einer am Arduino verbundenen SD-Karte speichern, jedoch muss das Gsm modul bzw arduino die Numer erkennen welche anruft.

PAXON999:
Die vorherige Frage war nicht deutlich formuliert. Hab mir noch eine andere möglichkeit überlegt man könnte die Nummer einfach in einer am Arduino verbundenen SD-Karte speichern, jedoch muss das Gsm modul bzw arduino die Numer erkennen welche anruft.

Ich habe leider lange nichts mehr mit dem SIM800 gemacht, aber das sollte damit und einem Arduino funktionieren.
Sieh dir mal das Datenblatt bzw. die Beschreibung zum SIM800 an.

ok danke

Hallo,

ich kam erst heute dazu mal was zu probieren.
Das SIM800L reagiert auf einen Anruf mit der Ausgabe von "RING´".
Wenn vorher mit AT+CLIP=1 CLIP eingeschaltet wird kommt danach noch +CLIP: "+49171xxxxxxx",145,"",0,"",0 (Statt xxx steht die anrufende Nummer).
Geht also.

Hallo,

ich habe mal was probiert, ist aus einem anderen Sketch von mir, es könnten noch Variablen definiert sein die jetzt unnötig sind....
Läuft auf einem NODEMCU mit einem SIM800L. Ich hoffe ich habe genügend Kommentare drin um es einigermaßen zu verstehen.

#include <SoftwareSerial.h>

char           OKrn[] = "OK\r\n";                                    // Default für GSM_Antwort
char           * ptr;
char           buffer[1000];                                         // Ergebnis vom GSM-Port
char           delimiter[5] = "123";                                 // Trennzeichen im Buffer

int            CallNr = 0;                                               // wie viele Rufe

const String   Version  = "GSM-Anruf. ",
               Ver      = "05.11.18",
               Compiled = String(__DATE__) + ", " + String(  __TIME__) ;

String         sRSSI    = "",
               sBetreiber = "",
               sNummer    = "";

#define        GSM_RX      D2
#define        GSM_TX      D7

SoftwareSerial    GSM_Serial(GSM_RX, GSM_TX);                        // RX/TX

// Funktionen deklarieren --------------------------------------------------------------------
void    setup();
void    loop();
bool    GSM_Antwort(int nDelay = 100, char* term = OKrn);            // GSM Status ausgeben
int     GSM_Init();
// --------------------------------------------------------------------
void setup()
{
  Serial.begin(74880);
  GSM_Serial.begin(19200);                                           // GSM-Port

  Serial.println("\n" + Version + Ver + " (" + Compiled + ")");
  Serial.println("");

  GSM_Init();                                                       // SIM800 initialisieren, Return ERRORlevel
}
// --------------------------------------------------------------------
void loop()
{
  ESP.wdtFeed();                                           // Watchdog resetten
  delay(10);

  if (GSM_Antwort(5000, "\"\""))                           // Bufferende ist 2 x "
  {
    strcpy(delimiter, "\"");                               // Rufnummer im Buffer suchen
    ptr = strtok(buffer, delimiter);
    int nX = 0;
    while (ptr != NULL)
    {
      nX++;
      switch (nX)
      {
        case 2: sNummer = ptr; break;                     // Rufnummer
      }
      ptr = strtok(NULL, delimiter);                      // nächsten Abschnitt erstellen
    }

    Serial.println(sNummer);
    delay(5000);                                          // damit ein Rufton durchkommt
    GSM_Serial.println("AT H");                           // wieder auflegen
    if (GSM_Antwort(5000)) Serial.println("aufgelegt...");
  }
}
// --------------------------------------------------------------------
int GSM_Init()
{
  int           nX,
                iRSSI     = 0;
  boolean       flag      = 1;
  unsigned long StartZeit = millis();

  Serial.print("Suche GSM-Modul.....");

  while (millis() - StartZeit < 10000)                              // Timeout 10 Sekunden
  {
    GSM_Serial.println("AT");                                       // hallo SIM800
    if (GSM_Antwort(1000))
    {
      flag = 0;                                                     // dann gut
      Serial.println("gefunden");
      break;
    }
  }
  if (flag)
  {
    Serial.println(" nicht gefunden...");
    return (1);                                                     // Fehler GPS-Modul
  }
  Serial.print("Suche Netz.");
  flag = 1;
  StartZeit       = millis();
  nX = 0;
  while (millis() - StartZeit < 1 * 60000)                          // Timeout 60 Sekunden
  {
    GSM_Serial.println("AT+CGATT?");                                // GPRS-Netz da?
    if (GSM_Antwort(1000, "CGATT: 1"))
    {
      flag = 0;                                                     // dann gut
      Serial.println("gefunden");
      break;                                                        // fertig
    }
    Serial.print(".");
    nX++;
    nX++;
    yield();
    delay(2000);                                                    // Pause
  }

  if (flag)
  {
    return (2);                                                     // Fehler kein Netz
  }
  Serial.print("Suche Provider......");

  while (true)
  {
    GSM_Serial.println("AT+COPS?") ;                                // aktueller Netzbetreiber
    GSM_Antwort(15000);
    if (strstr(buffer, "COPS")) break;                              // IP zwischen "xxx.xxx.xxx.xxx"
    yield();
  }
  strcpy(delimiter, "\"");
  ptr = strtok(buffer, delimiter);
  nX = 0;
  while (ptr != NULL)
  {
    nX++;
    switch (nX)
    {
      case 2: sBetreiber = ptr; Serial.print(sBetreiber + ", "); break;
    }
    ptr = strtok(NULL, delimiter);                                  // nächsten Abschnitt erstellen
  }

  GSM_Serial.println("AT + CSQ") ;                                  // aktueller RSSI
  if (GSM_Antwort(5000))
  {
    iRSSI = atoi(buffer + 16);
    iRSSI = iRSSI * 2 - 114;
    sRSSI = String(iRSSI);
    Serial.println("RSSI: " + sRSSI + " dBm");
  }
  GSM_Serial.println("AT + CLIP = 1") ;                                  // aktueller RSSI
  GSM_Antwort(5000, "OK");

  Serial.println();

  return (0);
}
// --------------------------------------------------------------------
// Antwort vom GSM-Port der SIM800, in term wird der zu suchende Wert
// und in nDelay der Timeout dafür übergeben, Return ist true wenn term gefunden.
// In der globalen Variablen buffer steht der vom Port kommende Wert drin.
//
bool GSM_Antwort(int nDelay, char* term)
{
  bool Flag = false;

  unsigned long t    = millis();
  int           i    = 0,
                Size = 2000,
                len  = strlen(term);

  while ((millis() < t + nDelay) && (i < Size))                 // Timeout und Bufferlänge ok
  {
    yield();
    if (GSM_Serial.available() > 0)                             // Schnittstelle da?
    {
      buffer[i++] = GSM_Serial.read();                          // Port lesen
      if (i >= len)
      {
        if (strncmp(buffer + i - len, term, len) == 0)          // term im Buffer drin ?
        {
          buffer[i++] = 0;
          Flag = true;
          break;
        }
      }
    }
  }
  delay(100);
  while (GSM_Serial.available() > 0)
  {
    yield();
    GSM_Serial.read();                                           // Port ganz leeren
  }
  return (Flag);
}
// --------------------------------------------------------------------