Mal wieder eine Tankstellenfrage (gelöst)

Ein nettes Hallo und guten Abend in die Runde,
es ist schon ne weile her aber der ein oder andere erinnert sich noch an das Rennbahnprojekt. Es läuft immer noch und alle Besucher die es gesehen haben sind begeistert..... Ich auch :smiley:

Nun nach Balkonkraftwerk, OpenDtu hatte ich mal wieder die Lust verspürt zu Basteln.
Es sollte eine Tankstelle für die o.g. Rennbahn werden und unter den geilen Projekten hab ich eine Abfrage der Spritpreise mit dem ESP32 gesehen.

Gesehen und für "Will Haben" befunden. Gezeichnet, gedruckt, zusammengebaut...s.Foto's
Nu bin ich ein kleiner Perfektionist in Sachen Optik. Und da tauchen die ersten Probleme auf. Als Startbild bekomme ich es hin wie ich's gern hätte, aber dann ist auch Schluss. Hab's versucht mit zurückspringen und die große "9" zu löschen was aber nicht funktioniert.(Zeile 193)

Aber da ist ja noch das andere Problem, wie bekomme ich auf dem Json String den Spritpreis in eine Floatzahl gewandelt? Hintergrund, ich möchte gern den Preis von Superplus darstellen. Dieser liegt in den letzten Monaten immer um genau 0,09 Cent höher als Super E5. Daher würde ich gern den e5 Preis mit den 0,09 addieren.

Wenn das mit der Floatzahl klappt hätte ich auch das erste Problem gelöst, denn dann könnte ich mir nur 2 Stellen nach dem Komma anzeigen lassen.

Also geht es um die Frage, wie komme ich an die Floatzahl von den Spritpreisen aus dem Json String? Hat einer schonmal so was gemacht und würde es mir verraten.

Hier der Code zu den Bildern...

/*
  Dieser Sketch ermöglicht die Anzeige der aktuellen Spritpreise auf 4 einzelne OLED SSD1306 128x32 (0,91 Quer) über einen Multiplexer.
  Die Größe der Anzeige ist für eine Rennbahn in 1:24 sehr gut geeignet.
  Der Empfang aktueller Spritpreise erfolgt über einen ESP32 von der Webseite https://creativecommons.tankerkoenig.de/
  Hier kann nach Registierung der entsprechende (kostenlose) API-Key angefordert und die ID einer Tankstelle nach freier Wahl ermittelt werden.
  Die Verbindung zwischen ESP 32 und dem SSD1306 Display erfolgt über I2C.
  IO21 -> SDA
  IO22 -> SCL

*/

#include <WiFi.h>
#include <WiFiClient.h>
#include <Wire.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
#include <U8g2lib.h>          // OLED
#define U8G2_16BIT            // setzen der 16bit Verison
#define TCA9548A 0x70         // Multiplexer



void tcaselect(uint8_t i) {
  if (i > 7) return;
  Wire.beginTransmission(TCA9548A);
  Wire.write(1 << i);
  Wire.endTransmission();
}

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R2, U8X8_PIN_NONE);//R1 dreht das Display um 90 Grad zum Hochformat

// WLAN Zugangsdaten
const char* ssid = " ";
const char* password = " ";


/*
     Dein persönlicher Tankerkoenig ApiKey und die abzufragende TankstellenID
*/

String TankerkoenigApiKey = " ";
String TankstellenID = "005056ba-7cb6-1ed2-bceb-b56667210d48";//Star Ronsdorferstrasse
//String TankstellenID = "51d4b50d-a095-1aa0-e100-80009459e03a";// Jet Hahnerberger

/*
     RootCA von Tankerkoenig
*/

