Variablen-Typ feststellen

Ich frage beim ESP Wifi Start die lokale IP Adresse mit WiFi.localIP() ab.

Mit Serial.println(WiFi.localIP()); wird auch die korrekte IP angezeigt.

Ich möchte diese im OLED angezeigt bekommen. Zwecks Unterprogrammaufruf müsste ich die WiFi.localIP() in ein String umwandeln.

Bei "String(WiFi.localIP());" kommt nur totaler Quatsch raus.

Wie kann ich den Variablentyp von WiFi.localIP() feststellen und ihn richtig umwandeln?

.
.
void WiFiStart()                              // Unterprogramm um WiFi am Router anzumelden
{
  // Connect to WiFi network
  Scroll("Call to " + String(ssid));                      //Unterprogramm aufrufen um String in Display zu schreiben
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  
  Scroll("WiFi connected       ");                      //Unterprogramm aufrufen um String in Display zu schreiben
    
  // Start the server
  server.begin();
  Scroll("Server started       ");                      //Unterprogramm aufrufen um String in Display zu schreiben

  // Print the IP address
  //Serial.println(WiFi.localIP());
  Scroll(String(WiFi.localIP()));                       //Unterprogramm aufrufen um String in Display zu schreiben
}

.
.
.

void Scroll(String ScrollString)  {     //Unterprogramm um Display zu hochrückend zu beschreiben
  Zeile1 = Zeile2;
  Zeile2 = Zeile3;
  Zeile3 = Zeile4;
  Zeile4 = Zeile5;
  Zeile5 = Zeile6;
  Zeile6 = Zeile7;
  Zeile7 = Zeile8;
  Zeile8 = (ScrollString);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println(Zeile1);
  display.println(Zeile2);
  display.println(Zeile3);
  display.println(Zeile4);
  display.println(Zeile5);
  display.println(Zeile6);
  display.println(Zeile7);
  display.println(Zeile8);
  display.display();
}

Ich habe mit den ESP bisher noch nichts gemacht, aber vermutet, dass du es einem Char übergeben musst.

Du meinst: Im Unterprogramm nicht String sondern Char zur Übergabe verwenden?

Dann müsste ich alle anderen außer WiFi.localIP() erst zu char umwandeln.

Wäre es nicht besser char WiFi.localIP() zu string umzuwandeln?
Geht das? Hab bisher noch nix dazu gefunden...

Ich glaube das ist ein Gebilde "IPAdress" aus 4 byte, auf die du per Index zugreifen kannst.

Ah, Index! :grin:

Wie greife ich per Index auf WiFi.localIP() zu?

Meinst du sowas?

Hab dazu noch sowas gefunden.

Könntest Recht haben. Muss ich mal testen...

IPAddress ist eine Klasse die ein Byte Array enthält:

