Skip to content

Instantly share code, notes, and snippets.

@underdoeg
Last active August 26, 2023 23:33
Show Gist options
  • Save underdoeg/98a38b54f889fce2b237 to your computer and use it in GitHub Desktop.
Save underdoeg/98a38b54f889fce2b237 to your computer and use it in GitHub Desktop.
Python port for RaspberryPI of the HX711 Breakout Board
import RPi.GPIO as GPIO
import time
def createBoolList(size=8):
ret = []
for i in range(8):
ret.append(False)
return ret
class HX711:
def __init__(self, dout, pd_sck, gain=128):
self.PD_SCK = pd_sck
self.DOUT = dout
GPIO.setup(self.PD_SCK, GPIO.OUT)
GPIO.setup(self.DOUT, GPIO.IN)
self.GAIN = 0
self.OFFSET = 0
self.SCALE = 1
self.lastVal = 0
#GPIO.output(self.PD_SCK, True)
#GPIO.output(self.PD_SCK, False)
self.set_gain(gain);
def is_ready(self):
return GPIO.input(self.DOUT) == 0
def set_gain(self, gain):
if gain is 128:
self.GAIN = 1
elif gain is 64:
self.GAIN = 3
elif gain is 32:
self.GAIN = 2
GPIO.output(self.PD_SCK, False)
self.read()
def read(self):
while not self.is_ready():
#print("WAITING")
pass
dataBits = [createBoolList(), createBoolList(), createBoolList()]
for j in range(2, -1, -1):
for i in range(7, -1, -1):
GPIO.output(self.PD_SCK, True)
dataBits[j][i] = GPIO.input(self.DOUT)
GPIO.output(self.PD_SCK, False)
#set channel and gain factor for next reading
#for i in range(self.GAIN):
GPIO.output(self.PD_SCK, True)
GPIO.output(self.PD_SCK, False)
#check for all 1
if all(item == True for item in dataBits[0]):
return self.lastVal
bits = []
for i in range(2, -1, -1):
bits += dataBits[i]
self.lastVal = int(''.join(map(str, bits)), 2)
return self.lastVal
'''
data = [0,0,0]
for i in range(0,3):
#print(''.join(map(str, dataBits[i])))
data[i] = int(''.join(map(str, dataBits[i])), 2)
#print(data[i])
#data[2] ^= 0x80
return data[2] << 16 | data[1] << 8 | data[0]
'''
def read_average(self, times=3):
sum = 0
for i in range(times):
sum += self.read()
return sum / times
def get_value(self, times=3):
return self.read_average(times) - self.OFFSET
def get_units(self, times=3):
return self.get_value(times) / self.SCALE
def tare(self, times=15):
sum = self.read_average(times)
self.set_offset(sum)
def set_scale(self, scale):
self.SCALE = scale
def set_offset(self, offset):
self.OFFSET = offset
def power_down(self):
GPIO.output(self.PD_SCK, False)
GPIO.output(self.PD_SCK, True)
def power_up(self):
GPIO.output(self.PD_SCK, False)
############# EXAMPLE
hx = HX711(9, 11)
hx.set_scale(7050)
hx.tare()
while True:
try:
val = hx.get_units(3)
if val > 100:
print("OH NO")
#hx.power_down()
#time.sleep(.001)
#hx.power_up()
except (KeyboardInterrupt, SystemExit):
sys.exit()
@Jameo
Copy link

Jameo commented Apr 25, 2016

Hi, I am trying to work out why the scaling is in reverse i.e. the bigger the weight I put on the lower the value reading I get?

@MikeMmmm
Copy link

Has anyone gotten this to work in Python on Raspberry Pi? My HX711 board (Sparkfun HX711 Load Cell Amp breakout) works flawlessly with Arduino, but makes a big mess on the Pi. I've tried debugging it, getting it to spit out the bit string, etc., and it doesn't make any sense... Is there a clock timing issue? Problem interpreting the 2's complement?

@tatobari
Copy link

tatobari commented Jun 5, 2016

