OLED-Display: Werte nacheinander ausgeben

Hallo zusammen,
nachdem ich mich schon Tage abmühe und keine Lösung finde, hoffe ich auf einen guten Tipp im Forum.
Zu meinen Kenntnissen:
Ich entwickle schon lange Websites in WordPress sowie etliche Plugins und verfüge über Grundkenntnisse in PHP, HTML, CSS usw. Daher ist mir einiges in C++ vertraut.
Mit dem Arduino habe ich auch eine einfache Steuerung meiner Solaranlage für den Garagenantrieb gebaut und bin nun an der neuen Version.
Problem:
Meine neue Steuerung ist fast fertig, aber an einer Stelle komme ich nicht weiter. Der Arduino liest u. a. Messwerte von Strom und Spannung ein, welche auf einem kleinen OLED-Display (0.96") zyklisch angezeigt werden sollen. Im Codeauszug wird delay nur zur Demo verwendet, damit ich die Funktion sehen kann. Die Anzeige soll in drei Blöcken nacheinander erfolgen, wie es natürlich mit delay klappt. Mit millis habe ich auch schon Versuche gemacht, aber für meinen Anwendungsfall kein Beispiel zum Anpassen gefunden. Die Bibliothek INTERVAL ist vielversprechend, aber auch da rauschen die Anzeigen auf dem Display nur durch.
Hier nun der betreffende Teil, wo ich hängengeblieben bin:

  // Ausgabe OLED-Display
  // Solar
  INTERVAL(2000UL)  // 2000ms
  {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println("Solarzelle");
    display.println("----------");
    display.println("U = " + String(vin1, 1) + " V");
    display.println("I = 0.1 A");
    display.display();
  }
  delay(2000);


  // Accu 1
  INTERVAL(2000UL)  // 2000ms
  {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println("Accu 1");
    display.println("----------");
    display.println("U = " + String(vin2, 1) + " V");
    display.println("I = 0.1 A");
    display.display();
  }
  delay(2000);


  // Accu 2
  INTERVAL(2000UL)  // 2000ms
  {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println("Accu 2");
    display.println("----------");
    display.println("U = " + String(vin3, 1) + " V");
    display.println("I = 0.1 A");
    display.display();
  }
  delay(2000);

Für einen guten Tipp wäre ich dankbar.

Hallo,
Du brauchst eine eigene Statusvariable, die du per INTERVAL hochzählst (1-2-3-1-2-3 usw.) und diese in der Loop per switch-case abfragst und dann darauf reagierst.

Edit:
Vielen Dank für den Hinweis mit der Statusvariable. Ich habe das mal im folgenden Beispielsketch vereinfacht nachgestellt. Jetzt beginnt die Ausgabe korrekt von vorne. Allerdings werden Block 2+3 (Accu 1, Accu 2) gleichzeitig ausgegeben. Wo liegt mein Denkfehler?



#include <INTERVAL.h>

int x;



void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
  delay(2000);
  x = 0;
}

void loop()
{
  INTERVAL(2000UL)
  {
    //Tu was alle 2000ms
    if (x == 0) {
      Serial.println("Solar");
    }
    x = 1;
  }

  INTERVAL(2000UL)
  {
    //Tu was alle 2000ms
    if (x == 1) {
      Serial.println("Accu 1");
    }
    x = 2;
  }

  INTERVAL(2000UL)
  {
    //Tu was alle 2000ms
    if (x == 2) {
      Serial.println("Accu 2");
    }
    x = 0;
  }
}
const uint32_t intervall = 2000;
uint32_t lastmillis = 0;
byte x = 0;
byte lastX = 255;



void setup()
{
  Serial.begin(115200);
  Serial.println("Start...");
}

void loop()
{
  if (millis() - lastmillis >= intervall)
  {
    lastmillis += intervall;
    x++;
    if (x > 2) x = 0;
  }
  if (x != lastX)         // diese Zeile verhindert das flooden des Display/der Schnittstelle
  {
    if (x == 0)
    {
      Serial.println("Solar");
    }
    if (x == 1)
    {
      Serial.println("Accu 1");
    }
    if (x == 2)
    {
      Serial.println("Accu 2");
    }
    lastX=x;
  }
}

