Kalibrierung des HX711

Hallo,

ich bin auf der Suche nach einer Lösung im Internet auf dieses Forum hier gestoßen und dachte mir, warum soll ich es denn nicht hier auch einmal versuchen? :roll_eyes:

Ich versuche derzeit mit zwei Funktion in einem Programm meinen HX711 zu Kalibrieren und anschließend das Gewicht zu messen. Leider gibt es mir immer falsche Werte aus und auch permanent verschiedene und keine eindeutigen, welche immer gleich bleiben würden.
Ich möchte die Werte in Kilogramm und Gramm ausgeben, aber bereits hier gibt es mir immer unterschiedliche Werte aus welche nicht zusammen passen. (Umrechnungsfehler?)

//Anfang des Programms
#include <HX711.h> // Quelle: https://github.com/bogde/HX711

HX711 scale(A1, A0);

float kalibrationsfaktor = 0;


//Funktion Kalibrierung
void kalibrierung()
{
 // Folgendes wird auf dem Seriellen Monitor angezeigt
 Serial.println("Für die Kalibrierung entfernen Sie bitte alle Gegenstände von der Waage!");
 Serial.println("Wenn Sie alle Gegenstände entfernt haben geben Sie bitte die Nummer 1 ein und drücken Sie [ENTER].");
 Serial.println();

  
   while((Eingabe != '1'))
   {
     Eingabe = Serial.read();
   }

     scale.set_scale();
     scale.tare();

     float current_weight=scale.get_units(20);
     kalibrationsfaktor=(current_weight/0.1000);
     Serial.print("Kalibrierungsfaktor: ");
     Serial.println(kalibrationsfaktor);
     Serial.println();
     Serial.println();

 Serial.println("Waage kalibriert");
}


