Connected Things mit Arduino und (fast) ohne Internet

Arduino und SMS in Action

Es gibt unzählige Möglichgeiten, Geräte mit dem Internet zu verbinden. Doch oft ist es gar nicht so einfach, eine Internetverbindung mit all den Protokollen auf eher schwachbrüstigen Geräten umzusetzen. Außerdem ist Internet auch nicht immer vorhanden (wenn man z. B. von landwirtschaftlichen Anwendungsfällen ausgeht). Und manchmal ist Internet auch nicht erforderlich, wenn man nur Statusmeldungen und einfache Steuerbefehle austauschen möchte.

Arduino-kompatibles GBoard mit SIM900 GSM-Chip

Wer hiermit erste Erfahrungen sammeln möchte, für den bietet sich ein Embedded-Device als Entwicklerplattform an. Beispielsweise Arduino. Wer eher einen General-Purpose-Computer in vergleichbar kompakter Bauform nutzen möchte, kann natürlich auch auf einen Rapberry Pi zurückgreifen. Beiden fehlt jedoch ein GSM-Modem, um ganz ohne Internetverbindung Daten unabhängig von der Entfernung auszutauschen. Dies lässt sich aber in beiden Fällen leicht nachrüsten. Beim Raspberry gibt es kompatible USB-Sticks, für Arduino ist eine Auswahl an sogenannten Shields mit GSM/GPRS-Funktion erhältlich. Im letzteren Falle kann man aber auch gleich auf das GBoard zurückgreifen. Dabei handelts es sich um ein Arduino-kompatibles Board mit GSM-Modem.

Im Falle von Arduino findet sich ein hervorragender Einstieg in die Nutzung des GSM-Modems für das Internet unter http://www.cumulocity.com/guides/developers-guide/startwitharduino. Es geht aber noch einfacher, wenn man Daten nur per Kurznachricht Senden und Empfangen möchte.

Im Wesentlichen benötigt man nur eine serielle Verbindung zum GSM-Modem. Bei normaler Konfiguration gelingt das mit der standardmäßig eh vorhandenen Arduino-Bibliothek SoftwareSerial – beim GBoard sieht das dann meist so aus:

1
2
3
4
5
6
7
8
9
#include 
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
   // Open serial communications
   Serial.begin(9600); // Serial Monitor
   mySerial.begin(9600); // GSM Shield
   sendMessage();
   ...
}

Sobald man hier die richtigen Datenleitungen und Baudrate (hier 9600) gefunden und eingestellt hat, geht es an die Programmierung mit sogenannten AT-Kommandos:

1
2
3
4
5
6
7
8
9
10
11
void sendMessage() {
   // mySerial.print("AT+CPIN=1234\r"); // Do not forget your PIN
   // delay(100);
   mySerial.print("AT+CMGF=1\r"); // Because we want to send the SMS in text mode
   delay(200);
   mySerial.print("AT+CMGS=\"+49151987654321\"\r"); // Send message, be careful need to add a country code before the cellphone number
   delay(200);
   mySerial.print("Alarm, something was activated!"); // The content of the message
   delay(200);
   mySerial.print((char)26); // Finish message and use the ASCII code for ctrl+z
}

Wenn das kleine Programm nun gestartet ist, wird eine Kurznachricht gesandt. Zumindest sofern das Modem auch eingeschaltet ist. Leider muss man das meist selber per Hand erledigen oder dafür noch zusätzlichen etwas trickreicheren Programmcode verfassen (weshalb wir uns hier mit der händischen Methode begnügen).

Eine Alarmanlage wäre damit bereits einfach möglich. Aber wenn Sensordaten gesammelt und ausgewertet werden sollen, dann müssen die Kurznachrichten doch letztendlich irgendwie wieder in einen Computer. Klar, eine Gegenstelle mit einem GSM-Modem wäre eine Option. Doch eleganter und ganz ohne Hardware geht es mit der Global SMS API.