Problem mit LCD

hallo.
ich habe einen mixer gebaut um mit deej die lautstärke zu regulieren. habe leds und einen lcd hinzugefügt. soweit läuft alles wie es sollte, bis auf den lcd. der sollte immer den wert von dem poti anzeigen der zuletzt geändert wurde und das in der unteren zeile mit einem balken darstellen. es wird aber nur in der oberen zeile ein balken angezeigt der sich nicht verändert und die zweite zeile bleibt leer. woran kann das liegen?

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int NUM_SLIDERS = 5; // 5 Potentiometer
const int analogInputs[NUM_SLIDERS] = {A0, A1, A2, A3, A4}; // Potentiometer-Eingänge
int analogSliderValues[NUM_SLIDERS];
int lastSliderIndex = 0; // Verfolgt den zuletzt angepassten Slider

// Namen der Potentiometer
const char* potiNames[NUM_SLIDERS] = {
  "Sound",   // Poti 1
  "Discord", // Poti 2
  "YouTube", // Poti 3
  "Game",    // Poti 4
  "Spotify"  // Poti 5
};

// NeoPixel-Setup für 5 LEDs
Adafruit_NeoPixel strip(NUM_SLIDERS, 6, NEO_GRB + NEO_KHZ800); // 5 LEDs an Pin 6
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C-Adresse 0x27, 16 Zeichen, 2 Zeilen

int buttonState = 1; // Tasterzustand
int prevButtonState = 1;
int savedPoti1Value = 0; // Zum Speichern des alten Werts von Poti 1 (Sound)
bool poti1Zeroed = false; // Um den Zustand von Poti 1 zu verfolgen (ob es auf 0 gesetzt wurde)

void setup() {
  // Potentiometer als Eingänge konfigurieren
  for (int i = 0; i < NUM_SLIDERS; i++) {
    pinMode(analogInputs[i], INPUT);
  }

  // Serielle Kommunikation initialisieren
  Serial.begin(9600);

  // NeoPixel-Strip initialisieren
  strip.begin();
  strip.show();
  strip.setBrightness(255); // Helligkeit der LEDs (0-255)

  // Taster konfigurieren
  pinMode(2, INPUT_PULLUP); // Taster an Pin 2 mit Pullup-Widerstand

  // LCD initialisieren
  lcd.init(); // LCD initialisieren
  lcd.backlight(); // LCD-Hintergrundbeleuchtung einschalten
}

void loop() {
  delay(10);
  buttonState = digitalRead(2); // Taster lesen

  // Wenn der Taster gedrückt wird, den Wert von Poti 1 (Sound) steuern
  if (buttonState == LOW && buttonState != prevButtonState) {
    if (!poti1Zeroed) {
      savedPoti1Value = analogSliderValues[0]; // Den aktuellen Wert von Poti 1 speichern
      analogSliderValues[0] = 0; // Poti 1 auf 0 setzen
      poti1Zeroed = true;
    } else {
      analogSliderValues[0] = savedPoti1Value; // Poti 1 auf den alten Wert zurücksetzen
      poti1Zeroed = false;
    }
  }
  prevButtonState = buttonState;

  // Potentiometer-Werte aktualisieren und LEDs einstellen
  updateSliderValues(); 
  setLeds(); 

  // Den zuletzt angepassten Poti auf dem LCD anzeigen
  displaySliderOnLCD(); 

  // Potentiometerwerte über die serielle Schnittstelle senden
  sendSliderValues(); // Simuliert das Senden der Werte (deej nutzt serielle Daten)
}

void updateSliderValues() {
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if (i != 0 || !poti1Zeroed) { // Aktualisiere den Wert von Poti 1 nur, wenn es nicht auf 0 gesetzt wurde
      analogSliderValues[i] = analogRead(analogInputs[i]); // Potentiometerwert lesen
    }
  }
}

