Sim Youngwoo / HX711

Dependents:   torque_calibration_ywsim

Committer:
ywsim
Date:
Fri Feb 12 22:50:27 2021 +0000
Revision:
5:4f34d26cc9e7
Parent:
4:d7a5cd03ed09
aa

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