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:   SmartCrutches

Committer:
megrootens
Date:
Thu Jun 16 07:31:43 2016 +0000
Revision:
1:197ef68ad6de
Parent:
0:5fa72cacd94b
Child:
2:f118f8c456a4
replaced #defines outside class by static const int within the class

Who changed what in which revision?

UserRevisionLine numberNew contents of line
megrootens 0:5fa72cacd94b 1 #ifndef _HX711_H_
megrootens 0:5fa72cacd94b 2 #define _HX711_H_
megrootens 0:5fa72cacd94b 3
megrootens 0:5fa72cacd94b 4 /**
megrootens 0:5fa72cacd94b 5 * Class for communication with the HX711 24-Bit Analog-to-Digital
megrootens 0:5fa72cacd94b 6 * Converter (ADC) for Weigh Scales by AVIA Semiconductor.
megrootens 0:5fa72cacd94b 7 * This library is a port of the Arduino library at
megrootens 0:5fa72cacd94b 8 * https://github.com/bogde/HX711
megrootens 0:5fa72cacd94b 9 * It works with the FRDM K22F.
megrootens 0:5fa72cacd94b 10 */
megrootens 0:5fa72cacd94b 11 class Hx711 {
megrootens 1:197ef68ad6de 12
megrootens 0:5fa72cacd94b 13 public:
megrootens 1:197ef68ad6de 14
megrootens 0:5fa72cacd94b 15 /**
megrootens 0:5fa72cacd94b 16 * Create an Hx711 ADC object
megrootens 0:5fa72cacd94b 17 * @param pin_sck PinName of the clock pin (digital output)
megrootens 0:5fa72cacd94b 18 * @param pin_dt PinName of the data pin (digital input)
megrootens 0:5fa72cacd94b 19 * @param offset offset for sensor values
megrootens 0:5fa72cacd94b 20 * @param scale scale factor to obtain real values
megrootens 0:5fa72cacd94b 21 * @param gain channel selection is made by passing the appropriate gain:
megrootens 0:5fa72cacd94b 22 * 128 or 64 for channel A, 32 for channel B
megrootens 0:5fa72cacd94b 23 */
megrootens 0:5fa72cacd94b 24 Hx711(PinName pin_sck, PinName pin_dt, int offset, float scale, uint8_t gain = 128) :
megrootens 0:5fa72cacd94b 25 sck_(pin_sck),
megrootens 0:5fa72cacd94b 26 dt_(pin_dt) {
megrootens 0:5fa72cacd94b 27 set_offset(offset);
megrootens 0:5fa72cacd94b 28 set_scale(scale);
megrootens 0:5fa72cacd94b 29 set_gain(gain);
megrootens 0:5fa72cacd94b 30 }
megrootens 0:5fa72cacd94b 31
megrootens 0:5fa72cacd94b 32 /**
megrootens 1:197ef68ad6de 33 * Create an Hx711 ADC object with zero offset and unit scaling
megrootens 0:5fa72cacd94b 34 * @param pin_sck PinName of the clock pin (digital output)
megrootens 0:5fa72cacd94b 35 * @param pin_dt PinName of the data pin (digital input)
megrootens 0:5fa72cacd94b 36 * @param gain channel selection is made by passing the appropriate gain:
megrootens 0:5fa72cacd94b 37 * 128 or 64 for channel A, 32 for channel B
megrootens 1:197ef68ad6de 38 * TODO: constructor overloading is not allowed?
megrootens 0:5fa72cacd94b 39 */
megrootens 0:5fa72cacd94b 40 Hx711(PinName pin_sck, PinName pin_dt, uint8_t gain = 128) :
megrootens 0:5fa72cacd94b 41 sck_(pin_sck),
megrootens 0:5fa72cacd94b 42 dt_(pin_dt) {
megrootens 0:5fa72cacd94b 43 set_offset(0);
megrootens 0:5fa72cacd94b 44 set_scale(1.0f);
megrootens 0:5fa72cacd94b 45 set_gain(gain);
megrootens 0:5fa72cacd94b 46 }
megrootens 0:5fa72cacd94b 47
megrootens 0:5fa72cacd94b 48 /**
megrootens 0:5fa72cacd94b 49 * Check if the sensor is ready
megrootens 0:5fa72cacd94b 50 * from the datasheet: When output data is not ready for retrieval,
megrootens 0:5fa72cacd94b 51 * digital output pin DOUT is high. Serial clock input PD_SCK should be low.
megrootens 0:5fa72cacd94b 52 * When DOUT goes to low, it indicates data is ready for retrieval.
megrootens 0:5fa72cacd94b 53 * @return true if dt_.read() == LOW
megrootens 1:197ef68ad6de 54 * TODO: this is not ideal; the programm will hang if the chip never
megrootens 1:197ef68ad6de 55 * becomes ready...
megrootens 0:5fa72cacd94b 56 */
megrootens 0:5fa72cacd94b 57 bool is_ready() {
megrootens 0:5fa72cacd94b 58 return dt_.read() == LOW;
megrootens 0:5fa72cacd94b 59 }
megrootens 0:5fa72cacd94b 60
megrootens 0:5fa72cacd94b 61 /**
megrootens 0:5fa72cacd94b 62 * Waits for the chip to be ready and returns a raw int reading
megrootens 0:5fa72cacd94b 63 * @return int sensor output value
megrootens 0:5fa72cacd94b 64 */
megrootens 0:5fa72cacd94b 65 int readRaw();
megrootens 0:5fa72cacd94b 66
megrootens 0:5fa72cacd94b 67 /**
megrootens 0:5fa72cacd94b 68 * Obtain offset and scaled sensor output; i.e. a real value
megrootens 0:5fa72cacd94b 69 * @return float
megrootens 0:5fa72cacd94b 70 */
megrootens 0:5fa72cacd94b 71 float read() {
megrootens 0:5fa72cacd94b 72 return ((float)(readRaw() - get_offset())) * get_scale();
megrootens 0:5fa72cacd94b 73 }
megrootens 0:5fa72cacd94b 74
megrootens 0:5fa72cacd94b 75 /**
megrootens 0:5fa72cacd94b 76 * Puts the chip into power down mode
megrootens 0:5fa72cacd94b 77 */
megrootens 0:5fa72cacd94b 78 void power_down() {
megrootens 0:5fa72cacd94b 79 sck_.write(LOW);
megrootens 0:5fa72cacd94b 80 sck_.write(HIGH);
megrootens 0:5fa72cacd94b 81 }
megrootens 0:5fa72cacd94b 82
megrootens 0:5fa72cacd94b 83 /**
megrootens 0:5fa72cacd94b 84 * Wakes up the chip after power down mode
megrootens 0:5fa72cacd94b 85 */
megrootens 0:5fa72cacd94b 86 void power_up() {
megrootens 0:5fa72cacd94b 87 sck_.write(LOW);
megrootens 0:5fa72cacd94b 88 }
megrootens 0:5fa72cacd94b 89
megrootens 0:5fa72cacd94b 90 /**
megrootens 0:5fa72cacd94b 91 * Set the gain factor; takes effect only after a call to read()
megrootens 0:5fa72cacd94b 92 * channel A can be set for a 128 or 64 gain; channel B has a fixed 32 gain
megrootens 0:5fa72cacd94b 93 * depending on the parameter, the channel is also set to either A or B
megrootens 0:5fa72cacd94b 94 * Ensures that gain_ = 128, 64 or 32
megrootens 0:5fa72cacd94b 95 * @param gain 128, 64 or 32
megrootens 0:5fa72cacd94b 96 */
megrootens 0:5fa72cacd94b 97 void set_gain(uint8_t gain = 128);
megrootens 0:5fa72cacd94b 98
megrootens 0:5fa72cacd94b 99 /**
megrootens 0:5fa72cacd94b 100 * Obtain current gain
megrootens 0:5fa72cacd94b 101 * @return gain_
megrootens 0:5fa72cacd94b 102 */
megrootens 0:5fa72cacd94b 103 uint8_t get_gain() {
megrootens 0:5fa72cacd94b 104 return gain_;
megrootens 0:5fa72cacd94b 105 }
megrootens 0:5fa72cacd94b 106
megrootens 0:5fa72cacd94b 107 /**
megrootens 0:5fa72cacd94b 108 * Set the scale factor
megrootens 0:5fa72cacd94b 109 * @param scale desired scale
megrootens 0:5fa72cacd94b 110 */
megrootens 0:5fa72cacd94b 111 void set_scale(float scale = 1.f) {
megrootens 0:5fa72cacd94b 112 scale_ = scale;
megrootens 0:5fa72cacd94b 113 };
megrootens 0:5fa72cacd94b 114
megrootens 0:5fa72cacd94b 115 /**
megrootens 0:5fa72cacd94b 116 * Get sensor scale factor
megrootens 0:5fa72cacd94b 117 * @return scale_
megrootens 0:5fa72cacd94b 118 */
megrootens 0:5fa72cacd94b 119 float get_scale() {
megrootens 0:5fa72cacd94b 120 return scale_;
megrootens 0:5fa72cacd94b 121 }
megrootens 0:5fa72cacd94b 122
megrootens 0:5fa72cacd94b 123 /**
megrootens 0:5fa72cacd94b 124 * Set the sensor offset
megrootens 0:5fa72cacd94b 125 * @param offset the desired offset
megrootens 0:5fa72cacd94b 126 */
megrootens 0:5fa72cacd94b 127 void set_offset(int offset = 0) {
megrootens 0:5fa72cacd94b 128 offset_ = offset;
megrootens 0:5fa72cacd94b 129 }
megrootens 0:5fa72cacd94b 130
megrootens 0:5fa72cacd94b 131 /**
megrootens 0:5fa72cacd94b 132 * Get current sensor offset
megrootens 0:5fa72cacd94b 133 * @return offset_
megrootens 0:5fa72cacd94b 134 */
megrootens 0:5fa72cacd94b 135 int get_offset() { return offset_; }
megrootens 0:5fa72cacd94b 136
megrootens 0:5fa72cacd94b 137
megrootens 0:5fa72cacd94b 138 private:
megrootens 1:197ef68ad6de 139
megrootens 1:197ef68ad6de 140 static const uint8_t LSBFIRST = 0; // least significant bit first
megrootens 1:197ef68ad6de 141 static const uint8_t MSBFIRST = 1; // most significant bit first
megrootens 1:197ef68ad6de 142 static const uint8_t LOW = 0; // digital low
megrootens 1:197ef68ad6de 143 static const uint8_t HIGH = 1; // digital high
megrootens 1:197ef68ad6de 144
megrootens 0:5fa72cacd94b 145 DigitalOut sck_; // clock line
megrootens 0:5fa72cacd94b 146 DigitalIn dt_; // data line
megrootens 0:5fa72cacd94b 147
megrootens 0:5fa72cacd94b 148 uint8_t gain_; // amplification factor at chip
megrootens 1:197ef68ad6de 149 int offset_; // offset chip value
megrootens 1:197ef68ad6de 150 float scale_; // scale output after offset
megrootens 0:5fa72cacd94b 151
megrootens 0:5fa72cacd94b 152 /**
megrootens 0:5fa72cacd94b 153 * Port of the Arduino shiftIn function; shifts a byte one bit at a time
megrootens 0:5fa72cacd94b 154 * @param bit_order LSBFIRST or MSBFIRST
megrootens 0:5fa72cacd94b 155 * @return incoming but
megrootens 0:5fa72cacd94b 156 */
megrootens 0:5fa72cacd94b 157 uint8_t shiftIn(uint8_t bit_order);
megrootens 0:5fa72cacd94b 158 };
megrootens 0:5fa72cacd94b 159
megrootens 0:5fa72cacd94b 160 #endif