void setLeds() {
  // Farben der LEDs festlegen
  int colors[NUM_SLIDERS][3] = {
    {255, 255, 255}, // LED 5: Weiß für Poti 1 (Sound)
    {0, 0, 255},   // LED 4: Gelb für Poti 2 (Discord)
    {255, 0, 0},     // LED 3: Rot für Poti 3 (YouTube)
    {255, 255, 0},     // LED 2: Blau für Poti 4 (Game)
    {0, 255, 0}      // LED 1: Grün für Poti 5 (Spotify)
  };

  // LEDs basierend auf Potentiometerwerten einstellen
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if (analogSliderValues[i] == 0) {
      strip.setPixelColor(NUM_SLIDERS - 1 - i, 0, 0, 0); // LED aus, wenn Potentiometer auf 0
    } else {
      strip.setPixelColor(NUM_SLIDERS - 1 - i, colors[i][0], colors[i][1], colors[i][2]); // Farbe einstellen
    }
  }

  strip.show(); // LEDs anzeigen
}

void displaySliderOnLCD() {
  lcd.clear(); // LCD löschen
  
  // Erster Schritt: Namen und Wert des Potentiometers in der ersten Zeile anzeigen
  lcd.setCursor(0, 0); // Erste Zeile, erste Spalte
  lcd.print(potiNames[lastSliderIndex]); // Zeigt den Namen des Potentiometers an

  // Zeigt den Wert des Potentiometers in der ersten Zeile
  lcd.setCursor(10, 0); // Gehe zur 11. Spalte in der ersten Zeile
  lcd.print(map(analogSliderValues[lastSliderIndex], 0, 1023, 0, 100)); // Zeigt den Wert (0-100)

  // Zweiter Schritt: Balkenanzeige in der zweiten Zeile
  int barLength = map(analogSliderValues[lastSliderIndex], 0, 1023, 0, 16); // Länge für LCD (16 Zeichen)
  lcd.setCursor(0, 1); // Zur zweiten Zeile wechseln

  for (int i = 0; i < 16; i++) { // Exakt 16 Zeichen in der zweiten Zeile anzeigen
    if (i < barLength) {
      lcd.print("|"); // Balken anzeigen
    } else {
      lcd.print(" "); // Rest der Zeile auffüllen, um die Zeile zu "leeren"
    }
  }
}

void sendSliderValues() {
  String builtString = String("");

  for (int i = 0; i < NUM_SLIDERS; i++) {
    builtString += String((int)analogSliderValues[i]);

    if (i < NUM_SLIDERS - 1) {
      builtString += String("|");
    }
  }

  Serial.println(builtString); // Werte über die serielle Schnittstelle senden
}

Welche LiquidCrystal_I2C.h, es gibt viele verschiedene? Link bitte.

Gruß Tommy

Ein Problem wird sein, dass du den Pin A4 mit einem Poti belegst, obwohl dieser für den I2C-Bus genutzt wird. Da solltest du den Pin nicht zusätzlich mit einem Poti belegen.
Der I2C-Bus belegt am Controller (Uno o.ä.) die Pins A4 und A5 und müssen daher für den frei bleiben.

Nimm ein Nao V3 der hat 7 Analog Eingänge
Nano V3 ist voll kompatibel zu UNO, ohne den poti auf A4 wird gut angezeigt, zum Testen klemme den Poti ab dann kommt so was.


Nur durch das

