Probleme mit Arduino IDE und ESP8266

Hallo Zusammen,

zum Hintergrund:
Ich versuche grad, meinen Stromzähler an der IR-Schnittstelle auszulesen und möchte diese
Daten dann an iioBroker senden, bzw. dort einen Datenpunkt füllen…

Bislang bin ich soweit, dass ich mit dem Sketch auf einem Uno, die Daten auslesen kann und
Serial anzeige…

nächster Schritt wäre das ganze über Netzwerk zu senden, da LAN in der nähe des Zählers
nicht wirklich zur Verfügung steht, habe ich mich für Wifi entschieden.

  1. Versuch, ein ESP8266-01 an den Uno gehängt mittels LogicLevelConverter.
    Soweit so gut, mit etlichen gefummel, ist die Kommunikation da und ich kann AT Befehle
    Im Serial Monitor eingeben und ich bekomme Rückmeldung.
    Allerdings bekomme ich trotz exakt gleich WLAN Zugangsdaten wie ich sie auch beim
    ESP8266-01 standalone Button verwende, verbindet sich das ganze nicht mit den
    Beispiel Sketchen die bei der wifiesp Librarie dabei sind.

Also überlegt, den ganzen Sketch des IR Auslesen auf den ESP8266-12E zu packen, kurzer Hand
die nötigen Boards installiert, bzw. update durchgeführt…

  1. Versuch, leider schon gescheiter, als ich den Sketch kompilieren möchte kommen schon etliche
    Fehlermeldungen, die ich weder Nachvollziehen noch verstehen kann, da sie ja beim Uno nicht
    Auftauchen, lediglich bei der Auswahl des ESP8266… boards
    in meinem Fall “NodesMCU 1.0 (ESP-12E Modul)” aber auch bei 8266 generic…
    bricht das Kompilieren ab.

Nun die Frage, hat jemand eine Idee, was das Problem ist und wie ich es lösen kann?

Sketch:

#include <SoftwareSerial.h>         // Bibliothek für serielle Kommunikation über beliebige Digitalports 
                                    // "softSerial()"-Bibliothek stellt in etwa gleiche Funktionen und Syntax wie "Serial()"-Bibliothek zur Verfügung.
                                    
SoftwareSerial softSerial(1, 2); // Pin D7 ist Rx, Pin D10 ist Tx.

// Variablen definieren und initialisieren
char inData[800]; // Allocate some space for the string
const char* inChar = ""; // Where to store the character read
const char checkChar = '!';
int index = 0;
String Rx1String ="";

void setup()
{
  // initialisieren der seriellen Schnittstelle des Arduino.
  Serial.begin(9600);
  Serial.println("Serial interface ready for action");
  softSerial.begin(9600); // 6900 bit/s, es werden immer 8 bit pro Zeichen eingelesen (ggf. ist das oberste bit (MSB)das Parity-bit)
//  softSerial.println("softSerial interface ready"); // nur, wenn auch Daten an "softSerial" gesendet werden können
  
}

void loop()
{
  while (softSerial.available() >0) // Don't read unless
    // there you know there is data
  {
      inChar = softSerial.read(); // Read a character
      inChar &= B01111111;
      inData[index] = inChar; // Store it
      index++; // Increment where to write next

      if (inChar == checkChar){
        Serial.print("Vollständig  ");
        Serial.println(strlen(inData));
        Serial.println();
     //   index++;
      //  inData[index] = '\0';
        for (int i=0; i <= (strlen(inData)); i++){
          Serial.print(inData[i]);
        }
        Serial.println();
        Serial.println();
        Serial.println();
        
        Serial.print("ZaehlerStand: ");
        for (int x=69; x <= 84; x++){
          Serial.print(inData[x]);
        }
        Serial.println(" KWh");
        
        Serial.print("L1: ");
        for (int x=109; x <= 117; x++){
          Serial.print(inData[x]);
        }
        Serial.println(" Watt");
        
        Serial.print("L2: ");
        for (int x=140; x <= 148; x++){
          Serial.print(inData[x]);
        }
        Serial.println(" Watt");

        Serial.print("L3: ");
        for (int x=171; x <= 179; x++){
          Serial.print(inData[x]);
        }
        Serial.println(" Watt");

        Serial.print("Gesamt: ");
        for (int x=201; x <= 209; x++){
          Serial.print(inData[x]);
        }
        Serial.println(" Watt");
        Serial.println();
        Serial.println();
        Serial.println();
        
        int index = 0;
        memset(inData, 0, sizeof(inData));
        inChar = "";
       }
    }


  }

