Zeigt her eure geilen Projekte!

Mein Projekt für ein "Lichtschwert" fing etwas holprig an. Es ist kein Lichtschwert alá StarWars, sondern eher eine 1m lange Schiene mit 60 RGB-LEDs. Diese LEDs sind in einem Silikonschlauch verbaut, so ist ein gestreuteres Licht möglich. Das setze ich für mein Hobby, Lightpainting, ein. Für die, die nicht wissen was Lightpainting ist: Man animiert Lichtquellen oder Licht reflektierende Objekte, wie z.B. Wunderkerzen, abbrennende Stahlwolle, Taschenlampen oder eben solch selbstgebaute Leuchtelemente während einer Langzeitbelichtung der Kamera (BULB) im Dunkeln durchs Bild. Die "Schlieren" die dabei entstehen machen das Werk aus.


Das die Bäume grün leuchten, liegt am Licht, welches in 30s aus den Wohnungen und Hauseingängen abgestrahlt wird und die Kamera einfängt.

Ich hatte mich das erste Mal mit den RGBs WS2812B beschäftigt. Was am Ende rauskam, stellte mich zufrieden.
Ich habe einen Joyit Nano-Clone (Old Bootloader, ca. 7,90€) verbaut. 8 Taster sind für 8 Farben zuständig, rot, grün, blau, weiß, lila, türkis, orange und gelb. Ein neunter schaltet die jeweilige Farbe aus. Ein Schalter kann die gewählte Farbe blinken lassen, ein Poti legt die Blinkfrequenz fest. Und ein weiterer Schalter lässt die LEDs als Regebogenverlauf erstrahlen.
Der mechanische Aufbau ist einem Gehäuse geschuldet, welches ich nutzen wollte.


Der Nano ist so verbaut, dass ich ihn weiterhin programmieren kann, falls ich etwas ändern möchte.
Das folgende Foto zeigt, wie der LED-Silikonschlauch in einem U-Profil aus Alu steckt. Das Gehäuse und eine 10Ah-Powerbank sind einfach mit schwarzem Isolierband mit dran befestigt. Beim Lightpainting kommt es nicht auf Schönheit an, es ist eh immer dunkel. Die Powerbank versorgt den Nano und die WS-LEDs mit 5V, hält mehrere Stunden Dauerlicht aus. Weiß frisst mit 1,8A am meisten.

Nun kommt es drauf an, was man damit anstellt. Ich bin in dem Foto einfach 2x durchs Bild gelaufen. Einmal ist der Regenbogeneffekt an und 1x blinkt die Leiste in Türkis.

Wer Lust hat mit sowas zu experimentieren, hier mein Sketch. Der ist noch mit delays fürs blinken. Kann jeder für sich übernehmen oder abändern. Nicht schön aber funktioniert.

[code]
#include <Adafruit_NeoPixel.h>
#define PIN 3 // Hier wird angegeben, an welchem digitalen Pin die WS2812 LEDs bzw. NeoPixel angeschlossen sind
#define NUMPIXELS 60 // Hier wird die Anzahl der angeschlossenen WS2812 LEDs bzw. NeoPixel angegeben
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

const byte rainb = 2;    // Rainbow gesteuert über D2
const byte rot = 4;      // Rot gesteuert über D4
const byte gruen = 5;    // Grün gesteuert über D5
const byte blau = 6;     // Blau gesteuert über D6
const byte lila = 7;     // Lila gesteuert über D7
const byte tuerkis = 8;  // Türkis gesteuert über D8
const byte orange = 9;   // Orange gesteuert über D9
const byte gelb = 10;    // Gelb gesteuert über D10
const byte weiss = 11;   // Weiß gesteuert über D11
const byte aus = 12;     // LEDs aus gesteuert über D12
const byte blk = A1;     // schnelles blinken gesteuert über A1, genutzt als Digitalpin
const byte poti = A0;    // Blinkfrequenz

const byte pause = 250;  // 250ms Pause
byte R = 0;        // Rot auf Null
byte G = 0;        // Grün auf Null
byte B = 0;        // Blau auf Null

void setup()
{
  pinMode(rainb, INPUT_PULLUP);   // alle Pins auf Digital-Input mit Pullup-Rs
  pinMode(rot, INPUT_PULLUP);
  pinMode(gruen, INPUT_PULLUP);
  pinMode(blau, INPUT_PULLUP);
  pinMode(lila, INPUT_PULLUP);
  pinMode(tuerkis, INPUT_PULLUP);
  pinMode(orange, INPUT_PULLUP);
  pinMode(gelb, INPUT_PULLUP);
  pinMode(weiss, INPUT_PULLUP);
  pinMode(aus, INPUT_PULLUP);
  pinMode(blk, INPUT_PULLUP);

  pixels.begin();                // Initialisierung der NeoPixel
  pixels.setBrightness(255);     // NeoPixel auf volle Helligkeit
}