void displaySliderOnLCD() {
  lcd.clear(); // LCD löschen

bei jedem durchlauf der Loop flackert das ganze unheimlich, um den Balken kleiner machen musst dir was ausdenken :wink:
Ich wurde nicht Striche machen nur wirklich Balken anzeigen.
Beispiele gibt's in der Bibliothek.

ich hab jetzt den 5ten poti weg, aber die anzeige bleibt gleich wie davor.

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int NUM_SLIDERS = 4; // 4 Potentiometer
const int analogInputs[NUM_SLIDERS] = {A0, A1, A2, A3}; // Potentiometer-Eingänge
int analogSliderValues[NUM_SLIDERS];
int lastSliderIndex = 0; // Verfolgt den zuletzt angepassten Slider

// Namen der Potentiometer
const char* potiNames[NUM_SLIDERS] = {
  "Sound",   // Poti 1
  "Discord", // Poti 2
  "YouTube", // Poti 3
  "Game"     // Poti 4
};

// NeoPixel-Setup für 5 LEDs (5 LEDs, auch wenn es nur 4 Potis gibt)
Adafruit_NeoPixel strip(5, 6, NEO_GRB + NEO_KHZ800); // 5 LEDs an Pin 6
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C-Adresse 0x27, 16 Zeichen, 2 Zeilen

int buttonState = 1; // Tasterzustand
int prevButtonState = 1;
int savedPoti1Value = 0; // Zum Speichern des alten Werts von Poti 1 (Sound)
bool poti1Zeroed = false; // Um den Zustand von Poti 1 zu verfolgen (ob es auf 0 gesetzt wurde)

void setup() {
  // Potentiometer als Eingänge konfigurieren
  for (int i = 0; i < NUM_SLIDERS; i++) {
    pinMode(analogInputs[i], INPUT);
  }

  // Serielle Kommunikation initialisieren
  Serial.begin(9600);

  // NeoPixel-Strip initialisieren
  strip.begin();
  strip.show();
  strip.setBrightness(255); // Helligkeit der LEDs (0-255)

  // Taster konfigurieren
  pinMode(2, INPUT_PULLUP); // Taster an Pin 2 mit Pullup-Widerstand

  // LCD initialisieren
  lcd.init(); // LCD initialisieren
  lcd.backlight(); // LCD-Hintergrundbeleuchtung einschalten
}

void loop() {
  delay(10);
  buttonState = digitalRead(2); // Taster lesen

  // Wenn der Taster gedrückt wird, den Wert von Poti 1 (Sound) steuern
  if (buttonState == LOW && buttonState != prevButtonState) {
    if (!poti1Zeroed) {
      savedPoti1Value = analogSliderValues[0]; // Den aktuellen Wert von Poti 1 speichern
      analogSliderValues[0] = 0; // Poti 1 auf 0 setzen
      poti1Zeroed = true;
    } else {
      analogSliderValues[0] = savedPoti1Value; // Poti 1 auf den alten Wert zurücksetzen
      poti1Zeroed = false;
    }
  }
  prevButtonState = buttonState;

  // Potentiometer-Werte aktualisieren und LEDs einstellen
  updateSliderValues(); 
  setLeds(); 

  // Den zuletzt angepassten Poti auf dem LCD anzeigen
  displaySliderOnLCD(); 

  // Potentiometerwerte über die serielle Schnittstelle senden
  sendSliderValues(); // Simuliert das Senden der Werte (deej nutzt serielle Daten)
}

void updateSliderValues() {
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if (i != 0 || !poti1Zeroed) { // Aktualisiere den Wert von Poti 1 nur, wenn es nicht auf 0 gesetzt wurde
      analogSliderValues[i] = analogRead(analogInputs[i]); // Potentiometerwert lesen
    }
  }
}

void setLeds() {
  // Farben der LEDs festlegen
  int colors[5][3] = {
    {255, 255, 255}, // LED 5: Weiß für Poti 1 (Sound)
    {0, 0, 255},     // LED 4: Blau für Poti 2 (Discord)
    {255, 0, 0},     // LED 3: Rot für Poti 3 (YouTube)
    {255, 255, 0},   // LED 2: Gelb für Poti 4 (Game)
    {0, 255, 0}      // LED 1: Grün (bleibt aktiv, aber ohne Poti)
  };

  // LEDs basierend auf Potentiometerwerten einstellen
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if (analogSliderValues[i] == 0) {
      strip.setPixelColor(4 - i, 0, 0, 0); // LED aus, wenn Potentiometer auf 0
    } else {
      strip.setPixelColor(4 - i, colors[i][0], colors[i][1], colors[i][2]); // Farbe einstellen
    }
  }

  // LED 5 (Grün) bleibt immer an, da sie keinen Poti hat
  strip.setPixelColor(0, colors[4][0], colors[4][1], colors[4][2]);

  strip.show(); // LEDs anzeigen
}

