Forum: Mikrocontroller und Digitale Elektronik ESP8266-AT Firmware - TCP Verbindung - NetIO APP - Daten senden


von Matthias S. (mat-sche)


Lesenswert?

Liebes Forum,

wie im Betreff schon steht bin ich an folgernder Sache dran:
Ausstattung:
* MEGA+WiFi R3 ATmega2560+ESP8266, flash 32MB, USB-TTL CH340G, Micro-USB
* Bascom als Programmiersprache für den ATmega
* ESP8266 AT-Firmware 1.6.2.0 (oder so)(Bedienung ESP über AT-Befehle)
  https://www.espressif.com/en/support/download/at
* Hterm als Eingabekonsole zum ESP

Was will ich:
* einlesen von Zeit/Datum über NTP in meine Steuerung => FERTSCH
* App-Entwicklung zur Bedienung meiner Steuerung über NetIO app:
  https://netioapp.com/de/projects/

Der ESP ist nur das Sende- und Empfangsglied zwischen meinem 
Tablet/Handy und der Steuerung. Die Datenübertragung geht vom ATmega 
über rs232 zum ESP und dann per TCP an die App.

Was geht:
* ESP ist ins W-Lan eingebunden
* Abfrage der Uhrzeit per NTP und Auswertung über ATmega
* Verbindungseinstellung für Mehrfachverbindung  •  AT+CIPMUX=1
* ESP als Server vorbereiten•  AT+CIPSERVER=1,5000
* Verbindungsaufbau ESP zur Android-App
Danach kann ich Daten von meinem TAB zum ESP senden, sehe ich dann als 
+IPD,0,...... .
N
Was geht nicht (halbwegs und unerklärlich):
* Daten vom ESP zur APP senden
* mit •  AT+CIPSEND=0,18 das Senden vorbereiten ( Empfänger 0 und 18 
Zeichen senden)
* > abwarten und Zeichen eingeben mit cr+lf verschicken
Nach dem ich die App soweit programmiert/zusammengestellt habe, kann ich 
nur wie folgt und auch nachverfolgbar Daten übertragen.
Ich gebe weniger Zeichen als angekündigt ein und muss dann nochmals den 
Befehl •  AT+CIPSEND=0,18 eingeben. Danach erhalte ich in der App auch 
den Wert angezeigt.
Gebe ich die angekündigte Zeichenmenge ein und sende bekomme ich 
sogleich eine Sendebestätigung •  SEND OK , was vor nicht an dem war.
In der App wird kein Wert angezeigt.

Wo liegt mein Fehler, warum wird erst nach zweimaliger AT+CIPSEND=0,18 
die Daten übertragen?

Gibt es eine feinere/leichtere Art über die AT-Befehle Daten per TCP zu 
versenden?

vielen Dank schon einmal für Eure Gedanken und Hilfe!
MAT-sche

von zipp (Gast)


Lesenswert?

hi,
mit der org. Software des esp habe ich da unter gleichen Anforderungen 
auch abgekotzt. (haufen esp-01...)
umgestellt auf Tasmota und alles läuft so wie ich will!
z. B.
Abfrage Status Ausgang 1:
Kommando  : 21:52:31 CMD: power1
Antwort 1 :21:52:31 RSL: RESULT = {"POWER1":"OFF"}
Antwort 2 :21:52:31 RSL: POWER1 = OFF
Setze Ausgang 1:
22:05:34 CMD: power1 1
22:05:34 RSL: RESULT = {"POWER1":"ON"}
22:05:34 RSL: POWER1 = ON
 Wie man Ausgang 1 zurücksetzt darfst du raten ;-)

Die über hterm eingebenen Befehle
sind
power1 <Return>
bzw.
power1 1 <Return>

Lässt sich auch in Bascom fix ausfiltern.

cu zipp

von Matthias S. (mat-sche)


Lesenswert?

Hi Zipp,

danke für Deine interessanten Zeilen! Kann ich darüber auch Analogwerte 
übertragen und die GPIO vom ESP ansteuern?

von Chris K. (kathe)


Lesenswert?

Lan to Serial mit ESP8266 mit ....
https://github.com/jeelabs/esp-link

von Stefan F. (Gast)


Lesenswert?

Du musst mit dem AT Befehl exakt so viele Bytes senden, wie du 
angekündigt hast.

Wenn du zu wenige Zeichen sendest, wird der nächste Befehl zerstückelt. 
Wenn du zu viele Zeichen sendest, werden die überschüssigen Zeichen als 
nächster Befehl interpretiert. So oder so bekommst du dann mindestens 
einen ERROR.

> In der App wird kein Wert angezeigt.

Dann sende die Daten an ein Programm, bei dem du sicher bist, dass es 
funktioniert. Ich empfehle für solche Sachen das Programm Netcat.

Anleitung zur Verwendung des AT Befehlssatzes: 
http://stefanfrings.de/esp8266/index.html#atcommands

