Forum: Mikrocontroller und Digitale Elektronik Arduino + ESP-01 + WLAN Telnet = ECONNREFUSED


von ArdBack (Gast)


Lesenswert?

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?

von Andreas B. (bitverdreher)


Lesenswert?

Zeile 42 Deines Programms auskommentieren.

von ArdBack (Gast)


Lesenswert?

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
}

von Andreas B. (bitverdreher)


Lesenswert?

Als erstes würde ich mal loggen anstatt einfach exit 1 auszuführen, wenn 
das "ok" beim Reset nicht kommt.

von Einer K. (Gast)


Lesenswert?

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

von ArdBack (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

Du bestätigst meine Befürchtungen.
Danke.

von ArdBack (Gast)


Lesenswert?

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.

von Jörg B. (Gast)


Lesenswert?

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

von Alex G. (dragongamer)


Lesenswert?

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
von ArdBack (Gast)


Lesenswert?

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 ...

von Alex G. (dragongamer)


Lesenswert?

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.

von ArdBack (Gast)


Lesenswert?

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...

von Stefan F. (Gast)


Lesenswert?

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().

von Alex G. (dragongamer)


Lesenswert?

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
Noch kein Account? Hier anmelden.