Hallo zusammen,
für mein Projekt möchte ich ein Menü erstellen, sodass verschiedene Szenarien Auswählbar sind. Dieses Menü möchte ich implementieren und auf meinem 16x2 LCD-Display anzeigen lassen.
Meine Idee: Ich möchte mit einem Encoder zwischen verschiedenen Menüpunkten auswählen. Das soll in etwa wie folgt aussehen:
| Größe wählen: |
| klein | an dieser Stelle soll zwischen "klein", "mittel", "groß" und "sehr klein" gewählt werden
Umgesetzt habe ich es bisher wie folgt: Ich habe den Wertebereich des Encoders von 1 bis 80 beschränkt. Nun soll bei den Werten 1-20 "sehr klein" erscheinen, bei 21-40 "klein" usw. und anschließend mit dem Button des Encoders der jeweilige Parameter wählbar sein.
Für jeden Parameter (klein, mittel, groß, sehr klein" soll dann eine bestimmt Menge an Wasser durch eine Pumpe in ein Gefäß gefüllt werden. (Noch nicht implementiert)
Mein Code sieht wie folgt aus:
#include <Encoder.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C meinLCD(0x27,16,2);
int newPosition = 3; // Definieren der Variable newPosition
int oldPosition = -999; // Definieren der Variable oldPosition mit fiktiver Startposition ungleich der neuen Position
Encoder meinEncoder(5, 6); //Rotary Encoder definieren
void setup() {
Serial.begin(9600); //starten des seriellen Monitors
Serial.println("Basic Encoder Test:");
meinLCD.init();
meinLCD.backlight();
}
void loop() {
newPosition = meinEncoder.read(); //Abfrage der Encoderposition
newPosition = constrain(newPosition,0,80); //Begrenzung des Wertebereichs von 0-80
if (newPosition != oldPosition) {
oldPosition = newPosition;
Serial.println(newPosition);
textausgabe(); //Aufruf der Funktion "textausgabe"
}
}
void textausgabe() {
//Je nach Wert des Encoders, sollen verschiedene Infos auf dem LCD Display zu sehen sein:
if (newPosition < 21)
{ meinLCD.clear();
meinLCD.print("Groesse waehlen:");
meinLCD.setCursor(0,1);
meinLCD.print("sehr klein");}
if (newPosition < 41 && newPosition >20)
{ meinLCD.clear();
meinLCD.print("Groesse waehlen:");
meinLCD.setCursor(0,1);
meinLCD.print("klein");}
if (newPosition < 61 && newPosition >40)
{ meinLCD.clear();
meinLCD.print("Groesse waehlen:");
meinLCD.setCursor(0,1);
meinLCD.print("mittel");}
if (newPosition < 81 && newPosition >60)
{ meinLCD.clear();
meinLCD.print("Groesse waehlen:");
meinLCD.setCursor(0,1);
meinLCD.print("gross");}
}
Problem: Führe ich den Code aus, ohne die Funktion "textausgabe" zu nutzen (deaktivieren der Funktion durch "//"), so ändern sich die Werte des Drehgebers im seriellen Monitor sehr konstant und flüssig.
Sobald ich die Funktion "textausgabe" einbeziehe (so wie im geposteten Code), ändern sich die Werte sehr schleppend. Außerdem kommt es vor, dass ich nach rechts drehe und sich die Werte (wie gewollt) erhöhen. Drehe ich dann anschließend nach links, bleibt der Wert stehen oder erhöht sich ebenfalls (ungewollt! er soll sinken!).
Habt ihr Ideen, woran das liegen kann? Außerdem bin ich auch über Alternativvorschläge zur Verwirklichung meines kleinen Projektes dankbar (andere Libs, andere Ansätze etc.)
Vielen Dank schonmal! ![]()