mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
200 lines
5.5 KiB
C++
200 lines
5.5 KiB
C++
#pragma once
|
|
//
|
|
// FILE: HX711_MP.h
|
|
// AUTHOR: Rob Tillaart
|
|
// VERSION: 0.2.0
|
|
// PURPOSE: Library for load cells for Arduino
|
|
// URL: https://github.com/RobTillaart/HX711_MP
|
|
// URL: https://github.com/RobTillaart/HX711
|
|
//
|
|
// NOTES
|
|
// Superset of interface of HX711 class of Bogde
|
|
// float instead of long as float has 23 bits mantissa.
|
|
|
|
|
|
#include "Arduino.h"
|
|
|
|
#define HX711_MP_LIB_VERSION (F("0.2.0"))
|
|
|
|
|
|
const uint8_t HX711_AVERAGE_MODE = 0x00;
|
|
// in median mode only between 3 and 15 samples are allowed.
|
|
const uint8_t HX711_MEDIAN_MODE = 0x01;
|
|
// medavg = average of the middle "half" of sorted elements
|
|
// in medavg mode only between 3 and 15 samples are allowed.
|
|
const uint8_t HX711_MEDAVG_MODE = 0x02;
|
|
// runavg = running average
|
|
const uint8_t HX711_RUNAVG_MODE = 0x03;
|
|
// causes read() to be called only once!
|
|
const uint8_t HX711_RAW_MODE = 0x04;
|
|
|
|
|
|
// supported values for set_gain()
|
|
const uint8_t HX711_CHANNEL_A_GAIN_128 = 128; // default
|
|
const uint8_t HX711_CHANNEL_A_GAIN_64 = 64;
|
|
const uint8_t HX711_CHANNEL_B_GAIN_32 = 32;
|
|
|
|
// maximum size for internal mapping array
|
|
const uint8_t HX711_MP_MAX_SIZE = 10;
|
|
|
|
|
|
class HX711_MP
|
|
{
|
|
public:
|
|
HX711_MP(uint8_t size);
|
|
~HX711_MP();
|
|
|
|
// fixed gain 128 for now
|
|
void begin(uint8_t dataPin, uint8_t clockPin, bool fastProcessor = false);
|
|
|
|
void reset();
|
|
|
|
// checks if load cell is ready to read.
|
|
bool is_ready();
|
|
|
|
// wait until ready,
|
|
// check every ms
|
|
void wait_ready(uint32_t ms = 0);
|
|
// max # retries
|
|
bool wait_ready_retry(uint8_t retries = 3, uint32_t ms = 0);
|
|
// max timeout
|
|
bool wait_ready_timeout(uint32_t timeout = 1000, uint32_t ms = 0);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// READ
|
|
//
|
|
// raw read
|
|
float read();
|
|
|
|
// get average of multiple raw reads
|
|
// times = 1 or more
|
|
float read_average(uint8_t times = 10);
|
|
|
|
// get median of multiple raw reads
|
|
// times = 3..15 - odd numbers preferred
|
|
float read_median(uint8_t times = 7);
|
|
|
|
// get average of "middle half" of multiple raw reads.
|
|
// times = 3..15 - odd numbers preferred
|
|
float read_medavg(uint8_t times = 7);
|
|
|
|
// get running average over times measurements.
|
|
// the weight alpha can be set to any value between 0 and 1
|
|
// times = 1 or more.
|
|
float read_runavg(uint8_t times = 7, float alpha = 0.5);
|
|
|
|
|
|
// primary user functions
|
|
// in HX711_RAW_MODE the parameter times will be ignored.
|
|
float get_value(uint8_t times = 1);
|
|
// converted to proper units.
|
|
// in HX711_RAW_MODE the parameter times will be ignored.
|
|
float get_units(uint8_t times = 1);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// MODE
|
|
//
|
|
// get set mode for get_value() and indirect get_units().
|
|
// in median and medavg mode only 3..15 samples are allowed.
|
|
void set_raw_mode() { _mode = HX711_RAW_MODE; };
|
|
void set_average_mode() { _mode = HX711_AVERAGE_MODE; };
|
|
void set_median_mode() { _mode = HX711_MEDIAN_MODE; };
|
|
void set_medavg_mode() { _mode = HX711_MEDAVG_MODE; };
|
|
// set_run_avg will use a default alpha of 0.5.
|
|
void set_runavg_mode() { _mode = HX711_RUNAVG_MODE; };
|
|
uint8_t get_mode() { return _mode; };
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// GAIN
|
|
//
|
|
// CORE "CONSTANTS" -> read datasheet
|
|
// CHANNEL GAIN notes
|
|
// -------------------------------------
|
|
// A 128 default, tested
|
|
// A 64
|
|
// B 32
|
|
|
|
// returns true ==> parameter gain is valid
|
|
// returns false ==> parameter gain is invalid ==> no change.
|
|
// note that changing gain/channel takes up to 400 ms (page 3)
|
|
// if forced == true, the gain will be forced set
|
|
// even it is already the right value
|
|
bool set_gain(uint8_t gain = HX711_CHANNEL_A_GAIN_128, bool forced = false);
|
|
uint8_t get_gain();
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// CALIBRATION
|
|
//
|
|
// clear the scale
|
|
// call tare() to set the zero offset (index 0)
|
|
//
|
|
// put a series of SIZE known weights on the scale in increasing order
|
|
// thereby skipping 0 (as that is the tare)
|
|
// call calibrate_scale(index, raw, weight)
|
|
// index = 0..size -1
|
|
// raw = raw read = getValue() made in any mode
|
|
// weight = weight in units
|
|
// setCalibrate() can be adjusted runtime.
|
|
bool setCalibrate(uint8_t index, float raw, float weight);
|
|
uint8_t getCalibrateSize();
|
|
float getCalibrateRaw(uint8_t index);
|
|
float adjustCalibrateRaw(uint8_t index, float amount);
|
|
float getCalibrateWeight(uint8_t index);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// POWER MANAGEMENT
|
|
//
|
|
void power_down();
|
|
void power_up();
|
|
|
|
|
|
// TIME OF LAST READ
|
|
uint32_t last_read()
|
|
{
|
|
return _lastRead;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//
|
|
// DEBUG
|
|
//
|
|
float testCalibration(float raw)
|
|
{
|
|
return _multiMap(raw);
|
|
}
|
|
|
|
|
|
private:
|
|
uint8_t _dataPin = -1;
|
|
uint8_t _clockPin = -1;
|
|
|
|
uint8_t _gain = 128; // default channel A
|
|
uint32_t _lastRead = 0;
|
|
uint8_t _mode = HX711_AVERAGE_MODE;
|
|
|
|
void _insertSort(float * array, uint8_t size);
|
|
uint8_t _shiftIn();
|
|
|
|
// calibration arrays.
|
|
float _in[HX711_MP_MAX_SIZE];
|
|
float _out[HX711_MP_MAX_SIZE];
|
|
uint8_t _size = HX711_MP_MAX_SIZE;
|
|
float _multiMap(float val);
|
|
bool _fastProcessor = false;
|
|
};
|
|
|
|
|
|
// -- END OF FILE --
|
|
|