Library for HX711 device. 24-Bit Analog-to-Digital Converter (ADC) for Weigh Scales

Dependents:   EXPO_ANDA EXPO_ANDA_Copilotoco

Committer:
mcm
Date:
Wed Sep 13 09:11:22 2017 +0000
Revision:
4:d7a5cd03ed09
Parent:
3:d246aa415f3a
Adapt the scale was fixed, myFactor now works as expected, some comments were improved.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:06652a775538 1 /**
mcm 1:06652a775538 2 * @brief HX711.h
mcm 1:06652a775538 3 * @details 24-Bit Analog-to-Digital Converter (ADC) for Weigh Scales.
mcm 1:06652a775538 4 * Header file.
mcm 1:06652a775538 5 *
mcm 1:06652a775538 6 *
mcm 1:06652a775538 7 * @return NA
mcm 1:06652a775538 8 *
mcm 1:06652a775538 9 * @author Manuel Caballero
mcm 1:06652a775538 10 * @date 11/September/2017
mcm 1:06652a775538 11 * @version 11/September/2017 The ORIGIN
mcm 1:06652a775538 12 * @pre NaN.
mcm 1:06652a775538 13 * @warning NaN
mcm 1:06652a775538 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
mcm 1:06652a775538 15 */
mcm 1:06652a775538 16 #ifndef HX711_H
mcm 1:06652a775538 17 #define HX711_H
mcm 1:06652a775538 18
mcm 1:06652a775538 19 #include "mbed.h"
mcm 1:06652a775538 20
mcm 1:06652a775538 21
mcm 1:06652a775538 22 /**
mcm 1:06652a775538 23 Example:
mcm 1:06652a775538 24
mcm 3:d246aa415f3a 25 #include "mbed.h"
mcm 3:d246aa415f3a 26 #include "HX711.h"
mcm 3:d246aa415f3a 27
mcm 3:d246aa415f3a 28 HX711 myWeightSensor ( p5, p6 );
mcm 3:d246aa415f3a 29 Serial pc ( USBTX, USBRX );
mcm 3:d246aa415f3a 30
mcm 3:d246aa415f3a 31 Ticker newReading;
mcm 3:d246aa415f3a 32 DigitalOut myled1 ( LED1 );
mcm 3:d246aa415f3a 33 DigitalOut myled2 ( LED2 );
mcm 3:d246aa415f3a 34 DigitalOut myled3 ( LED3 );
mcm 3:d246aa415f3a 35 DigitalOut myled4 ( LED4 );
mcm 3:d246aa415f3a 36
mcm 3:d246aa415f3a 37 HX711::HX711_status_t aux;
mcm 3:d246aa415f3a 38 HX711::Vector_count_t myData;
mcm 3:d246aa415f3a 39 HX711::Vector_mass_t myCalculatedMass;
mcm 3:d246aa415f3a 40 HX711::Vector_voltage_t myCalculatedVoltage;
mcm 3:d246aa415f3a 41
mcm 3:d246aa415f3a 42
mcm 3:d246aa415f3a 43 void readDATA ( void )
mcm 3:d246aa415f3a 44 {
mcm 3:d246aa415f3a 45 myled4 = 1;
mcm 3:d246aa415f3a 46
mcm 3:d246aa415f3a 47 aux = myWeightSensor.HX711_ReadRawData ( HX711::CHANNEL_A_GAIN_128, &myData, 4 );
mcm 3:d246aa415f3a 48 myCalculatedMass = myWeightSensor.HX711_CalculateMass ( &myData, 1.0, HX711::HX711_SCALE_kg );
mcm 3:d246aa415f3a 49 myCalculatedVoltage = myWeightSensor.HX711_CalculateVoltage ( &myData, 5.0 );
mcm 3:d246aa415f3a 50
mcm 3:d246aa415f3a 51 pc.printf( "Raw Data: %ld Mass: %0.5f kg Voltage: %0.5f mV\r\n", (uint32_t)myData.myRawValue, myCalculatedMass.myMass, 1000*myCalculatedVoltage.myVoltage );
mcm 3:d246aa415f3a 52
mcm 3:d246aa415f3a 53 myled4 = 0;
mcm 3:d246aa415f3a 54 }
mcm 3:d246aa415f3a 55
mcm 3:d246aa415f3a 56
mcm 3:d246aa415f3a 57 int main()
mcm 3:d246aa415f3a 58 {
mcm 3:d246aa415f3a 59 pc.baud ( 115200 );
mcm 3:d246aa415f3a 60
mcm 3:d246aa415f3a 61
mcm 3:d246aa415f3a 62 // Reset and wake the device up
mcm 3:d246aa415f3a 63 aux = myWeightSensor.HX711_PowerDown ();
mcm 3:d246aa415f3a 64 aux = myWeightSensor.HX711_Reset ();
mcm 3:d246aa415f3a 65 wait(1);
mcm 3:d246aa415f3a 66
mcm 3:d246aa415f3a 67
mcm 3:d246aa415f3a 68 // CALIBRATION time start!
mcm 3:d246aa415f3a 69 // 1. REMOVE THE MASS ON THE LOAD CELL ( ALL LEDs OFF ). Read data without any mass on the load cell
mcm 3:d246aa415f3a 70 aux = myWeightSensor.HX711_ReadData_WithoutMass ( HX711::CHANNEL_A_GAIN_128, &myData, 4 );
mcm 3:d246aa415f3a 71
mcm 3:d246aa415f3a 72 myled1 = 1;
mcm 3:d246aa415f3a 73 wait(3);
mcm 3:d246aa415f3a 74
mcm 3:d246aa415f3a 75
mcm 3:d246aa415f3a 76 // 2. PUT A KNOWN MASS ON THE LOAD CELL ( JUST LED1 ON ). Read data with an user-specified calibration mass
mcm 3:d246aa415f3a 77 aux = myWeightSensor.HX711_ReadData_WithCalibratedMass ( HX711::CHANNEL_A_GAIN_128, &myData, 4 );
mcm 3:d246aa415f3a 78 // CALIBRATION time end!
mcm 3:d246aa415f3a 79
mcm 3:d246aa415f3a 80
mcm 4:d7a5cd03ed09 81 // [ OPTIONAL ] REMOVE THE MASS ON THE LOAD CELL ( JUST LED2 ON ). Read the device without any mass to calculate the tare weight for 5 seconds
mcm 3:d246aa415f3a 82 myled1 = 0;
mcm 3:d246aa415f3a 83 myled2 = 1;
mcm 3:d246aa415f3a 84 wait(3);
mcm 3:d246aa415f3a 85 myled2 = 0;
mcm 3:d246aa415f3a 86
mcm 3:d246aa415f3a 87 // Calculating the tare weight ( JUST LED3 ON )
mcm 3:d246aa415f3a 88 myled3 = 1;
mcm 3:d246aa415f3a 89 aux = myWeightSensor.HX711_SetAutoTare ( HX711::CHANNEL_A_GAIN_128, 1.0, HX711::HX711_SCALE_kg, &myData, 5 );
mcm 3:d246aa415f3a 90 myled3 = 0;
mcm 3:d246aa415f3a 91
mcm 3:d246aa415f3a 92
mcm 3:d246aa415f3a 93 newReading.attach( &readDATA, 0.5 ); // the address of the function to be attached ( readDATA ) and the interval ( 0.5s ) ( JUST LED4 BLINKING )
mcm 3:d246aa415f3a 94
mcm 3:d246aa415f3a 95 // Let the callbacks take care of everything
mcm 3:d246aa415f3a 96 while(1)
mcm 3:d246aa415f3a 97 {
mcm 3:d246aa415f3a 98 sleep();
mcm 3:d246aa415f3a 99 }
mcm 3:d246aa415f3a 100 }
mcm 3:d246aa415f3a 101
mcm 1:06652a775538 102 */
mcm 1:06652a775538 103
mcm 1:06652a775538 104
mcm 1:06652a775538 105 /*!
mcm 1:06652a775538 106 Library for the HX711 24-Bit Analog-to-Digital Converter (ADC) for Weigh Scales.
mcm 1:06652a775538 107 */
mcm 1:06652a775538 108 class HX711
mcm 1:06652a775538 109 {
mcm 1:06652a775538 110 public:
mcm 1:06652a775538 111 /**
mcm 1:06652a775538 112 * @brief CHANNELS & GAIN
mcm 1:06652a775538 113 */
mcm 1:06652a775538 114 typedef enum {
mcm 1:06652a775538 115 CHANNEL_A_GAIN_128 = 0, /*!< Channel A 128 Gain. */
mcm 1:06652a775538 116 CHANNEL_B_GAIN_32 = 1, /*!< Channel B 32 Gain. */
mcm 1:06652a775538 117 CHANNEL_A_GAIN_64 = 2 /*!< Channel A 64 Gain. */
mcm 1:06652a775538 118 } HX711_channel_gain_t;
mcm 1:06652a775538 119
mcm 1:06652a775538 120
mcm 1:06652a775538 121
mcm 1:06652a775538 122 /**
mcm 2:1af13a8a8275 123 * @brief READY/BUSY DATA
mcm 1:06652a775538 124 */
mcm 1:06652a775538 125 typedef enum {
mcm 1:06652a775538 126 HX711_DATA_BUSY = 0, /*!< HX711 data is NOT ready to be read. */
mcm 1:06652a775538 127 HX711_DATA_READY = 1 /*!< HX711 data is ready to be read. */
mcm 1:06652a775538 128 } HX711_data_output_status_t;
mcm 1:06652a775538 129
mcm 1:06652a775538 130
mcm 1:06652a775538 131
mcm 2:1af13a8a8275 132 /**
mcm 2:1af13a8a8275 133 * @brief SCALE
mcm 2:1af13a8a8275 134 */
mcm 2:1af13a8a8275 135 typedef enum {
mcm 2:1af13a8a8275 136 HX711_SCALE_kg = 0, /*!< HX711 Scale in kg. */
mcm 2:1af13a8a8275 137 HX711_SCALE_g = 1, /*!< HX711 Scale in g. */
mcm 2:1af13a8a8275 138 HX711_SCALE_mg = 2, /*!< HX711 Scale in mg. */
mcm 2:1af13a8a8275 139 HX711_SCALE_ug = 3 /*!< HX711 Scale in ug. */
mcm 2:1af13a8a8275 140 } HX711_scale_t;
mcm 2:1af13a8a8275 141
mcm 2:1af13a8a8275 142
mcm 2:1af13a8a8275 143
mcm 2:1af13a8a8275 144
mcm 1:06652a775538 145 #ifndef VECTOR_STRUCT_H
mcm 1:06652a775538 146 #define VECTOR_STRUCT_H
mcm 1:06652a775538 147 typedef struct {
mcm 2:1af13a8a8275 148 float myRawValue_WithCalibratedMass;
mcm 2:1af13a8a8275 149 float myRawValue_WithoutCalibratedMass;
mcm 2:1af13a8a8275 150 float myRawValue_TareWeight;
mcm 2:1af13a8a8275 151 uint32_t myRawValue;
mcm 2:1af13a8a8275 152 } Vector_count_t;
mcm 3:d246aa415f3a 153
mcm 1:06652a775538 154 typedef struct {
mcm 2:1af13a8a8275 155 float myMass;
mcm 2:1af13a8a8275 156 } Vector_mass_t;
mcm 3:d246aa415f3a 157
mcm 3:d246aa415f3a 158 typedef struct {
mcm 3:d246aa415f3a 159 float myVoltage;
mcm 3:d246aa415f3a 160 } Vector_voltage_t;
mcm 1:06652a775538 161 #endif
mcm 2:1af13a8a8275 162
mcm 1:06652a775538 163
mcm 1:06652a775538 164
mcm 1:06652a775538 165 /**
mcm 1:06652a775538 166 * @brief INTERNAL CONSTANTS
mcm 1:06652a775538 167 */
mcm 2:1af13a8a8275 168 #define HX711_PIN_HIGH 0x01 /*!< Pin 'HIGH' */
mcm 1:06652a775538 169 #define HX711_PIN_LOW 0x00 /*!< Pin 'LOW' */
mcm 3:d246aa415f3a 170
mcm 1:06652a775538 171 typedef enum {
mcm 1:06652a775538 172 HX711_SUCCESS = 0,
mcm 1:06652a775538 173 HX711_FAILURE = 1,
mcm 1:06652a775538 174 } HX711_status_t;
mcm 1:06652a775538 175
mcm 1:06652a775538 176
mcm 1:06652a775538 177
mcm 1:06652a775538 178
mcm 1:06652a775538 179 /** Create an HX711 object connected to the specified pins.
mcm 1:06652a775538 180 *
mcm 1:06652a775538 181 * @param pd_sck HX711 Power down control (high active) and serial clock input
mcm 1:06652a775538 182 * @param dout HX711 Serial data output
mcm 1:06652a775538 183 */
mcm 2:1af13a8a8275 184 HX711 ( PinName PD_SCK, PinName DOUT );
mcm 1:06652a775538 185
mcm 1:06652a775538 186 /** Delete HX711 object.
mcm 1:06652a775538 187 */
mcm 1:06652a775538 188 ~HX711();
mcm 1:06652a775538 189
mcm 1:06652a775538 190 /** It performs an internal reset.
mcm 1:06652a775538 191 */
mcm 1:06652a775538 192 HX711_status_t HX711_Reset ( void );
mcm 3:d246aa415f3a 193
mcm 1:06652a775538 194 /** It puts the device into power-down mode.
mcm 1:06652a775538 195 */
mcm 1:06652a775538 196 HX711_status_t HX711_PowerDown ( void );
mcm 3:d246aa415f3a 197
mcm 2:1af13a8a8275 198 /** It sets both the channel and the gain for the next measurement.
mcm 2:1af13a8a8275 199 */
mcm 2:1af13a8a8275 200 HX711_status_t HX711_SetChannelAndGain ( HX711_channel_gain_t myChannel_Gain );
mcm 3:d246aa415f3a 201
mcm 2:1af13a8a8275 202 /** It gets both the channel and the gain for the current measurement.
mcm 2:1af13a8a8275 203 */
mcm 2:1af13a8a8275 204 HX711_channel_gain_t HX711_GetChannelAndGain ( void );
mcm 3:d246aa415f3a 205
mcm 2:1af13a8a8275 206 /** It reads raw data from the device.
mcm 2:1af13a8a8275 207 */
mcm 2:1af13a8a8275 208 HX711_status_t HX711_ReadRawData ( HX711_channel_gain_t myChannel_Gain, Vector_count_t* myNewRawData, uint32_t myAverage );
mcm 3:d246aa415f3a 209
mcm 2:1af13a8a8275 210 /** It reads raw data with an user-specified calibrated mass.
mcm 2:1af13a8a8275 211 */
mcm 2:1af13a8a8275 212 HX711_status_t HX711_ReadData_WithCalibratedMass ( HX711_channel_gain_t myChannel_Gain, Vector_count_t* myNewRawData, uint32_t myAverage );
mcm 3:d246aa415f3a 213
mcm 2:1af13a8a8275 214 /** It reads raw data without any mass.
mcm 2:1af13a8a8275 215 */
mcm 2:1af13a8a8275 216 HX711_status_t HX711_ReadData_WithoutMass ( HX711_channel_gain_t myChannel_Gain, Vector_count_t* myNewRawData, uint32_t myAverage );
mcm 3:d246aa415f3a 217
mcm 2:1af13a8a8275 218 /** It reads raw data without any mass after the system is calibrated.
mcm 2:1af13a8a8275 219 */
mcm 3:d246aa415f3a 220 HX711_status_t HX711_SetAutoTare ( HX711_channel_gain_t myChannel_Gain, float myCalibratedMass, HX711_scale_t myScaleCalibratedMass, Vector_count_t* myNewRawData, float myTime );
mcm 3:d246aa415f3a 221
mcm 3:d246aa415f3a 222 /** It sets a tare weight manually.
mcm 3:d246aa415f3a 223 */
mcm 3:d246aa415f3a 224 Vector_count_t HX711_SetManualTare ( float myTareWeight );
mcm 3:d246aa415f3a 225
mcm 2:1af13a8a8275 226 /** It calculates scaled data.
mcm 2:1af13a8a8275 227 */
mcm 2:1af13a8a8275 228 Vector_mass_t HX711_CalculateMass ( Vector_count_t* myNewRawData, float myCalibratedMass, HX711_scale_t myScaleCalibratedMass );
mcm 1:06652a775538 229
mcm 3:d246aa415f3a 230 /** It calculates voltage data.
mcm 3:d246aa415f3a 231 */
mcm 3:d246aa415f3a 232 Vector_voltage_t HX711_CalculateVoltage ( Vector_count_t* myNewRawData, float myVoltageReference );
mcm 1:06652a775538 233
mcm 1:06652a775538 234
mcm 1:06652a775538 235
mcm 3:d246aa415f3a 236
mcm 3:d246aa415f3a 237 private:
mcm 2:1af13a8a8275 238 DigitalOut _PD_SCK;
mcm 2:1af13a8a8275 239 DigitalIn _DOUT;
mcm 2:1af13a8a8275 240 HX711_channel_gain_t _HX711_CHANNEL_GAIN;
mcm 2:1af13a8a8275 241 HX711_scale_t _HX711_SCALE;
mcm 2:1af13a8a8275 242 float _HX711_USER_CALIBATED_MASS;
mcm 1:06652a775538 243 };
mcm 1:06652a775538 244
mcm 1:06652a775538 245 #endif