4
4
HX711::HX711 (byte dout, byte pd_sck, byte gain) {
5
5
PD_SCK = pd_sck;
6
6
DOUT = dout;
7
-
7
+
8
8
pinMode (PD_SCK, OUTPUT);
9
9
pinMode (DOUT, INPUT);
10
10
@@ -40,26 +40,44 @@ long HX711::read() {
40
40
// wait for the chip to become ready
41
41
while (!is_ready ());
42
42
43
- byte data[3 ];
43
+ unsigned long value = 0 ;
44
+ byte data[3 ] = { 0 };
45
+ byte filler = 0x00 ;
44
46
45
47
// 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);
53
51
54
52
// 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++) {
56
54
digitalWrite (PD_SCK, HIGH);
57
55
digitalWrite (PD_SCK, LOW);
58
56
}
59
57
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);
63
81
}
64
82
65
83
long HX711::read_average (byte times) {
@@ -93,9 +111,9 @@ void HX711::set_offset(long offset) {
93
111
94
112
void HX711::power_down () {
95
113
digitalWrite (PD_SCK, LOW);
96
- digitalWrite (PD_SCK, HIGH);
114
+ digitalWrite (PD_SCK, HIGH);
97
115
}
98
116
99
117
void HX711::power_up () {
100
- digitalWrite (PD_SCK, LOW);
101
- }
118
+ digitalWrite (PD_SCK, LOW);
119
+ }
0 commit comments