Lectura de una celda de Carga HX711.

Dependencies:   mbed

Committer:
CCastrop1012
Date:
Fri Sep 03 04:51:59 2021 +0000
Revision:
1:392a3fb6d177
Lectura de una celda de Carga.

Who changed what in which revision?

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