Forum: Mikrocontroller und Digitale Elektronik ESP8266 + Arduino will nicht senden


von Benedikt K. (benek)


Lesenswert?

Hallo,
vorab erstmal: Bitte keine Kommentare über die Arduino Plattform oder 
sonstigen belanglosen Kram.
1
#include <OneWire.h>
2
#include <DallasTemperature.h>
3
#include <SoftwareSerial.h>
4
SoftwareSerial EspSerial(4, 5); // RX, TX
5
6
String auth = "auth"; //API Key für den Zugriff auf ThingSpeak Projekt
7
String wlanName = "SSID"; //SSID und Passwort habe ich natürlich zensiert
8
String wlanPasswort = "pass";
9
String thingSpeakIP = "184.106.153.149";
10
11
void setupESP8266(){
12
  EspSerial.println("AT+RST");
13
  
14
  delay(50);
15
  
16
  String cmdWlan = ("AT+CWJAP=");  
17
  cmdWlan += '\u0022' + wlanName + '\u0022';
18
  cmdWlan += ",";
19
  cmdWlan += '\u0022' + wlanPasswort + '\u0022';
20
  EspSerial.println(cmdWlan);
21
  Serial.println(cmdWlan);
22
  delay(500);
23
24
  EspSerial.println("AT+CWMODE=1");
25
  delay(1000);
26
  
27
  Serial.println("Initialisierung erfolgreich!"); 
28
}
29
30
void updateThingspeak(String field1, String field2){
31
  String cmdTCP = "AT+CIPSTART=\"TCP\",\"";
32
  cmdTCP += "184.106.153.149"; // api.thingspeak.com
33
  cmdTCP += "\",80";
34
  EspSerial.println(cmdTCP);
35
  delay(500);
36
  
37
  if(EspSerial.find("ERROR")){
38
    Serial.println("AT+CIPSTART error");
39
  }
40
  
41
  String getStr = "GET /update?key=";
42
  getStr += auth;
43
  getStr +="&field1=";
44
  getStr += String(field1);
45
  getStr +="&field2=";
46
  getStr += String(field2);
47
48
  
49
  String cmdSend= "AT+CIPSEND=" + String(getStr.length() + 4);
50
//+4 steht für /r/n oder ähnliches
51
  EspSerial.println(cmdSend);
52
  delay(1000);
53
  
54
  if(EspSerial.find(">")){ //AT+CIPSEND antwortet mit ">"
55
    EspSerial.println(getStr);
56
  }
57
  else{
58
    EspSerial.println("AT+CIPCLOSE");
59
    // alert user
60
    Serial.println("AT+CIPCLOSE");
61
  }
62
}
63
64
void setup() {
65
  Serial.begin(9600);     // Set console baud rate
66
  EspSerial.begin(9600);  // Set ESP8266 baud rate
67
68
  setupESP8266();
69
  updateThingspeak("72" ,"0");
70
}
71
72
void loop() {
73
}

Das obige Programm soll mir später etwa alle 5 Minuten 2 
Temperatursensoren auslesen und an den Thingspeak Server senden. 
ThingSpeak ist eine Online Plattform, auf der man mit wenig Aufwand eine 
kleine Weboberfläche für IoT zusammenklicken kann. Rein Theoretisch 
funktioniert die Übertragung über den Aufruf des Links 
https://thingspeak.com/update?key=[APIKEY]&field1=x&field2=y, wobei die 
Variablen x und y für die jeweiligen Messwerte stehen.

Mein Versuchsaufbau funktioniert inzwischen schon soweit, dass die 
Kommunikation mit dem ESP vernünftig läuft und dass Kommandos 
theoretisch übertragen werden können. Die Musterlösung für die 
Übertragung eines Messwerts würde übrigens so aussehen:
1
AT+CIPSTART="TCP","184.106.153.149",80
2
AT+CIPSEND=[StringLength]
3
GET /update?key=[APIKEY]&field1=x&field2=y
4
AT+CIPCLOSE

Allerdings hat mein µC bis jetzt noch nicht eine einzige Übertragung 
abgeschlossen. Die TCP Verbindung scheint er noch erfolgreich 
herzustellen, scheitert aber dann spätestens bei dem GET Befehl. Diese 
bricht er meist mit der Fehlermeldung "link is not valid" oder 
"AT+CIPCLOSE" ab. Das mag evtl. an der falschen Zeichenlänge liegen, die 
für den GET Befehl berechnet wird. Mein Ansatz dazu ist dem Code zu 
entnehmen. Falls dazu jemand eine bessere Lösung parat hat: Immer her 
damit.

Ich hoffe jemand kann mir bei meinem Problem helfen.
MfG Benedikt

von Marc_s86 (Gast)


Lesenswert?

1
String cmdSend= "AT+CIPSEND=" + String(getStr.length() + 4);
2
//+4 steht für /r/n oder ähnliches

Da liegt dein fehler denke ich. \r\n sind 2 zeichen, der ESP wartet also 
noch auf 2 weitere zeichen.