Fehlermeldungen:

Arduino: 1.8.5 (Windows 7), Board: "NodeMCU 1.0 (ESP-12E Module), 80 MHz, 4M (1M SPIFFS), v2 Prebuilt (MSS=536), Disabled, None, 115200"

TestZaehler3.1:10: error: 'int index' redeclared as different kind of symbol

 int index = 0;

     ^

In file included from C:\Users\Tacker\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0/tools/sdk/libc/xtensa-lx106-elf/include/stdlib.h:11:0,

                 from C:\Users\Tacker\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0\cores\esp8266/Arduino.h:27,

                 from sketch\TestZaehler3.1.ino.cpp:1:

C:\Users\Tacker\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0/tools/sdk/libc/xtensa-lx106-elf/include/string.h:54:15: error: previous declaration of 'char* index(const char*, int)'

 char  *_EXFUN(index,(const char *, int));

               ^

C:\Users\Tacker\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0/tools/sdk/libc/xtensa-lx106-elf/include/_ansi.h:65:30: note: in definition of macro '_EXFUN'

 #define _EXFUN(name, proto)  name proto

                              ^

C:\Users\Tacker\Documents\Arduino\TestZaehler3.1\TestZaehler3.1.ino: In function 'void loop()':

TestZaehler3.1:28: error: invalid conversion from 'int' to 'const char*' [-fpermissive]

       inChar = softSerial.read(); // Read a character

                                ^

TestZaehler3.1:29: error: invalid operands of types 'const char*' and 'int' to binary 'operator&'

       inChar &= B01111111;

              ^

TestZaehler3.1:29: error: in evaluation of 'operator&=(const char*, int)'

TestZaehler3.1:30: error: invalid types 'char [800][char*(const char*, int)]' for array subscript

       inData[index] = inChar; // Store it

                   ^

TestZaehler3.1:31: error: ISO C++ forbids incrementing a pointer of type 'char* (*)(const char*, int)' [-fpermissive]

       index++; // Increment where to write next

            ^

TestZaehler3.1:31: error: lvalue required as increment operand