const char* root_ca = \
                      "-----BEGIN CERTIFICATE-----\n" \
                      "MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n" \
                      "TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n" \
                      "cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n" \
                      "WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n" \
                      "ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n" \
                      "MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n" \
                      "h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n" \
                      "0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n" \
                      "A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n" \
                      "T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n" \
                      "B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n" \
                      "B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n" \
                      "KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n" \
                      "OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n" \
                      "jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n" \
                      "qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n" \
                      "rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n" \
                      "HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n" \
                      "hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n" \
                      "ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n" \
                      "3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n" \
                      "NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n" \
                      "ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n" \
                      "TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n" \
                      "jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n" \
                      "oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n" \
                      "4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n" \
                      "mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n" \
                      "emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n" \
                      "-----END CERTIFICATE-----\n";



/*
    Abfragetimer, laut Nutzungsbedingungen darf die API alle 5 Minuten abgefragt werden
*/

void setup(void) {

  Serial.begin(115200);
  Wire.begin();

  for (int i = 0; i <= 7; i++)
  {
    tcaselect(i);
    u8g2.begin();                                  // startet die möglichen 8Stück SSD1306 128x32 Display's
  }

  {
    tcaselect(2);                                  // OLED-1 von oben DIESEL
    u8g2.clearBuffer();                            // Lösche den Inhalt im Buffer
    u8g2.setFontMode(0);                           // Aktivierung das Transparentmodus
    u8g2.setFont(u8g2_font_5x7_mr);                // setzen der Font-Größe für Anzeige der Benzinsorte
    u8g2.drawStr(0, 6, "Diesel");                  // Benzinsorte anzeigen
    u8g2.setFont(u8g2_font_courB24_tf);            // setzen der Font-Größe für Anzeige des Einschalt-Preises zwei Stellen nach Komma
    u8g2.drawStr(12, 32, "0.00");                  // Einschaltpreis
    u8g2.setFont(u8g2_font_courB14_tf);            // setzen der Font-Größe für Anzeige des Einschalt-Preises dritte Stelle nach Komma
    u8g2.drawStr(93, 22, "9");                     // Die Blödsinnige 0,009 bei Spritpreisen man könnte auch aufrunden :-)
    u8g2.sendBuffer();                             // sende die Inhalte an Oled-1

    tcaselect(3);                                  // OLED-2 von oben SUPER E5
    u8g2.clearBuffer();
    u8g2.setFontMode(0);
    u8g2.setFont(u8g2_font_5x7_mr);
    u8g2.drawStr(0, 6, "SUPER E5");
    u8g2.setFont(u8g2_font_courB24_tf);
    u8g2.drawStr(12, 32, "0.00");
    u8g2.setFont(u8g2_font_courB14_tf);
    u8g2.drawStr(93, 22, "9");
    u8g2.sendBuffer();

    tcaselect(4);                                  // OLED-3 von oben SUPER E10
    u8g2.clearBuffer();
    u8g2.setFontMode(0);
    u8g2.setFont(u8g2_font_5x7_mr);
    u8g2.drawStr(0, 6, "Super E10");
    u8g2.setFont(u8g2_font_courB24_tf);
    u8g2.drawStr(12, 32, "0.00");
    u8g2.setFont(u8g2_font_courB14_tf);
    u8g2.drawStr(93, 22, "9");
    u8g2.sendBuffer();

    tcaselect(1);                                  // OLED-4 von oben SUPERPLUS
    u8g2.clearBuffer();
    u8g2.setFontMode(0);
    u8g2.setFont(u8g2_font_5x7_mr);
    u8g2.drawStr(0, 6, "Super Plus");
    u8g2.setFont(u8g2_font_courB24_tf);
    u8g2.drawStr(12, 32, "0.00");
    u8g2.setFont(u8g2_font_courB14_tf);
    u8g2.drawStr(93, 22, "9");
    u8g2.sendBuffer();

  }

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
  Serial.println("Timer auf 5 Minuten gesetzt (timerDelay variable)");
  delay(2000);
}

void loop(void)
{
  preisanzeige();
}

