152 lines
2.6 KiB
C++
152 lines
2.6 KiB
C++
|
//
|
||
|
// FILE: HX711.cpp
|
||
|
// AUTHOR: Rob Tillaart
|
||
|
// VERSION: 0.2.1
|
||
|
// PURPOSE: Library for Loadcells for UNO
|
||
|
// URL: https://github.com/RobTillaart/HX711
|
||
|
//
|
||
|
// HISTORY:
|
||
|
// 0.1.0 2019-09-04 initial release
|
||
|
// 0.1.1 2019-09-09 change long to float (reduce footprint)
|
||
|
// 0.2.0 2020-06-15 refactor; add price functions;
|
||
|
// 0.2.1 2020-12-28 add arduino-ci + unit test
|
||
|
|
||
|
|
||
|
#include "HX711.h"
|
||
|
|
||
|
HX711::HX711()
|
||
|
{
|
||
|
reset();
|
||
|
}
|
||
|
|
||
|
HX711::~HX711() {}
|
||
|
|
||
|
void HX711::begin(uint8_t dataPin, uint8_t clockPin)
|
||
|
{
|
||
|
_dataPin = dataPin;
|
||
|
_clockPin = clockPin;
|
||
|
|
||
|
pinMode(_dataPin, INPUT);
|
||
|
pinMode(_clockPin, OUTPUT);
|
||
|
digitalWrite(_clockPin, LOW);
|
||
|
|
||
|
reset();
|
||
|
}
|
||
|
|
||
|
void HX711::reset()
|
||
|
{
|
||
|
_offset = 0;
|
||
|
_scale = 1;
|
||
|
_gain = 128;
|
||
|
}
|
||
|
|
||
|
bool HX711::is_ready()
|
||
|
{
|
||
|
return digitalRead(_dataPin) == LOW;
|
||
|
}
|
||
|
|
||
|
float HX711::read()
|
||
|
{
|
||
|
// this waiting takes most time...
|
||
|
while (digitalRead(_dataPin) == HIGH) yield();
|
||
|
|
||
|
union
|
||
|
{
|
||
|
long value = 0;
|
||
|
uint8_t data[4];
|
||
|
} v;
|
||
|
|
||
|
noInterrupts();
|
||
|
|
||
|
// Pulse the clock pin 24 times to read the data.
|
||
|
v.data[2] = shiftIn(_dataPin, _clockPin, MSBFIRST);
|
||
|
v.data[1] = shiftIn(_dataPin, _clockPin, MSBFIRST);
|
||
|
v.data[0] = shiftIn(_dataPin, _clockPin, MSBFIRST);
|
||
|
|
||
|
// TABLE 3 page 4 datasheet
|
||
|
// only default verified, so other values not supported yet
|
||
|
uint8_t m = 1; // default gain == 128
|
||
|
if (_gain == 64) m = 3;
|
||
|
if (_gain == 32) m = 2;
|
||
|
|
||
|
while (m > 0)
|
||
|
{
|
||
|
digitalWrite(_clockPin, HIGH);
|
||
|
digitalWrite(_clockPin, LOW);
|
||
|
m--;
|
||
|
}
|
||
|
|
||
|
interrupts();
|
||
|
|
||
|
// SIGN extend
|
||
|
if (v.data[2] & 0x80) v.data[3] = 0xFF;
|
||
|
|
||
|
_lastRead = millis();
|
||
|
return 1.0 * v.value;
|
||
|
}
|
||
|
|
||
|
// assumes tare() has been set.
|
||
|
void HX711::callibrate_scale(uint16_t weight, uint8_t times)
|
||
|
{
|
||
|
_scale = (1.0 * weight) / (read_average(times) - _offset);
|
||
|
}
|
||
|
|
||
|
void HX711::wait_ready(uint32_t ms)
|
||
|
{
|
||
|
while (!is_ready())
|
||
|
{
|
||
|
delay(ms);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool HX711::wait_ready_retry(uint8_t retries, uint32_t ms)
|
||
|
{
|
||
|
while (retries--)
|
||
|
{
|
||
|
if (is_ready()) return true;
|
||
|
delay(ms);
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool HX711::wait_ready_timeout(uint32_t timeout, uint32_t ms)
|
||
|
{
|
||
|
uint32_t start = millis();
|
||
|
while (millis() - start < timeout)
|
||
|
{
|
||
|
if (is_ready()) return true;
|
||
|
delay(ms);
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
float HX711::read_average(uint8_t times)
|
||
|
{
|
||
|
float sum = 0;
|
||
|
for (uint8_t i = 0; i < times; i++)
|
||
|
{
|
||
|
sum += read();
|
||
|
yield();
|
||
|
}
|
||
|
return sum / times;
|
||
|
}
|
||
|
|
||
|
float HX711::get_units(uint8_t times)
|
||
|
{
|
||
|
float units = get_value(times) * _scale;
|
||
|
return units;
|
||
|
};
|
||
|
|
||
|
void HX711::power_down()
|
||
|
{
|
||
|
digitalWrite(_clockPin, LOW);
|
||
|
digitalWrite(_clockPin, HIGH);
|
||
|
}
|
||
|
|
||
|
void HX711::power_up()
|
||
|
{
|
||
|
digitalWrite(_clockPin, LOW);
|
||
|
}
|
||
|
|
||
|
// -- END OF FILE --
|