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