void preisanzeige() {
  static unsigned long lastTime = 0;            // 5 Minuten (300000)
  const unsigned long timerDelay = 300000UL;    // Um die ersten 5 Minuten zu überspringen
  static bool skiptimer = true;

  if ((millis() - lastTime) > timerDelay || skiptimer == true) {     // sende eine HTTP GET Anforderung

    if (WiFi.status() == WL_CONNECTED) {                             // überprüfe die WLAN-Verbindung

      //String serverPath = "https://creativecommons.tankerkoenig.de/json/detail.php?id=" + TankstellenID + "&apikey=" + TankerkoenigApiKey;

      //String jsonBuffer = httpGETRequest(serverPath.c_str());
      String jsonBuffer = R"({"ok":true,"license":"CC BY 4.0 -  https:\/\/creativecommons.tankerkoenig.de","data":"MTS-K","status":"ok","station":{"id":"b29ff104-bdb2-43f7-b026-711c99f10b00","name":"Shell Niederwiesa Chemnitzer Str. 23","brand":"Shell","street":"Chemnitzer Str.","houseNumber":"23","postCode":9577,"place":"Niederwiesa","openingTimes":[{"text":"Mo-Fr","start":"05:00:00","end":"22:00:00"},{"text":"Samstag","start":"06:00:00","end":"22:00:00"},{"text":"Sonntag, Feiertag","start":"07:00:00","end":"22:00:00"}],"overrides":[],"wholeDay":false,"isOpen":false,"e5":1.949,"e10":1.889,"diesel":2.109,"lat":50.862693,"lng":13.008754,"state":null}})";
      Serial.println(jsonBuffer);
      JSONVar myObject = JSON.parse(jsonBuffer);

      if (JSON.typeof(myObject) == "undefined") {
        Serial.println("Parsing input failed!");
        return;
      }    


      tcaselect(2);                               // OLED 1 (Von Oben) DIESEL
      u8g2.clearBuffer();                         // Lösche den Inhalt im Buffer
      u8g2.setFont(u8g2_font_5x7_mr);             // setzen der Font-Größe für Anzeige der Benzinsorte
      u8g2.drawStr(0, 6, "Diesel");               // Benzinsorte anzeigen
      u8g2.setFont(u8g2_font_courB24_tf);         // setzen der Font-Größe für Anzeige des Einschalt-Preises 
      u8g2.setCursor(12, 32);                     // setzen des Cursers
      u8g2.print(myObject["station"]["diesel"]);  // Schreiben des Wertes sus dem augelesenen JSON-String
      u8g2.drawStr(93, 32, " ");                  // Versuch die letzte Stelle (9) zu löschen.... !!!!
      u8g2.setFont(u8g2_font_courB14_tf);         // setzen der Font-Größe für Anzeige des Einschalt-Preises dritte Stelle nach Komma
      u8g2.drawStr(93, 22, "9");                  // Zeige letze Stelle (9) klein und hoch an
      u8g2.sendBuffer();                          // Inhalt des internen Speicher auf das Display übertragen


      tcaselect(3);                               // OLED 2 (Von Oben)SUPER E5
      u8g2.clearBuffer();                         
      u8g2.setFont(u8g2_font_5x7_mr);             
      u8g2.drawStr(0, 6, "Super E5");
      u8g2.setFont(u8g2_font_courB24_tf);         
      u8g2.setCursor(12, 32);                  
      u8g2.print(myObject["station"]["e5"]);      // Schreiben des Wertes sus dem augelesenen JSON-String
      u8g2.setFont(u8g2_font_courB14_tf);
      u8g2.drawStr(93, 22, "9");
      u8g2.sendBuffer();                          

      tcaselect(4);                               // OLED 3 (Von Oben)SUPER E10
      u8g2.clearBuffer();                         
      u8g2.setFont(u8g2_font_5x7_mr);             
      u8g2.drawStr(0, 6, "Super E10");
      u8g2.setFont(u8g2_font_courB24_tf);         
      u8g2.setCursor(12, 32);                     
      u8g2.print(myObject["station"]["e10"]);     // Schreiben des Wertes sus dem augelesenen JSON-String
      u8g2.setFont(u8g2_font_courB14_tf);
      u8g2.drawStr(93, 22, "9");
      u8g2.sendBuffer();  


      tcaselect(4);                               // OLED 4 (Von Oben)SUPERPLUS
      /*                
       Hier soll der Preis errechnet werden da Tankerkönig diesen nicht liefert.
       Meist sind es 9 Cent mehr wie der Preis vom Super E5
                      
       */

    } else {

      u8g2.setFont(u8g2_font_5x7_mr);
      u8g2.setCursor(0, 6 );
      u8g2.print("Close");

      u8g2.sendBuffer();

    }
    skiptimer = false;
    lastTime = millis();
  }

}