void loop()
{
  bool rainbStatus = digitalRead(rainb);        // alle Eingänge einlesen
  bool rotStatus = digitalRead(rot);
  bool gruenStatus = digitalRead(gruen);
  bool blauStatus = digitalRead(blau);
  bool lilaStatus = digitalRead(lila);
  bool tuerkisStatus = digitalRead(tuerkis);
  bool orangeStatus = digitalRead(orange);
  bool gelbStatus = digitalRead(gelb);
  bool weissStatus = digitalRead(weiss);
  bool ausStatus = digitalRead(aus);
  bool blinkStatus = digitalRead(blk);
  uint16_t frequenz = analogRead(poti);
  frequenz = map(frequenz, 0, 1023, 1000, 100);

  // Funktionen behandeln
  // Rainbow hat Priorität vor allen anderen

  if (rainbStatus == HIGH) {
    R = 0, G = 0, B = 0;
    rainbow(20);
  } else {
    // dann kommen die anderen Funktionen

    if (blinkStatus == HIGH) {        // blinken mit Poti
      for (int i = 0; i <= NUMPIXELS; ++i) {
        pixels.setPixelColor(i, pixels.Color(R, G, B));
      }
      pixels.show();
      delay(frequenz);
      ledaus();
      delay(frequenz);
    }
    if (rotStatus == LOW) {          // Farbe Rot definieren
      R = 255, G = 0, B = 0;
    }
    if (gruenStatus == LOW) {        // Farbe Grün definieren
      R = 0, G = 255, B = 0;
    }
    if (blauStatus == LOW) {         // Farbe Blau definieren
      R = 0, G = 0, B = 255;
    }
    if (lilaStatus == LOW) {         // Farbe Lila definieren
      R = 255, G = 0, B = 255;
    }
    if (tuerkisStatus == LOW) {      // Farbe Türkis definieren
      R = 0, G = 255, B = 200;
    }
    if (orangeStatus == LOW) {       // Farbe Orange definieren
      R = 255, G = 100, B = 0;
    }
    if (gelbStatus == LOW) {         // Farbe Gelb  definieren
      R = 255, G = 255, B = 0;
    }
    if (weissStatus == LOW) {        // Farbe Weiß definieren
      R = 255, G = 255, B = 150;
    }

    if (ausStatus == LOW) {          // LEDs ausschalten
      R = 0, G = 0, B = 0;
      ledaus();
    }
  }
  for (int i = 0; i <= NUMPIXELS; ++i) {              // definierte Farbe an Neopixel senden...
    pixels.setPixelColor(i, pixels.Color(R, G, B));
  }
  pixels.show();                                      // ... und einschalten
}


void ledaus() {                                       // LEDs ausschalten
  for (int i = 0; i <= 60; ++i) {
    pixels.setPixelColor(i, pixels.Color(0, 0, 0));   // Farbe definiern, also schwarz/dunkel...
  }
  pixels.show();                                      // ... und einschalten/ausschalten
}

