Dismiss
Join GitHub today
GitHub is home to over 20 million developers working together to host
and review code, manage projects, and build software together.
Sign up
How to get kilogram from hx711? and the proper New issue
calibration. #70
Open vainell opened this issue on Jun 11 · 112 comments
No one assigned
Hi! Can someone please explain how to get kilogram from xh711? and also how to properly calibrate it. I am
using arduino mega, hx711 and 4pcs of 50kg load cell (the one you see inside the bathroom scale).. please i Labels
need it for my project. and also, please do not use jargon words, for im just a beginner.. consider it like
None yet
explaining to a child =D
Projects
You need to just use a bit of math, so it will depend on how good your inner child is at math. Milestone
You use the standard formula for slope and intersection: y = mx + b ... or m = (y - b)/x No milestone
Here
• y is the actual weight in whatever units you want (g, kg, oz, etc) 10 participants
So say you have a raw value of 10000 for 0 weight (tare) and 20000 for 1000g, and want readings in g
First, your offset (b) is 10000
To calculate your multiplier (m) just substitute into the formula
1000 = m * 20000 + 10000 ... or m = (1000 - 10000) / 20000
Thus m = -0.45
Your numbers will be completely different, but the method is the same.
You then put these values into your sketch via scale.set_scale(m) and scale.set_offset(b)
Even better if you don't hard-code them but allow them to be calculated/updated on demand, as they may
change over time due to various reasons.
The example sketch that comes with the library partially shows this process.
You use those calculated values in scale.set_scale(m) and scale.set_offset(b) . Then you can start using
scale.get_units() to get the value in grams (or kg depending on how you did your calibration)
Note read the comments in HX711.h - it explains the difference between all the read and get functions
where should i put the scale.set_scale(m) and scale.set_offset(b)? should i put it inside the calibration() which
is called by setup()? or should i put it inside the loop()? and what should be put first? the scale.set_scale(m)
or scale.set_offset(b)? Sorry if i have too many questions. Im a total newbie..
You only call set_scale() and set_offset() once - usually in your setup() function with some pre-
calculated and saved values.
You can also just call them from the calibrate() function if you call that from setup() - although you
then have to manually calibrate every time you restart the Arduino.
You don't need to call scale.tare() if using scale.set_offset() - they do basically the same thing.
Please read the code written by bogde and try to understand it! It is very small, and most is quite easy to
follow.
Also, please don't include screenshots of code. You should copy and paste them inside a markdown code
block (surrounded by back-quotes)
The hx711 outputs a value corresponding to the ratio of difference voltage divided by the voltage applied to
the load cell. This ratio is factored by the gain. Full scale output is 800000 to 7FFFFF in hexadecimal and
corresponds to 0.5 to - 0.5 difference ratio V/V. The load cell calibration certificate tells me the output at a
particular voltage with a defined load applied. My certificate says 1.996 mV at 5 V with 50 kg applied. The
difference ratio is then 0.0003992 V/V at 50 kg. I am using a gain of 128 so this difference ratio becomes
0.0511 V/V. This is then 10.2 % of the full scale 0.5 V and will correspond to 800000 x 10.2 % in hexadecimal.
This will be a decimal value of 857275 for 50 kg. The sensitivity is therefore 17145 per kg.
4000 is 0.047 % of full scale. So don't worry about it. Take an average over more readings if you want a
steady value. I suspect that this is normal.
I found that was a factor of 2 out. The gain of my setup is 8573 /kgf. Does anyone know what's this is. I will
let you know if I can figure it out.
The load cell I have has a sensitivity of 1.966 mV/V at 50kg. This is then amplified to 0.2555 V/V. This is then
0.511 of the Hx711 half scale output of 0.5 V/V. The digital output is therefore 0.511 x 800000 in
hexadecimal. This will be 4286579 in decimal for 50 kg. The sensitivity is then 85731 per kg.
HX711 scale;
void setup() {
Serial.begin(38400);
Serial.println("HX711 Demo");
Serial.println("Initializing the scale");
// parameter "gain" is ommited; the default value 128 is used by the library
// HX711.DOUT - pin #A1
// HX711.PD_SCK - pin #A0
scale.begin(A1, A0);
scale.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README
for details
scale.tare(); // reset the scale to 0
Serial.print("read: \t\t");
Serial.println(scale.read()); // print a raw reading from the ADC
Serial.println("Readings:");
}
void loop() {
Serial.print("one reading:\t");
Serial.print(scale.get_units(), 1);
Serial.print("\t| average:\t");
Serial.println(scale.get_units(10), 1);
scale.power_down(); // put the ADC in sleep mode
delay(5000);
scale.power_up();
}`
I don't really understand how this code works. It gives values that are not even close to the required values.
please guide me on how to connect and use the two load cells and the hx711, my situation is desperate.
Thank you.
You need to read the README file and make use of tare() and set_scale() functions.
The value you pass to set_scale() (e.g. 2280.f in the above) will be your calibration factor to convert raw
values to your units of choice (mg, g, kg, lb, etc)
Read through HX711.h, the examples, and various other open/closed issues for plenty more details.
The first thing I notice is that you should have four wires from each load cell. You should start by reading
each load cell separately. As I explained earlier in this thread you should have a sensitivity value for the load
cell. Use this to set the gain as I described. I suggest that if you want to sum up the readings you should
read both cells independently and then you can add the values. Let me know if this makes sense.
You appear to have an apostrophe at the beginning of your #include statement. I guess that this is not in
the code.
I see you are using A1 and A2. This will work but remember that the signals from the hx711 are digital so
using analogue inputs is a little perverse.
Okay. The two sensors are actually two half bridges that need to be measured as a pair.
at 50 kg?
I don't exactly know how to find it. can you tell me the steps to find those values?
The load cell I have has a sensitivity of 1.966 mV/V at 50kg. This is then amplified to 0.2555 V/V when the
128 gain of the hx711 is applied. This is then 51.1 % of the Hx711 half scale output of 0.5 V/V. The digital
output is therefore 0.511 x 800000 in hexadecimal. This will be 4286579 in decimal for 50 kg. The sensitivity
is then 85731 per kg.
or is there any device or code which i can use to find the sensitivity value. I didn't get any certificate details
with the product.
Then determine the output for a couple of weights that you trust. The values will be high. Tell me what
output you get for these known weights.
/*
Example using the SparkFun HX711 breakout board with a scale
By: Nathan Seidle
SparkFun Electronics
Date: November 19th, 2014
License: This code is public domain but you buy me a beer if you use this and we meet someday (Beerware
license).
This is the calibration sketch. Use it to determine the calibration_factor that the main example uses. It also
outputs the zero_factor useful for projects that have a permanent mass on the scale in between power
cycles.
Setup your scale and start the sketch WITHOUT a weight on the scale
Once readings are displayed place the weight on the scale
Press +/- or a/z to adjust the calibration_factor until the output readings match the known weight
Use this calibration_factor on the example sketch
This example assumes pounds (lbs). If you prefer kilograms, change the Serial.print(" lbs"); line to kg. The
calibration factor will be significantly different but it will be linearly related to lbs (1 lbs = 0.453592 kg).
Your calibration factor may be very positive or very negative. It all depends on the setup of your scale
system
and the direction the sensors deflect from zero state
This example code uses bogde's excellent library: https://github.com/bogde/HX711
bogde's library is released under a GNU GENERAL PUBLIC LICENSE
Arduino pin 2 -> HX711 CLK
3 -> DOUT
5V -> VCC
GND -> GND
Most any pin on the Arduino Uno will be compatible with DOUT/CLK.
The HX711 board can be powered from 2.7V to 5V so the Arduino 5V power should be fine.
*/
#include "HX711.h"
#define DOUT 8
#define CLK 7
float calibration_factor = 8875; //-7050 worked for my 440lb max scale setup
void setup() {
Serial.begin(38400);
Serial.println("HX711 calibration sketch");
Serial.println("Remove all weight from scale");
Serial.println("After readings begin, place known weight on scale");
Serial.println("Press + or a to increase calibration factor");
Serial.println("Press - or z to decrease calibration factor");
scale.set_scale();
scale.tare(); //Reset the scale to 0
void loop() {
Serial.print("Reading: ");
Serial.print(scale.get_units()*0.453592, 3);
Serial.print(" kg"); //Change this to kg and re-adjust the calibration factor if you follow SI units like a sane
person
Serial.print(" calibration_factor: ");
Serial.print(calibration_factor);
Serial.println();
delay(1000);
if(Serial.available())
{
char temp = Serial.read();
if(temp == '+' || temp == 'a')
calibration_factor += 10;
else if(temp == '-' || temp == 'z')
calibration_factor -= 10;
}
}
I have used this code and the value that i have got for 500g is 700g and for 3.4kg the values are fluctuating
between 3.4 and 4.5
500 g is one percent of full scale so it is not a suitable value for calibration of your load cell. The 3.4 kg is a
bit better but you need to get a steady reading using average function of the hx711 library.
Where the code says scale.get_units() put a value of 100 between the brackets.
Dixit00 commented on Jul 13
I used 8875 as calibration factor. The code had 2215 as the default calibration factor, I went upto 8875 to
get the value near 3.4kg for the weight I had used.
I'll try placing 100 in scale.get_units() and will upadte you with the results.
Thank you so much for helping me.
scale.get_units(100) will give you the average of 100 readings. The calibration factor value should include
everything required to give you the output in the units that you want. So 8875 x 0.4536 gives 4026 per kg.
4026 per kg is 201,300 for a FSD of 50 kg. FSD of the HX711 is 0x800000.
0x800000 is 8388608 so at full scale your load cell would be giving 201300/8388608 x 100 = 2.4 % of the
possible FSD of the HX711 even with a gain of 128.
Your load cells combined are advertised to measure 100 kg. You need to calibrate with some big known
weights.
@DavidRTucker
0x800000 is 8388608 so at full scale your load cell would be giving 201300/8388608 x 100 = 2.4 % of the
possible FSD of the HX711 even with a gain of 128.
The digital output of the HX711 ranges from -8388607 to 8388608. It represents the voltage ratio by a
number. Plus 0.5 V/V is represented by 8388608. 800000 is 8388608 in hexadecimal.
Get someone to of a known weight to stand on the on your scale while you calibrate it.
That's exactly what I'm doing right now. And I'm getting values like 47-49 for weight of 51 kgs and 55-56 for
54. The calibration factor is 9150.
That might be as good as you can get with only two sensors. The trouble is that it is difficult to balance on
just two sensors. I guess that the 51 kg friend didn't stand as well on your scales as your other friend. Basing
the calibration on the 54 kg friend you need a calibration factor of 8900.
Dixit00 commented on Jul 14
I guess the values are close now. I get 56 for 55 and 54.8 for 54. This will do the job for now.
It would not have been possible without your help. Thank you so much for helping me. It is the best thing
someone has done to me. Thank you so much once again.
Good day :) God bless you.
I have to correct something. Your calibration factor is 8900/0.4536 = 19620 per kg. 100 kg would be
represented by the number 1962000 in the hx711. It is instructive for me to work through your problem so
that I can be more familiar with wheatstone bridges and the hx711. We will both be much wiser next time
we have a similar problem to sort out.
@DavidRTucker well done in assisting @Dixit00 - I wouldn't have had the patience :)
But your last comment isn't quite true. You also need to factor in your tare offset into any estimate value
from the HX711. The offset can be a good way from zero due to the weight of the platform and due to load
cell construction. Even more so with cheap load cells.
Hi Kean!
Thank you for your further correction. I will be completely right one day. It would be interesting to know
what the tare offset was.
David
Hi @Dixit00
When you have a moment could you let me know what zero factor you have. Your next time challenge is to
display the weight on an LCD rather than than the PC.
David
Hi @Dixit00
When you have a moment could you let me know what zero factor you have. Your next time challenge is to
display the weight on an LCD rather than than the PC.
David
Hi @Dixit00
Did you cross over the red and black leads? I mean did you have red and black connected to +ve and
another red and black connected to -ve?
I have never used half bridges but I am guessing that this would be necessary.
I have half bridge load cells and I found the red wire as central between the two resistor. The white wire
connects the variable resistor and the black one for the fixed resistor.
Did you connect both whites to one sense terminal and both blacks to the other?
white1 with black2 to E+ and white2 with black1 to E-; the two red to sense terminals
see also:
https://arduino.stackexchange.com/questions/17542/connect-hx711-to-a-three-wire-load-cell
Thank you for your reply. I assumed that would be necessary. Would you mind telling me what sensitivity
your load cells achieved.
I am trying to send the value obtained from the load cell to a server using a gprs sim900 module, and i am
doing so as follows
char val[20];
char url[160];
float temp;
temp= scale.get_units(); // or scale.get_units(10); AVERAGE OF 10
dtostrf(temp, 7, 2, val);
snprintf(url, 74, "AT+HTTPPARA="URL","http://www.website.com/test.php?temp=%s\"", val );
mySerial.println(url);
and sending the variable "temp" in the http url request. i get the value on the serial monitor when i print the
variable on the serial monitor but it does not get updated on the server. I just get a blank reading.
I am new to using load cells and gsm modules so am having a few doubts.
Hope you can help.
@SreevatsaAcharya please stop posting on every other issue. does the url looks ok before trying to send it?
can you connect to the serial line and see if the proper url gets sent? if the proper url gets sent, what
happens if you copy that and paste it to your browser? does the value get recorded? can you monitor your
server and see if any request is actually made?
With four 40 kg load cells read individually you can measure a maximum of 120 kg.
You can use a single hx711 to read two or four cells. To do this you will only use three wires from each cell.
Obviously all red and black wires need connecting then white from two cells and green from the other two.
I think your sensitivity in the 4 into 1 arrangement will be 4 mV/V at 160 kg.
@DavidRTucker
Thanks! That clears the doubt.
But how do i connect 4 load cells to a single HX711 amplifier.
DavidRTucker commented on Jul 19
It is easier to understand if you consider how to do a two into one arrangement first. In this case you would
use half the bridge from each cell connecting white from one cell and green from the other. Do you see how
this creates a single wheatstone bridge?
No. What you will be doing is using only the white from two cells and green from the other two.
@DavidRTucker Okay, i get it, then i would need 2 hx711 amps. what about the software side?
DavidRTucker commented on Jul 19
You should be able to parallel up the two green wire bridges and the two white wire bridges into a single
hx711.
Join the two white wires together and the two green wires together.
@DavidRTucker
Ok.
To what specification is this setup valid.
What if i want to use load cells that range up to a few 1000kilos?
The arrangement will work irrespective of the load rating of the cells. Notionally the load is being shared
equally between all cells.
@DavidRTucker
awesome. Thanks a a lot.
I think the sensitivity on the dual cell arrangement would be 2 mV/V for 80 kg.
And the sensitivity of the four into one arrangement would be 2 mV/V for 160 kg.
The four individual load cells will give you the best sensitivity and lower signal to noise ratio.
I have not yet hooked up an Arduino to multiple HX711 boards but when I do I am hoping that I can use
begin.scale(n,m) in the loop code with a different RX pin defined for each load cell.
Correction. The signal to noise ratio is probably not any better reading the four individually.
I have 4 hx711 modules and 4 load cells. If making 4 individual sets provides better output, i'll go with that.
I am also interested to know about the use of multiple begin.scale(n,m) in the loop code to read four
hx711's.
Finally!!! Made it work. The scale.get.units() function reads value from the load cell very quickly so i guess
the value wasn't actually getting stored in the variable i defined. Made a few changes , and now it works.
Thanks for your help @DavidRTucker @bogde
@DavidRTucker I am going to try with the 4 loadcell 4- hx711 setup first. will let you know the results with
both cases.
To get the average of multiple readings put an integer within the brackets of the scale. get.scale(100)
function call. The read will take a little longer.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
WiFiClient client;
void setup() {
Serial.begin(9600);
delay(10);
scale.begin(SCALE_DOUT_PIN, SCALE_SCK_PIN);
WiFi.begin(ssid, password);
lcd.init(); // initialize the lcd
lcd.init();
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" LOADING BEBAN");
Serial.println("HX711 calibration sketch");
Serial.println("Remove all weight from scale");
Serial.println("After readings begin, place known weight on scale");
scale.set_scale();
scale.tare(); //Reset the scale to 0
long zero_factor = scale.read_average(); //Get a baseline reading
Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent
scale projects.
Serial.println(zero_factor);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
void loop()
{
Serial.print("Reading: ");
units = scale.get_units(), 10;
if (units < 0) {
units = 0.00;
}
ounces = units * 0.035274;
Serial.print(units);
Serial.print("units");
Serial.print(" calibration_factor: ");
Serial.print(calibration_factor);
Serial.println();
lcd.setCursor(0, 1);
lcd.print("units : ");
lcd.print(units);
lcd.setCursor(0, 2);
lcd.print("ounces : ");
lcd.print(ounces);
lcd.setCursor(0, 3);
if (Serial.available())
{
char temp = Serial.read();
if (temp == '+' || temp == 'a')
calibration_factor += 1;
else if (temp == '-' || temp == 'z')
calibration_factor -= 1;
Serial.println("Failed to read from hx711 sensor!");
return;
}
if (client.connect(server, 80)) { // "184.106.153.149" or api.thingspeak.com
String postStr = apiKey;
postStr += "&field1=";
postStr += String(units);
postStr += "&field2=";
postStr += String(ounces);
postStr += "\r\n\r\n";
Serial.print("units: ");
Serial.print(units);
Serial.print("kg: ");
Serial.print(ounces);
Serial.println("% send to Thingspeak");
}
client.stop();
Serial.println("Waiting 20 secs");
// thingspeak needs at least a 15 sec delay between updates
// 20 seconds to be safe
delay(30000);
}
guys ,can help me ? thats code for upload to thingspeak, but that cant.
please help me
Hi @bambang! What is the sensitivity of your load cell? In which area do you have a problem?
Everything can be when I use it without code for thingspeak, but when I combine the thingspeak code and I
upload it. Just show up
can you post something else to thingspeak, like some random data? you should first sort that part out.
Hi @bambang71
I have an issue about our load sensor, I have used 2 three-wired load sensor and connected it to the HX711
with the same configuration as Mr @Dixit00 . But the sensor kept on throwing random data's. I would like
to know if a load combinator was used in the configuration. Thanks!
Hi jgg
Have you paired up the black and white wires? A load combinator is not required. You are just creating a full
bridge from two halves.
Hello @DavidRTucker ,
we tried pairing up the black and white wires but still wasn't able to get the right measurement. Whenever I
try to press the HX711 it shows random datas. and for the load sensor, no matter how hard I try to press,
the value always stays at 0.0 gram.
I attached our configuration in trying to get the value of the load sensor.
Hi Santos @jjgsantos
If you are using the example sketch HX711Serial DOUT is connected to A1 and SCK is connected to A0. I
think that using analogue pins for digital signals is perverse. In my sketch I have
#define DOUT 3
#define CLK 2
HX711 scale (DOUT CLK)
David
@DavidRTucker @bogde
Hey,
Thanks for your help previously.
I connected 4 load cells(40kg each) to individual HX711's and calibrated each one to find a common
calibration value of -50000. Then I have setup each load cell to a single platform but I believe the calibration
value has changed and the values don't add up. Is there a function for auto calibration? Removing the setup
is a tedious task to recalibrate each sensor again.
Does Scale.read() give an approximate value for calibration before calling Scale.tare and scale.set_scale
functions?
Each load cell has a sensitivity of 2 mV/V at 40 kg. 0.002 x 128 is 0.256 V/V. Full scale for the hx711 is 0.5 V/V
so the load cell output represents 51.2 % of full scale. Full scale is represented by the number 8388608 so
your 40 kg would be represented by 0.512 x 8388608 which is...
These are the initial readings on zero load. Shouldn't they be the same? 4294967 is the sensitivity.
I want to know what value to set in scale.set_scale(); for each load cell.
@SreevatsaAcharya if you have 4 wire (or 5 wire with shield) load cells, and they are equivalent in
specification, then you can usually just wire them all in parallel (i.e. all reds together, all green, etc, etc) and
connect to a single HX711. They will act as a single 160kg load cell.
Try the steps in my first reply at the start of this thread to calculate your offset and multiplier, and see how
that goes.
For optimal results with multiple load cells you need to ensure the load is pretty evenly distributed with no
lateral forces (e.g. using ball and cup contacts), and possibly use a summing box with trimming if the load
cells are not close enough in tolerance.
@SreevatsaAcharya
You need to zero all four load cells using scale1. tare() etc. You can set the sensitivity of each cell
individually.
@SreevatsaAcharya
The 50000 is per lbf so it is consistent with my suggestion of 107374 per kgf. Really your code should not
include the conversion from lbf to kgf. 107374 per kgf is 48704 per lbf. If you define the calibration factor as
107374 it traces back to the load cell sensitivity. Remove the 0.4536 factor from the readings. You need to
zero all your cell readings using the tare() function on each of them in setup.
David
#include` "Arduino.h"
#include "HX711.h"
#define DOUT 3
#define CLK 2
int a = 3;
int b = 2;
int c = 5;
// --------------------------------------------------------------------------------------
// SET UP SET UP SET UP SET UP SET UP SET UP SET UP SET UP SET UP
// --------------------------------------------------------------------------------------
void setup() {
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
Serial.begin(9600);
scale.set_scale();
scale.tare(); //Reset the scale to 0
// --------------------------------------------------------------------------------------
// LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP
// --------------------------------------------------------------------------------------
void loop()
{
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(4, LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(4, LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(4, LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
delay(5000);
}
Serial.print("weight = ");
Serial.println(weight ,1);
You need to communicate with two hx711s if you want to read two load cells. What is the sensitivity of the
load cells in mV/V at 40kgf?
I guess you should convert your float value to a string before sending it via any coms channel.
@DavidRTucker
yes I have done that as follows:
temp1 = scale1.get_units();
delay(1000);
temp2 = scale2.get_units();
delay(1000);
temp3 = scale3.get_units();
delay(1000);
temp4 = scale4.get_units();
delay(1000);
temp5 = temp1 + temp2 + temp3 + temp4;
delay(1000);
// temp5=12354.67;
dtostrf(temp5, 8, 3, val);
snprintf(url, 94, "AT+HTTPPARA=\"URL\",\"http://website.in/load_insert.php?
vehicle_id=1111&vehicle_load=%s\"", val );
mySerial.println(url);
but it still does not work with dynamic values. Maybe the values are too large after addition or getting
updated too fast. I have tried using delays or the power down/power up functions to slow down the update
of the response but that didn't work. Want to know if the values are too large.
Hi @SreevatsaAcharya
Does the string appear on Serial monitor if you print it to it. BTW you might as well get an average of
multiple readings of the load cells. Put 100 between the brackets. Have you used tare() in your setup code?
yes, i have used tare() in the setup code, and it displays the string on the serial monitor.
So do you have everything regarding the hx711s working with acceptable readings now?
If you have already converted your variable to a string why are you using snprintf?
electrokean commented 26 days ago
You definitely do not need two HX711's to connect to two load cells (4 or 6 wire) if the cells are the same
specification and are connected to a common platform that will spread the weight.
You just wire the two load cells in parallel. Much easier!
I am pretty sure you are right. Thanks for the suggestion. David