void displaySliderOnLCD() {
  lcd.clear(); // LCD löschen
  
  // Erster Schritt: Namen und Wert des Potentiometers in der ersten Zeile anzeigen
  lcd.setCursor(0, 0); // Erste Zeile, erste Spalte
  lcd.print(potiNames[lastSliderIndex]); // Zeigt den Namen des Potentiometers an

  // Zeigt den Wert des Potentiometers in der ersten Zeile
  lcd.setCursor(10, 0); // Gehe zur 11. Spalte in der ersten Zeile
  lcd.print(map(analogSliderValues[lastSliderIndex], 0, 1023, 0, 100)); // Zeigt den Wert (0-100)

  // Zweiter Schritt: Balkenanzeige in der zweiten Zeile
  int barLength = map(analogSliderValues[lastSliderIndex], 0, 1023, 0, 16); // Länge für LCD (16 Zeichen)
  lcd.setCursor(0, 1); // Zur zweiten Zeile wechseln

  for (int i = 0; i < 16; i++) { // Exakt 16 Zeichen in der zweiten Zeile anzeigen
    if (i < barLength) {
      lcd.print("|"); // Balken anzeigen
    } else {
      lcd.print(" "); // Rest der Zeile auffüllen, um die Zeile zu "leeren"
    }
  }
}

void sendSliderValues() {
  String builtString = String("");

  for (int i = 0; i < NUM_SLIDERS; i++) {
    builtString += String((int)analogSliderValues[i]);

    if (i < NUM_SLIDERS - 1) {
      builtString += String("|");
    }
  }

  Serial.println(builtString); // Werte über die serielle Schnittstelle senden
}

In den Fall erstmal Beispiel aus der Bibliothek testen. Manche haben 0x 3F Adresse, meiner 1602 hat die.
Also erst mal die stat 0x27 eintragen.
Das oben stimmt nicht der hat ja was angezeigt also muss die 0x27 stimmen. Am Telefon schreiben ist Müsst.

Du wurdest schon mal nach der verwendeten "LiquidCrystal_I2C.h" Library gefragt.
Warum schreibst du uns das nicht ?
Nur mit der Info können wir auch deine Fehler richtig erkennen.

Nicht Manche Sondern man schaue auf das Modul welches die LCD steuert.
Ist dort ein PCF8574 verbaut so ist die Adresse 0x20. bis 0X27
Handelt es sich um eine PCF8574A so ist die Adresse 0x38 bis 0x3F
ist bei den Modulen dann kein Jumper gelötet so ist der letztere Wert anzunehmen.
Mit offenen Jumper werden die A0 A1 A2 mit 10K auf H gesetzt.

Und was machst du wen nicht lesbar, ohne Adressentest?
4 Buchstaben sreiben ist schneller als Sketch suchen, laden schauen.
Na ja, man kann sich das leben schwer machen.

Das ist wenn ich ehrlich sein soll mir noch nicht so vorgekommen.
Ich schau immer als erstes nach der Hardwarekonfi und Handel entsprechend.
Da nehm ich auch schon mal das Handy und vergrößere so. Meistens klappt das.
In diesem Fall hier gehe ich aber davon aus das @HotSystems auf der richtigen Fährte ist.
Es handelt sich wahrscheinlich um diese Lib

Und beim Compeilern kommen hier etliche unbenutze Varis die auch mit der Formatierung des Textes zu tun haben.

Ok, mag sein ?
Ich sehe das eher als stochern im Nebel.
Und wenn ein Fragesteller hier zu faul ist, die richtige Library zu benennen, dann bin ich auch zu faul, weiter zu helfen.
Leider wird das immer häufiger, dass hier Anfänger keine brauchbaren Informationen liefern.

Ja da bin ich bei Dir.
Habe mal neugirig wie ich nun mal bin das eben im Sim aufgebaut.
Lib scheint zu Funktionieren. Aber wie Du schon sagst das ist im Nebel des schweigens zu sehen. Das einzige was nerft ist in jeder Loop wird die LCD neu ausgegeben. da sollte man dran arbeiten. Das hat ja nichts mit der LCD Lib zu tun.