String httpGETRequest(const char* serverName) {
  WiFiClient client;
  HTTPClient http;

  http.begin(serverName, root_ca);    // Domainname mit URL-Pfad oder IP-Adresse mit Pfad


  int httpResponseCode = http.GET();  // HTTP-POST-Anforderung senden

  String payload = "{}";

  if (httpResponseCode > 0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);

  }
  // Free resources
  http.end();

  return payload;
}


Vielen Dank

Guten Abend,

nutze doch einfach die ArduinoJSON Library GitHub - bblanchon/ArduinoJson: 📟 JSON library for Arduino and embedded C++. Simple and efficient.

Die sollte dir alles bieten, mit dem du den float aus deinem JSON String bekommst.

Das Beispiel zeigt eigentlich schon alles, was du benötigst.

Im Beispiel JasonParserExample.ino von Benoit Blanchon findet sich eine Zeile wie

double latitude = doc["data"][0];

Das sollte doch vielleicht mit der verwendeten Lib auch gehen:

double superE5 = myObject["station"]["e5"];

Dann den Wert z.B. mit sprintf und passendem Format für die zwei Nachkommastellen in einen C-String für die Ausgabe schreiben.

Falls das nicht geht, umstellen von Arduino_JSON.h auf ArduinoJson.h. Der Assistent bei Benoit erzeugt Beispielcode für jedes Element des JSON, den man passend plündern kann.

Dir auch ein nettes Hallo!

Versuche mal dies:

      tcaselect(5);                               // OLED 4 (Von Oben)SUPERPLUS
      /*                
       Hier soll der Preis errechnet werden da Tankerkönig diesen nicht liefert.
       Meist sind es 9 Cent mehr wie der Preis vom Super E5
                      
       */
      u8g2.clearBuffer();                         
      u8g2.setFont(u8g2_font_5x7_mr);             
      u8g2.drawStr(0, 6, "Super Plus");
      u8g2.setFont(u8g2_font_courB24_tf);         
      u8g2.setCursor(12, 32);                  
      u8g2.print(double(myObject["station"]["e5"]) + 0.09);      // Meist sind es 9 Cent mehr wie der Preis vom Super E5
      u8g2.setFont(u8g2_font_courB14_tf);
      u8g2.drawStr(93, 22, "9");
      u8g2.sendBuffer();                          

Anzeige:
image

Da Du ja nur Rennen fährst, um Arduino zu lernen ( :rofl: ), spendiere ich Dir noch eine Funktion für die Anzeige, womit Dein Programm schrumpft:

Programm mit ergänzter Funktion
void setup(void) 
{
  Serial.begin(115200);
  Wire.begin();

  for (int i = 0; i <= 7; i++)
  {
    tcaselect(i);
    u8g2.begin();                                  // startet die möglichen 8Stück SSD1306 128x32 Display's
  }
  anzeige(2, "Diesel", 0.0);      // OLED 1 (Von Oben) DIESEL
  anzeige(3, "Super E5", 0.0);    // OLED 2 (Von Oben) SUPER E5
  anzeige(4, "Super E10", 0.0);   // OLED 3 (Von Oben) SUPER E10
  anzeige(5, "Super Plus", 0.0);  // OLED 4 (Von Oben )SUPERPLUS

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
  Serial.println("Timer auf 5 Minuten gesetzt (timerDelay variable)");
  delay(2000);
}

void loop(void)
{
  preisanzeige();
}