Der ESP kann mit nodemcu übrigens auch ganz ohne arduino die 
temperatursensoren auslesen und an die seite schicken, nur so zur info.

von Stefan F. (Gast)


Lesenswert?

Hinter den GET Befehl müssen zwei Line-Breaks gesendet werden, damit der 
Webserver den Request beantwortet.

von Benedikt K. (benek)


Lesenswert?

Stefan U. schrieb:
> Hinter den GET Befehl müssen zwei Line-Breaks gesendet werden, damit der
> Webserver den Request beantwortet.

Tschuldigung ich kann dir nicht ganz folgen. Was ist ein Line-Break und 
wo genau soll er gesendet werden?

von Planlos (Gast)


Lesenswert?

Benedikt K. schrieb:
> Tschuldigung ich kann dir nicht ganz folgen. Was ist ein Line-Break und
> wo genau soll er gesendet werden?

Benedikt K. schrieb:
1
String cmdSend= "AT+CIPSEND=" + String(getStr.length() + 4);
2
//+4 steht für /r/n oder ähnliches
3
  EspSerial.println(cmdSend);
4
  // Print*ln* macht ein \r\n hintendran. Das sind "+2" Bytes.
5
  // Oben sind "+4" Bytes angekündigt worden, es fehlen also noch zwei:
6
  EspSerial.println("");
7
  // jetzt ist der GET-Request fertig. Warten oder so.
8
  delay(1000);

von Benedikt K. (benek)


Lesenswert?

Marc_s86 schrieb:
>
1
String cmdSend= "AT+CIPSEND=" + String(getStr.length() + 4);
2
> //+4 steht für /r/n oder ähnliches
>
> Da liegt dein fehler denke ich. \r\n sind 2 zeichen, der ESP wartet also
> noch auf 2 weitere zeichen.
>
> Der ESP kann mit nodemcu übrigens auch ganz ohne arduino die
> temperatursensoren auslesen und an die seite schicken, nur so zur info.

Gerade ausprobiert: Programm bricht leider immer noch mit AT+CIPLOSE ab.
Das Der ESP das auch alleine kann ist mir durchaus klar, allerdings sehe 
es nicht so ganz ein für ein kleines Projekt mich in eine neue SDK 
einzuarbeiten und evtl. sogar eine neue Programmiersprache zu lernen 
(ESP2866 spricht meines Wissens LUA?). Und da ein Arduino Nano in der 
Bucht nur 3€ kostet tut mir das auch nicht wirklich weh.

von Planlos (Gast)


Lesenswert?

Planlos schrieb:
> EspSerial.println("");

Ups. das hatte ich dir an die falsche stelle gesetzt.
Der Befehl muss ein paar Zeilen weiter runter, direkt nach

> EspSerial.println(getStr);

von Benedikt K. (benek)


Lesenswert?

Planlos schrieb:
> Planlos schrieb:
>> EspSerial.println("");
>
> Ups. das hatte ich dir an die falsche stelle gesetzt.
> Der Befehl muss ein paar Zeilen weiter runter, direkt nach
>
>> EspSerial.println(getStr);

Dein Tipp klingt irgendwie logisch, führt aber auch nicht zum 
gewünschten  Ergbenis. Ich habe jetzt einmal probiert die Ausgabe des 
ESPs an die Serielle Schnittstelle weiterzuleiten. Hier der komplette 
Mitschnitt:
1
AT+RST
2
3
4
OK
5
AT+CWJAP="SSID","pass"
6
7
AT+CIPSTART="TCP","184.106.153.149",80
8
9
no ip
10
11
ERROR
12
13
AT+CIPSEND=55
14
15
link is not valid
16
17
ERROR
18
19
GET /update?key=[apikey]&field1=72&field2=0
20
21
22
23
busy p...
24
25
ERROR

Meines Erachtens liegt der Fehler irgendwo beim AT+CIPSTART Befehl. Die 
Fehlermeldung no ip ist ja nicht gerade normal. Aber was bedeutet das? 
Die IP ist eigentlich korrekt.

von Benedikt K. (benek)


Lesenswert?

Ok Problem ist gelöst. Der Fehler lag daran, dass der ESP8266 im Setup 
zu wenig Zeit hatte sich mit meinem Router zu verbinden. Daher auch der 
Fehler no ip. Ein delay von 2s hat das Problem gelöst

von Stefan F. (Gast)


Lesenswert?

Mit zwei Line-Breaks meine ich die Zeichenfolge "\r\n\r\n".

EspSerial.println() hängt anscheinend \r\n an, dewegen ist es richtig, 
nach dem Senden des GET Befehls noch einen leeren String zu senden. Denn 
genau dadurch wird der zweite Zeilenumbruch gesendet.

von micha2057 (Gast)


Lesenswert?

Hallo Benedikt,
läuft dein Code?
Kannst du ihn zur Verfügung stellen? Tue mich schwer mir Arduino.

Danke

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.