Normal nutze nur die vom @noiasca.
Jedoch für test habe die genutzt

name=LiquidCrystal I2C
version=1.1.2
author=Frank de Brabander
maintainer=Marco Schwartz marcolivier.schwartz@gmail.com
sentence=A library for I2C LCD displays.
paragraph= The library allows to control I2C displays with functions extremely similar to LiquidCrystal library. THIS LIBRARY MIGHT NOT BE COMPATIBLE WITH EXISTING SKETCHES.
category=Display
url=GitHub - johnrickman/LiquidCrystal_I2C: LiquidCrystal Arduino library for the DFRobot I2C LCD displays
architectures=avr

"Normaler" weise auf einem UNO tun alle LCD Lib.

Ja Du weißt was Qualität ist :wink: Ich nutze diese auch, seit mir diese von Agmue vorgeschlagen wurde.

Mach doch bitte mal ein Foto von der Rückseite.
Und benenne das Thema um in Probleme mit allem :wink: LCD ist nicht dein einziges Problem.

Dein Skatch ohne flackern
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

const int NUM_SLIDERS = 4; // 4 Potentiometer
const int analogInputs[NUM_SLIDERS] = {A0, A1, A2, A3}; // Potentiometer-Eingänge
int analogSliderValues[NUM_SLIDERS];
int analogSliderValuesold[NUM_SLIDERS];
int lastSliderIndex = 0; // Verfolgt den zuletzt angepassten Slider

// Namen der Potentiometer
const char* potiNames[NUM_SLIDERS] = {
  "Sound",   // Poti 1
  "Discord", // Poti 2
  "YouTube", // Poti 3
  "Game"     // Poti 4
};

// NeoPixel-Setup für 5 LEDs (5 LEDs, auch wenn es nur 4 Potis gibt)
Adafruit_NeoPixel strip(5, 6, NEO_GRB + NEO_KHZ800); // 5 LEDs an Pin 6
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C-Adresse 0x27, 16 Zeichen, 2 Zeilen

int buttonState = 1; // Tasterzustand
int prevButtonState = 1;
int savedPoti1Value = 0; // Zum Speichern des alten Werts von Poti 1 (Sound)
bool poti1Zeroed = false; // Um den Zustand von Poti 1 zu verfolgen (ob es auf 0 gesetzt wurde)

void setup() {
  // Potentiometer als Eingänge konfigurieren
  for (int i = 0; i < NUM_SLIDERS; i++) {
    pinMode(analogInputs[i], INPUT);
  }

  // Serielle Kommunikation initialisieren
  Serial.begin(9600);

  // NeoPixel-Strip initialisieren
  strip.begin();
  strip.show();
  strip.setBrightness(255); // Helligkeit der LEDs (0-255)

  // Taster konfigurieren
  pinMode(2, INPUT_PULLUP); // Taster an Pin 2 mit Pullup-Widerstand

  // LCD initialisieren
  lcd.init(); // LCD initialisieren
  lcd.backlight(); // LCD-Hintergrundbeleuchtung einschalten
}

void loop() {
  //delay(10);
  buttonState = digitalRead(2); // Taster lesen

  // Wenn der Taster gedrückt wird, den Wert von Poti 1 (Sound) steuern
  if (buttonState == LOW && buttonState != prevButtonState) {
    if (!poti1Zeroed) {
      savedPoti1Value = analogSliderValues[0]; // Den aktuellen Wert von Poti 1 speichern
      analogSliderValues[0] = 0; // Poti 1 auf 0 setzen
      poti1Zeroed = true;
    } else {
      analogSliderValues[0] = savedPoti1Value; // Poti 1 auf den alten Wert zurücksetzen
      poti1Zeroed = false;
    }
  }
  prevButtonState = buttonState;

  // Potentiometer-Werte aktualisieren und LEDs einstellen
  updateSliderValues(); 
  setLeds(); 

  // Den zuletzt angepassten Poti auf dem LCD anzeigen
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if(analogSliderValuesold[i] != analogSliderValues[i]) 
    {
      displaySliderOnLCD();analogSliderValuesold[i] = analogSliderValues[i];
    }

  }
  // Potentiometerwerte über die serielle Schnittstelle senden
  sendSliderValues(); // Simuliert das Senden der Werte (deej nutzt serielle Daten)
}

