-
0215-5 HB_Titelei_Layout 1 19.04.
-
10215-5 HB_Titelei_Layout 1 19.04.
-
INHALT Bevor es losgehtt ..................................................................................................................... 4 Das IoT-WiFi-Board (NanoESP) ............................................................................................. 5 Bauteile im Lernpaket............................................................................................................ t 9 1 Das Modul kennenlernen ..................................................................................
-
BEVOR ES LOSGEHT Beim ersten Anschließen des IoT-WiFi-Boards (im Folgenden auch NanoESP genannt) kann es vorkommen, dass der Computer den erforderlichen Treiber für den USB-to-Serial-Wandler nicht automatisch findet. Ist dies der Fall, sollten Sie den Treiber von der Seite www.iot.fkainka.de/driver herunterladen und manuell installieren. In der Arduino-Software können Sie dann den Port und als Board Arduino Nano (Prozessor: Atmega328) auswählen. Danach sollte der Controller voll einsatzbereit sein.
-
Ich habe mit den Arduino-IDE-Versionen 1.6.5 und 1.6.6 gearbeitet. Ältere Versionen können Probleme verursachen. Die aktuelle Arduino-IDE-Version finden Sie auf der Internetseite www.arduino.cc. Bei allen Schwierigkeiten oder Problemen mit dem Board oder dem Lernpaket können Sie jederzeit auf der Interseite www.iot.fkainka.de Hilfe finden. Auf dieser Seite finden Sie außerdem ein Forum, neue Nutzerprojekte und auch alle hier vorgestellten Programme in der neuesten Version.
-
| Bevor es losgeht Diese beiden Komponenten kommunizieren über eine per Software generierte serielle Schnittstelle miteinander. Der NanoESP auf dem Steckboard Das Pinlayout des Boards Auf dem Board gibt es viele verschiedene Elemente, wie z. B. die Pins, von denen einige eine besondere Funktion haben, oder auch die LEDs, deren Funktionen nicht immer auf den ersten Blick ersichtlich sind.
-
| Das IoT-WiFi-Board (NanoESP) Das WLAN-Modul wird über sogenannte AT-Kommandos gesteuert. Dazu ist der Arduino-Teil des Boards über die Pins 11 und 12 mit dem WLAN-Modul verbunden. Eine kleine Schaltung wandelt die 5-V-Pegel in kompatible 3,3-V-Pegel um. Die Pins 11 und 12 sollten Sie also in eigenen Projekten nicht benutzen. 7 Die wichtigsten Pins und Bezeichnungen des Boards Weitere wichtige Hardwareeigenschaften des Boards finden Sie in der unteren Tabelle kurz aufgelistet.
-
| Bevor es losgeht Technische Daten Mikrocontroller: Flash-Speicher: SRAM: EEPROM: Taktrate: I/O-Pins: ATmega328 32 kB (davon 0,5 kB für den Bootloader) 2 kB 1 kB 16 MHz 20 (davon 2 für die Kommunikation mit dem WLAN-Modul) davon PWM: 6 davon analoge Eingänge: 6 USB-to-Serial-Chip: CH340G Betriebsspannung: 5V Empfohlene Eingangsspannung: 7 – 12 V Maximaler Strom pro I/O-Pin: 40 mA Belastbarkeit des 3,3-V-Ausgangs: 50 mA WLAN-Modul: SPI-Flash Betriebsspannung: WLAN-Standards: WLAN-Modi: Firm
-
| Das IoT-WiFi-Board (NanoESP) 9 BAUTEILE IM LERNPAKET Nachfolgend finden Sie eine Übersicht über die im Lernpaket enthaltenen Bauteile.
-
1 DAS MODUL KENNENLERNEN In diesem ersten Kapitel geht es um die grundsätzlichen Funktionen des WLAN-Moduls. Das Modul wird über sogenannte AT-Kommandos gesteuert. Alle hier verwendeten Beispielprogramme sowie Hilfe und weitere Informationen finden Sie übrigens unter www.iot.fkainka.de Am einfachsten ist es, Sie laden sich das komplette Zip-Verzeichnis herunter und kopieren den entpackten Ordner komplett in Ihren Sketchordner.
-
Jetzt können Sie schon eine Meldung sehen, nämlich AT und ein paar Zeilen darunter OK. Das Kommando AT wurde vom Mikrocontroller an das ESP-Modul gesendet und das Modul hat mit OK geantwortet. Hieran können Sie erkennen, dass das WLAN-Modul funktioniert und einsatzbereit ist. Terminal-Einstellungen: CR und NL und eine Baudrate von 19200 1.1.1 | Basis-Befehle Einige grundlegende Befehle des Moduls können Sie nun testen, indem Sie einfach das Kommando eintippen und mit [Enter] an das Modul senden.
-
1 | Das Modul kennenlernen 1 können Sie das Modul zurücksetzen. Sie sehen dann im Terminal zunächst ein paar unleserliche Zeichen und am Ende ready als Zeichen, dass das Modul nun bereit ist. Ein weiterer Befehl lautet: ATE0 Mit ihm ist es möglich, das sogenannte Echo des Moduls zu deaktivieren. Das bedeutet, dass Sie das gesendete Kommando nicht zurückgesendet bekommen, sondern nur die Antwort. Wenn Sie beispielsweise ATT senden, kommt nicht erst ATT und dann OK, sondern nur OK zurück.
-
1.1 | Grundlegende AT-Befehle 13 1.1.2 | WLAN-Befehle Mit den folgenden WLAN-Kommandos können Sie die WLAN-Eigenschaften des Moduls verändern. Bei manchen Befehlen können Sie nicht nur einen Zustand festlegen, sondern auch den aktuellen Zustand erfragen. Dies geschieht, indem Sie direkt hinter dem Befehl ein Fragezeichen einfügen, z. B. AT+CWMODE? Als Rückgabewert kommt im Regelfall +CWMODE=2 gefolgt von OK.
-
1 | Das Modul kennenlernen 1 die Channel ID (beliebiger Wert zwischen 1 und 13), und der Verschlüsselungsmodus (Wert von 0-4). Eine mögliche Einstellung wäre: AT+CWSAP="MyNanoESP","MyPassword",5,3 Nach einer kurzen Zeit erscheint OK K als Bestätigung. Sollte ein ERROR erscheinen, prüfen Sie noch einmal Ihre Eingaben, vor allem die Anführungszeichen. Sollte dennoch ein ERROR erscheinen, prüfen Sie, ob der CWMODE wirklich 2 ist.
-
1.1 | Grundlegende AT-Befehle 15 AT+CWMODE=1 – das Modul im Stationsmodus Mit dem Befehl AT+CWMODE=1 setzen Sie das Modul in den Stationsmodus. Dieser Modus ermöglicht es Ihnen, eine Verbindung zu Ihrem WLAN-Router aufzubauen. Dadurch ist das Modul auch mit dem Internet verbunden und hat viel mehr Möglichkeiten. Zuvor können Sie aber mit dem Befehl AT+CWLAP alle Netzwerke in Reichweite auflisten lassen und somit überprüfen, ob Ihr Netzwerk im Empfangsradius ist.
-
1 | Das Modul kennenlernen 1 Das Board baut eine Verbindung zu einem zweiten NanoESP auf. AT+CWMODE=3 – der duale Modus Der dritte mögliche Modus der WLAN-Einstellung ist der duale Modus. Er ermöglicht, wie der Name bereits vermuten lässt, das Betreiben des Moduls sowohl im Stations- als auch im AP-Modus. Das bedeutet, es können Geräte sowohl eine direkte WLAN-Verbindung mit dem Modul aufbauen oder das Modul über den Router als Zwischenstation erreichen. Ein praktischer Modus, z. B.
-
1.2 | Automatische Konfiguration 17 1.2 | Automatische Konfiguration Die grundlegenden Befehle konnten Sie bereits manuell testen. In diesem Kapitel soll nun die Frage geklärt werden, wie diese Befehle automatisch über den Controller bedient werden können. Außerdem lernen Sie einen weiteren Befehl kennen, mit dem Sie testen können, ob ein PC im Netzwerk oder ein Server im Internet erreichbar ist. In diesem Beispiel wird nämlich der Google-Server angepingt.
-
1 | Das Modul kennenlernen 1 Überprüfung, ob in der Antwort ERROR enthalten ist Genau wie bei der normalen seriellen Schnittstelle können dann Bytes oder ganze Zeilen mit den Befehlen esp8266.printt oder esp8266.println übertragen werden. Besonders praktisch sind auch die Befehle esp8266. find und esp8266.findUntil, mit denen ein ankommender Stream auf bestimmte Zeichenketten überprüft werden kann. Dadurch ist es recht einfach, die passende Antwort des Moduls abzufangen.
-
1.2 | Automatische Konfiguration 19 empfangenen String zurückgibt. Der String sollte aber nicht zu lang sein, denn der Buffer von SoftwareSerial kann überlaufen. 001 String sendCom(String command) 002 { 003 esp8266.println(command); 004 return esp8266.readString(); 005 } Fehlersuche Beim Entwickeln von Programmen kommt es oft zu Fehlern und Komplikationen.
-
1 | Das Modul kennenlernen 1 005 if (esp8266.available()) 006 Serial.write(esp8266.read()); 007 if (Serial.available()) 008 esp8266.write(Serial.read()); 009 } 010 } Konfiguration Um die Programme allgemein übersichtlicher zu gestalten, wurden die meisten Einstellungen ebenfalls in eigene Funktionen ausgelagert, allen voran die Funktion espConfig, in der die wichtigsten Parameter für das jeweilige Programm gesetzt werden.
-
1.2 | Automatische Konfiguration 21 gesamte Konfiguration ist gescheitert. Der erste AT-Befehl, der so auf Erfolg überprüft wird, ist der Reset-Befehl, der fast immer zu Beginn des Programms ausgeführt wird, um sicherzugehen, dass vorherige Versuche nicht noch das Modul beanspruchen. Es kann allerdings bis zu fünf Sekunden dauern, bis das Modul die Meldung ready zurücksendet. Deswegen wird kurz vor der sendCom()-Funktion der Timeout für esp8266. findUtil hochgesetzt.
-
1 | Das Modul kennenlernen 1 001 boolean configAP() 002 { 003 boolean success = true; 004 005 success &= (sendCom("AT+CWMODE=2", "OK")); 006 success &= (sendCom("AT+CWSAP=\"NanoESP\",\"\",5,0", "OK")); 007 008 return success; 009 } Die Funktion configAP() wird in diesem Beispiel nicht aufgerufen, soll aber dennoch kurz behandelt werden. Sie stellt sozusagen das Gegenstück zu der configStation()-Funktion dar, denn hier wird das Modul als Access Point eingestellt.
-
1.3 | Erkennung eines Netzwerks 23 023 { 024 //Start serial Debug Mode - Type Commandos over serial Monitor 025 serialDebug(); 026 } Die wichtigsten Funktionen, die Sie in fast jedem Programm finden werden, sind damit behandelt. In den bekannten Arduino-Funktionen setup() und loop() werden diese Funktionen nun verwendet. Zunächst werden allerdings die beiden seriellen Schnittstellen mit 19200 Baud initialisiert. Erst dann wird die Funktion espConfig() aufgerufen.
-
1 | Das Modul kennenlernen 1 Anschluss des Piezo-Lautsprechers Programmdatei: P03_SSIDalarm.ino Der Quelltext zu diesem Projekt unterscheidet sich vom vorherigen Versuch hauptsächlich in folgenden Funktionen: 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 void findSSID() { esp8266.println("AT+CWLAP"); if (esp8266.findUntil(ToFindSSID,"OK")) alarm(); else debug("SSID not found!"); } void alarm() { debug("alarm!"); 10215-5 Lernpaket Internet of Things_02.
-
1.3 | Erkennung eines Netzwerks 25 019 delay(500); 020 } 021 022 digitalWrite(LED_ALARM, LOW); 023 } Die Funktion findSSID() wird ca. alle 30 Sekunden in der loop-Routine aufgerufen und sucht dann nach allen Netzwerken in der Umgebung. ( Wenn das gesuchte Netzwerk gefunden wurde, wird die Funktion alarm() ausgelöst, die die LED D3 einschaltet und einen Signalton am Piezo ausgibt.
-
2 UDP UND IP In diesem Kapitel geht es um den grundsätzlichen Datenaustausch zwischen zwei Systemen über ein WLAN-Netzwerk. Dabei werden wir uns mit Themen wie IP, Ports und dem Protokoll UDP beschäftigen. Dazu müssen diese grundlegenden Begriffe zunächst erläutert werden. Was ist eine IP-Adresse? Eine IP-Adresse funktioniert wie eine Postadresse. Über sie kann ein Rechner im Netzwerk eindeutig identifiziert und adressiert werden.
-
weitere von einem Webserver einsehbare Daten dargestellt. Sie sind also nicht so anonym im Internet wie Sie eventuell glauben. Was ist ein Port? In Analogie zur Postadresse könnte ein Port so etwas wie die Haustür in einem Mehrfamilienhaus sein. Ein Rechner mit einer eindeutigen IP kann über verschiedene Ports verschiedene Dienste zur Verfügung stellen. Sie können über die IP den Server erreichen, aber über den Port müssen Sie auch den zu verwendenden Dienst wählen. Dies kann z. B.
-
2 | UDP und IP 2 Das sind erstmal die wichtigsten Grundlagen zu den Begriffen der folgenden Projekte. Man könnte das Thema noch um einiges tiefer behandeln und an geeigneter Stelle werden noch weitere Informationen folgen. Doch zunächst zum praktischen Teil. 2.1 | Daten zwischen Board und PC mit UDP austauschen In diesem ersten Projekt zum Thema UDP werden Daten zwischen Board und PC über das WLAN ausgetauscht. Voraussetzung dafür ist, dass Ihr Rechner über einen WLAN-Adapter verfügt.
-
2.1 | Daten zwischen Board und PC mit UDP austauschen 29 Regel sollte unten links dann UDP:90 stehen. Falls nicht, müssen Sie die Software einmal neu starten. Das Programm auf dem Rechner dient nun als UDP-Server, während der Controller als UDP-Client eingestellt ist. Im UDP-Protokoll ist die Unterscheidung Client/Server nicht eindeutig, aber in diesem Fall bedeutet dies, dass Sie mit dem Controller Daten an Ihren Rechner schicken. 10215-5 Lernpaket Internet of Things_02.
-
2 | UDP und IP 2 H l Hello ll l Die Nachricht wurde erfolgreich übertragen. Um Daten zu senden, verwenden Sie den Befehl: AT+CIPSEND=7 Dabei steht die 7 für die Anzahl der zu sendenden Zeichen. Es erscheint das Zeichen > als Rückgabewert. Dies bedeutet, dass Sie nun Ihre Nachricht übermitteln können. Tippen Sie Hello ein und bestätigen Sie wieder mit [Enter]. Als Rückgabewert sendet das Modul SEND OK, und das obwohl Sie nur fünf Zeichen eingegeben haben.
-
2.1 | Daten zwischen Board und PC mit UDP austauschen 001 boolean configUDP() 002 { 003 boolean success = true; 004 005 success &= (sendCom("AT+CIPMODE=0", "OK")); 006 success &= (sendCom("AT+CIPMUX=0", "OK")); 007 success &= sendCom("AT+CIPSTART=\"U DP\",\"192.168.4.2\",90", "OK"); //UDP-Server 008 return success; 009 } 31 Die Nachricht wurde von Packet Sender empfangen. Im Arduino-Programm ist für den Kommunikationsweg vor allem die Funktion configUDP() entscheidend.
-
2 | UDP und IP 2 scheidende Befehl ist CIPSTART. Mit ihm wird eine Verbindung aufgebaut, und zwar zu der IP 192.168.4.2, also Ihrem PC, und dem PORT 90, an dem das Programm Packet Senderr mit seinem UDP-Server lauscht. Das sind zunächst alle Schritte, die nötig sind, um eine erste Kommunikation aufzubauen. 2.2 | Daten senden und empfangen mit UDP In dem vorherigen Projekt wurde die UDP-Kommunikation in eine Richtung, also vom Board zum PC, getestet.
-
2.1 | Daten senden und empfangen mit UDP Die Nachricht wurde also empfangen. Sie können antworten, indem Sie wieder den CIPSEND-Befehl benutzen, also z. B.: 33 Der Packet Sender hat erfolgreich »Hi« übermittelt. 001 AT+CIPSEND=7 002 >Hello Der Unterschied zum vorherigen Programm liegt nur in einer einzigen Zeile: success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2 \",90,91", "OK"); Wie Sie sehen, wurde ein zweiter Port angegeben.
-
2 | UDP und IP 2 Programmdatei: P06_UDPLED.ino für beide Ports die Zahl 90 eintragen. Theoretisch ist es mit der Änderung aber auch möglich, dass das Modul seine eigenen Daten empfängt. 2.3 | Eine LED mit UDP schalten Im Programm P06_UDPLED.ino geht es nun endlich darum, Hardware über das UDP-Protokoll zu steuern. Mit diesem Programm ist es möglich, eine LED mit einfachen Befehlen ein- und auszuschalten.
-
2.3 | Eine LED mit UDP schalten 35 Der Controller wartet auf vom WLAN-Modul empfangene Daten, die über die +IPD-Meldung angekündigt werden. Legitime Befehle, die Sie über den Packet Senderr schicken können, lauten led1 und led0. Der Controller interpretiert sie und schaltet dementsprechend die LED ein oder aus. Eine Rückmeldung an den Sender wird ebenfalls übermittelt. Falls ein anderer Befehl gesendet wird, erscheint im Serial Monitor die Meldung »Wrong UDP Command«.
-
2 | UDP und IP 2 016 017 else { 018 debug("Wrong UDP Command"); 019 if (sendCom("AT+CIPSEND=19", ">")) 020 { 021 sendCom("Wrong UDP Command", "OK"); 022 } 023 024 } 025 } 026 } 027 } Das Analysieren der einkommenden Befehle geschieht in der loop-Routine, die permanent durchlaufen wird. Sind Daten vom Modul angekommen (esp8266.available()), werden sie auf das Vorhandensein der Zeichen »+IPD,« analysiert.
-
2.4 | Netzwerkschalter Das Programm Das Programm wertet weiterhin die ankommenden Befehle aus. Zusätzlich wird jedoch ständig der Button abgefragt. Wird er durch den Nutzer betätigt, sendet der Controller den Text 37 Der Schalter platzsparend an D8 angeschlossen Button=1 an das Netzwerk. Alle mit dem Modul verbundenen Geräte mit einem UDP-Server am Port 90 können den Befehl empfangen. Sie können dies mit dem Packet Senderr erneut überprüfen.
-
2 | UDP und IP 2 Der Verlauf im Packet Sender Die Änderungen des Programms sind vor allem in der loop-Routine zu finden. Eine einfache if-Abfrage überprüft, ob der Schalter gedrückt wird. Ist dies der Fall, übermittelt der Controller die Meldung Button=1 an das Netzwerk. Zusätzlich gibt es eine debug-Meldung. Die darauf folgende while-Schleife bewirkt, dass nicht gleich eine ganze Flut von Kommandos gesendet wird, solange Sie den Schalter gedrückt halten.
-
2.5 | Analoger Sensor 39 roller senden. So lässt sich ein ganzes Netzwerk von Sensoren und Aktoren aufbauen. 2.5 | Analoger Sensor Im letzten Projekt wurde mit einem Taster die einfachste Form eines Sensors behandelt. Diesmal soll ein Potenziometer als analoger Sensor zum Einsatz kommen, um permanent Messwerte an das Netzwerk zu senden. Dazu wird das mitgelieferte Potenziometer mit 10 kΩ benutzt. Der Aufbau wird auf dem unteren Bild gezeigt.
-
2 | UDP und IP 2 Nach dem Upload kann es eine Weile dauern, bis die Verbindung zum Netzwerk hergestellt wird. Ist dies erfolgreich, beginnt die LED D3, die auf dem Board fest bestückt ist, zu leuchten. Dies ist das Zeichen, dass der Controller bereit ist. Solange der serielle Monitor aktiv ist, werden Sie zwar auch eine entsprechende Meldung sehen, aber bei späteren Versuchen wollen Sie das Board eventuell autark einsetzen und dann kann dieses Feedback sehr nützlich sein.
-
2.5 | Analoger Sensor 41 Die Messdaten werden vom Packet Sender empfangen. Es gibt in diesem Programm eine weitere Änderung im CIPSTART-Befehl. Zum einen ist die Broadcast-Adresse erweitert worden, und zwar, weil sich nicht voraussagen lässt, welches Subnetz Ihr Router aufspannt. Die zweite Änderung liegt im Hinzufügen eines Parameters, hier des zweiten. Der neue Parameter ermöglicht, dass sich die Zieladresse des CIPSEND-Befehls ändern kann. Das Modul horcht also zunächst im gesamten Raum, der mit 192.
-
2 | UDP und IP 2 Modus 1: Die Einstellungen ändern sich einmal. Dies bedeutet Folgendes: Wenn das Modul mit der gerade verwendeten Broadcast-Adresse startet und dann von einem PC etwas empfangen wird, stellt sich das Modul auf die neue Adresse des PCs ein. Mit anderen Worten wird dann die Ziel-IP, die Sie eingetragen haben, überflüssig und es wird stattdessen zu der neuen Adresse gesendet. Diese Adresse bleibt auch dann bestehen, wenn das Modul Daten von einem weiteren PC gesendet bekommt.
-
2.5 | Analoger Sensor 43 Das Senden des analogen Wertes geschieht in der loop-Routine. Dazu wird die neue Funktion sendUDP() verwendet, die die bekannten Funktionen einfacher zugänglich macht. Ein Delay muss nicht unbedingt zwischen dem Senden der Befehle stehen, denn das Übertragen dauert eine gewisse Zeit. Allerdings ist die Frequenz, mit der neue Daten übermittelt werden, so hoch, dass der PC mit Nachrichten geradezu bombardiert wird. 10215-5 Lernpaket Internet of Things_02.indd 43 19.04.
-
3 TCP-CLIENT Im letzten Kapitel ging es um das UDP-Protokoll, mit dem Daten auf einfache Weise gesendet und empfangen werden. Mit dem Protokoll lässt sich bereits eine Vielzahl von Anwendungen realisieren. In diesem Kapitel werden wir uns mit dem TCP-Protokoll (Transmission Control Protocol) beschäftigen. Das Modul wird in diesem Kapitel die Rolle eines TCP-Clients annehmen. Dies ist die Rolle, die Ihr PC zuhause gegenüber einem Webserver einnimmt.
-
Das Programm Das Programm ähnelt in der Funktionsweise dem SoftwareSerialProgramm des ersten Versuchs, stellt allerdings unter anderem die WLAN-Verbindung beim Start selbstständig her. So sparen Sie eine Menge Schreibarbeit und können schneller loslegen. Vergessen Sie nicht, die Daten Ihres Heimnetzwerks in das Programm einzutragen. Tippen Sie dann im seriellen Monitor die folgende Befehlszeile ein: Programmdatei: P09_TCPBrowser. ino AT+CIPSTART="TCP","www.example.
-
3 | TCP-Client 3 Auszug aus der Antwort des Webservers An diesem Beispiel sehen Sie die Grundlagen des HTTP-Formats. Ein Client stellt eine Verbindung mit einem Webserver her. Dass Sie nicht die IP eintippen müssen, sondern den Domainnamen in Textform verwenden können, liegt an dem sogenannten DNS (Domain Name System). Es leitet die Anfrage an die schwer zu merkende IP weiter. Ist der Client verbunden, sendet der Browser eine Get-Request-Anfrage.
-
3.2 | Eine Internetuhr 47 lassen. Konkret lädt das Programm die aktuelle Uhrzeit von einer speziell dafür konzipierten Seite und stellt damit die per Library realisierte interne Uhr des Controllers, um eine akkurate Zeitausgabe zu ermöglichen. Die Uhrzeit wird über den seriellen Monitor ausgegeben. Für den Aufbau benötigen Sie nur das Board. Das Programm Während das vorherige Programm noch größtenteils per Hand bedient werden musste, arbeitet dieses weitgehend autonom.
-
3 | TCP-Client 3 007 String getRequest = "GET " + Subpage + " HTTP/1.1\r\ nHost:" + Host + "\r\n"; 008 success &= sendCom("AT+CIPSEND=" + String(getRequest.length() + 2), ">"); 009 010 esp8266.println(getRequest); 011 012 if (esp8266.find("+IPD")) 013 { 014 if (esp8266.find("\r\n\r\n")) 015 { 016 xyear = esp8266.parseInt(); 017 xmonth = esp8266.parseInt(); 018 xday = esp8266.parseInt(); 019 xhour = esp8266.parseInt(); 020 xminute = esp8266.parseInt(); 021 xsecond = esp8266.
-
3.3 | Temperaturanzeige 49 Webseite übermittelt. Die Antwort des Servers muss nun analysiert werden. Dazu wird der ganze Request-Header-Teil übersprungen, indem nach \r\n\r\n gesucht wird, was nichts anderes heißt, als dass es nach einem doppelten Carriage Return und New Line weitergeht. Die nächsten Zahlen entsprechen dem gesuchten Datum und der Uhrzeit, die durch eine Reihe von parseInt()-Funktionsaufrufen in Zwischenvariablen gespeichert werden.
-
3 | TCP-Client 3 Anschluss der RGBLED an die Pins D3, D5 und D6 Programmdatei: P11_TCPWeather.ino Das Programm In dem Sketch geht es erneut um die Abfrage einer Internetseite, dieses Mal handelt es sich aber um eine speziell für dieses Projekt programmierte Seite, die Daten von der Wetterseite http://www.openweathermap.com/ bezieht. Auf dieser Seite kann man durch Variation der URL Informationen zum Wetter in seiner Stadt bekommen.
-
3.
-
4 TCP-SERVER Nachdem Sie im vorangegangenen Kapitel etwas über die Verwendung des Moduls als TCP-Client erfahren haben, soll das Modul nun als eigener TCP-Server agieren. Praktischerweise gibt es auch dafür einen einfachen AT-Befehl, mit dem Sie diese komplexe Serveranwendung starten können. Das Modul verhält sich dann wie ein TCP-Server aus dem Internet, nur dass Sie das Senden der Webseite selbst programmieren müssen. 4.
-
eine Veränderung beobachten. Sie sehen eine Request-Anfrage ähnlich der, die Sie schon manuell versendet haben. Die BrowserAnfrage Der Browser wartet auf eine Antwort und zeigt so lange ein Ladezeichen, bis die Verbindung wegen Timeouts getrennt wird. Sie können dem Browser mit einer Variante eines bekannten Befehls eine Nachricht schicken: AT+CIPSEND=0,7 Der Parameter 0 gibt hier den Client an, an den die Nachricht geschickt werden soll.
-
4 | TCP-Server 4 4.2 | Autonomer Webserver Die Ergebnisse des vorherigen Versuchs gilt es nun wieder in einem autonomen Programm zu verwenden. Das neue Programm sendet aber nicht nur eine einfache Webseite an den Browser, sondern es ermöglicht zusätzlich die Ansteuerung einer LED. Auf dem Aufbaubild sehen Sie außerdem, wie Sie eine externe Stromversorgung an das Board anschließen können.
-
4.2 | Autonomer Webserver 55 Tragen Sie Ihre WLAN-Daten ein und laden Sie das Programm hoch. Die IP des Boards wird im seriellen Monitor angezeigt. Dann können Sie den Browser öffnen und die IP des Boards aufrufen. Die Webseite hat nun eine Überschrift und etwas mehr Text. Der Text weist Sie auch darauf hin, wie Sie die LED steuern können. Damit haben Sie also einen ersten vollautonomen Webserver. 001 void loop() { 002 if (esp8266.
-
4 | TCP-Server 4 Dabei ist
eine Anweisung an den Browser, den Text bis
als Überschrift vom Typ 1 darzustellen. Es handelt sich noch nicht um richtigen HTML-Code, sondern vielmehr um eine einfache Form der Textdarstellung. Die Länge der Webseite wird mit webpage.length() (eine Funktion der String-Klasse) an den CIPSEND-Befehl übergeben und die Seite schließlich übertragen. 4.3 | Webseite mit Buttons Bei diesem Versuch ist die Darstellung der Webseite noch ausgefeilter.
-
4.3 | Webseite mit Buttons 57 (Program Memory) gespeichert. Die Verwendung dieser Speicherart entlastet das SRAM des Boards, das sonst für das Speichern von Variablen zuständig wäre. Das SRAM fasst nur 2 kB und ist durch die Verwendung der Strings bereits sehr belastet. Durch die Progmem-Funktion wird nun der Inhalt der Webseite im Programmspeicher untergebracht, der mit rund 32 kB deutlich größer ist. Der Zugriff auf die Daten ist dadurch allerdings auch etwas komplexer.
-
4 | TCP-Server 4 004 005 006 007 008 009 010 011 012 013 014 015 016 if (sendCom("AT+CIPSEND=" + String(connectionId) + "," + String(webpage.length()), ">")) { esp8266.print(webpage); esp8266.find("SEND OK"); success &= sendCom("AT+CIPCLOSE=" + String(connectionId), "OK"); } else { success = false; } return success; } In der loop-Routine wird nun auf eine Request-Anforderung gewartet.
-
4.4 | Einschub: HTML-Crashkurs 59 Browserleiste angezeigt werden soll. In diesem Fall befindet sich im Header eine weitere Angabe, die nicht zu den Grundlagen von HTML gehört, aber die Darstellung auf mobilen Geräten verbessert (
002 PAGE 60
4 | TCP-Server 4 Alle bisher vorgestellten Elemente waren reine Formfaktoren, die der Gestaltung der Webseite dienen. Als Nächstes kommt allerdings das wichtige form-Element, mit dem das Schalten einer LED realisiert wird. 001
Das form-Element ist, wie der Name vermuten lässt, zum Erstellen von Formularen im Internet gedacht.
-
4.4 | Einschub: HTML-Crashkurs 001 002 003 004 005 61
Die letzten Zeilen des HTML-Quelltextes enthalten nichts Neues. Ein Sprung in die nächste Zeile und eine horizontale Line runden das Bild ab, bevor das Dokument mit