Librairie HX711 fonctionnel sur Nucleo L152RE

Dependents:   WaterLogger

Fork of HX711 by Cr300-Litho

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HX711.cpp Source File

HX711.cpp

00001 /*
00002  * FILE: HX711.cpp
00003  * 
00004  * VERSION: 0.1
00005  * PURPOSE: HX711 weight library for Nucleo STM32
00006  * AUTHOR: Bertrand Bouvier
00007  * LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html)
00008  *
00009  * DATASHEET: http://www.dfrobot.com/image/data/SEN0160/hx711_english.pdf
00010  * URL: 
00011  *
00012  * HISTORY:
00013  * 24/05/2015 - Bertrand Bouvier - Original version
00014  * see HX711.h
00015  *
00016  * SPECIAL THANKS:
00017  *  Inspiré du travail de Weihong Guan (@aguegu)
00018  *  https://github.com/aguegu/Arduino
00019  *  http://aguegu.net
00020  *  
00021  *  Inspiré du travail de bodge
00022  *  https://github.com/bogde/HX711
00023  *
00024  */
00025  
00026 #include "HX711.h"
00027 #include "mbed.h"
00028 
00029 #define SCALE_VALUE 1892.f //multiple propre à chaque hardware
00030 
00031 HX711::HX711(PinName pinData, PinName pinSck, uint8_t gain)
00032 {
00033     _pinData = pinData;
00034     _pinSck = pinSck;
00035     
00036     this->setGain(gain);
00037     
00038     DigitalOut sck(_pinSck);
00039     DigitalIn data(_pinData);
00040     
00041     sck = 1;        //Initialisation HX711
00042     wait_us(100);
00043     sck = 0;
00044     
00045     this->setOffset(averageValue(10)); //TARE de la balance
00046     this->setScale(SCALE_VALUE);        //Réglage du valeur du SCALE
00047 }
00048 
00049 HX711::~HX711()
00050 {
00051 
00052 }
00053 
00054 int HX711::averageValue(uint8_t times) //Calcule une moyenne sur plusieurs mesures 
00055 {
00056     int sum = 0;
00057     for (int i = 0; i < times; i++)
00058     {
00059         sum += getValue();
00060     }
00061 
00062     return sum / times;
00063 }
00064 
00065 int HX711::getValue() //Obtenir la valeur brut du controller
00066 {
00067     int buffer; 
00068     buffer = 0 ;
00069     
00070     DigitalOut sck(_pinSck);
00071     DigitalIn data(_pinData);
00072     
00073     while (data.read()==1) //wait is ready
00074     ;
00075     
00076     for (uint8_t i = 24; i--;) //read 24 bit 1 per 1 and save to buffer
00077     {
00078         sck=1;
00079 
00080         buffer = buffer << 1 ;
00081     
00082         if (data.read())
00083         {
00084             buffer ++;
00085         }
00086         
00087         sck=0;
00088     }
00089     
00090     for (int i = 0; i < _gain; i++)
00091     {
00092         sck=1; 
00093         sck=0;
00094     }
00095     
00096     buffer = buffer ^ 0x800000;
00097 
00098     return buffer;
00099 }
00100 
00101 void HX711::setOffset(int offset)
00102 {
00103     _offset = offset;
00104 }
00105 
00106 void HX711::setScale(float scale)
00107 {
00108     _scale = scale;
00109 }
00110 
00111 float HX711::getGram()
00112 {
00113     long val = (averageValue(2) - _offset);
00114     return (float) val / _scale;
00115 }
00116 
00117 void HX711::setGain(uint8_t  gain) 
00118 {
00119     switch (gain) 
00120     { 
00121         case 128:       // channel A, gain factor 128 
00122             _gain = 1; 
00123             break; 
00124             
00125         case 64:        // channel A, gain factor 64 
00126             _gain = 3; 
00127             break; 
00128             
00129         case 32:        // channel B, gain factor 32 
00130             _gain = 2; 
00131             break; 
00132     } 
00133     DigitalOut sck(_pinSck);
00134     sck = 0;
00135     getValue();
00136 }
00137 
00138 void HX711::powerDown() 
00139 {
00140     DigitalOut sck(_pinSck);
00141     sck = 0;
00142     sck = 1;
00143 }
00144 
00145 void HX711::powerUp() 
00146 {
00147     DigitalOut sck(_pinSck);
00148     sck = 0;
00149 }
00150 
00151 void HX711::tare(uint8_t times) 
00152 {
00153     int sum = averageValue(times);
00154     setOffset(sum);
00155 }