I'm working with a load cell and HX711. There was no weight on the sensor but I kept getting strange values, I thought it was broken or something so I used my second load cell but the same thing happened again. I'm wondering what is wrong with it ? If anyone have worked with it or have an idea how to work with it, please don't hesitate to give your opinions.
#include "HX711.h"
#include <Wire.h>
#define DOUT A0
#define CLK A1
#define DEC_POINT 2
#define STABLE 1
float offset=0;
float calibration_factor = 1;
//float real_weight = 1.560;//kg
float real_weight = 0.5;//kg
HX711 scale(DOUT, CLK);
unsigned char state=0;
long FindZeroFactor();
float get_units_kg();
void ReadWeight();
void FindCalibrationFactor();
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("Auto Calibrate Program");
Serial.println("Send 'a' to Find Zero Factor (Please Remove all weight from scale)");
Serial.println("Send 'b' to Find Calibration Factor (Please insert know the weight on the scales)");
Serial.println("Send 'c' Show weight on the scales");
}
void loop()
{
if(Serial.available())
{
char temp = Serial.read();
if(temp=='a')
state=1;
if(temp=='b')
state=2;
if(temp=='c')
state=3;
}
switch(state)
{
case 0:
break;
case 1:
FindZeroFactor();
// ReadWeight();
state=0;
break;
case 2:
FindCalibrationFactor();
state=0;
break;
case 3:
ReadWeight();
delay(200);
break;
case 4:
break;
}
}
long FindZeroFactor()
{
Serial.println("Find Zero Factor");
Serial.println("Please wait .....");
scale.set_scale();
scale.tare();
long zero_factor = scale.read_average(20);
Serial.print("Zero factor: ");
Serial.println(zero_factor);
return(zero_factor);
}
void FindCalibrationFactor()
{
unsigned char flag_stable=0;
unsigned int decpoint=1;
for(unsigned char i=0;i<DEC_POINT+1;i++ )
decpoint = decpoint*10;
while(1)
{
scale.set_scale(calibration_factor); //Adjust to this calibration factor
Serial.print("Reading: ");
float read_weight = get_units_kg();
String data = String(read_weight, DEC_POINT);
Serial.print(data);
Serial.print(" kg");
Serial.print(" calibration_factor: ");
Serial.print(calibration_factor);
Serial.println();
long r_weight = (real_weight*decpoint);
long int_read_weight = read_weight*decpoint;
Serial.print(r_weight);
Serial.print(" , ");
Serial.println(int_read_weight);
long x;
if(r_weight == int_read_weight)
{
flag_stable++;
if(flag_stable>=STABLE)
{
Serial.print("Calibration Factor is = ");
Serial.println(calibration_factor);
break;
}
}
if(r_weight > int_read_weight)
{
x = r_weight - int_read_weight;
if(x > 100)
calibration_factor -= 1000;
else if(x > 100)
calibration_factor -= 10;
else
calibration_factor -= 1;
flag_stable=0;
}
if(r_weight < int_read_weight)
{
x = int_read_weight-r_weight;
if(x > 100)
calibration_factor += 1000;
else if(x > 10)
calibration_factor += 10;
else
calibration_factor += 1;
flag_stable=0;
}
}
}
float get_units_kg()
{
return(scale.get_units()*0.453592);
}
void ReadWeight()
{
scale.set_scale(calibration_factor); //Adjust to this calibration factor
Serial.print("Reading: ");
String data = String(get_units_kg()+offset, DEC_POINT);
Serial.print(data);
Serial.println(" kg");
}
-
Could it be power fluctuations or a dodgy ground?Code Gorilla– Code Gorilla2016年05月10日 11:54:43 +00:00Commented May 10, 2016 at 11:54
-
2Or could it be your (unspecified) circuit?Majenko– Majenko2016年05月10日 12:06:52 +00:00Commented May 10, 2016 at 12:06
-
The typical examples show a zeroing on startup. Once zeroed calibration can be as simple as a known mass, or several to check linearity. If you have another scale found objects will do, otherwise you can get a crude kit of calibration weights. If you have a beam sensor make sure it is not upside down. Beware there will always be noise - you probably want some filterung in what you display, again see typical examples.Chris Stratton– Chris Stratton2016年05月10日 12:24:05 +00:00Commented May 10, 2016 at 12:24
-
1@geniusme I am saying maybe there is something wrong with the circuit you are using to interface your load cell to the Arduino - however you haven't shown us that circuit so we are unable to tell. Please show your circuit, and also your code. Without that we cannot help you.Majenko– Majenko2016年05月10日 13:00:18 +00:00Commented May 10, 2016 at 13:00
-
1@Majenko I'm wiring my circuit like this linkgeniusme– geniusme2016年05月10日 13:05:00 +00:00Commented May 10, 2016 at 13:05
2 Answers 2
The first thing that about Load Cells that always comes to my mind is the circuit which amplifies the load cell's signal, Usually the load cell signal changes in a low mv range, so you have to put a high gain circuit in the way of the signal, which amplifies signal and NOISE. You have to use an instrumentation amplifier for this purpose, otherwise, your signal would become so noisy.
And try to implement a low pass digital filter too, it should compensate the fluctuations and would give you smoother signal.
scale.set_scale(calibration_factor);
needs to be changed to :
scale.set_scale(calibration_factor/[the reference weight you have used]);
-
Hi Reza, and welcome to Arduino.SE! While your answer may be correct, it is a little terse. Could you expand upon our answer and explain why that change is required?Greenonline– Greenonline2016年10月27日 18:04:34 +00:00Commented Oct 27, 2016 at 18:04