void preisanzeige() {
  static unsigned long lastTime = 0;            // 5 Minuten (300000)
  const unsigned long timerDelay = 300000UL;    // Um die ersten 5 Minuten zu überspringen
  static bool skiptimer = true;

  if ((millis() - lastTime) > timerDelay || skiptimer == true) {     // sende eine HTTP GET Anforderung

    if (WiFi.status() == WL_CONNECTED) {                             // überprüfe die WLAN-Verbindung

      //String serverPath = "https://creativecommons.tankerkoenig.de/json/detail.php?id=" + TankstellenID + "&apikey=" + TankerkoenigApiKey;

      //String jsonBuffer = httpGETRequest(serverPath.c_str());
      String jsonBuffer = R"({"ok":true,"license":"CC BY 4.0 -  https:\/\/creativecommons.tankerkoenig.de","data":"MTS-K","status":"ok","station":{"id":"b29ff104-bdb2-43f7-b026-711c99f10b00","name":"Shell Niederwiesa Chemnitzer Str. 23","brand":"Shell","street":"Chemnitzer Str.","houseNumber":"23","postCode":9577,"place":"Niederwiesa","openingTimes":[{"text":"Mo-Fr","start":"05:00:00","end":"22:00:00"},{"text":"Samstag","start":"06:00:00","end":"22:00:00"},{"text":"Sonntag, Feiertag","start":"07:00:00","end":"22:00:00"}],"overrides":[],"wholeDay":false,"isOpen":false,"e5":1.949,"e10":1.889,"diesel":2.109,"lat":50.862693,"lng":13.008754,"state":null}})";
      Serial.println(jsonBuffer);
      JSONVar myObject = JSON.parse(jsonBuffer);

      if (JSON.typeof(myObject) == "undefined") {
        Serial.println("Parsing input failed!");
        return;
      }

      anzeige(2, "Diesel", double(myObject["station"]["diesel"]));         // OLED 1 (Von Oben) DIESEL
      anzeige(3, "Super E5", double(myObject["station"]["e5"]));           // OLED 2 (Von Oben)SUPER E5
      anzeige(4, "Super E10", double(myObject["station"]["e10"]));         // OLED 3 (Von Oben)SUPER E10
      //  Hier soll der Preis errechnet werden da Tankerkönig diesen nicht liefert. Meist sind es 9 Cent mehr wie der Preis vom Super E5
      anzeige(5, "Super Plus", double(myObject["station"]["e5"]) + 0.09);  // OLED 4 (Von Oben)SUPERPLUS

    } else {

      u8g2.setFont(u8g2_font_5x7_mr);
      u8g2.setCursor(0, 6 );
      u8g2.print("Close");
      u8g2.sendBuffer();
    }
    skiptimer = false;
    lastTime = millis();
  }
}

void anzeige(const byte oledNr, const char * sprit, const double preis)
{
  tcaselect(oledNr);
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_5x7_mr);
  u8g2.drawStr(0, 6, sprit);
  u8g2.setFont(u8g2_font_courB24_tf);
  u8g2.setCursor(12, 32);
  u8g2.print(preis);
  u8g2.setFont(u8g2_font_courB14_tf);
  u8g2.drawStr(93, 22, "9");
  u8g2.sendBuffer();
}

Ein fröhliches Hallo in die Runde und Tausend Dank an euch.
Ich werd verrückt.... es funktioniert :smiley:
Und genau so wie ich es mir vorgestellt habe....@agmue Dich muss ich einfach mal umarmen. :kissing_heart: :wink:

@wno158
vielleicht hätte ich es mit dem Tipp auch hinbekommen, hatte mit dem Assistent schon mal was gemacht für eine Mqtt Abfrage bei Zendure. Bin da aber hängen geblieben wegen zwei verschiedene Sn-Nummern der Akkus und den entsprechenden Werten. Der String ist dort auch nicht immer gleich....aber andere Baustelle. Aber Danke deine Hilfestellung.

Auch bei @Sikufan möchte ich nicht vergessen mich zu bedanken.