class IPAddress : public Printable {
private:
    union {
 uint8_t bytes[4];  // IPv4 address
 uint32_t dword;
    } _address;

....

Der Subkript Operator ist überladen so dass man das wie ein Array verwenden kann

Durch das Printable Interface sollte es aber direkt druckbar sein. Lasse also den Quatsch mit der String Klasse weg (wie so oft macht die nur alles schlimmer) und mache einfach das:

lcd.print(WiFi.localIP());

Das geht wenn deine OLED Klasse von der Arduino Print Klasse abgeleitet ist. Es ist auch vielleicht möglich dass das eine eigene Methode hat die nur zufällig println() heißt. Dann geht es nicht.

Und um ein IPAdress Objekt an eine Funktion zu übergeben (die Dinger heißen Funktionen. Nicht Unterprogramme) nimmst du einfach IPAddress& oder Printable& als Parameter. Also eine Referenz darauf.

Du hast es wieder geschafft Serenifly:

Bei mir glüht es wieder zwischen den Ohren! :grin:

Und um ein IPAdress Objekt an eine Funktion zu übergeben (die Dinger heißen Funktionen. Nicht Unterprogramme - ja, sorry) nimmst du einfach IPAddress& oder Printable& als Parameter. Also eine Referenz darauf.

Hat jemand einen link für mich wo das mit der Referenz erklärt wird?
Ich weiß nicht so recht was ich bei google eingeben soll...

Du kannst, wenn deine Lcd lib das
lcd.print(WiFi.localIP());
nicht unterstützt, in einen PString (16 char groß) streamen und dann das zugrundeliegende char array aufs Display schicken.

Suchst du Streaming Lib, PString Lib

Da ist es fast einfacher man greift mit auf die einzelnen Bytes zu und schreibt diese einzeln mit '.' dazwischen

Viele Wege führen nach Rom. Und die beiden Libs habe ich aus Bequemlichkeit fast sowieso überall drin.

Wobei ich da sowieso etwas auf dem falschen Weg war. Ich hatte übersehen dass es nicht nur darum geht ein IPAddress Objekt anzuzeigen. Sondern es soll auch Zwecks Scrollen als String dauerhaft gespeichert werden. Egal ob String Objekt oder C String/char Array.

Dazu will man dann doch kein IPAddress Objekt an eine Funktion übergeben. Sondern dessen String Darstellung.

Für char Arrays wäre dann die PString Library recht nützlich. Man kann es aber auch mit s(n)printf() und für die einzelnen Bytes machen.
Bei der String Klasse kann man einfach mit + konkatenieren.

IPAddress ip = WiFi.localIP() für die Adresse. Und dann ip[0], ip[1], etc. für die einzelnen Bytes

Bin ja erst mal beruhigt, das es wohl doch nicht ganz so einfach ist.

Hier wurde auch darüber diskutiert. Muss ich mir erst mal alles verdauen - als Anfänger tut man sich da noch schwehr...

char myIpString[24];
void setup() {
    IPAddress myIp = WiFi.localIP();
    sprintf(myIpString, "%d.%d.%d.%d", myIp[0], myIp[1], myIp[2], myIp[3]);
    Spark.variable("ipAddress", myIpString, STRING);
}

Der code soll wohl funktionieren. Ich versteh ihn aber noch nicht und kann ihn daher noch nicht auf mein Problem anwenden. Ich gebe mir Mühe...

ElEspanol:
Du kannst, wenn deine Lcd lib das
lcd.print(WiFi.localIP());
nicht unterstützt, in einen PString (16 char groß) streamen und dann das zugrundeliegende char array aufs Display schicken.

Suchst du Streaming Lib, PString Lib

So wie ich das verstehe wird statt auf's Display in ein String geprintet und dies kann ich weiterverarbeiten?!
Muss ich auch noch mal näher betrachten...

Wenn ich #include <PString.h) wrede ich schon angemeckert. Ohne PString zu verwenden…

Build-Optionen wurden verändert, alles wird neu gebaut
In file included from SprengerZentraleESPnodeMCU_OLED128x64-26.ino:16:0:
C:\Users\CarstenTower\Documents\Arduino\libraries\PString/PString.h:31:16: error: conflicting return type specified for 'virtual void PString::write(uint8_t)'
   virtual void write(uint8_t);
                ^
In file included from C:\Users\CarstenTower\Documents\Arduino\libraries\PString/PString.h:20:0,
                 from SprengerZentraleESPnodeMCU_OLED128x64-26.ino:16:
C:\Users\CarstenTower\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0\cores\esp8266/Print.h:55:24: error:   overriding 'virtual size_t Print::write(uint8_t)'
         virtual size_t write(uint8_t) = 0;
                        ^
Fehler beim Kompilieren.

Hab mich hier orientiert. Arbeite mit dem ESP nodeMCU.

stoni99:
So wie ich das verstehe wird statt auf’s Display in ein String geprintet und dies kann ich weiterverarbeiten?!

Genau. Der PString hat einen eigenen Namen unter dem man ein “dahinterliegendes” char Array bearbeiten kann. Allerdings muss man aufpassen, da die Größe auf die Größe des Array beschränkt ist.

char myIpString[24];
PString PmyIpString(myIpString,24);

PmyIpString << WiFi.localIP();
lcd.print(myIpString);

Alles was mehr als 23 Zeichen reingestreamt wird, wird verworfen. Ich benutze einen größeren Buffer immer wieder zum reinstreamen, dann muss man am Anfang
PmyIpString="";
machen, um den String zu leeren. Weil beim streaming wird eben allen hinten angehängt.

error: conflicting return type

Da passen Versionen von libraries nicht zusammen.

alt: void write (...);
neu: size_t write(...); // liefert die Anzahl ausgegebener Zeichen zurück

Und da jedes write das virtuelle Print::write überlädt, muss die Version von PString mit der von Print übereinstimmen.

stoni99:
Wenn ich #include <PString.h) wrede ich schon angemeckert. Ohne PString zu verwenden…

Hab mich hier orientiert. Arbeite mit dem ESP nodeMCU.

Die Beispiele sind gut. Kompiliert es den als UNO?

Ich vermute: Ja, Uno wird gehen. Da hab ich ja nicht die Libs vom ESP drin. Wird es wohl auch keinen Lib Konflikt geben.
Muss ich aber noch testen…

Im ESP:

#include <Time.h>
#include <TimeAlarms.h>
#include <ESP8266WiFi.h>
#include <Wire.h>                                         //I2C Anschlüsse
#include <SPI.h>                                          //OLED
#include <Adafruit_GFX.h>                                 //OLED
#include <Adafruit_SSD1306.h>                             //OLED

#define OLED_RESET 4                                      //OLED
Adafruit_SSD1306 display(OLED_RESET);                     //OLED
#define NUMFLAKES 10                                      //OLED
#define XPOS 0                                            //OLED
#define YPOS 1                                            //OLED
#define DELTAY 2                                          //OLED
#define LOGO16_GLCD_HEIGHT 16                             //OLED
#define LOGO16_GLCD_WIDTH  16                             //OLED
#if (SSD1306_LCDHEIGHT != 64)                             //OLED
#error("Height incorrect, please fix Adafruit_SSD1306.h!");           //OLED
#endif                                                                //OLED

Nöö, geht auch nicht. :sob:

Hab in einen “leeren” sketch #include <PString.h> eingefügt. Gibt beim ESP als auch am Uno die Fehlermeldung.

PString kann mich nicht leiden… (hab dem PString eigentlich nie was getan) :grin:

Hab diese in meinen Lib Ordner geladen. (.cpp und .h)