TestZaehler3.1:33: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

       if (inChar == checkChar){

                     ^

exit status 1
'int index' redeclared as different kind of symbol

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Danke
Gruß Tacker

Ihm schein Deine globale Variable index nicht zu gefallen, da sie in LIbs schon verwendet wird. Benenne sie in Deinem Sketch an allen Stellen um.

Oft hilft es, die Fehlermeldung duch ein Übersetzungsprogramm, z.B. deepl zu schicken, wenn man sie so nicht versteht.

Gruß Tommy

Du hast im Deklarationsteil "int index = 0;" und im Loop nochmals.
Änder im Loop mal in "index = 0;"

Tommys Tip könnte es aber auch sein :wink:

Lokale Variablen überdecken globale.
Ohne jede Meldung.

Ok, das wusste ich auch noch nicht.
Wieder ein guter Tag: hab was gelernt :wink:

wollte mich kurz eben melden, nachdem ich es heute testen konnte.

Also die beiden Tipps, waren die Punktlandung.

Zum einen, das umbenennen der globalen Variablen und zum anderen, was ich aber durch
die letzte nach dem umbenennen noch auftretende Fehlermeldung schon erfahren hatte
das schreiben des index ="" in index = 0 zu ändern und natürlich da hatte ich einen falschen Stand
gepostet nicht int index = 0

Also es kompiliert durch und läd auch hoch!

Top! Danke schön!

Mal ehrlich, wenn man sowas noch nicht gehabt hat, kommt man doch nicht darauf, dass die Benennung
der Variablen im Sketch mit boardspezifischen Libs kollidieren.

Aber ich kann mich Moko anschließen, ein guter Tag, wieder etwas dazu gelernt!

Danke

Nun nur noch die Daten per WLAN in iobroker und es sollte laufen

Danke

Gruß Tacker

AingTii:
Mal ehrlich, wenn man sowas noch nicht gehabt hat, kommt man doch nicht darauf, dass die Benennung
der Variablen im Sketch mit boardspezifischen Libs kollidieren.

Das hat Dir doch der Compiler erkärt. Du hast ihn nur nicht verstanden.

Gruß Tommy

Mal ehrlich, wenn man sowas noch nicht gehabt hat, kommt man doch nicht darauf, dass die Benennung
der Variablen im Sketch mit boardspezifischen Libs kollidieren.

Oh doch....
Von Generationen von Compilerentwicklern, Lehrern und Anwendern der Sprachen, wurden große Anstrengungen unternommen, um das Thema "Sichtbarkeit von Elementen" ausschweifend zu beackern.

Die "Lehre des wahren Tuns", sagt ganz klar, dass ein solcher universeller Begriff "index" nichts in der öffentlichen Schnittstelle eine Library zu suchen hat.
Sowas sollte in einer tieferen Schicht der Sichtbarkeiten liegen, da wo es auch verwendet wird..

Wohl nur eine Fahrlässigkeit, oder so....

Okay, das mag für Euch klar sein und wahrscheinlich habt Ihr programmieren studiert etc....

Ich glaube wenn alle Programmieren könnten, bräuchte man so ein Forum ja nicht..... :wink:

Aber ich denke grad um Arduino Bereich wird es viel geben die es nicht aus dem FF können und viel
Zusammensuchen, erlesen, erfragen, probieren und noch aus Fehlern lernen, da zähle ich mich
zu....

Nichts desto trotz habe ich die Teile des Sketches von schlauen Webseiten und mir absolut keine Gedanken
gemacht darüber, ob ich die Variablen umbenennen muss, weil ja alles Problemlos ohne Meckerei des
Compilers lief als ich es auf einem Uno getestet habe.

Und ja, ich kann die Fehlermeldungen nicht eindeutig verstehen, zumindest sehe ich dort nichts
in englisch was mir sagt es gibt diese Variable bereits in einer System-lib des baords....

Aber das nur nebenbei....

Ich bin wieder ein Stück weiter, und er sendet das ganze per wifi an ioBroker.
Und habe das ganze noch reduziert auf einen esp8266-01 gepackt.
auch das funktioniert es jetzt..

Danke noch mal für die Tipps und den lehrreichen Tag in meiner Hoffnung mal soweit zu sein, dass ich ebenso Tipps geben kann.

Danke
Gruß Tacker

Und ja, ich kann die Fehlermeldungen nicht eindeutig verstehen, zumindest sehe ich dort nichts
in englisch was mir sagt es gibt diese Variable bereits in einer System-lib des baords....

Dann zeige ich mal direkt mit dem Finger darauf:

: error: previous declaration of 'char* index(const char*, int)'

Dort ist der eindeutige Hinweis auf eine vorherige Deklaration.
Mit Angabe von Datei, Zeile und Position in der Zeile.

Viel ausführlicher geht es nicht mehr, glaube ich.....
Zumindest wüsste ich nicht wie.

Okay habe es verstanden, habt gnade mit mir… ::slight_smile:

da ich allerdings unsaubere Daten und Aussetzter bekommen habe, habe ich das ganze nocch mal angepasst
und bekomme promt das nächste um die Ohren gehauen…

Und hoffe nun dass Ihr wieder so net seid und mich dezent mit der Nase reinstupst :smiley:

Code:

#include <ESP8266WiFi.h>

// Variablen definieren und initialisieren
char inData[600]; // Allocate some space for the string
char inputchar = 0; // Where to store the character read
char checkChar = '!';
byte zaehler = 0;
float verbrauch = 0;
float geliefert = 0;
float phaseL1 = 0;
float phaseL2 = 0;
float phaseL3 = 0;
float gesamt = 0;

const char* ssid = "xxx";
const char* password = "xxx"; // mit \ maskiert
const char* Wifi_hostname = "Stromzaehler1";

IPAddress ip(192, 168, 5, 183);                                        // IP Address
IPAddress gateway(192, 168, 5, 1);                                         // gateway fürs Netzwerk
IPAddress dns(192, 168, 5, 1);                                         // dns fürs Netzwerk
IPAddress subnet(255, 255, 255, 0);                                       // subnet mask fürs Netzwerk

const char* host = "192.168.5.90";
const int httpPort = 8087;

void setup()
{
  // initialisieren der seriellen Schnittstelle des Arduino.
  Serial.begin(115200);

  // Connect to WiFi
  WiFi.hostname(Wifi_hostname);
  WiFi.begin(ssid, password);
  WiFi.config(ip, dns, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Print the IP address
  Serial.println(WiFi.localIP());

  // Logging data to cloud
  Serial.print("Connecting to ");
  Serial.println(host);
}

void loop()
{
  while (Serial.available() > 0) // Don't read unless
    // there you know there is data
  {
    inputchar = Serial.read(); // Read a character
    inputchar &= B01111111;
    inData[zaehler] = inputchar; // Store it
    zaehler++; // Increment where to write next

    if (inputchar == checkChar) {
    zaehler+1;
    inData[zaehler] = '\0';

      Serial.write(inData);
      Serial.println();
      sender();
    }
  }
}


void sender() {
  // Use WiFiClient class to create TCP connections
  WiFiClient client;

  if (!client.connect(host, httpPort)) {
    return;
  }
  char* pointVerbrauch = strstr(inData, ":1.8.0*255(");
  float verbrauch = atof(pointVerbrauch + 11);
  client.print(String("PUT /set/.Meine_Geraete.P.2_EG.1_HW.Stromzaehler_Stand?value=") + verbrauch + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  Serial.print("Verbrauch gesendet:");
  Serial.println(verbrauch);

  char* pointGeliefert = strstr(inData, ":2.8.0*255(");
  float geliefert = atof(pointGeliefert + 11);
  client.print(String("PUT /set/.Meine_Geraete.P.2_EG.1_HW.Stromzaehler_Geliefert?value=") + geliefert + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  Serial.print("Geliefert gesendet:");
  Serial.println(geliefert);

  char* pointL1 = strstr(inData, ":21.7.255*255(");
  float phaseL1 = atof(pointL1 + 14);
  client.print(String("PUT /set/.Meine_Geraete.P.2_EG.1_HW.Stromzaehler_L1?value=") + phaseL1 + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  Serial.print("PhaseL1 gesendet:");
  Serial.println(phaseL1);



  char* pointL2 = strstr(inData, ":41.7.255*255(");
  float phaseL2 = atof(pointL2 + 14);
  client.print(String("PUT /set/.Meine_Geraete.P.2_EG.1_HW.Stromzaehler_L2?value=") + phaseL2 + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  Serial.print("haseL2 gesendet:");
  Serial.println(phaseL2);


  char* pointL3 = strstr(inData, ":61.7.255*255(");
  float phaseL3 = atof(pointL3 + 14);
  client.print(String("PUT /set/.Meine_Geraete.P.2_EG.1_HW.Stromzaehler_L3?value=") + phaseL3 + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  Serial.print("haseL3 gesendet:");
  Serial.println(phaseL3);

  char* pointGesamt = strstr(inData, ":1.7.255*255(");
  float gesamt = atof(pointGesamt + 13);
  client.print(String("PUT /set/.Meine_Geraete.P.2_EG.1_HW.Stromzaehler_Gesamt?value=") + gesamt + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  Serial.print("Gesamt gesendet:");
  Serial.println(gesamt);

  // This will send the request to the server


  delay(10);
  zaehler = 0;
  Serial.flush();
  memset(inData, 0, sizeof(inData));

  // Read all the lines of the reply from server and print them to Serial
  while (client.available()) {
    String line = client.readStringUntil('\r');
  }
  //delay(5000);
  //  adresse = "";
  //  wert = "";
  //  eingang = "";
}

ich habe da schon einiges ausprobiert, das senden direkt mit in den Loop usw.
alles raus und nur Serial, festzustellen ist, dass es anscheinend an denZeilen
mit atoi() oder atof() hakt: atoi natürlich mit int

float verbrauch = atof(pointVerbrauch + 11);

was serial ankommt ist:

¯ÅSY5Ñ3DA±00´ V3.0²?
?
±-0:0.0.0ª²55(0²·300600±²²´©?
±-0:±.¸.0ª²55(0003·¸¸5.53²²±´´ªë×è©?
±-0:²±.·.²55ª²55(00²±·¸.·3ª×©?
±-0:´±.·.²55ª²55(000±9¸.33ª×©?
±-0:6±.·.²55ª²55(00030¸.¸²ª×©?
±-0:±.·.²55ª²55(00²6¸5.¸¸ª×©?
±-0:96.5.5ª²55(¸²©?
0-0:96.±.²55ª²55(±ÅSY±00600±²²´©?

?!

Fehlermeldung die Serial wieder zurückkommt:

06001224)?  ?!V3.02? ? 1-0:0.0.0*255(0273006001224)? 1-0:1.8.0*255(00037885.5322144*kWh)? 1-0:21.7.255*255(002178.73*W)? 1-0:41.7.255*255(000198.33*W)? 1-0:61.7.255*255(000308.82*W)? 1-0:1.7.255*255(002685.88*W)? 1-0:96.5.5*255(82)? 0-0:96.1.255*255(1ESY10
Verbrauch gesendet:37885.53

Exception (28):
epc1=0x40205ab2 epc2=0x00000000 epc3=0x00000000 excvaddr=0x0000000b depc=0x00000000

ctx: cont 
sp: 3fff00e0 end: 3fff03c0 offset: 01a0

>>>stack>>>
3fff0280:  00000000 000003ff fffc0000 3ffef364  
3fff0290:  3ffeeedc 3ffe84dc 4713fd88 00000000  
3fff02a0:  0000000b 3fff1ebc 00000001 3fff1c34  
3fff02b0:  3ffe8304 00000000 3ffe8880 40204458  
3fff02c0:  3ffef300 00000209 00000209 00000007  
3fff02d0:  3ffef364 00000003 3ffef364 40203a13  
3fff02e0:  3ffe8880 00000001 00000000 40204458  
3fff02f0:  3ffef364 400cffff fff70000 4713fd88  
3fff0300:  3ffe84dc 00000008 3ffef364 402038c9  
3fff0310:  3ffe8904 3ffeeedc 3ffef364 4713fd88  
3fff0320:  3ffe84dc 3ffeeedc 3ffef364 4020680c  
3fff0330:  3ffe84dc 3ffeeedc 3ffef364 402046f4  
3fff0340:  3ffe8b1c 3ffeeedc 3ffef364 402024ff  
3fff0350:  3ffe8d20 00000000 00001388 3ffef390  
3fff0360:  00000000 3fff19fc 00000000 00000000  
3fff0370:  00000000 00000000 00000000 00000000  
3fff0380:  3ffe8e50 00000000 3ffef364 3ffef390  
3fff0390:  3fffdad0 3ffeeedc 3ffef364 40202804  
3fff03a0:  3fffdad0 00000000 3ffef388 402040f0  
3fff03b0:  feefeffe feefeffe 3ffef3a0 40100710  
<<<stack<<<

 ets Jan  8 2013,rst cause:1, boot mode:(3,2)

load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v4ceabea9
~ld
.
WiFi connected
192.168.5.183
Connecting to 192.168.5.90

Das ganze nur auf Serial Basis ohne wifi läuft auf einen Uno Problemlos, aber aus dem ESP8266-01 kommt die Meldung.

Habt Ihr einen Tipp für mich?

Danke
Gruß Tacker

AingTii:
Habt Ihr einen Tipp für mich?

Arduino ESP8266/ESP32 Exception Stack Trace Decoder

Gruß Fips

danke,

allerdings wenn diese Fehlermeldung nicht wäre, würde es bestimmt gehen

ERROR: xtensa-lx106-elf-gdb.exe not found!

naja und weil man nach Suchen im Internet rausfindet, wie man die .exe einfügt....

bekommt man dann:
Decode Failed

So, nach vielem Probieren, ändern probieren usw.
ist mir aufgefallen, dass der zweit wert den ich Abfrage in dem Eingangstext gar nicht
vorhanden ist, ich wollte es universell machen für Ein-Richtung und Zwei-Richtungszähler.

Also hat er sich aufgehangen, da er ":2.8.0*255" nicht gefunden habe.

Lösung: erst abfragen ob es vorhanden ist, wenn dem so ist dann auslesen

     if (strstr(inData, ":2.8.0*255(")) {
        char* pointGeliefert = strstr(inData, ":2.8.0*255(");
        geliefert = atof(pointGeliefert + 11);
      }

so kann man auch seine Freizeit verplempern, um nach fast einer Woche den Aha Effekt zu erhalten.

Gruß Tacker

Wieso Freizeit verplempern?
Wenn du das als Hobby machst, ist doch auch der Weg zum Ziel Teil des Hobbies. Oder sogar das Hobby selbst.

Wenn du das beruflich machst, wieso dann in der Freizeit?

ja, da hast Du recht.

Verplempern nur weil es schussendlich so etwas simples war....
zumal ja der Uno die Probleme nicht hatte...

Und den Ehrgeiz es lösen zu wollen, wäre ich auch nicht so weit...
nich beruflich, Hobby Programmierer, Bastler, Tütfer und Hausautomatisierer..... :wink: