HX711 und Peaks

Hallo,

ich haben zwei Kraftmesssensoren mit zwei getrennten HX711 im Einsatz.
Leider zeigen sich gelegentlich kurze Peaks in den Daten die ich mit nicht erklären kann. Stellenweise werden extrem hohe Werte geliefert, stellenweise 0, gelegentlich sogar ein Überlauf(!) mit -Werten.
Ich hab schon alle mögliche Konstellationen durch, mit delay, Austausch der Verstärker, etc…
Es sind mehrere dieser Geräte im Einsatz mit mehr oder weniger vielen dieser Peaks,
aber keiner ohne…
Auch bei unterschiedlichen die Arduino IDE’s. Überall der gleiche Effekt.

Wer kann weiter helfen?

int X1;
int X2;
int Zaehler1;
int Zaehler2;
int Merker1;
int Merker2;
String inputString = "";         // a string to hold incoming data

#define CLK1  40  // Sensor 1
#define DOUT1 42
#define CLK2  44  // Sensor 2
#define DOUT2 46
#include "HX711.h"

 HX711 scale1(DOUT1, CLK1); // Sensor 1
 HX711 scale2(DOUT2, CLK2); // Sensor 2

void setup() {
  Serial.begin (57600);
   scale1.set_scale(100);  // Sensor 1
   scale2.set_scale(100);  // Sensor 2
}

void loop(){ 
  
  int X1=  (scale1.get_units()); 
  int X2 = -(scale2.get_units());
  
  // Grenzwerte, abhängig vom Sensor eingeben
  if (X1 > 6050 || X1 < 5910){++Zaehler1; Merker1 = X1;}
  if (X2 > 1600 || X2 < 1450){++Zaehler2; Merker2 = X2;}
  
  Serial.print( X1 ); Serial.print( "\t" ); 
  Serial.print( "Fehler1: ");  Serial.print( Zaehler1 );Serial.print( "\t" );
  Serial.print( "Merker1: "); Serial.print ( Merker1 ) ;Serial.print( "\t" );
  Serial.print( X2 ); Serial.print( "\t" ); 
  Serial.print( "Fehler2: ");  Serial.print( Zaehler2 );Serial.print( "\t" );
  Serial.print( "Merker2: "); Serial.println( Merker2 );
}

Selber habe ich damit noch nichts gemacht.
Tippe auf zu lange Leitungen oder schlechte Spannungsversorgung.

Manchen der HX711 Boards fehlt eine GND Verbindung zwischen zwischen Messbrücke und Arduino GND

Habe jetzt alles auf GND gelegt, Kabelabschirmung, Metallgehäuse und SensorGND. Jetzt ist Ruhe! Thank's @ Combie

Kommando zurück. Ich habe nämlich eine serielle Datenübertragung (bidirektional) zum PC eingefügt.

Sehr selten, manchmal nach Stunden "schnappen" die Werte über. Dann bekomme ich nicht nachvollziehbare Werte. Die können real sein, aber auch kompletter Blödsinn (0, 10fache Werte, negative Werte, etc.) Strom per USB vom Laptop (auch bei Akkubetrieb).
Diesen Fehler habe ich jetzt auch isoliert.

 Messen();           // HX711 Daten holen

  if (Serial1.available()>=21){// vom Com-Port / PC

    // StellWerte();     // Kraftwerte nachregeln
    // DatenSenden();  // zum PC senden

  }

Sobald ich die Datenübertragung stoppe oder auskommentiere ist alles gut. Das "Messen" in die If-Schleife setzen brachte keinerlei Erfolg. Ein davor eingefügtes delay(10); brachte keinerlei Besserung. Woran kann das liegen? Irgendein internes Timingproblem?

Sehr schön, aber mit dem Codefragment können wir nichts anfangen.
Vermutlich wird dein Messwert durch die Serielle wieder verändert.

Hier ist der komplette, aufgeräumte Code, bei dem die Fehler auftreten.