void updateSliderValues() {
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if (i != 0 || !poti1Zeroed) { // Aktualisiere den Wert von Poti 1 nur, wenn es nicht auf 0 gesetzt wurde
      if(analogSliderValuesold[i] !=analogRead(analogInputs[i]))
      {
      analogSliderValues[i] = analogRead(analogInputs[i]); // Potentiometerwert lesen
      

      }
    }
  }
}

void setLeds() {
  // Farben der LEDs festlegen
  int colors[5][3] = {
    {255, 255, 255}, // LED 5: Weiß für Poti 1 (Sound)
    {0, 0, 255},     // LED 4: Blau für Poti 2 (Discord)
    {255, 0, 0},     // LED 3: Rot für Poti 3 (YouTube)
    {255, 255, 0},   // LED 2: Gelb für Poti 4 (Game)
    {0, 255, 0}      // LED 1: Grün (bleibt aktiv, aber ohne Poti)
  };

  // LEDs basierend auf Potentiometerwerten einstellen
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if (analogSliderValues[i] == 0) {
      strip.setPixelColor(4 - i, 0, 0, 0); // LED aus, wenn Potentiometer auf 0
    } else {
      strip.setPixelColor(4 - i, colors[i][0], colors[i][1], colors[i][2]); // Farbe einstellen
    }
  }

  // LED 5 (Grün) bleibt immer an, da sie keinen Poti hat
  strip.setPixelColor(0, colors[4][0], colors[4][1], colors[4][2]);

  strip.show(); // LEDs anzeigen
}

void displaySliderOnLCD() {
  lcd.clear(); // LCD löschen
  
  // Erster Schritt: Namen und Wert des Potentiometers in der ersten Zeile anzeigen
  lcd.setCursor(0, 0); // Erste Zeile, erste Spalte
  lcd.print(potiNames[lastSliderIndex]); // Zeigt den Namen des Potentiometers an

  // Zeigt den Wert des Potentiometers in der ersten Zeile
  lcd.setCursor(10, 0); // Gehe zur 11. Spalte in der ersten Zeile
  lcd.print(map(analogSliderValues[lastSliderIndex], 0, 1023, 0, 100)); // Zeigt den Wert (0-100)

  // Zweiter Schritt: Balkenanzeige in der zweiten Zeile
  int barLength = map(analogSliderValues[lastSliderIndex], 0, 1023, 0, 16); // Länge für LCD (16 Zeichen)
  lcd.setCursor(0, 1); // Zur zweiten Zeile wechseln

  for (int i = 0; i < 16; i++) { // Exakt 16 Zeichen in der zweiten Zeile anzeigen
    if (i < barLength) {
      lcd.print("|"); // Balken anzeigen
    } else {
      lcd.print(" "); // Rest der Zeile auffüllen, um die Zeile zu "leeren"
    }
  }
}

void sendSliderValues() {
  String builtString = String("");

  for (int i = 0; i < NUM_SLIDERS; i++) {
    builtString += String((int)analogSliderValues[i]);

    if (i < NUM_SLIDERS - 1) {
      builtString += String("|");
    }
  }

 // Serial.println(builtString); // Werte über die serielle Schnittstelle senden
}

Ist dann aber nur auf dem Sim so oder Du fügst noch eine Tolleranz hinzu weil ja die Analogwerte in kleinen Bereichen nie gleich sein werden. Ebenso würde ich 10uF Elkos vom Slider zu GND bei allen Potis empfehlen.

Die NANO die ich kenne haben 8 analoge Eingänge A0 bis A7. Die analogen Eingänge A6 und A7 haben keine Digitalen Funktionen wie die anderen analogen Pins.

Grüße Uwe

Na ja stimmt mit den 8, sollte mal zurück in die Schule :wink:
Der TO hat ja 5 Potis, dann steht nix im Wege einen Nano nutzen, oder wen Unbedingt UNO muss ein Zusatz ADS nehmen

