Dimnet Robin / HX711

Dependents:   calibratio_jauge

Committer:
rdimnet
Date:
Thu Mar 14 10:25:00 2019 +0000
Revision:
0:88eb74c91751
14/03

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rdimnet 0:88eb74c91751 1 /*
rdimnet 0:88eb74c91751 2 * FILE: HX711.cpp
rdimnet 0:88eb74c91751 3 *
rdimnet 0:88eb74c91751 4 * VERSION: 0.1
rdimnet 0:88eb74c91751 5 * PURPOSE: HX711 weight library for Nucleo STM32
rdimnet 0:88eb74c91751 6 * AUTHOR: Bertrand Bouvier
rdimnet 0:88eb74c91751 7 * LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html)
rdimnet 0:88eb74c91751 8 *
rdimnet 0:88eb74c91751 9 * DATASHEET: http://www.dfrobot.com/image/data/SEN0160/hx711_english.pdf
rdimnet 0:88eb74c91751 10 * URL:
rdimnet 0:88eb74c91751 11 *
rdimnet 0:88eb74c91751 12 * HISTORY:
rdimnet 0:88eb74c91751 13 * 24/05/2015 - Bertrand Bouvier - Original version
rdimnet 0:88eb74c91751 14 * see HX711.h
rdimnet 0:88eb74c91751 15 *
rdimnet 0:88eb74c91751 16 * SPECIAL THANKS:
rdimnet 0:88eb74c91751 17 * Inspiré du travail de Weihong Guan (@aguegu)
rdimnet 0:88eb74c91751 18 * https://github.com/aguegu/Arduino
rdimnet 0:88eb74c91751 19 * http://aguegu.net
rdimnet 0:88eb74c91751 20 *
rdimnet 0:88eb74c91751 21 * Inspiré du travail de bodge
rdimnet 0:88eb74c91751 22 * https://github.com/bogde/HX711
rdimnet 0:88eb74c91751 23 *
rdimnet 0:88eb74c91751 24 */
rdimnet 0:88eb74c91751 25
rdimnet 0:88eb74c91751 26 #include "HX711.h"
rdimnet 0:88eb74c91751 27 #include "mbed.h"
rdimnet 0:88eb74c91751 28
rdimnet 0:88eb74c91751 29 #define SCALE_VALUE 57.50 //multiple propre à chaque hardware
rdimnet 0:88eb74c91751 30 #define NB_MESURE 10
rdimnet 0:88eb74c91751 31 HX711::HX711(PinName pinData, PinName pinSck, uint8_t gain)
rdimnet 0:88eb74c91751 32 {
rdimnet 0:88eb74c91751 33 _pinData = pinData;
rdimnet 0:88eb74c91751 34 _pinSck = pinSck;
rdimnet 0:88eb74c91751 35
rdimnet 0:88eb74c91751 36 this->setGain(gain);
rdimnet 0:88eb74c91751 37
rdimnet 0:88eb74c91751 38 DigitalOut sck(_pinSck);
rdimnet 0:88eb74c91751 39 DigitalIn data(_pinData);
rdimnet 0:88eb74c91751 40
rdimnet 0:88eb74c91751 41 sck = 1; //Initialisation HX711
rdimnet 0:88eb74c91751 42 wait_us(100);
rdimnet 0:88eb74c91751 43 sck = 0;
rdimnet 0:88eb74c91751 44
rdimnet 0:88eb74c91751 45 this->setOffset(averageValue(10)); //TARE de la balance
rdimnet 0:88eb74c91751 46 this->setScale(SCALE_VALUE); //Réglage du valeur du SCALE
rdimnet 0:88eb74c91751 47 }
rdimnet 0:88eb74c91751 48
rdimnet 0:88eb74c91751 49 HX711::~HX711()
rdimnet 0:88eb74c91751 50 {
rdimnet 0:88eb74c91751 51
rdimnet 0:88eb74c91751 52 }
rdimnet 0:88eb74c91751 53
rdimnet 0:88eb74c91751 54 int HX711::averageValue(uint8_t times) //Calcule une moyenne sur plusieurs mesures
rdimnet 0:88eb74c91751 55 {
rdimnet 0:88eb74c91751 56 int sum = 0;
rdimnet 0:88eb74c91751 57 for (int i = 0; i < times; i++)
rdimnet 0:88eb74c91751 58 {
rdimnet 0:88eb74c91751 59 sum += getValue();
rdimnet 0:88eb74c91751 60 }
rdimnet 0:88eb74c91751 61
rdimnet 0:88eb74c91751 62 return sum / times;
rdimnet 0:88eb74c91751 63 }
rdimnet 0:88eb74c91751 64
rdimnet 0:88eb74c91751 65 int HX711::getValue() //Obtenir la valeur brut du controller
rdimnet 0:88eb74c91751 66 {
rdimnet 0:88eb74c91751 67 int buffer;
rdimnet 0:88eb74c91751 68 buffer = 0 ;
rdimnet 0:88eb74c91751 69
rdimnet 0:88eb74c91751 70 DigitalOut sck(_pinSck);
rdimnet 0:88eb74c91751 71 DigitalIn data(_pinData);
rdimnet 0:88eb74c91751 72
rdimnet 0:88eb74c91751 73 while (data.read()==1) //wait is ready
rdimnet 0:88eb74c91751 74 ;
rdimnet 0:88eb74c91751 75
rdimnet 0:88eb74c91751 76 for (uint8_t i = 24; i--;) //read 24 bit 1 per 1 and save to buffer
rdimnet 0:88eb74c91751 77 {
rdimnet 0:88eb74c91751 78 sck=1;
rdimnet 0:88eb74c91751 79
rdimnet 0:88eb74c91751 80 buffer = buffer << 1 ;
rdimnet 0:88eb74c91751 81
rdimnet 0:88eb74c91751 82 if (data.read())
rdimnet 0:88eb74c91751 83 {
rdimnet 0:88eb74c91751 84 buffer ++;
rdimnet 0:88eb74c91751 85 }
rdimnet 0:88eb74c91751 86
rdimnet 0:88eb74c91751 87 sck=0;
rdimnet 0:88eb74c91751 88 }
rdimnet 0:88eb74c91751 89
rdimnet 0:88eb74c91751 90 for (int i = 0; i < _gain; i++)
rdimnet 0:88eb74c91751 91 {
rdimnet 0:88eb74c91751 92 sck=1;
rdimnet 0:88eb74c91751 93 sck=0;
rdimnet 0:88eb74c91751 94 }
rdimnet 0:88eb74c91751 95
rdimnet 0:88eb74c91751 96 buffer = buffer ^ 0x800000;
rdimnet 0:88eb74c91751 97
rdimnet 0:88eb74c91751 98 return buffer;
rdimnet 0:88eb74c91751 99 }
rdimnet 0:88eb74c91751 100
rdimnet 0:88eb74c91751 101 void HX711::setOffset(int offset)
rdimnet 0:88eb74c91751 102 {
rdimnet 0:88eb74c91751 103 _offset = offset;
rdimnet 0:88eb74c91751 104 }
rdimnet 0:88eb74c91751 105
rdimnet 0:88eb74c91751 106 void HX711::setScale(float scale)
rdimnet 0:88eb74c91751 107 {
rdimnet 0:88eb74c91751 108 _scale = scale;
rdimnet 0:88eb74c91751 109 }
rdimnet 0:88eb74c91751 110
rdimnet 0:88eb74c91751 111 float HX711::getGram()
rdimnet 0:88eb74c91751 112 {
rdimnet 0:88eb74c91751 113 long val = (averageValue(NB_MESURE) - _offset);
rdimnet 0:88eb74c91751 114 return (float) val / _scale;
rdimnet 0:88eb74c91751 115 }
rdimnet 0:88eb74c91751 116
rdimnet 0:88eb74c91751 117 void HX711::setGain(uint8_t gain)
rdimnet 0:88eb74c91751 118 {
rdimnet 0:88eb74c91751 119 switch (gain)
rdimnet 0:88eb74c91751 120 {
rdimnet 0:88eb74c91751 121 case 128: // channel A, gain factor 128
rdimnet 0:88eb74c91751 122 _gain = 1;
rdimnet 0:88eb74c91751 123 break;
rdimnet 0:88eb74c91751 124
rdimnet 0:88eb74c91751 125 case 64: // channel A, gain factor 64
rdimnet 0:88eb74c91751 126 _gain = 3;
rdimnet 0:88eb74c91751 127 break;
rdimnet 0:88eb74c91751 128
rdimnet 0:88eb74c91751 129 case 32: // channel B, gain factor 32
rdimnet 0:88eb74c91751 130 _gain = 2;
rdimnet 0:88eb74c91751 131 break;
rdimnet 0:88eb74c91751 132 }
rdimnet 0:88eb74c91751 133 DigitalOut sck(_pinSck);
rdimnet 0:88eb74c91751 134 sck = 0;
rdimnet 0:88eb74c91751 135 getValue();
rdimnet 0:88eb74c91751 136 }
rdimnet 0:88eb74c91751 137
rdimnet 0:88eb74c91751 138 void HX711::powerDown()
rdimnet 0:88eb74c91751 139 {
rdimnet 0:88eb74c91751 140 DigitalOut sck(_pinSck);
rdimnet 0:88eb74c91751 141 sck = 0;
rdimnet 0:88eb74c91751 142 sck = 1;
rdimnet 0:88eb74c91751 143 }
rdimnet 0:88eb74c91751 144
rdimnet 0:88eb74c91751 145 void HX711::powerUp()
rdimnet 0:88eb74c91751 146 {
rdimnet 0:88eb74c91751 147 DigitalOut sck(_pinSck);
rdimnet 0:88eb74c91751 148 sck = 0;
rdimnet 0:88eb74c91751 149 }
rdimnet 0:88eb74c91751 150
rdimnet 0:88eb74c91751 151 void HX711::tare(uint8_t times)
rdimnet 0:88eb74c91751 152 {
rdimnet 0:88eb74c91751 153 int sum = averageValue(times);
rdimnet 0:88eb74c91751 154 setOffset(sum);
rdimnet 0:88eb74c91751 155 }
rdimnet 0:88eb74c91751 156