Zu Deinen Vorkenntnissen fehlt Dir möglicherweise die Schrittkette (=endlicher Automat, =finite state machine), die ich gerne mit switch/case realisiere.

Der Herzschlag zeigt die noch freien Resoucen.

Getestet mit OLED SSD1306 und ESP32:

#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

const int herzschlagpin = 13;

void setup() 
{
  oled.begin();
  oled.setFont(u8g2_font_6x10_mr);
  pinMode(herzschlagpin, OUTPUT);
}

void loop()
{
  solar();
  herzschlag();
}

void solar()
{
  uint32_t jetzt = millis();
  const uint32_t intervall = 2000;
  static uint32_t vorhin = jetzt - intervall;
  static int schritt = 0;

  float vin0 = random(0, 1000) / 10.0;
  float vin1 = random(0, 1000) / 10.0;
  float vin2 = random(0, 1000) / 10.0;

  if (jetzt - vorhin >= intervall)
  {
    vorhin = jetzt;
    switch (schritt)
    {
      case 0:
        anzeige("Solarzelle", vin0);
        schritt = 1;
        break;
      case 1:
        anzeige("Accu 1", vin1);
        schritt = 2;
        break;
      case 2:
        anzeige("Accu 2", vin2);
        schritt = 0;
        break;
    }
  }
}

void anzeige(const char * text, float vin)
{
  oled.clearBuffer();
  oled.drawStr(0, 12, text);
  oled.drawStr(0, 24, "----------");
  oled.setCursor(0, 36);
  oled.printf("U = %4.1f V", vin);
  oled.setCursor(0, 48);
  oled.print("I =  0.1 A");
  oled.sendBuffer();
}

void herzschlag()
{
  uint32_t jetzt = millis();
  const uint32_t intervall = 100;
  static uint32_t vorhin = jetzt - intervall;

  if (jetzt - vorhin >= intervall)
  {
    vorhin = jetzt;
    digitalWrite(herzschlagpin, !digitalRead(herzschlagpin));
  }
}

Super! Funktioniert nun einwandfrei. Vielen Dank für deine Hilfe!
Hier der Sketch:

  // Ausgabe OLED-Display
  if (millis() - lastmillis >= intervall)
  {
    lastmillis += intervall;
    x++;
    if (x > 2) x = 0;
  }
  if (x != lastX)         // diese Zeile verhindert das flooden des Display/der Schnittstelle
  {
    if (x == 0)
    {  
  // Solar
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Solarzelle");
  display.println("----------");
  display.println("U = " + String(vin1, 1) + " V");
  display.println("I = 0.1 A");
  display.display();
      }
    if (x == 1)
    {
  // Accu 1
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Accu 1");
  display.println("----------");
  display.println("U = " + String(vin2, 1) + " V");
  display.println("I = 0.1 A");
  display.display();
      }
    if (x == 2)
    {
  // Accu 2
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Accu 2");
  display.println("----------");
  display.println("U = " + String(vin3, 1) + " V");
  display.println("I = 0.1 A");
  display.display();
    }
    lastX=x;
  }

Als nächstes werden nun die Stromsensoren angeschlossen.

Vielen Dank für diesen Hinweis. Ich muss das für mein OLED-Display anpassen und nachbauen. So ganz blicke ich da noch nicht durch, aber ich bleibe dran.

Schau Dir an, wie ich Deinen jetzt verändert habe:

// Ausgabe OLED-Display
if (millis() - lastmillis >= intervall)
{
  lastmillis += intervall;
  x++;
  if (x > 2) x = 0;
}
if (x != lastX)         // diese Zeile verhindert das flooden des Display/der Schnittstelle
{
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  switch (x)
  {
    case 0:
      // Solar
      display.println("Solarzelle");
      display.println("----------");
      display.println("U = " + String(vin1, 1) + " V");
      display.println("I = 0.1 A");
      display.display();
      break;
    case 1:
      // Accu 1
      display.println("Accu 1");
      display.println("----------");
      display.println("U = " + String(vin2, 1) + " V");
      display.println("I = 0.1 A");
      display.display();
      break;
    case 2:
      // Accu 2
      display.println("Accu 2");
      display.println("----------");
      display.println("U = " + String(vin3, 1) + " V");
      display.println("I = 0.1 A");
      display.display();
      break;
  }
  lastX = x;
}

