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
}

