Day 12: Autonomous webserver
The results of yesterday’s experiment are now to be used in an autonomous program. Today’s program not only sends a simple website to the browser, but also permits control of an LED.
Behind today’s door, you will find a 9-V battery clip that can make your board mobile. As an alternative, you may also use a Power Bank (a battery pack usually used for mobile phones). If you want to use the 9-V-battery, observe that the red wire must be connected to Vin, and the black one to GND. The figure shows the setup of today’s experiment with external power supply.
The program: Day12_TCPServerLed
Today’s program sends a slightly more complex page than the previous experiment. You can also switch the LED at pin D9 by entering /LED behind the IP? of the module. The current condition of the LED is then inverted, i.e. toggled each time.
Enter the WLAN data and upload the program. The board’s IP is displayed in serial mode. Then you can open the browser and call the board’s IP. The website now has a headline and a little more text. The text indicates how to control the LED. It is a first, fully autonomous web server.
Habe vorher Tag 11 gemacht und mich gefreut dass dieser problemlos funktioniert, bei Tag12 dann wieder die üblichen Probleme. Aber wohl eine mögliche Lösung gefunden, wenn das Board mal wieder nicht will: Einfach stromlos machen und ein paar Minuten warten. Ich schätze nach dem neu Flashen mit dme nächsten Programm und dem folgenden Reset vergeben manche Router die IP nicht neu und das Board kann sich nicht neu anmelden. Zumindest bei mir war nach Stromtrennung das frisch geflashte Board direkt erreichbar.
Eine ganz ganz ganz dumme Frage.
Hab das Board via USB am Laptop verbunden und dann das Programm aufgespielt + Serial Monitor geöffnet. Dannach (das Board) abgesteckt und an mein Ladegerät angeschlossen.
Der Rest hat toll funktioniert.
Habt ihr das Programm 12 via WIFI draufgespielt?
Möcht nur wissen ob ich da was übersehen habe
Ich bekomme soweit alles gestartet (ich sehe auch den entten Infotext von wegen “Hallo Welt”), aber wenn ich die LED schalten will (bei mir mit “192.168.178.37/LED”) ändert sich bei der LED nichts. Im Seriellen Monitor bekomme ich die Meldung
Server Aktiv
Incomming Request
Send and Close
Incomming Request
Send and Close
Incomming Request
Send and Close
(ich habe es einige Male versucht). Die LED ist richtigherum angeschlossen, und ich habe es auch mit mehreren Kabelstücken versucht, also ist es wahrscheinlich auch kein Wackelkontakt… Bleibt da noch eine Fehlerquelle übrig? Wenn ja, bitte helfen :)
Hallo Zusammen,
bin nun auch bis zum Tag 12 vorgestoßen.
Bis jetzt ließen sich auch alle Projekte zum laufen bringen.
Heute ist allerdings ein Problem aufgetaucht:
Wenn das Programm startet, meldet es sich nach kurzer Zeit mit der IP-Adresse, auch im Accesspoint taucht der Nano als Gerät auf. Mit dem Browser (Firefox) muss ich fast 15 s wiederholt die Adresse aufrufen, bis endlich etwas passiert. (Ebenso mit Ping). Dann geht es flott und funktioniert auch wiederholt. Wenn man das ganze dann ca. 30s in Ruhe läßt, muß man erst wieder 15s das System stressen, bis es wieder läuft.
Hat das WLAN-Modul so etwas wie einen Sleep-Modus ?
Oder ist das eher ein Netzwerkproblem ? Hat jemand eine Idee?
Ich habe ein ähnliches Problem am Laptop. Wobei es manchmal auf anhieb klappt und manchmal überhaupt nicht (Internet Explorer verwenden hilft hier auch nicht).
Über mein LG G3 funktioniert es problemlos im Android Browser.
Hat dazu jemand eine Antwort?
Grüßt euch,
wenn ich das richtig verstehe kann ich auf das ESP-Board nur zugreifen wenn ich im gleichen Netzwerk bin? Gibt es eine Möglichkeit, den Webserver auch von außerhalb des Netzwerkes aufzurufen, oder kommt das erst hinter einem späteren Türchen?
Hi, meinst du z.B. über das Internet? Dann müsstest du deinen Router so konfigurieren, dass er bestimmte Anfragen aus dem Netz an das Board weiterleitet (Stichwort Portforwarding)
Hallo Viduq,
der normale Anwender bekommt jedenTag eine neue Ip adresse. Er hat auch keine web adresse wie “www.meineHomepage.de”. Damit es richtig klappt braucht Du DynDNS.
Also du muß eine web adrese kaufen oder bei einem quasi kostenlosen DynDNS Provider beantragen.
check mal die Seite von:
http://www.noip.com
Da bezahlts Du halt mit Deinen Daten. Dann die Frixbox mit DynDNS konfigurieren. Erst dann kann Du mit forewarding Ports einrichten wie z.B. port 80 für http.
Für Day12
Port 80 muß Du auch auf der Fritzbox einrichten.
Erst dann kannst Du Deine eine eigene Webseite vom Handy erreichen.
Achtung jetzt ist Dein locales Netz offen !
Denn Dein Port 80 ist offen und bekannt für http Anwendungen.
Es wäre zu empfehlen eine eigen Porttranslation einzu bauen (z.B. 34567 -> 80 ).Der Nachteilt Du muß Deine Eigne Homepage mit port /34567 aufrufen.
Rechne mal mit der try und error Methode mit ca. 1-2 Wochen rum probieren.
Auf der AVM Seite gibt es dazu eininge Anleitungen.
Ich glaube, das wäre was für die Nachweihnachtszeit.
Ich habe das mal gleich aus probiert syntaxt
wäre: mit dem Beispiel:
“www.meineHomepage.de:34567/LED”
“http://www.meinehomepage.de/” ist eine Homepage
die schon jemand gekauft hat,dass hier ist nur ein Beispiel. Zum Testen bitte nur die eigene Homepage verwenden.
Aber auf der Seite ist ein netter Weihnachtsgruß
und damit passt es zum Adventskalender :-)
Wenn Jan Heuhoff, er ist der owner von “meinehomepage” auch einen IoT Calender haette, wäre es ober-cool, wenn er seinen ESP mit der Homepape kopplen würde.
Um dann noch eine Webcam. Schon könne man die Funktion sehr gut veranschaulichen.
Hallo,
versuche auch mehrere LEDs zu stuern mit dem Aufbau der RGB-LED.
Doch will es nicht funktionieren.
habe das Programm um folgende Zeilen erweitert bzw. geändert:
#define LEDrot 3
#define LEDgruen 5
pinMode(LEDrot, OUTPUT);
pinMode(LEDgruen, OUTPUT);
if (esp8266.findUntil(“LEDrot”,”\n”)) digitalWrite(LEDrot, !digitalRead(LEDrot));
else (esp8266.findUntil(“LEDgruen”,”\n”)) ;digitalWrite(LEDgruen, !digitalRead(LEDgruen));
Bei 192.168.2.112/LEDrot wird auch die rote LED an Pin 3 geschhaltet
Nur die grüne wird immer geschaltet, auch wenn ich nur 192.168.2.112 eingebe.
Habe es auch schon mit elese if probiert
und mit {} und ohne {}.
Bekomme es nicht hin!
Ist bei diesem Programm auch so zu erwarten.
Schau mal in früheren Kommentaren, wurde mehrmals behandelt.
Hi,
beim RGB Setup von Tag 10 musst Du analogWrite (PWM Signal) verwenden. Und einfaches invertieren geht auch nicht weil eine Zahl zwischen 0 und 255 verlangt wird.
Ich hab’ auch etwas in der Richtung gebastelt.
Siehe hier:
https://drive.google.com/file/d/0B3YbD96_4_tpaHdYZHBJN2dibDA/view?usp=sharing
Zusätzlich wird in dieser Variante die LED per Link (klick) gesteuert.
Hoffe das läuft bei Dir.
LG
Hi, ja läuft. 2 LED Zustände. OK. Geht die Entwicklung noch weiter ? ;-)
Link/Klick ist TOP.
Ein wenig bunter hab’ ich es noch bekommen. Stosse aber beim HTML Code an Grenzen mit der soft-Seriellen. Und stabil ist auch anders. Musste öffters zum Strom-Reset greifen…
https://drive.google.com/open?id=0B3YbD96_4_tpeEhacEJjZG5CLTA
Viel Spass.
@Kai & Raabinator: Stimmt. Die größte Schwierigkeit liegt beim Unwissenden (wie mir) im Abholen von LEDx. Geht sicher noch eleganter als in meiner Lösung.
Die RGB-LED lässt sich aber auch digital ansteuern! Es ist keine Pulsweitenmodulation zwingend notwendig so wie meine Tests ergeben haben.
Die Pins, an denen die RGB-LED angeschlossen ist KÖNNEN als PWM-Pins verwendet werden, müssen aber nicht.
Kai hat in seinem Programm die Pins schon richtig mit
pinMode(LEDrot, OUTPUT);
als digitale Ausgänge geschaltet. Die LEDs sind dann nur noch an oder aus, Helligkeit ändern ist dann nicht, aber toggeln funktioniert.
‘findUntil’ konsumiert alle Zeichen bis zum nächsten “\n”. Die übrigen Suchen schlagen nach dem ersten dann immer fehl.
wenn das wirklich dein Code ist:
if (esp8266.findUntil(„LEDrot“,“\n“))
digitalWrite(LEDrot, !digitalRead(LEDrot));
else (esp8266.findUntil(„LEDgruen“,“\n“))
;
digitalWrite(LEDgruen, !digitalRead(LEDgruen));
dann liegt es an dem Semikolon (‘;’) nach else. du beendest damit das else und die anweisung auf LEDgruen wird ausgeführt egal was das if ergibt.
Lg Martin
So – ich wollte nur mal sagen: Bei mir funktioniert heute wieder mal alles auf Anhieb!
Manch einer fragt sich jetzt vielleicht “warum muss der Blödmann das kundtun, wenn doch alles geht? Soll er doch einfach froh sein!”
Naja, wenn man die Kommentare hier liest, melden sich ja fast nur die, die Probleme haben. Dabei kommt m.E. zu kurz, dass es sicher auch viele Leute gibt, bei denen es meistens klappt (wie bei mir) – und die mit mal mehr mal weniger Forschungsgeist und Verständnis die Dinge gut zum laufen bringen – und eine Menge dabei lernen.
Deswegen an dieser Stelle ein Dank an ‘fkainka’, der sich wirklich Mühe gibt und gegeben hat um uns was beizubringen. Natürlich ist es nicht so einfach dabei den Spagat zu schaffen zwischen solchen, die den Code wie ein Buch lesen, und solchen, denen man das Lesen erst Buchstabe für Buchstabe beibringen muss. Jeder hat mal klein angefangen.
Alles in allem finde ich das hier wirklich gut gelungen – Danke!
Hallo Zusammen,
in der Beschreibung heute fehlt der Hinweis, dass, man nach dem Laden des Programms und Starten über den Seriellen Monitor, mit angeschlossener externer Stromquelle, die Verbindung zum Rechner getrennt werden kann/darf/soll. Man kann es sich zwar denken :-) …
Das WLAN Modul meines Boards wird mit der Zeit sehr heiß, was dazu führt, dass es dann nicht mehr über den Browser erreichbar ist.
Durch externe Kühlung (Pusten) lässt es sich wieder ansprechen.
Hat jemand ähnliche Probleme? Ist das Board defekt?
Als erstes würde ich mal alles auf der Experimentierplatte abklemmen – nur noch das Board übrig lassen und mit USB anschließen wie gewohnt. Keine kleinen Drähte irgendwo die einen Kurzschluss verursachen ?
Vielleicht ein abgeschnittenes Drähtchen zwischen Platte und Board gerutscht ?
Wenn das ausgeschlossen ist und das Board immer noch heiß wird obwohl es funktioniert – dann liegt fürchte ich wirklich ein Problem mit dem Board vor.
Bei mir wird es bisschen warm, aber nie heiß.
Leider wird es auch nach kompletten Abklemmen (nur an USB Anschluss) so heiß, dass es irgendwann nicht mehr erreichbar ist.
Hört sich verrückt an, aber mir das gleiche: LED lässt sich ein paar mal schalten, dann hängt der Browser und im Seriellen Monitor kommt “ESP SEND ERROR”.
Mit Draufpusten auf das WLAN Modul läuft es wieder und ESP SEND ERROR kommt nicht mehr.
Nach einiger Zeit ohne Kühlung kommen die Fehler wieder.
… wobei, jetzt läuft’s auch ohne Pusten. Vielleicht lag’s auch nur am Positionswechsel des Moduls… Irrglaube?
Leider hab ich heute zum ersten Mal ein Problem. Ich bekomme in der arduino-Konsole die IP genannt und im speedport wird das esp auch unter dieser Adresse geführt. Aber wenn ich dann http://192.168.2.121/ mit oder ohne LED am Ende in einen Browser eingebe ist diese Website immer Nicht Verfügbar. Egal ob Chrome, Firefox, Edge oder sogar Internet Explorer. Ich weiß nicht wo das Problem liegen kann. Ich habe mehrfach schon das Programm neu auf das Board hochgeladen. Aber nichts passiert.
Hi, lass mal “http://” weg. Bei mir geht es.
Hi,
seit gestern ist ein Update auf die Fritzbox 7490 verfügbar. Nachdem sich dieses installiert hatte, kam ich mit dem NanoESP nicht mehr ins WLAN.
Die Lösung (siehe auch Tag 0/1): Die Fritz!Box hat den Verbindungsstandard im WLAN wieder verändert. Man muss manuell von 802.11n+b+g auf 802.11b+g umstellen.
Vielen Dank, das hat mir geholfen! Ist aber ärgerlich das man das umschalten muss, schließlich will ich das 802.11n+b+g für alle “normalen Geräte” an lassen.
Dieser Effekt sollte weiter untersucht werden.
Mein Netgear Router unterstützt 802.11n+b+g (und ac auf 5GHz), und ist auch so konfiguriert, und es funktioniert.
n+b+g umfasst auch b+g, d.h. ältere Clients werden vom Router auch akzeptiert. Der PC wird aber n verwenden. Falls das esp8266 n (wirklich) nicht unterstützt (muss noch nachschauen), könnte es sein, dass es die Meldungen vom PC nicht versteht. Aber bei mir funktioniert es!
unterstützt b+g+n, siehe Details unter:
http://espressif.com/en/products/esp8266/
Hallo Zusammen! Zur Halbzeit melde ich mich einfach mal zu Wort. Anscheinend sind ja hier sonst nur Profis am probieren, denn ich bin leider immer noch bei Tag 2.
Ich wollte einfach mal einen anderen Adventskalender haben und eben diesen bei Conrad.de gefunden. Da stand auch noch geschrieben, dass keine Vorkenntnisse und keine Werkzeug erforderlich sind – also sollte schon passen. Doch leider falsch gedacht. Vielleicht mal ein Wort an den Autor: die Erklärungen dürfen ruhig etwas ausführlicher sein, so dass ein LAIE!!! sie auch versteht (wie gesagt, da stand OHNE Vorkenntnisse!). Wo z.Bsp. sehe ich denn dieses WLAN-Netz dieses Moduls, wie kann ich mich denn damit verbinden, was muss ich den beachten, wenn das Ganze nur als Heimnetzwerk funktioniert und und und. Es freut mich für alle, die sich bis zum jetzigen Zeitpunkt hier durchgebissen haben bzw. mithalten konnten – für mich war die Anschaffung des Kalenders bisher leider nur ein Flopp. Ich wünsche Euch trotzdem allen noch einen schönen 3.Advent und weiterhin viel Spaß und Erfolg beim ausprobieren.
Ich muss Dir recht geben.
Bei mir haben zwar bislang fast alle Experimente funktioniert, aber ich fühl emich bei den Programmen etwas alleingelassen. Die einzelnen Programme sind fast gar nicht kommentiert, womit man halt auch eigentlich nichts lernt.
Es ist immer nur: Da ist die Schaltung, hier das Programm und dann klappts oder halt nicht. Ein Lerneffekt, den ich mir erwünscht hatte gabs bislang leider gar nicht.
Ich hab leider auch gar keine Vorkentnisse beim Programmieren und versuche die vorhandenen Programme immer etwas selbst zu ändern und schau mir dann das Ergebnis an. Teilweise unterstützt durch verschiedene Foren.
Alles in Allen schaut der Adventskalender nach einem ziemlichen Schnellschuss aus. Anscheinend wurde alles “kurz vor knapp” noch zusammengestellt, damit der Adventskalender auch dieses jahr noch in die Läden kommt.
Ich hoffe es gibt bald irgendwo ein Forum für dieses Board, in dem man dann sich austauschen kann.
Sali Ingo.
Um die Funktionen zu verstehen oder zu suchen was für Funktionen es gibt hilft die englische Arduino Referenz
https://www.arduino.cc/en/Reference/HomePage
Die Funktionen für Serial sind hier beschrieben
https://www.arduino.cc/en/Reference/Serial
In Deutsch gibt von Arduino
http://playground.arduino.cc/Deutsch/HomePage
Ich hoffe es hilft.
Gruß Roebi
Habe es doch noch herausgefunden.
Die Beschreibung war unverständlich.
Hello World!
Open [IP]/LED to Toggle LED on D9
Ich verstehe nicht wie ich die LED steuern kann.
Schreibe im Browser die Adresse des NanoESP und füge dahinter direkt die Zeichenkette /LED an, also z. B. 192.168.178.22/LED.
Damit lässt sich die LED mit jedem Zugriff an-/ausschalten.
Funktioniert bei mir trotzdem nicht,
hast du noch eine Tipp?
Die LED richtig angeschlossen?
Wenn noch die RGB-LED dran hängt, musst du die Pin-Nummer im Programm ändern.
Wenn die einfache dran ist, ist sie vielleicht falsch herum.
Der längere Draht, bzw. das kleinere Metallteil im inneren, ist die Anode (sprich: der Plus-Pol) und muss an den Widerstand Richtung Board.
Genau, nimm am besten ReadStringUntil:
String input = esp8266.readStringUntil(‘\n’);
Dann vergleichst du input gegen LEDY und LEDX
Klappt auch irgendwie nicht :( Was mach ich nur falsch?
String input = esp8266.readStringUntil(‘\n’);
if (esp8266.available()) // check if the esp is sending a message
{
if (esp8266.find(“+IPD,”))
{
debug(“Incomming Request”);
int connectionId = esp8266.parseInt();
if (input == “LEDX”)
{
digitalWrite(LEDX, !digitalRead(LEDX));
}
else if (input == “LEDY”)
{
digitalWrite(LEDY, !digitalRead(LEDY));
}
String input = esp8266.readStringUntil(‚\n‘);
erst nach find(“+IPD”) einfügen, dann müsste in input das erste Zeichen ‘X’ oder ‘Y’ sein, wäre eine Variante.
Andere Varianten wurden auch schon beschrieben.
natürlich erst so nach zusätzlich find(“LED”).
sorry, ich sollte vor der Antwort besser überlegen.
Aber man kann natürlich auch den ganzen input nach find(“IPD”) analysieren.
Ich fand es heute spannend das Board mal vom Rechner zu “trennen”. Ich finde es mental immer eine Herausforderung zu “glauben”, dass das alles über WLAN läuft, wenn da ein Kabel am Rechner steckt ;-)
Eines ist mir aufgefallen: Wenn ich die IP mit Firefox aufrufe, dann klappt es einwandfrei, wenn ich Safari nutze gibt es Probleme: Die LED lässt sich zwar schalten (mit kurzem Zwischenblinken), aber ich sehe die den Text nicht, sondern nur eine Fehlermeldung auf Safari. Weiß jemand, woran das liegt?
Ich vermute mal fast, dass es genau der Effekt ist, den ich gestern hatte. Im Forum hatte ich gestern eine erweiterte Version gepostet. Dort hatte ich das gestrige Programm so erweitert, dass es automatisch eine Antwort schickt. Mit Firefox3 ging das, aktuelle Chrome, Opera und Safari gingen nur halb. Aktuellen Firefox hatte ich nicht probiert.
Der Hintergrund meines gestrigen Problems:
Firefox öffnete genau eine Verbindung. Die anderen Browser öffnen zusätzlich noch eine zweite Verbindung und schließen diese gleich wieder. Was der Sinn ist, weiß ich nicht. Bisher konnte mir noch keiner dieses Verhalten erklären.
Der neue Microsoft Edge funktioniert auch einwandfrei.
FF 42, Chrome 47, IE 11 unter Win7 funktionieren. Safari unter iPhone 4 schaltet LED, zeigt aber keinen Browsertext.
Hi,
ich vermute das Safari keinen reinen Text anzeigt. Damit also Text im Browser erscheint, muss der String anpassen, etwa so:
String webpage = „HTTP/1.1 200 OK\n\nHello World!Open [IP]/LED to Toggle LED on D9“;
und hinter den Text. Die Länge in CIPSEND muss dann natürlich noch angepasst werden.
Danke für den Tipp! Das war’s – jetzt wird der Text auch bei Safari (iPhone 5, iPad und iMac) ausgegeben.
(Länge in CIPSEND musste allerdings gar nicht angepasst werden, da mit webpage.length() ermittelt wird…)
Wow,hat perfekt geklappt. Ich habe versucht das ganze noch auf 2 LEDs auszuweiten, bin aber gescheitert.
if (esp8266.findUntil(“LEDX”,”\n”))
{
digitalWrite(LEDX, !digitalRead(LEDX));
}
else if (esp8266.findUntil(“LEDY”,”\n”))
{
digitalWrite(LEDY, !digitalRead(LEDY));
}
Es schaltet leider nur die erste LED. Wenn ich http://IP/LEDY eingebe, passiert nix.
Und ja, ich habe die LEDY definiert und als Output geschaltet.
Hat Jemand ne Idee ??
findUtil() leert den empfangenen Stream bis spätestens zum \n. Ein weiteres findUtil() findet dann keine Zeichen mehr zur Verarbeitung und endet dann mit einem Timeout d.h. gibt false zurück.
Ok, das erklärt es natürlich. Was kann ich dagegen machen?
Kann ich vielleicht das Ergebnis vorab in einer Variable speichern und darin suchen?
Hallo Ingo.
Als Ansatz zur Lösung : Suche nach LE bis ein D kommt
if (esp8266.findUntil(„LE“,“D“))
anschließend kannst Du den nächsten Buchstaben (X oder Y) einzeln auslesen.
wirklich?
der nächste Buchstabe müsste hier ‘D’ sein.