Aufbau An "5V" und "GND" eines Arduino Uno hängt ein StepDown-Konverter und erzeugt +3.3V für ein ESP-01 Modul. Die 3.3V sind zusätzlich mit einem 470µF Elko gestützt. RX und TX des ESP-01 sind an Pin8/9 mittels SoftSerial angeschlossen (RX des ESP über Spannungsteiler). CH_PD und RST hängen jeweils über 10kOhm an +3.3v. Problen Das funktioniert auch alles, nur leider nicht nach dem ersten Einschalten: Nach dem Verbinden mittels WLAN sehe ich bei jedem Versuch, mich über Telnet auf dem ESP-01 einzuloggen, nur ECONNREFUSED. Um das zu ändern kann ich entweder die WLAN-Verbindung trennen und wiederherstellen, dann funktioniert das Einloggen sofort. Oder ich kann die Reset-Taste beim Arduino-Uno drücken, dann wird die WLAN-Verbindung wohl automatisch unterbrochen und wiederhergestellt, jedenfalls funktioniert dann das Einloggen auch sofort. Frage Was muss ich tun, damit das Einloggen gleich beim ersten Einschalten des Arduino funktioniert?
1 | #include <AltSoftSerial.h> |
2 | AltSoftSerial Esp; |
3 | |
4 | void setup() { |
5 | Serial.begin( 115200 ); |
6 | Serial.println( "Arduino" ); |
7 | while ( !Serial ); // Wait for Arduino Serial Monitor to open |
8 | Serial.println( "starts ..." ); |
9 | Esp.begin( 19200 ); |
10 | |
11 | // Reset ESP module
|
12 | {
|
13 | #define MAX_RESET_NUMBER 10
|
14 | unsigned char reset_counter = 0; |
15 | while ( toEspNAwaitAns( "AT+RST\r\n", "OK\r\n" ) == false ) { // Reset |
16 | // Falls kein OK kommt, erneute Reset Commandos bis zum Arduino-Stillstand
|
17 | if ( ++reset_counter >= MAX_RESET_NUMBER ) exit( 1 ); |
18 | delay( 1000 ); |
19 | }
|
20 | // Danach alle kommenden Daten konsumieren (buffer flushen):
|
21 | // Zunächst bis zu mindestens 500ms auf Zeichen warten. Kommen sie schneller,
|
22 | // nur noch weitere mindestens 80ms auf weitere Zeichen warten
|
23 | unsigned long timeout = millis() + 1000; |
24 | do { |
25 | // Poll for Esp's response and read it completely
|
26 | while ( Esp.available() ) { |
27 | if ( DEBUG ) Serial.print( Esp.read() ); // Read the next symbol and show it |
28 | else Esp.read(); // Read the next symbol |
29 | timeout = millis() + 100; // Wait up to 100ms for late symbols |
30 | }
|
31 | } while ( millis() < timeout ); // unsigned comparison ok because setup() |
32 | if ( DEBUG ) Serial.print( "\n" ); |
33 | }
|
34 | // Setup ESP module via AT commands
|
35 | toEspNAwaitAns( "ATE0\r\n", "OK\r\n" ); // Echo off |
36 | toEspNAwaitAns( "AT+CWMODE=2\r\n", "OK\r\n" ); // Configure as access point |
37 | toEspNShowAns( "AT+CIFSR\r\n", "OK\r\n", true ); // Show IP address |
38 | toEspNAwaitAns( "AT+CIPMUX=1\r\n", "OK\r\n" ); // Configure for multiple (max. 5) connections |
39 | toEspNAwaitAns( "AT+CIPSERVER=1,80\r\n", "OK\r\n" ); // Turn on server on port 80 |
40 | }
|
Als erstes würde ich mal loggen anstatt einfach exit 1 auszuführen, wenn das "ok" beim Reset nicht kommt.
ArdBack schrieb: > Frage > > Was muss ich tun, damit das Einloggen gleich beim ersten Einschalten des > Arduino funktioniert? Ich befürchte, dass dir meine Antwort nicht schmecken wird.... Nach einigen Experimenten bin ich, für mich, zu dem Schluss gekommen, dass es unsinnig ist, den fetteren der beiden Rechner, zum WLAN Sklaven des schwächeren zu machen. Andersrum wird da eher ein Schuh draus. Mache den UNO zum I2C Slave des ESP8266-01
Andreas B. schrieb: > Als erstes würde ich mal loggen anstatt einfach exit 1 auszuführen, wenn > das "ok" beim Reset nicht kommt. exit(1) wird nie ausgeführt. setup() läuft immer problemlos durch. Nur kann ich mich eben erst nach einem manuellen Druck auf den Resetbutton des Arduino per WLAN+Telnet einloggen. Arduino Fanboy D. schrieb: > Mache den UNO zum I2C Slave des ESP8266-01 Das restliche Programm des Arduino steuert massenweise Hardware und WLAN ist nur eine kleine Zugabe. Master und Slave ist längst geklärt. Es geht jetzt also nur noch um einen komfortableren Startup als immer einen manuellen Reset.
Arduino Fanboy D. schrieb: > Du bestätigst meine Befürchtungen. Deine Antwort schmeckt mir doch. Es ist nur keine Lösung für das Problem. Es gilt, eine näherliegende Lösung zu suchen. Der ESP-01 läuft völlig problemlos Stunden, Tage, Wochen, Monate am Arduino. Wie gesagt es funktioniert alles bis auf dieses unschöne Startup-Problem.
Klingt für mich, als wärst Du (in der Software) zu ungeduldig. Ich bin jetzt nicht sicher, was genau hier abgefragt wird while ( toEspNAwaitAns( "AT+RST\r\n", "OK\r\n" ) == false ) aber wenn der jede Sekunde einen Reset an den ESP schickt wird er Probleme haben, eine WLAN-Verbindung aufzubauen. Dies kann schon mal länger als eine Sekunde dauern. Das würde dann auch dafür sprechen, dass - wenn Du den Arduino neu startest - es dann funktioniert. Dann hatte der ESP möglicherweise mehr Zeit eine Verbindung zu etablieren und dann kommt auch die gewünschte Antwort. Ich würde mal versuchen die Wartezeit auf 3 oder 5 Sekunden hochzusetzen und schauen, was dann passiert. Jörg
Also das klingt stark danach als ob da etwas timing mäßiges nicht stimmt. Beim ersten Einschalten wird angestoßen dass irgendwas hochfährt (Wlan ist ja nicht so trivial) aber das, was auch immer es ist, ist noch nicht bereit wenn es sofort verwendet werden soll. Wenn das Ganze erneut angestoßen wird, ist das was auch immer es ist, schon bereit und darum geht es sofort. EDIT: Zu spät :)
:
Bearbeitet durch User
Jörg B. schrieb: > Ich bin jetzt nicht sicher, was genau hier abgefragt wird > > while ( toEspNAwaitAns( "AT+RST\r\n", "OK\r\n" ) == false ) Der Reset-Befehl wird an den ESP geschickt und auf die Antwort "OK" gewartet. Diese kommt normalerweise auch sofort (in ganz seltenen Fällen kommen wirre Zeichen, dann reicht es, ein bischen zu warten und den Reset-Befehl noch einmal zu schicken und dann geht es immer. 1s ist hier sogar großzügig und 10 Wiederholungen auch übertrieben, 2 hätten gereicht). Aber wie gesagt, gleich nach dem Einschalten läuft das Ganze ja wunderbar durch. Der Server ist auf port 80 aktiviert und ich kann auch eine WLAN-Verbindung herstellen. Nur eben wird der Einlogg-Versuch per Telnet mit "ECONNREFUSED" quitiert, solange bis ich den Reset-Knopf des Arduino drücke. Dann läuft das Ganze wieder durch. Der Server ist auf port 80 aktiviert und ich kann auch eine WLAN-Verbindung herstellen und mich dann auch per Telnet einloggen ...
Versuch mal zwischen: ArdBack schrieb: > Aber wie gesagt, gleich nach dem Einschalten läuft das Ganze ja > wunderbar durch. Der Server ist auf port 80 aktiviert und ich kann auch > eine WLAN-Verbindung herstellen. Und: > Nur eben wird der Einlogg-Versuch per Telnet mit "ECONNREFUSED" > quitiert, solange bis ich den Reset-Knopf des Arduino drücke. Dann läuft > das Ganze wieder durch. Der Server ist auf port 80 aktiviert und ich > kann auch eine WLAN-Verbindung herstellen und mich dann auch per Telnet > einloggen ... Besagte Pause von ein paar Sekunden zu legen.
Danke Alex G. und Jörg B. für Euer Beschäftigen mit meinem Problem. Eure Ideen deuten auf etwas hin, was auch folgender Thread-Beitrag angibt: https://forum.arduino.cc/index.php?topic=410778.msg2878801#msg2878801 Gibt es irgendwo eine Liste mit den Wartezeiten für andere Befehle? Der ESP scheint sich ja tatsächlich zu verhaspeln, aber ich kann ja jetzt nicht alle Kommando-Delays selber durch Trial&Error herausfinden...
ArdBack schrieb: > Gibt es irgendwo eine Liste mit den Wartezeiten für andere Befehle? Der > ESP scheint sich ja tatsächlich zu verhaspeln, aber ich kann ja jetzt > nicht alle Kommando-Delays selber durch Trial&Error herausfinden... Warum nicht? Es sind doch nur ungefähr 10 Kommandos, die du brauchst. Zeige mal den Quelltext der Funktion toEspNAwaitAns().
Btw. wenn du dich klug anstellst, kannst du mit nur 3 oder 4 Testrunden rausfinden zwischen welchen der 10 Befehle, gewartet werden muss ;) Stichwort: Teile und herrsche. Schau aber erst obs geht wenn du zwischen allen 10 Befehlen wartest.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.