Hinweis:
Ich habe da gleich noch was runtergekürzt - die 4 Zeilen ändern sich nicht bei der Darstellung - also nur einmal am Anfang setzten und nicht dauernd zwischendurch. Die obige Variante mit if ginge genauso.

Vielen Dank auch für diese Verbesserung. Zeilen sparen ist immer gut, denn mittlerweile habe ich 61% des Nano verbraucht. Sicher könnte man noch mehr einsparen, denn ich habe möglicherweise etwas umständlich programmiert - so wie ich es mit den jetzigen Kenntnissen eben kann. Damit will ich aber niemand nerven, solange es funktioniert.
Mit if bin ich durch PHP mehr vertraut als mit case.
Etwas zum Hintergrund der ganzen Sache:
Ich benutze schon längere Zeit ein Hörmann-Garagentor mit 230 V-Anschluss. Die Stromzufuhr kommt (gegen Entgelt) von einem älteren Nachbarn (92 Jahre) und ich weiß nicht, ob das in Zukunft noch verfügbar ist. Also habe ich 2020 zwei 100 W-Solarzellen auf dem Garagendach installiert und lade damit eine 100Ah-Batterie auf. Über einen Wechselrichter (WR) wird dann daraus die Netzspannung erzeugt. Der Tor-Antrieb hat leider einen hohen Ruhestrom, so dass er bei trübem Wetter die Batterie leert. Aus diesem Grund wird der WR per Fernbedienung zuerst für 5 Minuten (Monoflop) eingeschaltet und danach kann ich mit einem zweiten Tastendruck auf der FB das Tor öffnen. Den WR und andere große Verbraucher schalte ich mit einem MOSFET durch. Soweit läuft das schon fast zwei Jahre ohne Probleme, nur interessiert mich halt auch der Zustand von Strom und Spannung in der Garage. Im ersten Schritt wird also die bisherige Schaltung verbessert und danach will ich versuchen, die Daten zu speichern und per WLAN auszulesen. Weitere Features wie ein Notbetrieb kommen noch dazu. So hoffe ich, dass der Speicherplatz reicht, denn der Nano braucht nicht viel Strom zum Arbeiten.

Habe detailliert geantwortet, aber Akismet hat meinen Beitrag ausgeblendet - warum auch immer :frowning:

Das Ding macht vermutlich wieder mal was es will...
Schade drum - ich war nicht schnell genug... Na mal sehn, ob das noch kommt...

Dann liege ich mit dem ESP32 ja nicht so schlecht :wink:

Na dann zum Einstieg die if Variante....

// Ausgabe OLED-Display
if (millis() - lastmillis >= intervall)
{
  lastmillis += intervall;
  x++;
  if (x > 2) x = 0;
}
if (x != lastX)         // diese Zeile verhindert das flooden des Display/der Schnittstelle
{
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  if (x == 0)
  {
    // Solar
    display.println(F("Solarzelle"));
    display.println(F("----------"));
    display.println(F("U = " + String(vin1, 1) + " V"));
    display.println(F("I = 0.1 A"));
  }
  if (x == 1)
  {
    // Accu 1
    display.println(F("Accu 1"));
    display.println(F("----------"));
    display.println(F("U = " + String(vin2, 1) + " V"));
    display.println(F("I = 0.1 A"));
  }
  if (x == 2)
  {
    // Accu 2
    display.println(F("Accu 2"));
    display.println(F("----------"));
    display.println(F("U = " + String(vin3, 1) + " V"));
    display.println(F("I = 0.1 A"));
  }
  lastX = x;
  display.display();
}

Ich hoffe nichts vergessen zu haben.
Sag mal wieviel Speicher jetzt da ist :wink:

Ja sicher. Aber zuerst muss alles korrekt laufen. Dann kommt WLAN dran und ich muss mich in das Thema einarbeiten.

Bei deinem letzten Beispiel kamen Fehlermeldung wegen "display.println(F". Ich habe es durch "display.println(" ersetzt.
Die if-Variante verbraucht mehr Speicher, aber weniger für Variablen:
Mit case:
18860/652Bytes
Mit if:
19034/606
Daher habe ich die case-Version wieder hergestellt. Ich will nun als Referenzspannung den LM4040 einbauen und hoffe, die Werte werden dadurch stabiler angezeigt. Habe deshalb nur eine Nachkommastelle verwendet.

