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
Hx711.h@0:5fa72cacd94b, 2016-06-15 (annotated)
- Committer:
- megrootens
- Date:
- Wed Jun 15 15:23:54 2016 +0000
- Revision:
- 0:5fa72cacd94b
- Child:
- 1:197ef68ad6de
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
Who changed what in which revision?
User | Revision | Line number | New 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 | #define LSBFIRST 0 |
megrootens | 0:5fa72cacd94b | 5 | #define MSBFIRST 1 |
megrootens | 0:5fa72cacd94b | 6 | #define LOW 0 |
megrootens | 0:5fa72cacd94b | 7 | #define HIGH 1 |
megrootens | 0:5fa72cacd94b | 8 | |
megrootens | 0:5fa72cacd94b | 9 | /** |
megrootens | 0:5fa72cacd94b | 10 | * Class for communication with the HX711 24-Bit Analog-to-Digital |
megrootens | 0:5fa72cacd94b | 11 | * Converter (ADC) for Weigh Scales by AVIA Semiconductor. |
megrootens | 0:5fa72cacd94b | 12 | * This library is a port of the Arduino library at |
megrootens | 0:5fa72cacd94b | 13 | * https://github.com/bogde/HX711 |
megrootens | 0:5fa72cacd94b | 14 | * It works with the FRDM K22F. |
megrootens | 0:5fa72cacd94b | 15 | */ |
megrootens | 0:5fa72cacd94b | 16 | class Hx711 { |
megrootens | 0:5fa72cacd94b | 17 | public: |
megrootens | 0:5fa72cacd94b | 18 | /** |
megrootens | 0:5fa72cacd94b | 19 | * Create an Hx711 ADC object |
megrootens | 0:5fa72cacd94b | 20 | * @param pin_sck PinName of the clock pin (digital output) |
megrootens | 0:5fa72cacd94b | 21 | * @param pin_dt PinName of the data pin (digital input) |
megrootens | 0:5fa72cacd94b | 22 | * @param offset offset for sensor values |
megrootens | 0:5fa72cacd94b | 23 | * @param scale scale factor to obtain real values |
megrootens | 0:5fa72cacd94b | 24 | * @param gain channel selection is made by passing the appropriate gain: |
megrootens | 0:5fa72cacd94b | 25 | * 128 or 64 for channel A, 32 for channel B |
megrootens | 0:5fa72cacd94b | 26 | */ |
megrootens | 0:5fa72cacd94b | 27 | Hx711(PinName pin_sck, PinName pin_dt, int offset, float scale, uint8_t gain = 128) : |
megrootens | 0:5fa72cacd94b | 28 | sck_(pin_sck), |
megrootens | 0:5fa72cacd94b | 29 | dt_(pin_dt) { |
megrootens | 0:5fa72cacd94b | 30 | set_offset(offset); |
megrootens | 0:5fa72cacd94b | 31 | set_scale(scale); |
megrootens | 0:5fa72cacd94b | 32 | set_gain(gain); |
megrootens | 0:5fa72cacd94b | 33 | } |
megrootens | 0:5fa72cacd94b | 34 | |
megrootens | 0:5fa72cacd94b | 35 | /** |
megrootens | 0:5fa72cacd94b | 36 | * Create an Hx711 ADC object with zero offset and scaling |
megrootens | 0:5fa72cacd94b | 37 | * @param pin_sck PinName of the clock pin (digital output) |
megrootens | 0:5fa72cacd94b | 38 | * @param pin_dt PinName of the data pin (digital input) |
megrootens | 0:5fa72cacd94b | 39 | * @param gain channel selection is made by passing the appropriate gain: |
megrootens | 0:5fa72cacd94b | 40 | * 128 or 64 for channel A, 32 for channel B |
megrootens | 0:5fa72cacd94b | 41 | */ |
megrootens | 0:5fa72cacd94b | 42 | Hx711(PinName pin_sck, PinName pin_dt, uint8_t gain = 128) : |
megrootens | 0:5fa72cacd94b | 43 | sck_(pin_sck), |
megrootens | 0:5fa72cacd94b | 44 | dt_(pin_dt) { |
megrootens | 0:5fa72cacd94b | 45 | set_offset(0); |
megrootens | 0:5fa72cacd94b | 46 | set_scale(1.0f); |
megrootens | 0:5fa72cacd94b | 47 | set_gain(gain); |
megrootens | 0:5fa72cacd94b | 48 | } |
megrootens | 0:5fa72cacd94b | 49 | |
megrootens | 0:5fa72cacd94b | 50 | /** |
megrootens | 0:5fa72cacd94b | 51 | * Check if the sensor is ready |
megrootens | 0:5fa72cacd94b | 52 | * from the datasheet: When output data is not ready for retrieval, |
megrootens | 0:5fa72cacd94b | 53 | * digital output pin DOUT is high. Serial clock input PD_SCK should be low. |
megrootens | 0:5fa72cacd94b | 54 | * When DOUT goes to low, it indicates data is ready for retrieval. |
megrootens | 0:5fa72cacd94b | 55 | * @return true if dt_.read() == LOW |
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 | 0:5fa72cacd94b | 139 | DigitalOut sck_; // clock line |
megrootens | 0:5fa72cacd94b | 140 | DigitalIn dt_; // data line |
megrootens | 0:5fa72cacd94b | 141 | |
megrootens | 0:5fa72cacd94b | 142 | uint8_t gain_; // amplification factor at chip |
megrootens | 0:5fa72cacd94b | 143 | int offset_; // zet zero |
megrootens | 0:5fa72cacd94b | 144 | float scale_; // scale output |
megrootens | 0:5fa72cacd94b | 145 | |
megrootens | 0:5fa72cacd94b | 146 | /** |
megrootens | 0:5fa72cacd94b | 147 | * Port of the Arduino shiftIn function; shifts a byte one bit at a time |
megrootens | 0:5fa72cacd94b | 148 | * @param bit_order LSBFIRST or MSBFIRST |
megrootens | 0:5fa72cacd94b | 149 | * @return incoming but |
megrootens | 0:5fa72cacd94b | 150 | */ |
megrootens | 0:5fa72cacd94b | 151 | uint8_t shiftIn(uint8_t bit_order); |
megrootens | 0:5fa72cacd94b | 152 | }; |
megrootens | 0:5fa72cacd94b | 153 | |
megrootens | 0:5fa72cacd94b | 154 | #endif |