Ich habe mir das auch mal angeschaut. Was der Button machen soll habe ich nicht kapiert. Darum habe ich den mal umgewidmet in einen Umschalter zur Anzeige der jeweiligen Analogwerte.

Ansonsten habe ich ebenfalls das Flackern beseitigt. Wird ein Slider Wert = Null, so springt die Anzeigt zum nächsten Wert der nicht Null ist oder zum ersten Wert(wenn alle Null sind).

Der Button ist, wie schon erwähnt, zum durchschalten der Anzeige missbraucht worden.
Und weil es so einen Spaß macht habe ich auch die "Todsünde" begangen und ein goto verwendet :slight_smile:

#include <Adafruit_NeoPixel.h>
#include <LiquidCrystal_I2C.h>   // https://github.com/johnrickman/LiquidCrystal_I2C
#include <Button_SL.hpp>         // https://github.com/DoImant/Button_SL

// If the search in an array was unsuccessful in terms of the search, -1 is returned.
constexpr int NO_VALID_INDEX {-1};  

const int NUM_SLIDERS = 4; // 4 Potentiometer
const int analogInputs[NUM_SLIDERS] = {A0, A1, A2, A3}; // Potentiometer-Eingänge
int analogSliderValues[NUM_SLIDERS];
int lastSliderIndex = 0; // Verfolgt den zuletzt angepassten Slider

// Namen der Potentiometer
const char* potiNames[NUM_SLIDERS] = {
  "Sound",   // Poti 1
  "Discord", // Poti 2
  "YouTube", // Poti 3
  "Game"     // Poti 4
};

// NeoPixel-Setup für 5 LEDs (5 LEDs, auch wenn es nur 4 Potis gibt)
Adafruit_NeoPixel strip(5, 6, NEO_GRB + NEO_KHZ800); // 5 LEDs an Pin 6
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C-Adresse 0x27, 16 Zeichen, 2 Zeilen
Btn::ButtonSL btn{2};

int savedPoti1Value = 0; // Zum Speichern des alten Werts von Poti 1 (Sound)
bool poti1Zeroed = false; // Um den Zustand von Poti 1 zu verfolgen (ob es auf 0 gesetzt wurde)

template <typename T, size_t N>
int hasChanged(T (&oldVal)[N], T (&newVal)[N] )
{
  int result {NO_VALID_INDEX};

  for (size_t index {0}; index < N; ++index) {
    if (oldVal[index] != newVal[index]) {
      oldVal[index] = newVal[index];
      if(result < 0) result = index;
    }
  }
  return result;
}

template <typename T, size_t N>
int nextNonZero(T (&data)[N], size_t start ) {
  // Search from actal index to end
  if (start < N-1) {
    for (size_t index {start+1}; index < N; ++index ) {
      if (data[index]) { return index; }
    }
  }

  // Search from begin to actal index
  for (size_t index {0}; index < start; ++index ) {
    if (data[index]) { return index; }
  }
  return 0;
}

void updateSliderValues() {
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if (i != 0 || !poti1Zeroed) { // Aktualisiere den Wert von Poti 1 nur, wenn es nicht auf 0 gesetzt wurde
      analogSliderValues[i] = analogRead(analogInputs[i]); // Potentiometerwert lesen
    }
  }
}

void setLeds() {
  // Farben der LEDs festlegen
  int colors[5][3] = {
    {255, 255, 255}, // LED 5: Weiß für Poti 1 (Sound)
    {0, 0, 255},     // LED 4: Blau für Poti 2 (Discord)
    {255, 0, 0},     // LED 3: Rot für Poti 3 (YouTube)
    {255, 255, 0},   // LED 2: Gelb für Poti 4 (Game)
    {0, 255, 0}      // LED 1: Grün (bleibt aktiv, aber ohne Poti)
  };

  // LEDs basierend auf Potentiometerwerten einstellen
  for (int i = 0; i < NUM_SLIDERS; i++) {
    if (analogSliderValues[i] == 0) {
      strip.setPixelColor(4 - i, 0, 0, 0); // LED aus, wenn Potentiometer auf 0
    } else {
      strip.setPixelColor(4 - i, colors[i][0], colors[i][1], colors[i][2]); // Farbe einstellen
    }
  }
  // LED 5 (Grün) bleibt immer an, da sie keinen Poti hat
  strip.setPixelColor(0, colors[4][0], colors[4][1], colors[4][2]);
  strip.show(); // LEDs anzeigen
}

