Library to read out HX711 24-Bit Analog-to-Digital Converter (ADC) for Weigh Scales by AVIA Semiconductor. Tested with K22F with SCK pint at D13 and DT pin at D12

Dependents:   mbed_blinky

Committer:
Eugene0469
Date:
Tue Jun 25 15:15:57 2019 +0000
Revision:
6:2232982efde9
Parent:
5:16627e96c8de
Create a hx711 test program.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
megrootens 0:5fa72cacd94b 1 #include "mbed.h"
megrootens 0:5fa72cacd94b 2 #include "Hx711.h"
megrootens 0:5fa72cacd94b 3
megrootens 0:5fa72cacd94b 4 void Hx711::set_gain(uint8_t gain) {
megrootens 0:5fa72cacd94b 5 switch (gain) {
megrootens 0:5fa72cacd94b 6 case 128: // channel A, gain factor 128
megrootens 0:5fa72cacd94b 7 gain_ = 1;
megrootens 0:5fa72cacd94b 8 break;
megrootens 0:5fa72cacd94b 9 case 64: // channel A, gain factor 64
megrootens 0:5fa72cacd94b 10 gain_ = 3;
megrootens 0:5fa72cacd94b 11 break;
megrootens 0:5fa72cacd94b 12 case 32: // channel B, gain factor 32
megrootens 0:5fa72cacd94b 13 gain_ = 2;
megrootens 0:5fa72cacd94b 14 break;
megrootens 0:5fa72cacd94b 15 }
megrootens 0:5fa72cacd94b 16
megrootens 0:5fa72cacd94b 17 sck_.write(LOW);
megrootens 0:5fa72cacd94b 18 read();
megrootens 0:5fa72cacd94b 19 }
megrootens 0:5fa72cacd94b 20
Eugene0469 6:2232982efde9 21 int32_t Hx711::readRaw() {
megrootens 0:5fa72cacd94b 22 // wait for the chip to become ready
megrootens 1:197ef68ad6de 23 // TODO: this is not ideal; the programm will hang if the chip never
megrootens 1:197ef68ad6de 24 // becomes ready...
megrootens 0:5fa72cacd94b 25 while (!is_ready());
Eugene0469 6:2232982efde9 26 printf("Chip is ready.\n");
megrootens 0:5fa72cacd94b 27 uint32_t value = 0;
megrootens 0:5fa72cacd94b 28 uint8_t data[3] = { 0 };
megrootens 0:5fa72cacd94b 29 uint8_t filler = 0x00;
megrootens 0:5fa72cacd94b 30
megrootens 0:5fa72cacd94b 31 // pulse the clock pin 24 times to read the data
megrootens 3:9bbfb7f8c751 32 data[2] = shiftInMsbFirst();
megrootens 3:9bbfb7f8c751 33 data[1] = shiftInMsbFirst();
megrootens 3:9bbfb7f8c751 34 data[0] = shiftInMsbFirst();
megrootens 0:5fa72cacd94b 35
Eugene0469 6:2232982efde9 36 printf("Data has been read.\n");
megrootens 0:5fa72cacd94b 37 // set the channel and the gain factor for the next reading using the clock pin
megrootens 0:5fa72cacd94b 38 for (unsigned int i = 0; i < gain_; i++) {
megrootens 0:5fa72cacd94b 39 sck_.write(HIGH);
megrootens 0:5fa72cacd94b 40 sck_.write(LOW);
megrootens 0:5fa72cacd94b 41 }
megrootens 0:5fa72cacd94b 42
megrootens 0:5fa72cacd94b 43 // Datasheet indicates the value is returned as a two's complement value
megrootens 0:5fa72cacd94b 44 // Flip all the bits
megrootens 0:5fa72cacd94b 45 data[2] = ~data[2];
megrootens 0:5fa72cacd94b 46 data[1] = ~data[1];
megrootens 0:5fa72cacd94b 47 data[0] = ~data[0];
Eugene0469 6:2232982efde9 48
Eugene0469 6:2232982efde9 49 printf("Data[2]: %d\n",data[2]);
Eugene0469 6:2232982efde9 50 printf("Data[1]: %d\n",data[1]);
Eugene0469 6:2232982efde9 51 printf("Data[0]: %d\n",data[0]);
megrootens 0:5fa72cacd94b 52
megrootens 0:5fa72cacd94b 53 // Replicate the most significant bit to pad out a 32-bit signed integer
megrootens 0:5fa72cacd94b 54 if ( data[2] & 0x80 ) {
megrootens 0:5fa72cacd94b 55 filler = 0xFF;
megrootens 0:5fa72cacd94b 56 } else if ((0x7F == data[2]) && (0xFF == data[1]) && (0xFF == data[0])) {
megrootens 0:5fa72cacd94b 57 filler = 0xFF;
megrootens 0:5fa72cacd94b 58 } else {
megrootens 0:5fa72cacd94b 59 filler = 0x00;
megrootens 0:5fa72cacd94b 60 }
Eugene0469 6:2232982efde9 61 printf("Filler: %d\n",filler);
megrootens 0:5fa72cacd94b 62 // Construct a 32-bit signed integer
megrootens 0:5fa72cacd94b 63 value = ( static_cast<uint32_t>(filler) << 24
megrootens 0:5fa72cacd94b 64 | static_cast<uint32_t>(data[2]) << 16
megrootens 0:5fa72cacd94b 65 | static_cast<uint32_t>(data[1]) << 8
megrootens 0:5fa72cacd94b 66 | static_cast<uint32_t>(data[0]) );
Eugene0469 6:2232982efde9 67
Eugene0469 6:2232982efde9 68 printf("32-bit signed integer has been constructed:%d\n",value);
Eugene0469 6:2232982efde9 69 // ... and add 1. Thiscompletes the conversion of the 2's complement value.
Eugene0469 6:2232982efde9 70 value = ++value;
Eugene0469 6:2232982efde9 71 printf("32-bit after adding 1: %d\n",value);
Eugene0469 6:2232982efde9 72 value = static_cast<int32_t>(value);
Eugene0469 6:2232982efde9 73 printf("32-bit after typecasting: %d\n",value);
Eugene0469 6:2232982efde9 74 return value;
megrootens 0:5fa72cacd94b 75 }
megrootens 0:5fa72cacd94b 76
megrootens 0:5fa72cacd94b 77
megrootens 3:9bbfb7f8c751 78 uint8_t Hx711::shiftInMsbFirst() {
megrootens 0:5fa72cacd94b 79 uint8_t value = 0;
megrootens 0:5fa72cacd94b 80
megrootens 3:9bbfb7f8c751 81 for (uint8_t i = 0; i < 8; ++i) {
megrootens 0:5fa72cacd94b 82 sck_.write(HIGH);
megrootens 3:9bbfb7f8c751 83 value |= dt_.read() << (7 - i);
megrootens 0:5fa72cacd94b 84 sck_.write(LOW);
megrootens 0:5fa72cacd94b 85 }
Eugene0469 6:2232982efde9 86 printf("8-bit raw value: %d\n",value);
megrootens 0:5fa72cacd94b 87 return value;
megrootens 0:5fa72cacd94b 88 }