Was für Fehlermeldungen?
Mach doch nicht sowas. Du kommst hier nur mit einem Teilstück - also geht nur ein Teilstück zurückzuliefern.
Wenn es nicht geht, dann erwarte ich, das wenigstens die Fehlermeldung mitgeteilt wird.

Selbst die case-Variante wäre noch zu verbessern.

Deine Entscheidung.

Es hat bestimmt niemand Lust, meinen gesamten Code von über 190 Zeilen durchzusehen. Deshalb zur Vereinfachung das relevante Teilstück.

Hier die komplette Fehlermeldung:

In file included from D:...\ArduinoData\packages\arduino\hardware\avr\1.8.4\cores\arduino/Arduino.h:28:0,
from sketch\Solar_2-08f.ino.cpp:1:
D:...\Arduino\03 Solaranlage Garage\Solar-Neu\Solar 2\Solar_2-08f\Solar_2-08f.ino: In function 'void loop()':
Solar_2-08f:169:48: error: initializer fails to determine size of '__c'
display.println(F("U = " + String(vin1, 1) + " V"));
D:...\Arduino\03 Solaranlage Garage\Solar-Neu\Solar 2\Solar_2-08f\Solar_2-08f.ino:169:21: note: in expansion of macro 'F'
display.println(F("U = " + String(vin1, 1) + " V"));
^
Solar_2-08f:169:48: error: array must be initialized with a brace-enclosed initializer
display.println(F("U = " + String(vin1, 1) + " V"));
D:...\Arduino\03 Solaranlage Garage\Solar-Neu\Solar 2\Solar_2-08f\Solar_2-08f.ino:169:21: note: in expansion of macro 'F'
display.println(F("U = " + String(vin1, 1) + " V"));
^
Solar_2-08f:177:48: error: initializer fails to determine size of '__c'
display.println(F("U = " + String(vin2, 1) + " V"));
D:...\Arduino\03 Solaranlage Garage\Solar-Neu\Solar 2\Solar_2-08f\Solar_2-08f.ino:177:21: note: in expansion of macro 'F'
display.println(F("U = " + String(vin2, 1) + " V"));
^
Solar_2-08f:177:48: error: array must be initialized with a brace-enclosed initializer
display.println(F("U = " + String(vin2, 1) + " V"));
D:...\Arduino\03 Solaranlage Garage\Solar-Neu\Solar 2\Solar_2-08f\Solar_2-08f.ino:177:21: note: in expansion of macro 'F'
display.println(F("U = " + String(vin2, 1) + " V"));
^
Solar_2-08f:185:48: error: initializer fails to determine size of '__c'
display.println(F("U = " + String(vin3, 1) + " V"));
D:...\Arduino\03 Solaranlage Garage\Solar-Neu\Solar 2\Solar_2-08f\Solar_2-08f.ino:185:21: note: in expansion of macro 'F'
display.println(F("U = " + String(vin3, 1) + " V"));
^
Solar_2-08f:185:48: error: array must be initialized with a brace-enclosed initializer
display.println(F("U = " + String(vin3, 1) + " V"));
D:...\Arduino\03 Solaranlage Garage\Solar-Neu\Solar 2\Solar_2-08f\Solar_2-08f.ino:185:21: note: in expansion of macro 'F'
display.println(F("U = " + String(vin3, 1) + " V"));
^
Mehrere Bibliotheken wurden für "Adafruit_SSD1306.h" gefunden
Benutzt: D:...\Arduino\libraries\Adafruit_SSD1306
Nicht benutzt: D:...\Arduino\libraries\Adafruit_SSD1306_Wemos_Mini_OLED
exit status 1
initializer fails to determine size of '__c'

Ich bin dir dankbar für deine Hilfe.

Du solltest Dir mal ein Bild darüber machen was hier schon an Code durchgesehen wurde.
190 Zeilen?
Peanuts!

Was wird das:

Soll das ein float sein mit einer Nachkommastelle?

Ja. Das ist der Wert vom Spannungsmesser in einer Variable (3x vorhanden).
Wenn der gesamte Code kein Problem darstellt, füge ich ihn bei. Ich weiß, dass er sicher verbessert werden kann, bin aber damit zufrieden. In PHP schreibe ich auch immer ausführlichen dokumentierten Code, damit ihn auch Anfänger nachvollziehen können. Wenn der Code extrem verkürzt ist, verstehe zwar ich das, aber ein anderer User kapiert nichts. Also übe Nachsicht mit meinen unperfekten Code. Jeder fängt mal an.

