Skip to content

Commit 5a08610

Browse files
committed
unapproved pull-request by zfields
1 parent 5c526af commit 5a08610

File tree

1 file changed

+34
-16
lines changed

1 file changed

+34
-16
lines changed

HX711.cpp

+34-16
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
HX711::HX711(byte dout, byte pd_sck, byte gain) {
55
PD_SCK = pd_sck;
66
DOUT = dout;
7-
7+
88
pinMode(PD_SCK, OUTPUT);
99
pinMode(DOUT, INPUT);
1010

@@ -40,26 +40,44 @@ long HX711::read() {
4040
// wait for the chip to become ready
4141
while (!is_ready());
4242

43-
byte data[3];
43+
unsigned long value = 0;
44+
byte data[3] = { 0 };
45+
byte filler = 0x00;
4446

4547
// pulse the clock pin 24 times to read the data
46-
for (byte j = 3; j--;) {
47-
for (char i = 8; i--;) {
48-
digitalWrite(PD_SCK, HIGH);
49-
bitWrite(data[j], i, digitalRead(DOUT));
50-
digitalWrite(PD_SCK, LOW);
51-
}
52-
}
48+
data[2] = shiftIn(DOUT, PD_SCK, MSBFIRST);
49+
data[1] = shiftIn(DOUT, PD_SCK, MSBFIRST);
50+
data[0] = shiftIn(DOUT, PD_SCK, MSBFIRST);
5351

5452
// set the channel and the gain factor for the next reading using the clock pin
55-
for (int i = 0; i < GAIN; i++) {
53+
for (unsigned int i = 0; i < GAIN; i++) {
5654
digitalWrite(PD_SCK, HIGH);
5755
digitalWrite(PD_SCK, LOW);
5856
}
5957

60-
data[2] ^= 0x80;
61-
62-
return ((uint32_t) data[2] << 16) | ((uint32_t) data[1] << 8) | (uint32_t) data[0];
58+
// Datasheet indicates the value is returned as a two's complement value
59+
// Flip all the bits
60+
data[2] = ~data[2];
61+
data[1] = ~data[1];
62+
data[0] = ~data[0];
63+
64+
// Replicate the most significant bit to pad out a 32-bit signed integer
65+
if ( data[2] & 0x80 ) {
66+
filler = 0xFF;
67+
} else if ((0x7F == data[2]) && (0xFF == data[1]) && (0xFF == data[0])) {
68+
filler = 0xFF;
69+
} else {
70+
filler = 0x00;
71+
}
72+
73+
// Construct a 32-bit signed integer
74+
value = ( static_cast<unsigned long>(filler) << 24
75+
| static_cast<unsigned long>(data[2]) << 16
76+
| static_cast<unsigned long>(data[1]) << 8
77+
| static_cast<unsigned long>(data[0]) );
78+
79+
// ... and add 1
80+
return static_cast<long>(++value);
6381
}
6482

6583
long HX711::read_average(byte times) {
@@ -93,9 +111,9 @@ void HX711::set_offset(long offset) {
93111

94112
void HX711::power_down() {
95113
digitalWrite(PD_SCK, LOW);
96-
digitalWrite(PD_SCK, HIGH);
114+
digitalWrite(PD_SCK, HIGH);
97115
}
98116

99117
void HX711::power_up() {
100-
digitalWrite(PD_SCK, LOW);
101-
}
118+
digitalWrite(PD_SCK, LOW);
119+
}

0 commit comments

Comments
 (0)