OK, da ich immer nichts kaputt machen möchte, habe ich versucht mich schlau zu machen wie ich das neu erworbene teil (HX711) anschließen muss.
SO habe ich das verstanden. (Bild)
kann mir jemand sagen ob das Stimmt was ich da so mir vorstelle?
OK, da ich immer nichts kaputt machen möchte, habe ich versucht mich schlau zu machen wie ich das neu erworbene teil (HX711) anschließen muss.
SO habe ich das verstanden. (Bild)
kann mir jemand sagen ob das Stimmt was ich da so mir vorstelle?
I2C !!
GoogleBilder("hx711 arduino")
Zeigt unter anderem: Plan
He he, Cool danke.
dann werde ich das mal so anschließen (Bild)
ja das I2C habe ich schon öfter gehört jedoch noch nie Berührungen damit.
Jetzt muss ich noch einen Beispiel Code dazu finden,
so habe alles angeschlossen, und einen Test Code auf mein Mega gespielt.
als Antwort bekomme ich: 8388608
jedoch ändert sich meine Antwort nicht, ich kann an der
Wage Ziehen wie ich möchte, der Wert bleibt gleich
das ist der Test Code:
#define PD_SCK A2
#define DOUT A3
void setup()
{
Serial.begin(9600);
pinMode (PD_SCK, OUTPUT);
pinMode (DOUT, INPUT);
digitalWrite(PD_SCK, LOW);
}
void loop()
{
Serial.println(read());
delay(500);
}
bool is_ready()
{
return digitalRead(DOUT) == LOW;
}
long read()
{
// wait for the chip to become ready
while (!is_ready());
unsigned long Count;
unsigned char i;
Count = 0;
// pulse the clock pin 24 times to read the data
for (i=0; i<24; i++)
{
digitalWrite(PD_SCK, HIGH);
if(digitalRead(DOUT) > 0)
{
Count++;
}
digitalWrite(PD_SCK, LOW);
Count=Count<<1;
}
digitalWrite(PD_SCK, HIGH);
digitalWrite(PD_SCK, LOW);
Count=Count^0x800000;
return Count;
}
EDIT:
ich haeb die Pins A2 & A3 ein mal gedreht und schau an jetzt ändern sich die Daten, jedoch obwohl ändern die sich auch wenn ich nichts mache, die schwanken unheimlich.
ich habe das teil nicht berührt:
24627814
24629596
24640550
24624168
24629080
24633170
24627358
24632220
24627760
...
EDIT2:
habe mir die LIB mal vorgenommen da war auch ein Beispiel mit dabei.
Code, Copirt und eingefügt,
ein Neues TAB erstellt den Inhalt der Lib eingefügt und alles in einem Ordner gespeichert.
dann wollte ich die das Test Programm hoch laden
hierbei bekomme ich Fehlermeldungen.
SerialScale.cpp.o: In function
__static_initialization_and_destruction_0': /Applications/SerialScale.ino:17: undefined reference to
Hx711::Hx711(unsigned char, unsigned char)'
/Applications/SerialScale.ino:17: undefined reference toHx711::~Hx711()' SerialScale.cpp.o: In function
loop':
/Applications/SerialScale.ino:26: undefined reference to `Hx711::getGram()'
nur sagen die mir mal nichts.
Könnte mir jemand weiter helfen?
ja ich habe die Anschlüsse auf A0 und A1 gewechselt.
EDIT 3:
nach dem ich gerade etwas Platz machen wollte auf meinen Schreibtisch, habe ich gesehen das ich einen ZIP mit dem Namen "Source_code" habe, die habe ich auch ausprobiert, da sind ein Haufen Dateien drin und eine INO hier kommen werte raus sogar in KG umgerechnet, auch wenn die zu 100% Falsch sind, denn das sind - Werte kommt was bei raus, ich muss mal schauen ob ich den Coode verstehe denn die Kommentare sind glaube ich Chinesisch oder so was sieht aus wie gemalt für mich :-).
Ich muss das mal in ruhe durchgehen und dann Berichte ich wider.
Eine Sache bei dem Ding ist wohl, dass man auch ohne Gewicht einen Wert herausbekommt. Dieser Wert ist aber konstant!
Um diesen Offset abzuziehen haben die besseren Libs eine Methode. Bei der die verlinkt hast oder bei der hier :
Beides mal:
set_offset(offset);
so ich habe alls erstes das Programm genommen und isoliert, aus dem Rissen Daten Haufen.
es sind nur 3 Dateien dafür zuständig gewesen
als zweites habe ich das japanische über Google ins Deutsche übersetzt, lässt sich besser lesen
so, wenn ich das Arduino Reset dann Kalibriert sich die Software neu, das dauert ein paar Sekunden,
dann bekomme ich "0 g" als Ausgabe,
in der Datei "HX711.CPP" gibt es in Zeile 42 eine Umrechnung nur komme ich mit der nicht klar,
mein Messbecher den ich zum Test dranhänge hat ein Gewicht von 141g (mit der Küchen wage ermittelt)
doch ich bekomme -12 g angezeigt.
Ich verstehe nur die Berechnung an der Stelle nicht und kann daher auch schlecht etwas umstellen.
Könntet Ihr mir da etwas weiterhelfen?
die besagte zeile ist die hier:
#include "HX711.h"
int Weight = 0;
void setup()
{
Init_Hx711(); // IO Einstellung Initialisierungsmodul verbunden HX711
Serial.begin(9600);
Serial.print("Welcome to use!\n");
delay(3000);
Get_Maopi(); // Holen Sie sich fur
}
void loop()
{
Weight = Get_Weight(); // Auf das Gewicht des Gewichtssensors berechnet
Serial.print(Weight); // Serielle Anzeige Gewicht
Serial.print(" g\n"); // Anzeigeeinheiten
Serial.print("\n"); // Anzeigeeinheiten
delay(1000); // Verzögerung
}
#include "hx711.h"
long HX711_Buffer = 0;
long Weight_Maopi = 0,Weight_Shiwu = 0;
//****************************************************
// Initialisierung HX711
//****************************************************
void Init_Hx711()
{
pinMode(HX711_SCK, OUTPUT);
pinMode(HX711_DT, INPUT);
}
//****************************************************
// Holen Pelzgewicht
//****************************************************
void Get_Maopi()
{
HX711_Buffer = HX711_Read();
Weight_Maopi = HX711_Buffer/100;
}
//****************************************************
// Wiegen
//****************************************************
unsigned int Get_Weight()
{
HX711_Buffer = HX711_Read();
HX711_Buffer = HX711_Buffer/100;
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //Holen AD Abtastwert in Art.
// ******************* TEST *************************
Serial.print(" Rohwert = ");
Serial.print(HX711_Buffer);
Serial.print("\n");
// ******************* TEST *************************
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu / 7.35 + 0.05);
// Das tatsächliche Gewicht von der Art der Berechnung
// Da verschiedene Sensorkennlinie ist die gleiche, und daher wird jeder der Sensoren und die Teiler 4,30 hier korrigieren.
// Wenn sie herausfinden, das Testgewicht zu groß ist, erhöhen Sie den Wert.
// Wenn die Prüfung aus dem Gewicht zu klein ist, verringern Sie den Wert zu ändern.
// Dieser Wert ist in der Regel rund 7,16. Da verschiedene Sensoren kann.
//+0.05 Perzentil Rundungs
return Weight_Shiwu;
}
//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void) //gewinnen Sie 128
{
unsigned long count;
unsigned char i;
bool Flag = 0;
digitalWrite(HX711_DT, HIGH);
delayMicroseconds(1);
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
count=0;
while(digitalRead(HX711_DT));
for(i=0;i<24;i++)
{
digitalWrite(HX711_SCK, HIGH);
delayMicroseconds(1);
count=count<<1;
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
if(digitalRead(HX711_DT))
count++;
}
digitalWrite(HX711_SCK, HIGH);
count ^= 0x800000;
delayMicroseconds(1);
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
return(count);
}
#ifndef __HX711__H__
#define __HX711__H__
#include <Arduino.h>
#define HX711_SCK 2 // Orange Kabel
#define HX711_DT 3 // Schwarzes Kabel
extern void Init_Hx711();
extern unsigned long HX711_Read(void);
extern unsigned int Get_Weight();
extern void Get_Maopi();
#endif
ich habe nun eine LIB gefunden die nicht so Groß ist, dachte das ich da besser etwas drin verstehe, leider nicht.
Die Seite hat die Erklärung: Weight Sensor Module V1
habe mir dann den Test Code und die Lib in den Ordner "SerialScale" Kopiert, das habe ich alles von hier bekommen: ardulibs / hx711 /
Wenn ich die jetzt ausführe habe ich den Falschen 0 Punkt den habe ich Korrigiert wie in der Anleitung auch Steht das war noch sehr einfach für mich.
Doch das kalibrieren, sprioch das mir auch der richtige wert angezeigt wird verstehe ich nihct was ich da machen muss soll.
wo muss ich da was machen?
ich habe mir extra 5 Säckchen mit exakt 1000g Inhalt erstellt die ich dran hängen kann. um das zu überprüfen.
Ich habe den Eindruck das ich noch verrückt werde, denn ich versteh den Code nicht, ...
hat jemand schon Erfahrung mit dem hx711
ich bin ja bestimmt nicht immer die Hellste leuchte, daher kann mir jemand sagen was ich da gerade mache?
mit der Zeile:
void setScale(float scale = 800.f);
kann ich scheinbar die Kennleine verändern.
doch was ändere ich da?
und was bedeutet das .f bei der Zahl
habe versuche das mit einer 5 zu Ersetzen die werte Streuen dann glaube ich nicht mehr so.? oder bilde ich mir das ein?
ich benutze die LIB im Beitrag über mir
das sind mal ein Paar Test werte: 1. warten bis ich 0.0 g angezeigt bekomme, und dann ein Gewicht von genau 1.000g dran hängen, habe das mit meiner Küchen Waage abgewogen.
Das ist das Ergebnis:
Code | Serieler Monitor |
---|---|
1000.5 | 66.6 g |
800.5 | 83.4 g |
600.5 | 111.0 g |
400.5 | 166.3 g |
200.5 | 331.8 g |
Kann mir jemand sagen was das jetzt Bedeutet? denn ich verstehe mal nur Bahnhof
so langsam verzweifle ich, ... mit meiner Koffer wage
und ich glaube das ich die Werte doch von Hand abschreiben muss.
Hallo Muecke,
ich hatte den HX711 weiter oben empfohlen weil mir das Teil als einfachste Lösung für dein Vorhaben erschien. Ich selbst habe leider keine Erfahrung damit, weiß aber dass andere damit eine funktionierende Waage gebaut haben.
Rein von der Physik her würde ich behaupten dass jede Wägezelle mit einer DMS-Brücke eine spezifische Zellenkonstante hat welche die Abhängigkeit der Widerstandsänderung zur Gewichtsänderung beschreibt.
Ich würde auch erwarten, dass eine Library für den HX711 welche zum wiegen gedacht ist die Möglichkeit haben muss diese Zellenkonstante anzugeben.
In allen von dir bisher geposteten Sketches sehe ich keine Möglichkeit einen solchen "Messzellenkennwert" einzustellen.
Irgendwie muss der HX711 oder der Arduino die gemessenen Rohdaten in ein Gewicht umrechnen.
Am HX711 kann man per Software auch einen Inputchannel und eine Verstärkung (32, 64, 128) einstellen. Bietet eine von deinen Librarys die Möglichkeit dazu?
Gruß
Peter
Hallo Peter,
auch ich habe das zu 1.000 Fach gelesen das mit einem HX711 das machbar ist,
die LIB`s gehen bei anderen daher glaube ich das die auch bei mir gehen müsste.
den "Messzellenkennwert" kann man einstellen in der ziele: hx711.h
void setScale(float scale = 64.f);
jedoch wenn ich das mache dann stimmt mein Test Gewicht, doch alle anderen weichen vom Tatsächlichen wert ab :-(.
das man einen Wert sich zurück geben lassen kann habe ich auch schon mal gelesen ich habe das nur noch nie verstanden wie das gehen soll
Inputchannel, Öm du kannst mich da was fragen, ... gute Frage, ich habe gelesen das die LIB`s sich selbst auf 128 einstellen.
peter_de:
Am HX711 kann man per Software auch einen Inputchannel und eine Verstärkung (32, 64, 128) einstellen. Bietet eine von deinen Librarys die Möglichkeit dazu?
Ja, diese:
Siehe Punkt 3
Da steht auch unten was zur Kalibrierung:
*Call set_scale() with no parameter.
*Call set_tare() with no parameter.
*Place a known weight on the scale and call get_units(10).
*Divide the result in step 3 to your known weight. You should get about the parameter you need to pass to set_scale.
*Adjust the parameter in step 4 until you get an accurate reading.
die kann ich bei mir nicht verwenden, denn da bekomme ich immer Fehlermeldungen
und ich kann mit denen immer nichts anfangen
HX711.cpp:4: error: 'HX711' has not been declared
HX711.cpp:4: error: ISO C++ forbids declaration of 'HX711' with no type
HX711.cpp: In function 'int HX711(byte, byte, byte)':
HX711.cpp:5: error: 'PD_SCK' was not declared in this scope
HX711.cpp:6: error: 'DOUT' was not declared in this scope
HX711.cpp:11: error: 'set_gain' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:14: error: expected constructor, destructor, or type conversion before '::' token
HX711.cpp:18: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'bool is_ready()':
HX711.cpp:19: error: 'DOUT' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:22: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'void set_gain(byte)':
HX711.cpp:25: error: 'GAIN' was not declared in this scope
HX711.cpp:35: error: 'PD_SCK' was not declared in this scope
HX711.cpp:36: error: 'read' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:39: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'long int read()':
HX711.cpp:48: error: 'PD_SCK' was not declared in this scope
HX711.cpp:49: error: 'DOUT' was not declared in this scope
HX711.cpp:55: error: 'GAIN' was not declared in this scope
HX711.cpp:56: error: 'PD_SCK' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:65: error: 'HX711' is not a class or namespace
HX711.cpp:73: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'double get_value(byte)':
HX711.cpp:74: error: 'OFFSET' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:77: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'float get_units(byte)':
HX711.cpp:78: error: 'SCALE' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:81: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'void tare(byte)':
HX711.cpp:83: error: 'set_offset' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:86: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'void set_scale(float)':
HX711.cpp:87: error: 'SCALE' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:90: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'void set_offset(long int)':
HX711.cpp:91: error: 'OFFSET' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:94: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'void power_down()':
HX711.cpp:95: error: 'PD_SCK' was not declared in this scope
HX711.cpp: At global scope:
HX711.cpp:99: error: 'HX711' is not a class or namespace
HX711.cpp: In function 'void power_up()':
HX711.cpp:100: error: 'PD_SCK' was not declared in this scope
Dann machst du was falsch. Der Beispiel Sketch kompiliert einwandfrei.
Zip Datei herunterlade, ins libraries Verzeichnis entpacken, eventuell das "_master" im Ordnernamen entfernen und es geht.
ah, ich muss die LIB ins libraries Verzeichnis packen?
das habe ich nicht.
das habe ich gemacht:
dabei kommen die Fehler.
werde das aber mal machen DIE LIB`s in das libraries Verzeichnis.
EDIT: ich habe jetzt alles in das LIB Verzeichnis kopiert, jetzt kann ich es aufs Ardoino Spielen,
und ich bekomme auch eine Ausgabe
4 ç ¨%(¡ÅHX711 Demo
Before setting up the scale:
read: 8261130
read average: 8259497
get value: 8259482.00
get units: inf
After setting up the scale:
read: 8259465
read average: 8259499
get value: 37.00
get units: 0.0
Readings:
one reading: 0.0 | average: 0.0
one reading: -0.3 | average: -0.2
one reading: -0.3 | average: -0.3
one reading: -0.3 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.3 | average: -0.3
one reading: -0.3 | average: -0.3
one reading: -0.3 | average: -0.3
one reading: -0.3 | average: -0.3
one reading: -0.3 | average: -0.3
one reading: -0.3 | average: -0.3
one reading: -0.3 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.3 | average: -0.3
one reading: -0.4 | average: -0.3
one reading: -0.3 | average: -0.3
jetzt muss ich mal schauen ob ich das umgesetzt bekomme.
mal schauen, ...
Und was hast du mit den .cpp und .h Dateien gemacht? Einfach ins Sketch-Verzeichnis?
Solche Fehler deuten jedenfalls immer auf "Library nicht richtig installiert" hin
ja, habe ich. warum auch nicht alle in ein Verzeichnis :-).
jetzt geht es, habe mir gerade die Kommentare und die Ausgabe über Google mal ins Deutsche übersetzt.
Jetzt muss ich die "README.txt" noch übersäten dann schaue ich mal weiter.
Das bekomme ich gerade raus: (ohne das Gewicht an der Wage ist)
t ñHX711 Demo
Vor dem Einrichten der Waage:
lesen: 8258669
lesen Durchschnitt: 8258929
erhalten Wert: 8259115.00
erhalten Einheiten: infNach der Konfiguration der Waage:
lesen: 8259261
lesen Durchschnitt: 8259327
erhalten Wert: 120.00
erhalten Einheiten: 0.0Lesungen:
one reading: 0.1 | average: 0.1
one reading: -0.2 | average: -0.1
ich komme beim Kalibrieren nicht so ganz klar.
How to Calibrate Your Scale
- Call set_scale() with no parameter.
- Call set_tare() with no parameter.
- Place a known weight on the scale and call get_units(10).
- Divide the result in step 3 to your known weight. You should get about the parameter you need to pass to set_scale.
- Adjust the parameter in step 4 until you get an accurate reading.
also erstelle ich mir eine Neue Datei.
das ist dann der Code:
#include "HX711.h"
// HX711.DOUT - pin #A1
// HX711.PD_SCK - pin #A0
HX711 scale(A1, A0); // parameter "gain" is ommited; the default value 128 is used by the library
int Taster = 13;
void setup()
{
Serial.begin(38400); // Serieler Monitor Geschwindigkeit
pinMode(Taster, INPUT); // Port für den Taster als Eingang festlegen
Serial.println("HX711 Kalibriren");
}
void loop()
{
set_scale();
Serial.println("set_scale() - Aufgerufen");
set_tare();
Serial.println("set_tare() - Aufgerufen");
Serial.println("\nBitte das Gewicht 1.000g anhängen und Taster drücken.");
while(digitalRead(Taster)== HIGH) { } // warten bis Taster betätigt wurde
while(digitalRead(Taster)== LOW) { } // warten bis Taster betätigt wurde
Serial.print( "get_units(10) = ");
Serial.println( get_units(10));
while(digitalRead(Taster)== HIGH) { } // warten bis Taster betätigt wurde
while(digitalRead(Taster)== LOW) { } // warten bis Taster betätigt wurde
}
/*
1. Befehl [b]set_scale()[/b] aufrufen.
2. Befehl [b]set_tare()[/b] aufrufen.
3.1 ein Gewicht an die Wage hängen
3.2 Befehl get_units(10) ausgeben lassen
*/
jedoch bekomme ich hier Fehlermeldungen denn ich glaube ich habe das mit den Befehlen Falsch verstanden.
Fehlermeldungen:
sketch_nov23b.ino: In function 'void loop()':
sketch_nov23b:19: error: 'set_scale' was not declared in this scope
sketch_nov23b:21: error: 'set_tare' was not declared in this scope
sketch_nov23b:29: error: 'get_units' was not declared in this scope
OK, ich habe es etwas hin bekommen, habe vor die Befehle das "scale." geschrieben, und bei Tare habe ich das "set_" weg gelassen.
das ist der Code:
#include "HX711.h"
// HX711.DOUT - pin #A1
// HX711.PD_SCK - pin #A0
HX711 scale(A1, A0); // parameter "gain" is ommited; the default value 128 is used by the library
int Taster = 13;
int TMP;
void setup()
{
Serial.begin(38400); // Serieler Monitor Geschwindigkeit
pinMode(Taster, INPUT); // Port für den Taster als Eingang festlegen
Serial.println("HX711 Kalibriren");
}
void loop()
{
scale.set_scale();
Serial.println("set_scale() - Aufgerufen");
scale.tare();
Serial.println("set_tare() - Aufgerufen");
Serial.println("\nBitte das Gewicht 1.000g anhaengen und Taster druecken.");
while(digitalRead(Taster)== HIGH) { } // warten bis Taster betätigt wurde
while(digitalRead(Taster)== LOW) { } // warten bis Taster betätigt wurde
Serial.println( "get_units(10) \t Teilen durch3 ");
for (int i=0; i <= 10; i++)
{
TMP = scale.get_units(10);
Serial.print( TMP );
Serial.print("\t\t");
Serial.println( TMP/3 );
}
}
und das die Ausgabe dazu:
set_scale() - Aufgerufen
set_tare() - AufgerufenBitte das Gewicht 1.000g anhaengen und Taster druecken.
get_units(10) Teilen durch3
350 116
286 95
374 124
321 107
328 109
356 118
326 108
360 120
302 100
310 103
300 100
irgend wie finde ich aber das die Werte etwas Stark schwanken. oder ist das normal?
Hallo,
ich weiß nicht was die ausgegebenen Werte repräsentieren und kann deshalb wenig dazu sagen ob diese Schwankungen stark oder schwach sind.
Ich kenne auch deinem mechanischen und elektrischen Aufbau nicht. Ich könnte mir aber vorstellen dass die Verbindungsleitungen zwischen der Kofferwaage und dem HX-Board empfindlich gegen Störungen sind.
Sollten diese lang und ungeschirmt sein könnte man dort ansetzen. Verdrillen könnte schon helfen falls die Schwankungen von dort kommen.