Nun kommt das kleine aber....
Der Befehl "double" scheint den Sprintpreis auf 2 Stellen hinter dem Komma aufzurunden, durch die dritte Stelle der 9 war der Preis um 1 Cent höher, daher musste ich vom Ergebnis 1 Cent abziehen.

      anzeige(2, "Diesel", double(myObject["station"]["diesel"])- 0.01);         // OLED 1 (Von Oben) DIESEL
      anzeige(3, "Super E5", double(myObject["station"]["e5"])- 0.01);           // OLED 2 (Von Oben)SUPER E5
      anzeige(4, "Super E10", double(myObject["station"]["e10"])- 0.01);         // OLED 3 (Von Oben)SUPER E10
      anzeige(1, "Super Plus", double(myObject["station"]["e5"]) + 0.08);        // OLED 4 (Von Oben)SUPERPLUS
      //  OLED 4 Hier wird der Preis errechnet werden da Tankerkönig diesen nicht liefert. Meist sind es 9 Cent mehr wie der Preis vom Super E5
      //  Durch die double Anweisung wird der Spritpreis auf 2 Stellen hinter dem Komma gerechnet und aufgerundet, daher wird 1 Cent abgezogen.
      //  Die dritte Stelle "9" wird als Zeichen dargestellt und nicht als Wert von den Spritpreisen 

Ansonsten seht selbst.....echt nice :heart_eyes:

Das hast Du schön hinbekommen - sieht aus wie im MiWuLa :slight_smile:

Und wenn Du jetzt so ein Spielkind wärst wie ich, würdest Du zufällig ("random") den Aufpreis vom SuperPlus zwischen 9 und 13 Cent schwanken lassen.

Das Runden hatte ich übersehen, ein ganzer Cent zu teuer :flushed:

Du kennst mich, ich bin pingelig, nicht double rundet, sondern print:

ergänzte Funktion
void anzeige(const byte oledNr, const char * sprit, const double preis)
{
  Serial.print("oledNr: "); Serial.print(oledNr);
  Serial.print("\tpreis 3 St.: "); Serial.print(preis, 3);
  Serial.print("\tpreis 2 St.: "); Serial.print(preis);
  Serial.print("\tpreis: "); Serial.print( int(100 * preis) / 100.0 );
  Serial.println();
  tcaselect(oledNr);
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_5x7_mr);
  u8g2.drawStr(0, 6, sprit);
  u8g2.setFont(u8g2_font_courB24_tf);
  u8g2.setCursor(12, 32);
  u8g2.print( int(100 * preis) / 100.0 );
  u8g2.setFont(u8g2_font_courB14_tf);
  u8g2.drawStr(93, 22, "9");
  u8g2.sendBuffer();
}

Ausgabe:

oledNr: 2	preis 3 St.: 2.109	preis 2 St.: 2.11	preis: 2.10
oledNr: 3	preis 3 St.: 1.949	preis 2 St.: 1.95	preis: 1.94
oledNr: 4	preis 3 St.: 1.889	preis 2 St.: 1.89	preis: 1.88
oledNr: 5	preis 3 St.: 2.039	preis 2 St.: 2.04	preis: 2.03

Ob Du das übernimmst, kannst Du Dir überlegen, mir geht es um's Verständnis.

Daher gefällst du mir auch :kissing_heart: :wink:

Nein ich nehme es dankend an das du mich darauf hinweist das es Print und nicht double ist. Denn, wie ich finde prägen sich solche Dinge dann besser ein wenn man von der eigenen Überzeugung den Fehler gefunden zu haben, von anderen verbessert wird. :wink:

.... welch frage. :grinning:

....ohh danke für's Kompliment :smiling_face:

Spielkind ja bin ich auch....aber es sollte der Preis stimmen da ich auch ein Auto fahre der diesen Sorte benötigt.(Aber nur im Sommer) Und in meinem Spielzimmer für große alte Menschen....steht nun eine Preissäule auf dem Schreibtisch. :joy:

Aber ich denke es wird nicht nur bei der Anzeige von Spritpreisen bleiben....wenn ich den mein Ziel mit MQTT-Server und Balkonkraftwerk mal ans Laufen bekomme.