void displaySliderOnLCD() {
  lcd.clear(); // LCD löschen

  // Erster Schritt: Namen und Wert des Potentiometers in der ersten Zeile anzeigen
  lcd.setCursor(0, 0); // Erste Zeile, erste Spalte
  lcd.print(potiNames[lastSliderIndex]); // Zeigt den Namen des Potentiometers an

  // Zeigt den Wert des Potentiometers in der ersten Zeile
  lcd.setCursor(10, 0); // Gehe zur 11. Spalte in der ersten Zeile
  lcd.print(map(analogSliderValues[lastSliderIndex], 0, 1023, 0, 100)); // Zeigt den Wert (0-100)

  // Zweiter Schritt: Balkenanzeige in der zweiten Zeile
  int barLength = map(analogSliderValues[lastSliderIndex], 0, 1023, 0, 16); // Länge für LCD (16 Zeichen)
  lcd.setCursor(0, 1); // Zur zweiten Zeile wechseln

  for (int i = 0; i < 16; i++) { // Exakt 16 Zeichen in der zweiten Zeile anzeigen
    if (i < barLength) {
      lcd.print("|"); // Balken anzeigen
    } else {
      lcd.print(" "); // Rest der Zeile auffüllen, um die Zeile zu "leeren"
    }
  }
}

void sendSliderValues() {
  String builtString = String("");
  for (int i = 0; i < NUM_SLIDERS; i++) {
    builtString += String((int)analogSliderValues[i]);

    if (i < NUM_SLIDERS - 1) {
      builtString += String("|");
    }
  }
  Serial.println(builtString); // Werte über die serielle Schnittstelle senden
}

void setup() {
  // Potentiometer als Eingänge konfigurieren
  for (auto &pin : analogInputs) { pinMode(pin, INPUT); }

  // Serielle Kommunikation initialisieren
  Serial.begin(9600);
  btn.begin();

  // NeoPixel-Strip initialisieren
  strip.begin();
  strip.show();
  strip.setBrightness(255); // Helligkeit der LEDs (0-255)

  // Taster konfigurieren
  pinMode(2, INPUT_PULLUP); // Taster an Pin 2 mit Pullup-Widerstand

  // LCD initialisieren
  lcd.init(); // LCD initialisieren
  lcd.backlight(); // LCD-Hintergrundbeleuchtung einschalten
}

void loop() {
  static int oldSliderValues[NUM_SLIDERS] {-1};
  if (btn.tick() != Btn::ButtonState::notPressed) {
    lastSliderIndex = (lastSliderIndex + 1) % NUM_SLIDERS;
    displaySliderOnLCD();
  }
  updateSliderValues();
  auto result = hasChanged(oldSliderValues, analogSliderValues);
  if (result != NO_VALID_INDEX) {
    // if a value becomes 0 show the next Slider value > 0
    lastSliderIndex = (!analogSliderValues[result]) ? nextNonZero(analogSliderValues, result) : result; 

    // Potentiometer-Werte aktualisieren und LEDs einstellen
    setLeds();
    // Den zuletzt angepassten Poti auf dem LCD anzeigen
    displaySliderOnLCD();
    // Potentiometerwerte über die serielle Schnittstelle senden
    sendSliderValues(); // Simuliert das Senden der Werte (deej nutzt serielle Daten)
  }
}

Ja, so ging mir das auch. Mehr als umschalten zwischen 0 und dem Analogwert (Sound) war nicht programiert.

Aber was ist das ?
Sorry habs gefunden. Ja lüpt auch bei mir hier. Fehlt nur noch TO der seinen Hardware Fehler erst beheben müsste.