Das SIM800L GSM/GPRS-Modul ist ein sehr kleines GSM-Modem zum Senden und Empfangen von Daten, Gesprächen und SMS-Nachrichten über das mobile Funknetz. Damit ist es gut für IoT mit höherer Reichweite geeignet, denn es funktioniert quasi überall in der Welt, wo man Funkempfang hat.
Zentrales Bauteil des Moduls ist der SIM800L GSM Mobilfunk-Chip von SimCom. Die Betriebsspannung von
3,4V-4,4V eignet sich gut für kleinere, mobile Projekte, denn man kann eine LiPo-Zelle mit 3,7V direkt
verwenden ohne Spannungsregulatoren etc.
Das Modul unterstützt Baudraten von 1200bps to 115200bps (inkl. automatischer Baudraten-Erkennung). Für den
Betrieb wird eine externe Antenne benötigt, die jedoch meist dem Modul beiliegt.
Auf der Rückseite des Moduls befindet sich der Halter für die Sim-Karte, wobei sich hierbei jede aktivierte,
2G Micro-SIM eignet.
Meist liegen dem Modul zweierlei Antennentypen bei:
Helix-Antenne: Diese Antenne wird an den NET-Pin gelötet, hat aber manchmal Probleme beim Empfang,
v.a. in geschlossenen Räumen.
3dBi GSM-Antenne mit (U.FL/IPEX)-Anschluss: kann einfach auf die Buchse des Moduls aufgesteckt werden.
Das Modul wird mit 3,4V-4,4V betrieben und benötigt in bestimmten Modi folgende Strom:
Damit alle Leistungen durchgeführt werden können, muss die Spannungsquelle einen Spitzenstrom von 2A leisten
können. Dafür eignet sich z.B. ein LiPo mit 3,7V und 1200mAh.
VCC sollte immer als letzter Kontakt in den Stromkreislauf angeschlossen werden und als
erster entfernt werden, sonst könnte das Modul zerstört werden!
SIM800L | Beschreibung | Arduino |
---|---|---|
NET | Hier wird die Helix-Antenne angeschlossen (fall keine anderweite GSM-Antenne verwendet wird) | - |
VCC | Spannungsversorgung (3,4V-4,4V) z.B. mit LiPo-Akku | - |
RST | Reset-Pin: Das Modul wird zurückgesetzt, sobald für mindestens 100ms LOW anliegt. | 7 (jeder andere freie Pin möglich) |
RXD | Receiver-Pin (Empfänger): Wird für die serielle Kommunikation verwendet. | 11 |
TXD | Transmitter-Pin (Sender): Wird für die serielle Kommunikation verwendet. | 10 |
GND | Gemeinsamer Masseanschluss | GND |
RING | Indikator-Pin beim Empfang von eingehenden Anrufen (auch für SMS konfigurierbar). Hier liegt normalerweise HIGH an und pulst für 120ms auf LOW, sobald ein Anruf eingeht. | (ungetestet) |
DTR |
(De-)Aktiviert den Sleep-Modus. HIGH: Modul geht in Sleep-Modus (serielle Kommunikation wird unterbrochen) LOW: Modul wacht wieder auf. |
(ungetestet) |
MIC+ | Hier kann der (+)-Anschluss eines externen Mikrofons angeschlossen werden. | - |
MIC- | Hier kann der (-)-Anschluss eines externen Mikrofons angeschlossen werden. | - |
SPK+ | Hier kann der (+)-Anschluss eines externen Lautsprechers angeschlossen werden. | - |
SPK- | Hier kann der (-)-Anschluss eines externen Lautsprechers angeschlossen werden. | - |
Im folgenden Sketch werden einige grundlegende AT-Befehle gesendet
und deren Ergebnis in der seriellen Konsole des Arduino ausgegeben.
Außerdem kann darüber auch die serielle Schnittstelle des SIM800L
angesprochen werden. Die serielle Kommunikation mit dem GSM-Modul
wird mit der Library
SoftwareSerial
bewerkstelligt. (Bei mir hat SoftwareSerial erst funktioniert, als ich es lokal im Ordner eingebunden habe!)
(In der seriellen Konsole des Arduino muss die Option "Sowohl NL als auch CR" muss gewählt sein!)
#include "SoftwareSerial.h"
#define PIN_RESET 7
#define PIN_TX 10
#define PIN_RX 11
SoftwareSerial mySerial(PIN_TX, PIN_RX);
void setup()
{
pinMode(PIN_RESET, OUTPUT);
digitalWrite(PIN_RESET, HIGH);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
// Once the handshake test is successful, it will back to OK
mySerial.println("AT");
updateSerial();
// Signal quality test, value range is 0-31 , 31 is the best
mySerial.println("AT+CSQ");
updateSerial();
// Read SIM information to confirm whether the SIM is plugged
mySerial.println("AT+CCID");
updateSerial();
//Check whether it has registered in the network
mySerial.println("AT+CREG?");
updateSerial();
}
void loop()
{
updateSerial();
}
void updateSerial()
{
delay(500);
while (Serial.available()) {
// Forward what Serial received to Software Serial Port
mySerial.write(Serial.read());
}
while(mySerial.available()) {
// Forward what Software Serial received to Serial Port
Serial.write(mySerial.read());
}
}
Sobald die Initialisierung im setup()-Teil durchgelaufen ist, können eigene AT-Befehle über die serielle Konsole abgeschickt werden, z.B.:
ATI | Modulname und -version |
---|---|
AT+COPS? | Prüft, in welchem mobilen Netzwerk man sich befindet |
AT+COPS=? | Listet verfügbare mobile Netzwerke in der Umgebung auf, |
AT+CBC | Prüft den Batteriestand: Die zweite Nummer ist der Batteriestand in Prozent; die dritte Nummer ist die gemessene Spannung. |
AT+GSN | Abfrage der globalen IMEI-Nummer des Moduls |
Um eine SMS-Nachricht zu verschicken wird zunächst der Befehl
AT+CMGF=1
gegeben, d.h. das Format der SMS wird
als Text eingestellt. Für eine SMS stehen zwei verschieden Formate zur Verfügung: Text-
Mode (CMGF=1) und PDU-Mode(CMGF=0). Während der Text-Mode
für Texte benutzt wird, können im PDU-Mode auch binäre Daten, z. B.
komprimierte Daten, versendet werden.
Nach dem Einstellen der Telefonnummer wird die Nachricht normalerweise
mit einem STRG-z abgeschlossen. Dies ist das Äquivalent zum dem ASCII-Code
"26 DEC" (1AHEX).
#include "SoftwareSerial.h"
#define PIN_RESET 7
#define PIN_TX 10
#define PIN_RX 11
// replace with your own PIN of the Sim card
const char SIM_PIN_NUMBER = "XXXX";
// XX = country code, e.g. "49" for Germany and xxxxxxxxxxx = phone number
const char TELEFONE_NUMBER[] = "+XXxxxxxxxxx";
SoftwareSerial mySerial(PIN_TX, PIN_RX);
void setup()
{
pinMode(PIN_RESET, OUTPUT);
digitalWrite(PIN_RESET, HIGH);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
// Once the handshake test is successful, it will back to OK
mySerial.println("AT");
updateSerial();
mySerial.println("AT+CPIN=\""+String(SIM_PIN_NUMBER)+"\"");
updateSerial();
// Configuring TEXT mode
mySerial.println("AT+CMGF=1");
updateSerial();
mySerial.println("AT+CMGS=\""+String(TELEFONE_NUMBER)+"\"");
updateSerial();
// SMS text content
mySerial.print("Hello from SIM800L GSM-Modul");
updateSerial();
mySerial.write(26);
}
void loop() {}
void updateSerial()
{
delay(200);
while (Serial.available()) {
// Forward what Serial received to Software Serial Port
mySerial.write(Serial.read());
}
while(mySerial.available()) {
// Forward what Software Serial received to Serial Port
Serial.write(mySerial.read());
}
}
#include <SoftwareSerial.h>
#define PIN_RESET 7
#define PIN_TX 10
#define PIN_RX 11
SoftwareSerial mySerial(PIN_TX, PIN_RX);
void setup()
{
pinMode(PIN_RESET, OUTPUT);
digitalWrite(PIN_RESET, HIGH);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
// Once the handshake test is successful, it will back to OK
mySerial.println("AT");
updateSerial();
// Configuring TEXT mode
mySerial.println("AT+CMGF=1");
updateSerial();
// Decides how newly arrived SMS messages should be handled
mySerial.println("AT+CNMI=1,2,0,0,0");
updateSerial();
}
void loop()
{
updateSerial();
}
void updateSerial()
{
delay(500);
while (Serial.available()) {
// Forward what Serial received to Software Serial Port
mySerial.write(Serial.read());
}
while(mySerial.available()) {
// Forward what Software Serial received to Serial Port
Serial.write(mySerial.read());
}
}
zurück