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