Wie kann man sich eine humane und moderne Mausefalle im Internet of Things (IoT) vorstellen? Die Frage ist leicht zu klären. Wir nehmen uns eine handelsübliche Lebendfalle aus dem Baumarkt. Daran schrauben wir einen Mikroschalter, der gedrückt wird, wenn die Falle schließt. Den Mikroschalter verbinden wir geschickt mit einer Batterie und einem ESP8266. Der ESP8266 schickt uns eine Mail, wenn eine Maus in der Falle ist – und fertig ist die IoT-Mausefalle. Damit die Maus auch in die Falle geht, braucht es natürlich noch den richtigen Köder. Man sagt zwar: „Mit Speck fängt man Mäuse“, aber mit Nussnougatcreme, Schokolade oder einer leckeren Erdnussbutter werden Sie mehr Erfolg haben. Klingt seltsam, aber die kleinen Nager stehen auf Nussnougatcreme.
Alles in allem hört sich das nach einem einfachen Plan an. Doch wenn man genauer darüber nachdenkt, merkt man, dass viele Arbeitsschritte nötig sind, bis die Falle zuschnappt. Um eine bessere Vorstellung davon zu bekommen, was wir hier bauen wollen, werfen wir einen Blick auf die Abbildung 1. Unter https://youtu.be/2H_RTiwckms ist zudem ein kleines Video zu finden, das zeigt, wie die Falle funktioniert.
Wenn wir uns etwas intensiver mit der Thematik beschäftigen, stellen wir schnell fest, dass es gar nicht so leicht ist, mit einem Mikrocontroller wie dem ESP8266 E-Mails zu verschicken. Nicht zu vergessen, dass wir eine IDE einzurichten haben, um diesen Controller zu programmieren. Schauen wir uns die Schritte einen nach dem anderen an.
Abb.1: Die Falle mit Elektronik
Schaltungsaufbau
Die Elektronik für unsere Mausefalle bauen wir auf einer kleinen Prototypplatine auf. Der Schaltplan zu unserer Mausefalle ist in Abbildung 2 zu sehen. Das zentrale Bauelement ist ein ESP8266. Dabei handelt es sich um einen Mikrocontroller, der eine WLAN-Schnittstelle mit eingebaut hat. Er ist kleiner als eine Briefmarke und kostet nur knapp vier Euro.
Abbildung 2: Der Schaltplan zu unserer Mausefalle
Der ESP8266 hat zwei Betriebsmodi: Der „Flash Mode“ ist dazu gedacht, neuen Programmcode in den Controller zu laden. Das geschieht über die Anschlüsse RXD und TXD. Im „Run Mode“ führt der Controller das geladene Programm aus. Mit den Jumpern JP1 und JP2 wird gesteuert, in welchem Modus der ESP8266 nach einem Reset starten soll. Die Widerstände R1 bis R4 sind dazu da, den Betriebsmodus einzustellen. Falls Sie eine Adapterplatine für den ESP8266 verwenden, sehen Sie sich diese sehr genau an. Oft sind Adapterplatinen schon mit einigen Widerständen bestückt. Diese Widerstände können uns das Leben erleichtern oder auch Probleme erzeugen.
Die Programme werden mithilfe eines USB-zu-Seriell-Adapters hochgeladen. Da wir ihn nur brauchen, wenn wir das Programm anpassen wollen, ist er nur auf die Platine gesteckt. Zu beachten ist, dass der Adapter auf 3,3 Volt stehen muss. Ist das nicht der Fall, wird der ESP8266 dauerhaft beschädigt.
Die LED und der Widerstand R5 sind zu Testzwecken mit auf der Platine verbaut. Es kann vorkommen, dass der ESP8266 im WLAN-Sendebetrieb große Energiemengen benötigt. Das kann die Betriebsspannung kurz einbrechen lassen. Im besten Fall würde der ESP8266 danach neu starten, im schlechtesten Fall ist er danach in einem undefiniertem Zustand. Um dieses Problem zu umgehen, ist C1 vorhanden. C1 stabilisiert die Betriebsspannung des ESP8266.
Der Kondensator C2 bildet mit dem Widerstand R6 und dem Mikroschalter eine Schaltung, die den Reset-Impuls erzeugt. Würde man den Mikroschalter direkt an den ESP8266 anschließen, würde er bei gedrücktem Mikroschalter im Reset verharren, kein Programm würde starten. Man spricht bei einer solchen Schaltung von Flankentriggerung. Dabei wird auf Zustandswechsel reagiert, nicht auf die Zustände selbst.
Learn more about IoT Conference:
Die Schaltung wird über zwei Batterien mit Spannung versorgt. Da sich der ESP8266 dauerhaft im Energiesparmodus befindet und nur aufwacht, wenn wir eine Maus gefangen haben, halten die Batterien sehr lange. Das genaue Zusammenwirken von Hardware und Programm beschreiben wir später.
Wissenswertes über Mäuse
Installation der IDE
Um Programme für den ESP8266 erstellen zu können, brauchen wir eine Entwicklungsumgebung und ein Tool, das den gebauten Code in den Mikrocontroller hochlädt. Die Arduino IDE vereint diese beiden Funktionen in einer Software. Sie ist zwar, wie der Name schon vermuten lässt, für die Entwicklung für die Arduino Boards gedacht, hat aber auch die Möglichkeit, Maschinencode für andere Prozessoren zu erzeugen. Dies geschieht über sogenannte Boardmanager. Es können Boardmanager für viele verschiedene Prozessoren nachinstalliert werden, unter anderen auch für den ESP8266.
Die Arduino IDE kann über die Homepage des Projekts heruntergeladen werden. Man wählt dort einfach die für das jeweilige Betriebssystem passende Version aus und installiert sie. Unter Linux sind folgende Schritte zur Installation durchzuführen:
cd ~ cp Downloads/arduino-1.8.5-linux64.tar.xz ~ tar -xvf arduino-1.8.5-linux64.tar.xz cd arduino-1.8.5
Sollte sich das Archiv nicht entpacken lassen, fehlt auf dem System vermutlich das Paket xz-utils. Unter Debian-Abkömmlingen wie Ubuntu lässt sich das Paket wie folgt installieren: sudo apt-get install xz-utils. Um die IDE zu starten, geben Sie ./arduino auf der Kommandozeile ein. Nachdem die IDE gestartet ist, tragen wir unter datei | voreinstellungen | zusätzliche boardverwalter -URLS folgenden URL ein: http://arduino.esp8266.com/stable/package_esp8266com_index.json. Damit veranlassen wir die Arduino IDE, die für den ESP8266 nötigen Bordmanager in die Liste der Manager aufzunehmen.
Als Nächstes starten wir die Installation des Bordmanagers für den ESP8266. Das erledigen wir unter dem Menüpunkt werkzeuge | board | bordverwalter … Suchen Sie dort einfach nach ESP8266. Nach erfolgreicher Installation kann jetzt das „Generic ESP8266 Modul“ unter werkzeuge | board ausgewählt werden. Unsere Entwicklungsumgebung ist jetzt in der Lage, Programme für den ESP8266 zu erstellen.
Jetzt müssen wir unseren aktuellen Benutzer noch dazu berechtigen, dass er auf die serielle Schnittstelle zuzugreifen darf. Dazu müssen wir ihn in die Gruppe dailout aufnehmen. Ein Reboot danach ist nicht unbedingt nötig, es würde auch ein erneuter Log-in des aktuellen Users reichen. Ein Reboot hat aber unbestritten den Vorteil, dass sich das System danach in einem 100 % konsistenten Zustand befindet:
sudo usermod -a -G dialout $USER sudo reboot
Damit Sie Ihre selbst geschriebenen Programme in den ESP8266 hochladen können, müssen Sie noch den USB-nach-Seriell-Adapter mit einen freien USB-Anschluss Ihres PCs verbinden.
Erstes kleines Testprogramm
Unser erstes Testprogramm (Listing 1) dient dazu festzustellen, ob wir alles korrekt zusammengelötet haben. Es lässt die LED, die an der GPIO4 angeschlossen ist, blinken. Um es hochzuladen und zu starten, genügt es, den ESP8266 in den Flash-Modus zu bringen: DIP-Schalter auf ON und Mikrotaster drücken. Der Mikrotaster resettet den ESP8266, und er startet in dem über die DIP-Schalter gewählten Modus. Jetzt können wir in der IDE den Button hochladen drücken. Nach einigen Sekunden ist das Programm in den ESP8266 geladen und wird automatisch gestartet. Sollte das Hochladen nicht auf Anhieb klappen, kann das viele Gründe haben. Überprüfen Sie bitte zuerst die Hardware: Ist wirklich alles korrekt verlötet? Haben Sie den richtigen Bordmanager ausgewählt (Generic-ESP8266-Modul)? Ist die Übertragungsgeschwindigkeit auf 115 200 eingestellt? Oft ist auch einfach ein falscher Port gewählt, man muss auf jeden Fall einen ttyusb-Port verwenden, auf keinen Fall einen com-Port. Falls Sie den ESP8266 mit einer Adapterplatine betreiben, schauen Sie sich diese genau an. Oft sind Adapterplatinen bereits mit Widerständen und Brücken bestückt. Es kann sein, dass diese für uns nicht passen. Doch das waren auch schon alle üblichen Fehler, die auftreten können.
void setup() { pinMode(4, OUTPUT); } void loop() { digitalWrite(4, HIGH); delay(1000); digitalWrite(4, LOW); delay(1000); }
Falls Sie das Beispielprogramm nicht abtippen möchten, schauen Sie in der IDE unter datei | 01.beispiele | basics | blink. Dort ist unser Quellcode zu finden. Generell sind die Beispielprogramme, die die IDE mitbringt, auf jeden Fall immer ein guter Einstieg für eigene Programme. Wenn alles soweit funktioniert, können wir uns dem E-Mail Versand widmen.
Programm für den E-Mail-Versand
Damit wir eine E-Mail bekommen, sobald wir eine Maus gefangen haben, müssen wir jetzt noch einiges erledigen. Um Zeit zu sparen, verwenden wir eine schon fertige Bibliothek für den E-Mail-Versand. Sie kann frei unter [https://github.com/gpepe/esp8266-sendemail] heruntergeladen werden. Nach dem Herunterladen entpacken wir das Zipfile in den libraries-Ordern der Arduino IDE. Wenn wir die IDE jetzt starten, würde sie eine fehlerhafte Bibliothek melden. Um das zu verhindern, kopieren wir die zwei Dateien sendemail.h und sendemail.cpp direkt in den Ordner esp8266-sendemail-master und löschen danach den Ordner src und die README.md-Datei. Die Arduino IDE kann jetzt die Bibliothek esp8266-sendemail-master verwenden.
Das Programm für den E-Mailversand ist etwas untypisch aufgebaut. Die Funktion loop(), in der sich normalerweise die Programme befinden, ist komplett leer. Das komplette Programm ist in der setup()-Funktion untergebracht. Am Ende der setup()-Funktion befindet sich das Kommando, um den ESP8266 schlafen zu legen. Aufgeweckt wird er, wenn die Reset-Taste (Maus in der Falle) gedrückt wird. Wenn der ESP8266 erwacht, startet er zuerst die setup()-Funktion, und so schließt sich der Kreis. Eigentlich ist der ESP8266 immer am Schlafen, außer es ist eine Maus in der Falle. Dann wird er kurz wach, schickt seine Mail und legt sich wieder zur Ruhe.
Die ersten Zeilen im Programm stellen eine Verbindung mit dem lokalem WLAN her. Wenn das funktioniert hat, wird direkt die E-Mail verschickt. Sie müssen natürlich Ihre WLAN-Parameter eintragen und auch die Parameter für den Mail-Versand anpassen. Die Parameter für den E-Mail-Versand finden sich mehr oder weniger gut versteckt auf der Homepage Ihres E-Mail Providers.
Sehen wir uns nun die zwei Codezeilen für den E-Mail-Versand etwas genauer an. Die erste Zeile erzeugt ein Objekt von Typ SendEmail. Diesem werden alle Parameter übergeben, die benötigt werden, um sich mit einen SMTP Server zu verbinden. In Tabelle 1 sind die Parameter der Reihe nach beschrieben.
Parameter | Beschreibung |
SMTP Host | Ist von E-Mail Provider zu erfragen. z.B. smtp.gmail.com. |
SMTP Port | Oft 25, kann aber auch einen anderen Wert haben. Bei gmail.com: 465. |
SMTP Login | Ist von E-Mail Provider zu erfragen, oft die komplette E-Mail. |
SMTP Pass | So gut wie immer start123 ;-). Bitte sichere Passworte verwenden! |
TIMEOUT | Maximale Wartezeit für Netzwerkoperationen. Ist diese zu knapp bemessen, gibt es einen Timeout, bevor die Mail versendet wurde. |
SSL | Muss true sein, um SSL zu aktivieren. |
Tabelle 1: Parameter des SendEmail-Objektes
Das SendEmail-Objekt hat eine Methode send(). Mit dieser Methode können E-Mails versendet werden. Die Parameter der send()-Methode sind in Tabelle 2 beschrieben.
Parameter | Beschreibung |
send-from | Ihre E-Mail-Adresse |
send-to | Die E-Mail-Adresse des Empfängers |
subject | Der Betreff der E-Mail |
Mail-Text | Der Inhalt der E-Mail |
Tabelle 2: Parameter der „send()“–Methode
Jetzt kommt der kniffelige Part. Jeder E-Mail Provider verwendet eigene Parameter, die zuerst einmal bekannt sein müssen. Der ESP8266 kann nicht, wie ein moderner E-Mail-Client, die Parameter erraten. Sie können sich sicherlich vorstellen, dass hier der Teufel im Detail steckt. Es ist daher sehr wichtig, die Parameter gewissenhaft einzutragen. Ein anderes Problem ist die allgegenwärtige Spam-Flut. Die E-Mail Provider müssen sich immer wieder neue Verfahren einfallen lassen, um ihre Systeme zu sichern. Aus diesem Grund kann es sich auch teilweise sehr schwierig gestalten, alle Parameter richtig zu setzen, um eine E-Mail versenden zu können. Daher verwenden wir hier exemplarisch die Parameter für einen der bekannteren Provider. Gmail.
SendEmail e("smtp.gmail.com", 465, "<Your-Email>", "<Your-Pass>", 5000, true); e.send("<<Your-Email>>", "<<send-to>>", "<Subject>", "<Mail-Text>");
Bei Gmail kommen noch einige weitere Hürden hinzu. Die E-Mail-Adressen innerhalb der send-Anweisung müssen in spitzen Klammern stehen <>. Daher die etwas sonderbare Darstellung in der Codezeile oben. Zusätzlich muss noch der Log-in für „weniger sichere Apps“ aktiviert werden. Um das zu erreichen, folgen Sie den Anweisungen in der Warn-Mail, die Sie von Gmail bekommen. Vermutlich verwenden auch andere Provider ähnliche Mechanismen, daher sollten Sie nicht so schnell aufgeben, wenn es auf Anhieb nicht klappt.
Da hier leider ziemlich viel schief gehen kann, möchte ich noch ein paar Tipps zum Debuggen von Mikrocontroller-Programmen mit auf den Weg geben. Sie haben sich sicherlich schon gewundert, was die Serial-Befehle in unserem Programm machen. Diese Befehle schreiben Ausgaben auf das Serielle Port des ESP8266. Um sie lesen zu können, klicken Sie in der Arduino IDE auf das Icon serieller monitor (Lupe oben rechts). Machen Sie das aber nicht, während Sie gerade dabei sind, Programme hochzuladen, das wird schief gehen. Alle Ausgaben des Programms sind nun im Seriellen Monitor zu sehen, sie sind bei der Fehlersuche oft essenziell.
Leider sehen wir hier nur, ob die Verbindung zu unseren WLAN geklappt hat. Wenn sie den Verdacht haben, es könnte etwas mit dem Mailversand nicht stimmen, müssen Sie die SendEmail-Bibliothek in den Debug-Modus bringen. Das erreichen Sie, indem Sie im Ordner ~/arduino-1.8.5/libraries/esp8266-sendemail-master die Datei sendmail.cpp um die Codezeile #define DEBUG_EMAIL_PORT Serial erweitern. Die Codezeile muss am Anfang der Datei eingefügt werden. Wenn Sie jetzt das Programm neu bauen und wieder hochladen, bekommen Sie den kompletten Debugoutput der Bibliothek zu sehen. Damit kommt man den Fehlern, die beim E-Mail-Versand auftreten können, schnell auf die Schliche.
Den Quellcode für unseren E-Mail-Versand können Sie in Listing 2 nachvollziehen.
Listing 2: E-Mail-Versand
#include #include const char* ssid = ""; const char* pass = ""; void setup() { Serial.begin(115200); Serial.println("\r\n") ; WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Verbunden mit "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); SendEmail e("",, "", "", 5000, true); e.send("", "", "", ""); delay(1500); ESP.deepSleep(0); } void loop() { }
Fazit
Das Bauen der hier gezeigten Mausefalle ist zugegebenermaßen zeitaufwändiger als das Aufstellen einer normalen Falle. Sie kann aber den Stress für die gefangenen Tiere erheblich mindern, weil man die kleinen Quälgeister schnell wieder in Feld oder Wald aussetzen kann. Außerdem ist die Mausfalle für Kinder und Haustiere ungefährlich, kommt ohne Gift aus und fängt die Maus auf eine hygienische Art und Weise. Nebenbei lernen wir noch, wie die Energiesparfunktion des ESP8266 funktioniert und wie man mit einem Mikrocontroller E-Mails versenden kann. Von hier ist es nur noch ein kleiner Schritt zum eigenen Amazon Dash Button. Ihnen fallen sicher noch unendlich viele Anwendungen für dieses Basisprogramm ein. Daher wünsche ich viel Spaß bei eigenen Experimenten mit den ESP8266!
IoT Conference 2020 – Program
● Deep Learning for IoT Devices
● Real Time Analytics on the Edge and in the Cloud with Azure IoT