/* Solaranlage Garage (Nano)
   Ardunino Nano Port, COM7, ATmega328P Old Bootloader)
   Version 1.0
   Datum: 23.12.2021
   2x Monoflops OK (unabhängig durch millis)
   3x Spannungsmesser OK
   OLED-Dispay für Spannung OK
   To Do: Stromsensoren
   To Do: Temperatursensor
   To Do: Piezo variable Spannungsanzeige (Bei Abschaltung durch SpÜ)
*/


// OLED-Display
// https://www.amazon.de/AZDelivery-Display-Arduino-Raspberry-gratis/dp/B074N9VLZX/ref=psdc_1626220031_t1_B078J78R45
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
const uint32_t intervall = 2000;
uint32_t lastmillis = 0;
byte x = 0;
byte lastX = 255;

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);


// Pausen
unsigned long startTime;              // Startzeit
unsigned long startTime3;             // Startzeit3
unsigned long startTime4;             // Startzeit4
unsigned long currentTime;            // Aktuelle Zeit Spannungsmesser Monitor
unsigned long currentTime3;           // Aktuelle Zeit3 Solar
unsigned long currentTime4;           // Aktuelle Zeit3 Accu 1
const unsigned long period1 = 2000;   // Pausenlänge Spannungsmesser
const unsigned long period2 = 2000;   // Pausenlänge Stromsensoren

#define PIN_TEST1 A0
#define PIN_TEST2 A1
#define PIN_TEST3 A2

#define REF_VOLTAGE 4.8
#define PIN_STEPS 1024.0

float vout = 0.0, vin = 0.0;
float vin1 = 0.0; // Solarzelle
float vin2 = 0.0; // Accu 1
float vin3 = 0.0; // Accu 2

// Spannungsteiler
float R1 = 100000.0; // resistance R1 (= 100 KOhm)
float R2 =  10000.0; // resistance R2 (= 10 KOhm)
float R3 = 100000.0; // resistance R1 (= 100 KOhm)
float R4 =  10000.0; // resistance R2 (= 10 KOhm)
float R5 = 100000.0; // resistance R1 (= 100 KOhm)
float R6 =  10000.0; // resistance R2 (= 10 KOhm)
int rawValue = 0;

// Monoflop 1 Wechselrichter
const byte FB1Pin = 9;                   // FB1-Taster für Trigger (gegen Masse) Pin 9
const byte outputPinWR = 10;             // Ausgang für LED, MOSFET, Relais      Pin 10
unsigned long Laufzeit1 = 1 * 3 * 1000UL; // Laufzeit Monoflop/WR (5 min.) -> 5*60*1000UL = 5 min. (Test: 3 sec.)
uint32_t previousMillis1 = 0;

// Monoflop 2 Notbetrieb (Accu 1 Unterspannung)
const byte FB2Pin = 11;                  // FB2-Taster für Trigger (gegen Masse) Pin 11
const byte outputPinNB = 12;             // Ausgang für LED, MOSFET, Relais      Pin 12
unsigned long Laufzeit2 = 1 * 2 * 1000UL; // Laufzeit Notbetrieb (5 min.) -> 5*60*1000UL = 5 min. (Test: 2 sec.)
uint32_t previousMillis2 = 0;

void setup() {
  pinMode(FB1Pin, INPUT_PULLUP);
  pinMode(outputPinWR, OUTPUT);
  pinMode(FB2Pin, INPUT_PULLUP);
  pinMode(outputPinNB, OUTPUT);
  pinMode(PIN_TEST1, INPUT);
  pinMode(PIN_TEST2, INPUT);
  pinMode(PIN_TEST3, INPUT);
  startTime = millis();  //initial start time
  Serial.begin(9600);
  Serial.println("Start");
  // OLED
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    //    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.clearDisplay();

  // suppress noise
  if (vin < 0.09) {
    vin = 0.0;
  }
}