I made it work. I've made a few modifications on this code on the way the bits are processed after making a few tests using Python's Numpy library. The main problem was that the final int value was not being built with the bytes in the correct order. This caused that with very low differences (noise, etc) the values would jump from one extreme to another because the "less significant byte" was in the "most significant byte" position when building the 24 bit integer.

One note about the HX711 is that just after it is plugged to power it kind of needs a few minutes to "warm up". Before digging in this code por Raspberry Pi, I used an Arduino to test the HX711 using the Serial Plotter because I thought my mine might have been broken (I have 20 of these and tested 2 of them). After I plugged the Vcc, the signal just keeps growing with very little increments for about 2 or 3 minutes until it reaches a stable value. This could lead to bad "taring" or, if you're aiming for big precision, well, you know...

I've never contributed to any repository before so I'm not sure what are the steps here. Should I fork it? Should I clone? I've only worked on my own repositories before.

@eddie4
Copy link

eddie4 commented Jun 6, 2016

I would be very interested in the modifications you made. Am not completely sure about git educate on how to do this best. But if you could send it to me that would be great.
eddiebijnen@hotmail.com

@tatobari
Copy link

tatobari commented Jun 6, 2016

I've uploaded the code to the repo on the URL below but I will give it to "underdoeg" as soon as he contacts me. It's his code after all.

https://github.com/tatobari/hx711py/

@arthurmoises
Copy link

Basically, you clone it. After that, branch it and make a pull request to the owner. If he accepts it, he can merge it with the original code.

Thanks for the debbuging! I will be looking forward to test it on Monday, so after that I can post the results and contribute to it too.

@tibloop
Copy link

tibloop commented Jun 23, 2016

hello, I am trying to run this code in Beaglebone Black, however I only get 0.0 all the time . I only modified the GPIO reading and writing to fit beaglebone. Is there any timing difference between RaspberryPI and beaglebone that I should consider? Thank you very much

(self.read_average(times) always gives me 8388607 )

@underdoeg
Copy link
Author

I am sorry for not reacting to this thread sooner. I have somehow not seen the notifications. Please issue any PRs if you changed something. thanks

@ahmetuludag
Copy link

@tibloop may I ask if you find any solution ? I'm also experiencing the same issue.

@dcrystalj
Copy link

@ahmetuludag I ported project to py3 and did some improvements. https://github.com/dcrystalj/hx711py3

@Richard-Major
Copy link

@underdoeg - there seems to be some problems with the bit order in this code - I've updated a version at https://gist.github.com/Richard-Major/64e94338c2d08eb1221c2eca9e014362

@lucian0112
Copy link

Hi all,

I tried use all codes from this page but seems my main issue is i get totally random values from hx711... where i can be wrong?

Thanks

@panditjiNE
Copy link

@tibloop @tatobari - I am having same issue, I have beaglebone black rev c board and getting zeros, is that any solution for that

@mertmzk
Copy link

mertmzk commented Jun 15, 2017

Hi all,
I was also having same problem (getting all 0 value) with a different SoM (not raspi) and finally got the solution. As I was writing / reading GPIOs from linux sys interface with my own function which has some problems and not reading properly. I changed it with python gpio library which is here it starts working like a charm! Please check that your gpio fucntion reading/writing properly.

Thanks.

@getunified
Copy link

Hi Mertmzk, do you mean include your code in the example.py or run separately?

Thanks
Paul

@duc99hust99
Copy link

Hi tatobari i have a problem with time to read hx711 . it's too slow . How can i control time to read hx711

@Abinaya2597
Copy link

can anyone tell me how to calibrate???

@LBG1
Copy link

LBG1 commented Mar 12, 2019

Hi tatobari I am using your example.py and getting -8388607 repeatedly as output, always the same whether or not I put any weight on the load gauge. I notice that tibloop also got this same number (23 Jun 2016). Can anyone help me? I'm a complete novice, this is my first project with a Raspberry Pi and load gauge, learning as I go along...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment