Ok Danke werde es mal ausprobieren
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);
}
// --------------------------------------------------------------------