void rainbow(uint8_t wait) {                          // Routine für Farbverlauf
  uint16_t i, j;

  for (j = 0; j < 256; j++) {
    for (i = 0; i < pixels.numPixels(); i++) {
      pixels.setPixelColor(i, Wheel((i + j) & 255));
    }
    pixels.show();
    delay(wait);
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if (WheelPos < 170) {
    WheelPos -= 85;
    return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
[/code]

Ich danke allen für Unterstützung hier im Forum, allen voran möchte ich agmue für seine Geduld danken.

Der Link zur eigentlichen Diskussion, hier gehts lang: Steuerung für Lichtschwert

Nachtrag: Ich habe noch weiter experimentiert. Die Hardware ist die gleiche geblieben, allein die Software hatte mir nicht gefallen, habe sie geändert.
Zur Beschreibung des Sketches:

  • Die 60 LEDs habe ich in drei Gruppen á 20 aufgeteilt. Es sind also drei Abschnitte. Diese kann ich gesondert in der Farbe über das Poti einstellen.
  • Ich kann die Helligkeit über alle Modi über das Poti einstellen
  • Ich kann die Blinkfrequenz über das Poti einstellen, jetzt übrigens nicht mehr mit delay, sondern mit millis :wink:
    Für diese fünf Funktionen ist nur ein Poti nötig, werden dann nur per Taster aktiviert. Nun mein neuer Sketch:
#include <FastLED.h>

FASTLED_USING_NAMESPACE

#define DATA_PIN    3
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB  // Farbreihenfolge variiert je nach Hersteller
#define NUMPIXELS   60   // Hier wird die Anzahl der angeschlossenen WS2812 LEDs bzw. NeoPixel angegeben
CRGB leds[NUMPIXELS];

const byte rainb = 2;    // Rainbow gesteuert über D2
const byte ein = 4;      // LEDs ein gesteuert über D4
const byte aus = 7;      // LEDs aus gesteuert über D7
const byte hell = 5;     // Helligkeit gesteuert über D5
const byte blinkt = 12;  // blinken solange gedrückt, über D12
const byte orange = 8;   // Spitze Farbe festlegen, mit Poti, über D8
const byte gelb = 9;     // Mittelteil Farbe festlegen, mit Poti, über D9
const byte weiss = 10;   // unteren Teil, Farbe festlegen, mit Pot, über D10
const byte poti = A0;    // Farbeinstellung

byte unten = 0;          // Anzahl LEDs unten
byte mitte = 21;         // Anzahl LEDs in der Mitte
byte spitze = 41;        // Anzahl LEDs an der Spitze
byte farbe1 = 127;       // Farbe 1, unten, Startfarbe türkis
byte farbe2 = 213;       // Farbe 2, Mitte, Startfarbe lila
byte farbe3 = 96 ;       // Farbe 3, Spitze, Startfarbe grün
byte color;              // Zwischenvariable
byte merker;
byte helligkeit = 100;   // Starthelligkeit

void setup()
{
  pinMode(rainb, INPUT_PULLUP);   // alle Pins auf Digital-Input mit Pullup-Rs
  pinMode(ein, INPUT_PULLUP);
  pinMode(hell, INPUT_PULLUP);
  pinMode(aus, INPUT_PULLUP);
  pinMode(blinkt, INPUT_PULLUP);
  pinMode(orange, INPUT_PULLUP);
  pinMode(gelb, INPUT_PULLUP);
  pinMode(weiss, INPUT_PULLUP);
  Serial.begin (9600);

  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUMPIXELS);
  FastLED.show(); // send the 'leds' array out to the actual LED strip
}

void loop()
{
  bool rainbStatus = digitalRead(rainb);        // alle Eingänge einlesen
  bool einStatus = digitalRead(ein);
  bool hellStatus = digitalRead(hell);
  bool ausStatus = digitalRead(aus);
  bool blinktStatus = digitalRead(blinkt);
  bool orangeStatus = digitalRead(orange);
  bool gelbStatus = digitalRead(gelb);
  bool weissStatus = digitalRead(weiss);

  // Funktionen bearbeiten
  // Vorrang hat Rainbow mit Helligkeit

  if (rainbStatus == HIGH) {
    int merker = analogRead(poti);
    helligkeit = map(merker, 0, 1023, 30, 255);
    rainbow(20, helligkeit);
  }
  else {
    // dann kommen die anderen Funktionen

    if (ausStatus == LOW) {                // LEDs ausschalten
      faerbeLeds(0, 0, 0);
    }
    if (einStatus == LOW) {                // LEDs einschalten
      faerbeLeds(color, 255, helligkeit);
    }
    if (blinktStatus == LOW) {             // Blinken solange gedrückt
      blinken(color, helligkeit);
    }
    if (hellStatus == LOW) {               // Helligkeit einstellen
      int merker = analogRead(poti);
      helligkeit = map(merker, 0, 1023, 30, 255);
      faerbeLeds(color, 255, helligkeit);
    }
    if (weissStatus == LOW) {              // Farbe unten einstellen
      farbe1 = analogRead(poti) / 4;
      faerbeLeds(farbe1, 255, helligkeit);
    }
    if (gelbStatus == LOW) {               // Farbe Mitte einstellen
      farbe2 = analogRead(poti) / 4;
      faerbeLeds(farbe2, 255, helligkeit);
    }
    if (orangeStatus == LOW) {             // Farbe Spitze einstellen
      farbe3 = analogRead(poti) / 4;
      faerbeLeds(farbe3, 255, helligkeit);
    }

  }
}

void faerbeLeds(const uint8_t color, const uint8_t saettigung, const uint8_t helligkeit) {
  for (uint8_t led = 0; led <= 20; led++)
  {
    leds[led] = CHSV(farbe1, 255, helligkeit);
  }
  for (uint8_t led = 21; led <= 40; led++)
  {
    leds[led] = CHSV(farbe2, 255, helligkeit);
  }
  for (uint8_t led = 41; led < NUMPIXELS; led++)
  {
    leds[led] = CHSV(farbe3, 255, helligkeit);
  }

  FastLED.show();
}

void rainbow(const uint8_t wait, const uint8_t helligkeit) {                          // Routine für Farbverlauf
  uint32_t jetzt = millis();
  static uint32_t vorhin = 0;
  static uint8_t rbfarbe = 0;

  if (jetzt - vorhin >= wait) {
    vorhin = jetzt;
    for (uint8_t led = 0; led < NUMPIXELS; led++)
    {
      leds[led] = CHSV(rbfarbe, 255, helligkeit);
    }
    FastLED.show();
    rbfarbe++;
  }
}

void blinken(const uint8_t color, const uint8_t helligkeit) {
  uint32_t jetzt = millis();
  uint16_t intervall = analogRead(poti);
  intervall = map(intervall, 0, 1023, 1000, 100);
  Serial.print("Intervall =  ");
  Serial.print(intervall);
  Serial.println(" ms");
  static uint32_t vorhin = jetzt;
  static byte schritt = 0;

  if (jetzt - vorhin >= intervall) {
    vorhin = jetzt;
    switch (schritt) {
      case 0:
        faerbeLeds(color, 255, helligkeit);
        schritt = 1;
        break;
      case 1:
        faerbeLeds(0, 0, 0);
        schritt = 0;
        break;
    }
    FastLED.show();
  }
}
3 Likes

Hallo,

im Forum wurde kürzlich ein Beitrag veröffentlicht, den ich gern nachbauen wollte.
Danke an @dandud100.

Projektvorstellung: Spritpreis von deiner Heimtankstelle mit ESP32 auf Display anzeigen
Der Nachbau im ESP32 funktionierte auf anhieb und sollte auch mit einem ESP8266 nachgebaut werden.
Leider gelang mir das nicht, da mir die Erfahrung in JSON fehlt.

Hier war @Tommy56 bereitwillig das umzusetzen, auch dir danke dafür.

Aus beiden Versionen entstand eine für mich sehr nützliche Anwendung auf dem ESP8266, die auch auf einem ESP8266-01 läuft.
Kleine Anregungen konnte ich auch von @wno158 übernehmen.

Aktuell zeigt der Sketch 6 Tankstellen in meinem Umfeld an. Die Anzahl kann problemlos erweitert werden.
Für mich folgt demnächst noch eine Erweiterung um einen Webserver zur Anzeige in meinem SmartHome-Umfeld.
Nochmals danke an alle Beteiligten.

Hier der aktuelle Sketch, Teil1:
Das Zertifikat wurde ausgelagert, da es später im Spiffs/LittleFS landet.


/*  Arduino V1.8.15_core2.7.4 mit ESP8266 WeMos D1 Mini

                             Antenne
                             /\/\/\/
                        RST |    LED| TX = GPIO1
             Analog 3.3V A0 |       | RX = GPIO3
       not usable GPIO16 D0 |       | D1 = GPIO5 (I2C-SCL
   (SPI-Clock SCK)GPIO14 D5 | WeMos | D2 = GPIO4 (I2C-SDA)
       (SPI-MISO) GPIO12 D6 | D1    | D3 = GPIO0 (Pullup) if connected during upload upload won't work
        (SPI-MOSI)GPIO13 D7 | Mini  | D4 = GIOP2 LED Pullup
       not usable GPIO15 D8 |       | GND
                       3.3V |_______| 5V
                               USB

       OLED SH1106 Display an ESP8266 WeMos D1 Mini
       Pin-Belegung:

       I2C-SCL    5   (D1)
       I2C-SDA    4   (D2)

*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <U8g2lib.h>            // https://github.com/olikraus/U8g2_Arduino

//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

const char* ssid = "ssid";
const char* pass = "password";

const char *host = "creativecommons.tankerkoenig.de";
const uint16_t port = 443;
bool isFirst = true;
String stationName;

// Dein Tankerkoenig ApiKey und die abzufragende TankstellenID
String TankerkoenigApiKey = "eigene ID";

// Stationsname = Nix, Oil!, Tanklager Baack, Esso, Star, Jet, Aral
String StationID[] = {"0", "65131384-915a-4ad7-9327-0e74d3dfe9a8", "6238b606-2054-4ba4-3468-82266bd41332", "4af748dc-85fd-42b5-8be4-ad47a10ae525", "005056ba-7cb6-1ed2-bceb-65ef408c0d1d", "51d4b69e-a095-1aa0-e100-80009459e03a", "0a637be7-dc90-4ed3-a222-4574de01ba7d" };

// Use WiFiClientSecure class to create TLS connection
WiFiClientSecure client;

String url;
uint32_t lastTime;
const uint32_t intervall = 1000UL * 60 * 5;                             // mindestens 5 Minuten
unsigned int tid = 0;

int abfrage()
{
  Serial.print("\nConnecting to ");
  Serial.println(host);
  if (!client.connect(host, port)) {
    Serial.println("Connection failed");
    return -1;
  }
  lastTime = millis();
  HTTPClient http;
  Serial.print("[HTTPS] begin...\n");

  if (http.begin(client, url))
  {
    String jsonBuffer = "{}";
    Serial.print("[HTTPS] GET...\n");
    // start connection and send HTTP header
    int httpCode = http.GET();
    // httpCode will be negative on error
    if (httpCode > 0) {
      // HTTP header has been send and Server response header has been handled
      Serial.printf("[HTTPS] GET... code: %d\n", httpCode);

      // file found at server
      if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY)
      {
        jsonBuffer = http.getString();
        //Serial.println(jsonBuffer);
        StaticJsonDocument<1024> doc;
        DeserializationError error = deserializeJson(doc, jsonBuffer);

        if (error)
        {
          Serial.print(F("deserializeJson() failed: "));
          Serial.println(error.f_str());
          return -2;
        }
        bool isOk = doc["ok"];
        if (!isOk) {
          String msg = doc["message"];
          Serial.println(msg);
          return -5;
        }
        JsonObject station = doc["station"];
        String name = station["name"];
        Serial.println(name);
        Serial.print(tid);
        Serial.print(". ");
        String brand = station["brand"];
        Serial.println(brand);
        stationName = brand;
        bool open = station["isOpen"];
        Serial.println(open ? "offen" : "geschlossen");
        float num = station["e5"];
        Serial.print("E5: \t\t");
        Serial.println(num, 3);
        num = station["e10"];
        Serial.print("E10: \t\t");
        Serial.println(num, 3);
        num = station["diesel"];
        Serial.print("Diesel: \t");
        Serial.println(num, 3);

        bool station_isOpen = station["isOpen"];
        if (station_isOpen)
        {
          float diesel = station["diesel"];
          schreibeOled(diesel);                                       // auf Display anzeigen
        }
        else
        {
          schreibeOled(0);                                            // auf Display anzeigen
        }
      }
    }
    else
    {
      Serial.printf("[HTTPS] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      return -3;
    }
    http.end();
    return 0;
  }
  else
  {
    Serial.printf("[HTTPS Unable to connect\n");
    return -4;
  }
}


void schreibeOled(float preis)
{
  if (preis == 0)
  {
    u8g2.clearBuffer();
    u8g2.setCursor(5, 15);
    u8g2.setFont(u8g2_font_crox2h_tf);
    u8g2.print(tid);
    u8g2.print(". ");
    u8g2.print(stationName);
    u8g2.setCursor(10, 45);
    u8g2.setFont(u8g2_font_fur14_tf);
    u8g2.println("Geschlossen");
    u8g2.sendBuffer();
  }
  else
  {
    u8g2.clearBuffer();
    u8g2.setCursor(5, 15);
    u8g2.setFont(u8g2_font_crox2h_tf);
    u8g2.print(tid);
    u8g2.print(". ");
    u8g2.print(stationName);
    u8g2.setCursor(10, 55);
    u8g2.setFont(u8g2_font_fur30_tf);                     //fur30_tf
    String preis1 = String(preis, 3);
    u8g2.print(preis1.substring(0, 4));
    u8g2.setFont(u8g2_font_fur17_tf);                     //fur30_tf
    u8g2.setCursor(90, 42);
    u8g2.print("9");
    u8g2.sendBuffer();
  }
}


void setup()
{
  Serial.begin(115200);
  u8g2.begin();

  // https://arduino-projekte.info/schriftarten-fuer-oled-display/
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_crox3h_tf);
  u8g2.setCursor(0, 35);
  u8g2.println(" Moin...."); 
  u8g2.sendBuffer();
  delay(2000);
  u8g2.clearBuffer();
  u8g2.setCursor(0, 35);
  u8g2.print("Connecting WLan...");
  u8g2.sendBuffer();
  u8g2.setCursor(0, 10);

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected to IP address: ");
  //Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Set time via NTP, as required for x.509 validation
  configTime(3 * 3600, 0, "fritz.box", "pool.ntp.org", "time.nist.gov");

  Serial.print("Waiting for NTP time sync: ");
  time_t now = time(nullptr);
  while (now < 8 * 3600 * 2) {
    delay(500);
    Serial.print(".");
    now = time(nullptr);
  }
  Serial.println("");
  struct tm timeinfo;
  gmtime_r(&now, &timeinfo);
  Serial.print("Current time: ");
  Serial.print(asctime(&timeinfo));

  // Initialisierung Root-CA
  configCA();

  readTankID();                                           // TankstellenID lesen und in JSON-String schreiben
  int rc = abfrage();
  Serial.print("rc: ");
  Serial.println(rc);
}


void loop() {
  if (millis() - lastTime >= intervall)
  {
    readTankID();                                         // TankstellenID lesen und in JSON-String schreiben
    int rc = abfrage();
    Serial.print("rc: ");
    Serial.println(rc);
  }
}


void readTankID()
{
  tid++;                                                  // Tankstellenposition
  if (tid == 7) tid = 1;
  url = "https://creativecommons.tankerkoenig.de/json/detail.php?id=" + StationID[tid] + "&apikey=" + TankerkoenigApiKey;
}

Das Zertifikat, Teil 2:

// Im Browser die Website aufrufen, mit der Mouse auf das Schloß klicken, weitere Informationen
// Zertifikat anzeigen, ganz nach rechts auf das höchste Zertifikat gehen, runterscrollen bis "Verschiedenes" 
// dort PEM(Zertifikat) wählen und zwischen "CERT( und )CERT"; einfügen, evtl. Gültigkeitsdatum eintragen
// gültig bis Mon, 04 Jun 2035


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

X509List cert(cert_XSRG_ROOT_X1);

void configCA() {
  client.setTrustAnchors(&cert);
  Serial.println("Single CA");
}
1 Like

Das das nicht funktioniert, sollte Dir bekannt sein.

Das was nicht funktioniert ?

Ach schau - doch noch selbst drauf gekommen... - na geht doch.

Witzbold.....

Ich werde Dich daran erinnern.
PS:

Na denne - Ich nehme zur Kenntnis, das für Dich dieser Thread aufgemacht wurde.

Ein sinnvolles Projekt. Als zusätzliche Option könntest du noch den letzten Wert zwischenspeichern und dann den Trend mit einem Pfeil anzeigen lassen.
Außer es läuft immer so ab wie bei der Tankstelle in meiner Nähe..

1 Like

Ich habe meine PHP-Version mit 7 Tankstellen in meiner Umgebung nun schon eine Weile am Laufen (nur E10) und da kann man doch gewisse Regelmäßigkeiten erkennen.

Gruß Tommy

Ja und der Sprung von Sonntag Nachmittag auf Montag Morgen ist schon immer heftig.

Eigentlich wird hier jeden Morgen in etwa gleich erhöht.

Gruß Tommy

Keine schlechte Idee.
Da werde ich mir noch ein paar Gedanken zu machen.
Optimieren ist ja immer ein anzustrebendes Ziel für mich.

Man könnte den Verpenner auch gegen was effizientes austauschen!

Welchen Verpenner?

Gruß Tommy

Ich schrieb "optimieren" nicht verbrennen.

Die fossil betriebene Heizung mit abfallender Bewegungsenergie.

Ach das meinst Du. Muss man aber nicht. Wir sind mit unserem Hybrid (nicht Plugin) ganz zufrieden.

Gruß Tommy

Das Problem dabei ist nur das Wort "fossil", aber leider soll ja garnichts mehr verbrannt werden. Was aber meiner Meinung nach ohne Zwischenschritt nicht zu meistern ist.

Wieso? Die Verbrennung von Wasserstoff ergibt Wasser.

Gruß Tommy

Ja aber die letzten 10- 15 Jahre wurden von der Regierung jeder synthetischer Kraftstoff nicht gefördert bzw. sogar abgelehnt mit der Begründung "Man hat sich für die E-Mobilität entschieden" Aber sich nur auf eine Sache festzulegen und jede andere Entwicklung im Voraus abzulehnen ist mehr als dumm.....