void loop() {
  /////////////////////////
  // Monoflop Wechselrichter
  if (digitalRead(FB1Pin) == LOW) {
    digitalWrite(outputPinWR, HIGH);
    previousMillis1 = millis();
  }
  if (millis() - previousMillis1 > Laufzeit1 && digitalRead(outputPinWR) == HIGH)
  {
    digitalWrite(outputPinWR, LOW);
  }

  // Monoflop Notbetrieb (Accu 100Ah Unterspannung)
  if (digitalRead(FB2Pin) == LOW) {
    digitalWrite(outputPinNB, HIGH);
    previousMillis2 = millis();
  }
  if (millis() - previousMillis2 > Laufzeit2 && digitalRead(outputPinNB) == HIGH)
  {
    digitalWrite(outputPinNB, LOW);
  }
  /////////////////////////

  /////////////////////////
  // Spannungsmesser: Ausgabe Monitor
  currentTime = millis();
  if (currentTime - startTime >= period1) //Pause1 abgelaufen?
  {
    startTime = currentTime;
    // A0
    rawValue = analogRead(PIN_TEST1);
    vout = (rawValue * REF_VOLTAGE) / PIN_STEPS;
    vin1 = vout / (R2 / (R1 + R2));
    Serial.println("U Solar  = " + String(vin1, 1) + " V");

    // A1
    rawValue = analogRead(PIN_TEST2);
    vout = (rawValue * REF_VOLTAGE) / PIN_STEPS;
    vin2 = vout / (R4 / (R3 + R4));
    Serial.println("U Accu 1 = " + String(vin2, 1) + " V");

    // A2
    rawValue = analogRead(PIN_TEST3);
    vout = (rawValue * REF_VOLTAGE) / PIN_STEPS;
    vin3 = vout / (R6 / (R5 + R6));
    Serial.println("U Accu 2 = " + String(vin3, 1) + " V");
  }
  /////////////////////////

  // Ausgabe OLED-Display
  if (millis() - lastmillis >= intervall)
  {
    lastmillis += intervall;
    x++;
    if (x > 2) x = 0;
  }
  if (x != lastX)         // diese Zeile verhindert das flooden des Display/der Schnittstelle
  {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    switch (x)
    {
      case 0:
        // Solar
        display.println("Solarzelle");
        display.println("----------");
        display.println("U = " + String(vin1, 1) + " V");
        display.println("I = 0.1 A");
        display.display();
        break;
      case 1:
        // Accu 1
        display.println("Accu 1");
        display.println("----------");
        display.println("U = " + String(vin2, 1) + " V");
        display.println("I = 0.1 A");
        display.display();
        break;
      case 2:
        // Accu 2
        display.println("Accu 2");
        display.println("----------");
        display.println("U = " + String(vin3, 1) + " V");
        display.println("I = 0.1 A");
        display.display();
        break;
    }
    lastX = x;
  }
}

Ich war leider etwas schneller...

Ich hab jetzt nur das init für den Display übernommen.

Musste mal sehen, ob er was anzeigt.
Ich schau über Deinen Code mal drüber...


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

const uint32_t intervall = 5000;
uint32_t lastmillis = 0;
float vin1 = 1.1, vin2 = 1.3, vin3 = 1.5;
byte x = 0, lastX = 255;
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
}

void loop()
{
  // Ausgabe OLED-Display
  if (millis() - lastmillis >= intervall)
  {
    lastmillis += intervall;
    x++;
    if (x > 2) x = 0;
  }
  if (x != lastX)         // diese Zeile verhindert das flooden des Display/der Schnittstelle
  {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    if (x == 0)
    {
      // Solar
      display.println(F("Solarzelle"));
      schreibeDisplayVolt();
      display.print(vin1, 1);
      schreibeDisplayRest();
    }
    if (x == 1)
    {
      // Accu 1
      display.println(F("Accu 1"));
      schreibeDisplayVolt();
      display.println(vin2, 1);
      schreibeDisplayRest();
    }
    if (x == 2)
    {
      // Accu 2
      display.println(F("Accu 2"));
      schreibeDisplayVolt();
      display.println(vin3, 1);
      schreibeDisplayRest();
    }
    lastX = x;
    display.display();
  }
}
void schreibeDisplayVolt()
{
  display.println(F("----------"));
  display.print(F("U = "));
}
void schreibeDisplayRest()
{
  display.print(F(" V"));
  display.println(F("I = 0.1 A"));
}