SIM800L GSM-Modul

SIM800L GSM-Modul

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.

Verwendete Bauteile

Aufbau des Moduls

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.

Funktionen laut Hersteller

Antenne(n)

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.

Spannungsversorgung/Stromverbrauch

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!

Anschlüsse

Anschlüsse des SIM800L GSM-Moduls
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. -

Aufbau der Schaltung

Aufbau auf dem Breadboard

Testen von AT-Befehlen

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
Ausgabe auf der seriellen Konsole
Abb.: Ausgabe auf der seriellen Konsole (CCID wurde unkenntlich gemacht)

Senden einer SMS

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());
	}
}

Empfangen einer SMS

#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());
	}
}
Ausgabe auf der seriellen Konsole
Abb.: Ausgabe auf der seriellen Konsole (CCID wurde unkenntlich gemacht)
zurück