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 ![]()
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" \
"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\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