In dem folgenden Buch am Ende von band 3 gibt es ein konkretes Beispiel 
mit AVR Mikrocontroller: 
http://stefanfrings.de/mikrocontroller_buch/index.html

von Matthias S. (mat-sche)


Lesenswert?

Hi Chris,

danke für den Link! sehr interessant. Irgend wann soll auch eine 
Hausautomation aufgebaut werden.

MAT

von Matthias S. (mat-sche)


Lesenswert?

Stefanus F. schrieb:
> Du musst mit dem AT Befehl exakt so viele Bytes senden, wie du
> angekündigt hast.
>
> Wenn du zu wenige Zeichen sendest, wird der nächste Befehl zerstückelt.
> Wenn du zu viele Zeichen sendest, werden die überschüssigen Zeichen als
> nächster Befehl interpretiert. So oder so bekommst du dann mindestens
> einen ERROR.
>
>> In der App wird kein Wert angezeigt.
>
> Dann sende die Daten an ein Programm, bei dem du sicher bist, dass es
> funktioniert. Ich empfehle für solche Sachen das Programm Netcat.
>
> Anleitung zur Verwendung des AT Befehlssatzes:
> http://stefanfrings.de/esp8266/index.html#atcommands
>
> In dem folgenden Buch am Ende von band 3 gibt es ein konkretes Beispiel
> mit AVR Mikrocontroller:
> http://stefanfrings.de/mikrocontroller_buch/index.html

Hallo Stefanus,

schön das Du geantwortet hast!
Deine Seiten haben mir für den Start mit dem ESP sehr geholfen. Also 
auch hier ein riesen großes Lob und DANK dafür.

mein Problem habe ich gefunden und nun kann es weiter gehen mit meinen 
Ideen!

Mein Problem war, dass ich in der Anzahl der zu sendenen Zeichen 
vergessen habe, ein cr/lf/ mit einzuberechnen.
Meine Anwendung funktioniert nun bestens.

Also Klartext:

z.Bsp. "23.23" senden bedeutet 7 zeichen durch "AT+CIPSEND=0,7" 
ankündigen.

Danke Dir Deiner Hinweise!

von Stefan F. (Gast)


Lesenswert?

Noch ein Tipp zur Auswertung der Antworten:

Warte nicht auf OK oder irgendeinen anderen konkreten String, sondern 
warte maximal 1 Sekunde irgendwas. Dann warte maximal 1 Sekunde darauf, 
dass der ESP Ruhe gibt.

Was du bis dahin eingesammelt hast, sollte ein "OK" enthalten.

So berappelt sich die Kommunikation nach einer Fehlfunktion viel 
schneller, als wenn du auf exakt "OK\r\n" (oder so ähnlich) wartest.

von Matthias S. (mat-sche)


Lesenswert?

Stefanus F. schrieb:
> Noch ein Tipp zur Auswertung der Antworten:
>
> Warte nicht auf OK oder irgendeinen anderen konkreten String, sondern
> warte maximal 1 Sekunde irgendwas. Dann warte maximal 1 Sekunde darauf,
> dass der ESP Ruhe gibt.
>
> Was du bis dahin eingesammelt hast, sollte ein "OK" enthalten.
>
> So berappelt sich die Kommunikation nach einer Fehlfunktion viel
> schneller, als wenn du auf exakt "OK\r\n" (oder so ähnlich) wartest.

Ohhh danke für den Hinweis. Eigentlich habe ich eine SUB in meinem 
Programm zur Auswertung drinnen. Werde aber dann zusätzlich die sec. 
abwarten.
Wenn ich ein AT eingebe und ein OK bekomme sollte es doch dann auch 
gehen?! Könnt ich als zusätzliche Abfrage im Fehlerfall ja mit 
einbinden.

Gibt es sonstige Fallstricke beim ESP noch, die Du erwähnenswert 
fändest?

Nutzt Du die AT-Firmware und wenn ja, läuft sie stabil?

von Stefan F. (Gast)


Lesenswert?

> Dann warte maximal 1 Sekunde darauf,
> dass der ESP Ruhe gibt.

Ich sollte vielleicht noch erwähnen, was genau "Ruhe geben" technisch 
gesehen ist:

Der Mikrocontroller empfängt 100ms lang keine weiteren Zeichen mehr. 
Dann kannst du sicher sein, dass du die Antwort komplett abgeholt hast.

Einen Timeout auf maximal 1s macht sinn, falls das ESP Modul amok läuft 
und deinen Mikrocontroller mit dauer-gebrabbel überflutet. Das hörst du 
dir maximal 1 Sekunde lang an, anstatt unendlich lange.

von Matthias S. (mat-sche)


Lesenswert?

DANKE!

von Stefan F. (Gast)


Lesenswert?

> Nutzt Du die AT-Firmware und wenn ja, läuft sie stabil?

Ich habe sie nur in einem ernsthaften Projekt genutzt und das etwa 1 
Woche lang im Dauertest gehabt (mit der Firmware aus dem SDK 1.5.4). Da 
lief es gut. Das Ding ist inzwischen allerdings wieder zerlegt worden.

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.