//Funktion Gewicht messen
void gewicht()
{
 Serial.println("Aktuelles Gewicht:");
 scale.set_scale(kalibrationsfaktor);  
 scale.tare();                        
 Serial.print(scale.get_units(3));
 Serial.print(" Kilogramm = ");
 Serial.print((scale.get_units(3)*1000));
 Serial.println(" Gramm");
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Danke habe ich gemacht :slight_smile:

Hi

Die 2.te IF ist unnötig - die WHILE wird nur verlassen, wenn Eingabe==1 ist - somit brauchst Du nicht danach zu fragen, OB Das so ist.

Das .tare() sollte, meinem Verständnis nach, das aktuelle Gewicht als Null annehmen lassen - soll Das so?
Da Du LAUFEND .tare(); aufrufst, solltest Du Werte um 0,000 erhalten, da das Gewicht ja 'genullt' wurde.

MfG

Danke für deine Antwort :slight_smile:

Das zweite IF habe ich nun entfernt.

Ja genau, das tare() setzt die Waage auf 0 zurück.
Warum rufe ich laufend tare() auf ? Ich rufe es nur einmal in der Funktion auf? Und diese wird auch nur einmal, für die Kalibrierung, ausgeführt.

Und bei der Funktion gewicht() wird es vor jedem Durchlauf ausgeführt. Als erstes der vorher gemessene kalibrationsfaktor und dann wird die Waage mithilfe diesem auf 0 gesetzt.

Wenn ich mein Programm so ausführe, wie es jetzt ist, bekomme ich auch bei der Messung verschiedene Werte!
Wenn als Beispiel 8 Messungen ausgeführt werden, dann kommen folgende Ergebnisse:

GEWICHT
Aktuelles Gewicht:
-0.05 Kilogramm = -63.16 Gramm

GEWICHT
Aktuelles Gewicht:
-0.14 Kilogramm = -257.89 Gramm

GEWICHT
Aktuelles Gewicht:
0.49 Kilogramm = 57.89 Gramm

GEWICHT
Aktuelles Gewicht:
0.06 Kilogramm = 89.47 Gramm

GEWICHT
Aktuelles Gewicht:
0.06 Kilogramm = 147.37 Gramm

GEWICHT
Aktuelles Gewicht:
0.07 Kilogramm = 78.95 Gramm

GEWICHT
Aktuelles Gewicht:
-0.05 Kilogramm = -36.84 Gramm

GEWICHT
Aktuelles Gewicht:
0.02 Kilogramm = -152.63 Gramm

Hi

Ups - noch gar nicht gesehen, daß Das nur ein Fragment ist - war irgendwie davon ausgegangen, Das wäre loop() - und Da wäre in jedem Durchlauf .tare() aufzurufen … äh … nicht zielführend :wink:

Sinnig ist’s, wenn Du testbaren Code lieferst - das Drum Herum fehlt komplett.
Wobei ich keine Wägezelle hatte, also selbst MIT kompilierbarem Code könnte ich Das nicht testen - soll hier aber noch ein/zwei Andere geben, Die vll. so was in Ihrer Krabbelkiste haben.

MfG

Danke nochmals für deine Antwort :slight_smile:

Ich habe den Code, welcher nur für das Wiegen zuständig ist herausgesucht und damit ein neues Programm erstellt.
Der ganze Code würde nämlich den Rahmen sprengen. :roll_eyes: :wink:

#include <HX711.h> // Quelle: https://github.com/bogde/HX711
HX711 scale(A1, A0);

char Eingabe = ' ';
float kalibrationsfaktor = 0;
float aktuelles_gewicht = 0;

void setup()
{
  Serial.begin(9600);

  Eingabe = ' ';

  Serial.println("GEWICHTSMESSUNG:");
  Serial.println();
  Serial.println("-----MENÜ-----");
  Serial.println();
  Serial.println("-1 ... KALIBRIERUNG DER STOCKWAAGE");
  Serial.println("-2 ... ABRUFEN DES AKTUELLEN GEWICHTS");
  Serial.println();
  Serial.println();
  Serial.println("Zahl eingeben und mit [ENTER] bestätigen");
}

void loop()
{ 
  while((Eingabe != '1') && (Eingabe != '2'))
  {
    Eingabe = Serial.read();
  }

  switch(Eingabe)
  {
    case '1':
        Serial.println("KALIBRIERUNG:");
        Serial.println();

        Eingabe = ' ';

        // Aufrufen der void kalibrierung
        kalibrierung();
  
        Serial.println();
        Serial.println("KALIBRIERUNG ERFOLGREICH");
        Serial.println();
        Serial.println();
        Serial.println("Sie werden zum Menü zurückgeleitet.");
        delay(3000);
        Serial.println();
        Serial.println();
    
        setup();
    break;

    case '2':
        Serial.println();
        Serial.println("AKTUELLE GEWICHTSMESSUNG:");
        Serial.println();
        Serial.println("Sie werden zum Menü zurückgeleitet wenn Sie '1' eingeben und [ENTER] drücken.");
        delay(3000);
        Serial.println();
        Serial.println();

        while(Eingabe != '1')
        {
          Eingabe = Serial.read();
          
          // Aufrufen der void gewicht
          gewicht();
          delay(3000);
        }

        setup();
    break;

    default:
        Serial.println();
        Serial.println("FEHLERHAFTE EINGABE!");
        Serial.println();
        Serial.println();
        Serial.println("Sie werden zum Menü zurückgeleitet.");
        delay(3000);
        Serial.println();
        Serial.println();
  
        setup(); 
    break;
  } 
}

void kalibrierung()
{
 Serial.println("Für die Kalibrierung entfernen Sie bitte alle Gegenstände von der Waage!");
 Serial.println("Wenn Sie alle Gegenstände entfernt haben geben Sie bitte die Nummer 1 ein und drücken Sie [ENTER].");
 Serial.println();

  
   while((Eingabe != '1'))
   {
     Eingabe = Serial.read();
   }

     scale.set_scale();
     scale.tare();

     aktuelles_gewicht=scale.get_units(20);
     kalibrationsfaktor=(aktuelles_gewicht/0.1000);
     Serial.print("Kalibrierungsfaktor: ");
     Serial.println(kalibrationsfaktor);
     Serial.println();
     Serial.println();

 Serial.println("Waage kalibriert");
}

void gewicht()
{
  Serial.println("GEWICHT:");
  Serial.println("Aktuelles Gewicht:");
  scale.set_scale(kalibrationsfaktor);  //Kalibrationsfaktor vom void kalibrierung
  scale.tare();                         //Setzt die Waage auf 0 zurück
  Serial.print(scale.get_units(3));
  Serial.print(" Kilogramm = ");
  Serial.print((scale.get_units(3)*1000));
  Serial.println(" Gramm");
  Serial.println();
  Serial.println();
}

Warum wiegst Du für die Ausgabe in Gramm nochmal? Das kannst Du doch aus den Kilogramm errechnen.

Gruß Tommy

Danke für deine Antwort :slight_smile:

Das habe ich bis jetzt noch nicht durchdacht. Aber müsste es nicht eigentlich egal sein? Also es sollten doch die selben Werte herauskommen oder? Also halt nur in Gramm oder Kilogramm.
Und die beiden ausgegebenen Werte haben aber nichts miteinander zutun?
Siehe oben? :confused:

Die obigen Werte habe ich gemessen, wenn es eigentlich 0kg ausgeben sollte. Und wenn ich 1kg messe, dann gibt es mir auch ganz unterschiedliche Werte aus, welche nichts miteinander zutun haben und welche auch weit von einem kg entfernt sind? :frowning:

Lg

Weiß noch jemand vielleicht eine Antwort? Wäre sehr wichtig :confused: :disappointed_relieved:

Voltolos:
Weiß noch jemand vielleicht eine Antwort? Wäre sehr wichtig :confused: :disappointed_relieved:

Ich habe deinen Code probiert und bin gescheitert.

Hier schon:

#include <HX711.h> // Quelle: https://github.com/bogde/HX711
HX711 scale(A1, A0);

Der Konstruktor Aufruf passt nicht zur lib.

ketch_aug05e:2:19: error: no matching function for call to 'HX711::HX711(const uint8_t&, const uint8_t&)'
    2 | HX711 scale(A1, A0);
      |

Hi

Voltolos:
Weiß noch jemand vielleicht eine Antwort? Wäre sehr wichtig :confused: :disappointed_relieved:

Druck machen ... Das sind jetzt aber keine Hausaufgaben, oder?
Sollte Dein Prof nicht ganz blöd sein, kennt Der die einschlägigen Foren - nur als 'Mal gehört hab'.

MfG

postmaster-ino:
HiDruck machen ... Das sind jetzt aber keine Hausaufgaben, oder?
Sollte Dein Prof nicht ganz blöd sein, kennt Der die einschlägigen Foren - nur als 'Mal gehört hab'.

MfG

Nein es sind keine Hausaufgaben. Ich habe keine Hausaufgaben mehr :smiley:
Ich habe nur einen Termin für den ersten Probebetrieb der Waage einzuhalten und dieser rückt immer näher und sie funktioniert aber noch nicht.

Ich brauche es nur um bei meinem Programm weiter zu kommen und solange die Kalibrierung und Messung nicht funktioniert, kann ich leider nicht weiterarbeiten.

Und ich war mir schon unsicher, ob ich überhaupt noch Lösungsvorschläge bekomme :wink:

Lg

combie:
Ich habe deinen Code probiert und bin gescheitert.

Hier schon:

#include <HX711.h> // Quelle: https://github.com/bogde/HX711

HX711 scale(A1, A0);



Der Konstruktor Aufruf passt nicht zur lib.



ketch_aug05e:2:19: error: no matching function for call to ‘HX711::HX711(const uint8_t&, const uint8_t&)’
    2 | HX711 scale(A1, A0);
      |

Danke dass du es ausprobiert hättest :slight_smile:

Ich habe keine Ahnung warum es bei dir nicht funktioniert? Bei mir funktioniert es bis dorthin ohne Probleme. Es funktioniert erst ab der Kalibrierung und Messung nicht mehr?!

Hast du die Bibliothek vom Link heruntergeladen?

Hast du die Bibliothek vom Link heruntergeladen?

Nach bestem Wissen und Gewissen.

Und sogar in den Quellcode geschaut.
Und nein, es gibt diesen Konstruktor nicht.

Warum das bei dir läuft?
Weil du eine andere Lib verwendest?

Wichtige Info:
Wenn die Tara-Funktion beim Start aufgerufen wird, ist es nach dem nächsten Stromausfall Essig, wenn die Last zur Überwachung immer auf der Waage ist.