int Zaehler1;
int Zaehler2;
int Merker1;
int Merker2;
String inputString;
unsigned long Nm1;
unsigned long Nm2;
#define CLK1  40  
#define DOUT1 42
#define CLK2  44  
#define DOUT2 46

#include "HX711.h"
  HX711 scale1(DOUT1, CLK1);
  HX711 scale2(DOUT2, CLK2);
  
void setup() {
  scale1.set_scale(100);  // Kraftsensor 1
  scale2.set_scale(100);  // Kraftsensor 2
  Serial.begin(57600);    // Arduino Monitor USB
  Serial1.begin(38400);   // Empfangen PC
}

void loop(){ 
  delay(5);
  //Messen();  
  if (Serial1.available()>=51){// vom Com-Port / PC
    // StellWerte();     // Kraftwerte nachregeln
    // DatenSenden();  // zum PC senden
    //delay(10);
    Messen();  
    Lesen();
  //}
}


void Messen(){ 
  int x1=  -(scale1.get_units()); 
  int x2 = (scale2.get_units());
  
  // Grenzwerte, abhängig vom Sensor eingeben
  if (x1 < 1450 || x1 > 1650){++Zaehler1; Merker1 = x1;}
  if (x2 < 5980 || x2 > 6050){++Zaehler2; Merker2 = x2;}
  Nm1 = x1;
  Nm2 = x2;
  
  Serial.print( x1 ); Serial.print( "\t" ); 
  Serial.print( "Fehler1: ");  Serial.print( Zaehler1 );Serial.print( "\t" );
  Serial.print( "Merker1: "); Serial.print ( Merker1 ) ;Serial.print( "\t" );
  Serial.print( x2 ); Serial.print( "\t" ); 
  Serial.print( "Fehler2: ");  Serial.print( Zaehler2 );Serial.print( "\t" );
  Serial.print( "Merker2: "); Serial.println( Merker2 );
}


void Lesen(){ // Daten werden mit 5 Hz gesendet und hier ausgelesen
  inputString="";
     for (int i=0; i <= 51; i++){
       inputString = inputString + char(Serial1.read());  // Puffer auslesen
   }
}

Sobald die serielle Kommunikation mit dem PC auskommentiert ist gibt’s keine Fehler.

Die Funktion "Messen()" innerhalb der "if-Abfrage" macht so auch keinen Sinn.

Da liest er den Sensor ja nur aus, wenn du Daten überträgst.
Das kommt sich bestimmt in die Quere.

@ Hot Systems: das macht durchaus Sinn. Nur wenn die Daten bereits eingetroffen sind, soll gemessen werden. Damit verhindert man Messen während gleichzeitig Daten eintreffen. Hab ich schon alles ausprobiert. Das ändert nichts.

@noiasca: ja, ist nervig.
Nm1/Nm2 Ist wieder zurückgeändert auf int. Hab da nur was ausprobiert.

Interessanterweise tritt der Fehler immer unregelmäßig auf. Egal ob ich den Arduino, die HX711, die Anschlüsse, die Sensoren oder die Reihenfolge der Aufrufe austausche. Mal tritt der Fehler zuerst bei 1,dann bei 2 auf, dann umgekehrt. Auf die Häufung der Fehler hat das keinen Einfluss. Im Schnitt alle paar Minuten.

Dann wirf doch mal die String-Variable raus und nimm ein char-Array.

Gruß Tommy

Bin mit dem char array nix weiter gekommen. Immer Fehler: invalid array assignment.
Statt dessen habe ich die Werte in eine Int Variable ausgelesen. Ändert nichts. Das muss das Empfangen der Daten sein.

@ noiasca: ich sehe das im Serial-Monitor.

Wenn ich nichts per Serial1 schicke, dann ist alles gut. Blöderweise sind die Störungen so selten, daß das wirklich zeitaufwendig ist. Aktuell habe ich Fehler alle 1-30 min. Ich schreibe mir jetzt ein Ergebnisarray, mit Plausibilitäts-Check. Erst danach werden die Daten verwendet. Umständlich, aber dann bekomme ich wenigstens geglättete Daten :slight_smile: