Probleme mit Programmierung Drehimpulsgeber

Hallo
Ich möchte eine Waage mit einem Arduino bauen. Auf Grund von verschiedenen Einflüssen macht es sich notwendig, den Skalierfaktor der Wägezelle hin und wieder leicht anzupassen. Ich hatte mir überlegt, dass ich dazu einen Encoder nehme und damit nicht einfach der Wert verstell wird, ist es nötig, dazu ein Taster zu drücken. Drücke ich den Encoder-Taster (EncP) und drehe ich am Encoder, erhöht oder verringert sich der Wert. Außerdem soll nur dert Wert auf dem LCD dargestellt werden, wenn halt auch der Encoder-Taster gedrückt ist.
Der folgende Sketch funktioniert ohne Probleme.

#include <LiquidCrystal.h>
#include <HX711.h>
#include <Encoder.h>


int EncR  = 5;  //Encoder Wert verkleinern
int EncL  = 4;  //Encoder Wert vergrößern
int EncP  = 3;  //Freigabetaster zur Kalibrierung
long oldPosition  = 0;
int Scalwert = 5120;  //Waagen-Skaliervorwert
int Scalact = 5120; //Skalierwert

LiquidCrystal lcd(31, 33, 35, 37, 39, 41); 

//Encoder
Encoder my_encoder(EncL, EncR);

void setup() { 
  Serial.begin(19200);
  lcd.begin(16, 2);
   pinMode(EncP,INPUT);
}

void loop() {
  /* Encoder einlesen und Skalierwert setzen
 Der Skalierwert ist bei der verwendeten Wägezelle rund 5120. Um die Waage genau zu kalibrieren, ist es erforderlich, diesen Wert
 geringfügig anzupassen. Damit ein versehentliches Verstellen des Wertes über den Drehimpulsgeber verhindert wird, muß man zum ändern des 
 Wertes immer erst den Freigabe-Taster (EncP) betätigen und betätigt halten.
 */
  if (digitalRead(EncP) == HIGH) { 
  long newPosition = my_encoder.read();
  if (newPosition != oldPosition) {
    Scalact = Scalwert - (newPosition - oldPosition);
  } 
   lcd.setCursor(0,1);
   lcd.print("Scalwert:");
   lcd.setCursor(11,1);
   lcd.print(Scalact);
  }

  else {
  lcd.setCursor(0,1);
  lcd.print("               ");
}

Serial.println(Scalact);
}

Füge ich den Code in den Rest meines Programmes ein, kann ich bei gedrückten Encoder-Taster (EncP) nur noch mit dem Encoder den Wert verringern, egal in welche Richtung ich drehe. Ab und zu springt der Wert auch mal wieder hoch, aber der Encoder arbeitet halt nicht mehr richtig. Hier mal der Code des gesamten Programmes.

//Benötigte Bibliotheken einlesen
#include <LiquidCrystal.h>
#include <HX711.h>
#include <Encoder.h>

int TaraBu = 2; //Tara Taster
int Scalvalue = 5120;  //Skalierungswert
int HXdat = A12;  //HX711 Daten
int HXsck = A11;  //HC711 SCK
int EncR  = 5;  //Encoder Wert verkleinern
int EncL  = 4;  //Encoder Wert vergrößern
int EncP  = 3;  //Freigabetaster zur Kalibrierung
long Scalwert = 5120;  //Waagen-Skaliervorwert
long Scalact = 5120; //Skalierwert
long oldPosition  = 0;

//LCD initialisieren
//RS-Pin31, E-Pin33, DB4-Pin35, DB5-Pin37, DB6-Pin39, DB7-Pin41, RN-GND
LiquidCrystal lcd(31, 33, 35, 37, 39, 41); 

//Encoder
Encoder my_encoder(EncL, EncR);

//Wägemodul
HX711 scale;

//Funktion "LCD aktualisieren"
void messwertAnzeigen(int spalte, int zeile, float wert, int stellen){
 char buf[7];
 lcd.setCursor(spalte,zeile);
 itoa (wert,buf,10);
 for (int i=0;i<stellen-strlen(buf);i++)
 lcd.print(" ");
 lcd.print(wert); 
 }

//---------------------------------------------------------------------------------------------------------------------------------------

void setup() {
 lcd.begin(16, 2);
 scale.begin(HXdat, HXsck); //HX711 Daten, HC711 SCK
 pinMode(TaraBu,INPUT);
 pinMode(EncP,INPUT);

 scale.tare(); //Tarieren beim Einschalten

//Feste Zeichen im LCD setzen
  lcd.setCursor(0,0);
  lcd.print("Gew. :");
  lcd.setCursor(15,0);
  lcd.print("g");
} 

//---------------------------------------------------------------------------------------------------------------------------------------

void loop() {
/* Encoder einlesen und Skalierwert setzen
 Der Skalierwert ist bei der verwendeten Wägezelle rund 5120. Um die Waage genau zu kalibrieren, ist es erforderlich, diesen Wert
 geringfügig anzupassen. Damit ein versehentliches Verstellen des Wertes über den Drehimpulsgeber verhindert wird, muß man zum ändern des 
 Wertes immer erst den Freigabe-Taster (EncP) betätigen und betätigt halten.
 */

if (digitalRead(EncP) == HIGH) { 
  long newPosition = my_encoder.read();
  if (newPosition != oldPosition) {
    Scalact = Scalwert - (newPosition - oldPosition);
  } 

   lcd.setCursor(0,1);
   lcd.print("Scalwert:");
   lcd.setCursor(11,1);
   lcd.print(Scalact);
  }
  else {
  lcd.setCursor(0,1);
  lcd.print("               ");
  }

//********************************************************

// Gewicht tarrieren
if (digitalRead(TaraBu)==HIGH){ 
scale.tare();  
}

//********************************************************

//Gewicht auf LCD ausgeben
scale.set_scale(Scalact);
messwertAnzeigen(0,0,scale.get_units(10),10);

//********************************************************   
}

Ich hoffe, dass der Code einigermaßen übersichtlich ist. Vielleicht kann mir einer sagen, wo mein Fehler liegt.

MfG
computerpap

Ich weiß, dass es schwer ist, sich in den Code einzulesen, noch dazu, wenn ihn ein Arduino-Anfänger wie ich ihn geschrieben haben, sorry dafür. Aber weiß keiner nur einen Ansatz, warum der Programmteil vom Encoder nur separat funktioniert und nicht im kompletten Programm? Ich steh total auf dem Schlauch.

Ich hab jetzt herausgefunden, dass die letzte Zeile im Code das Problem verursacht.

messwertAnzeigen(7,0,scale.get_units(5),3);

Deaktiviere ich die Zeile, funktioniert der Encoder.
Das ist doch aber nur die Parameterübergabe von der Funktion "messwertAnzeigen".
Was hat die mit dem Encoder zu tun?

Wie du in Post #1 schon geschrieben hast, ist es schwer den Code zu verstehen.

Ich vermute, das Problem liegt daran, dass du den Wert, den du mit dem Drehimpulsgeber einstellst, auch direkt an die verarbeitende Routine übergibst.
Du solltest den Wert erst an eine Variable übergeben und erst beim loslassen des Knopfes diesen an die Funktion weitergeben, die damit arbeiten soll.

Der Wert des Encoders hat nichts mit der Funktion "messwertAnzeigen" zu tun.
Den Wert des Encoders gebe ich direkt auf das Display mit

lcd.setCursor(0,1);
lcd.print("Scalwert:");
lcd.setCursor(12,1);
lcd.print(Scalact);

Die Funktion "messwertAnzeigen" nutze ich, um mir den Messwert der Wägezelle (HX711) anzuzeigen.
Deshalb begreife ich das ganze auch nicht.

computerpap:
Der Wert des Encoders hat nichts mit der Funktion "messwertAnzeigen" zu tun.
Den Wert des Encoders gebe ich direkt auf das Display mit

lcd.setCursor(0,1);
lcd.print("Scalwert:");
lcd.setCursor(12,1);
lcd.print(Scalact);

Die Funktion "messwertAnzeigen" nutze ich, um mir den Messwert der Wägezelle (HX711) anzuzeigen.
Deshalb begreife ich das ganze auch nicht.

Genau da vermute ich dein Problem. So wie ich schon geschrieben habe.
Speicher den Wert erst in eine Variable und übergebe den nach Loslassen des Knopfes an den Sketch.

Das Problem ist "scale.get_units(5)" in der letzten Zeile

messwertAnzeigen(7,0,scale.get_units(5),3);

Schreibe ich dort statt "scale.get_units(5)" eine Variable mit einem Wert rein, ist alles ok.
Ich hab auch schon versucht den Wert von "scale.get_units(5)" in eine Variable zu schreiben und diese dann als Parameter zu übergeben,

float variable_1 = scale.get_units(5);
messwertAnzeigen(7,0,variable_1,3);

hat aber auch nichts gebracht.

kann es sein, dass es an der Funktion "messwertAnzeigen" selber liegt?
Dort wird der Befehl "itoa" verwendet, da wird ja wenn ich es richtig verstanden habe, ein Integer zu einem String gewandelt. Ich hab aber als "wert" eine Gleitkommazahl.

void messwertAnzeigen(int spalte, int zeile, float wert, int stellen){
 char buf[7];
 lcd.setCursor(spalte,zeile);
 itoa (wert,buf,10);
 for (int i=0;i<stellen-strlen(buf);i++)
 lcd.print(" ");
 lcd.print(wert); 
 }

Das float vor Wert hab ich gemacht, original stand da int.

computerpap:
kann es sein, dass es an der Funktion "messwertAnzeigen" selber liegt?
Dort wird der Befehl "itoa" verwendet, da wird ja wenn ich es richtig verstanden habe, ein Integer zu einem String gewandelt. Ich hab aber als "wert" eine Gleitkommazahl.

Das float vor Wert hab ich gemacht, original stand da int.

Du solltest schon wissen, was du programmierst.
Wenn das ein Problem macht, dann gibt es auch einen Fehler bei der Kompilierung.

Da es aber nur für die Anzeige zuständig ist, liegt der eigentliche Fehler an anderer Stelle.
Wie schon geschrieben.

Du solltest schon wissen, was du programmierst.

Das ist mein Problem als Anfänger, da versteht man bei weiten noch nicht alles.

Speicher den Wert erst in eine Variable und übergebe den nach Loslassen des Knopfes an den Sketch.

Kannst du mir nochmal genau erklären, was ich hier machen soll.

computerpap:
Das ist mein Problem als Anfänger, da versteht man bei weiten noch nicht alles.

Dann solltest du nicht einfach irgendwelche Variablendefinitionen ändern.

Grundlagen lernen, sollte da helfen.

Dann setze es doch einfach wieder zurück und teste was passiert.
Er sollte beim Kompilieren einen Fehler auswerfen.

Hab ich schon zurückgesetzt, Kompiler bringt keinen Fehler, aber ich bekomme auch den Wert nicht richtig
angezeigt, deshalb wieder auf float gesetzt.
Gelöst hab ich es jetzt so wie du es beschrieben hast. Über eine while-Schleife frage ich den Taster ab und beim loslassen wird erst der Wert geschrieben.
Kapiert hab ich es zwar immer noch nicht, warum das so ist, aber es funktioniert erstmal.
Vielen Dank!