GY-63_MS5611/libraries/Max44009/max44009.cpp

247 lines
4.8 KiB
C++
Raw Normal View History

2016-12-17 14:58:29 -05:00
//
// FILE: Max44009.cpp
// AUTHOR: Rob Tillaart
2023-10-04 04:47:20 -04:00
// VERSION: 0.6.0
// DATE: 2010-??-??
2016-12-17 14:58:29 -05:00
// PURPOSE: library for MAX44009 lux sensor Arduino
2020-11-27 05:20:37 -05:00
// URL: https://github.com/RobTillaart/MAX44009
2016-12-17 14:58:29 -05:00
2021-05-28 07:37:15 -04:00
2016-12-17 14:58:29 -05:00
#include "Max44009.h"
2024-05-22 04:12:43 -04:00
// MAX44009 KEY VALUES
2022-01-05 10:46:56 -05:00
#define MAX44009_MIN_LUX (0.045)
#define MAX44009_MAX_LUX (188006.0)
2021-05-28 07:37:15 -04:00
2023-10-04 04:47:20 -04:00
Max44009::Max44009(const uint8_t address, TwoWire *wire)
{
2021-01-29 06:31:58 -05:00
_address = address;
_data = 0;
_error = MAX44009_OK;
_wire = wire;
}
2021-01-29 06:31:58 -05:00
bool Max44009::isConnected()
{
_wire->beginTransmission(_address);
_error = _wire->endTransmission();
return (_error == 0);
}
2021-01-29 06:31:58 -05:00
2024-05-22 04:12:43 -04:00
uint8_t Max44009::getAddress()
{
return _address;
}
float Max44009::getLux(void)
2016-12-17 14:58:29 -05:00
{
2021-06-04 14:31:56 -04:00
uint8_t datahigh = read(MAX44009_LUX_READING_HIGH);
2021-01-29 06:31:58 -05:00
if (_error != MAX44009_OK)
{
_error = MAX44009_ERROR_HIGH_BYTE;
return _error;
}
2021-06-04 14:31:56 -04:00
uint8_t datalow = read(MAX44009_LUX_READING_LOW);
2021-01-29 06:31:58 -05:00
if (_error != MAX44009_OK)
{
_error = MAX44009_ERROR_LOW_BYTE;
return _error;
}
2021-06-04 14:31:56 -04:00
uint8_t exponent = datahigh >> 4;
if (exponent == 0x0F)
2021-01-29 06:31:58 -05:00
{
_error = MAX44009_ERROR_OVERFLOW;
return _error;
}
2021-06-04 14:31:56 -04:00
float lux = convertToLux(datahigh, datalow);
return lux;
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2016-12-17 14:58:29 -05:00
int Max44009::getError()
{
2021-06-04 14:31:56 -04:00
int err = _error;
2021-01-29 06:31:58 -05:00
_error = MAX44009_OK;
2021-06-04 14:31:56 -04:00
return err;
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2021-06-04 14:31:56 -04:00
bool Max44009::setHighThreshold(const float value)
2016-12-17 14:58:29 -05:00
{
2021-06-04 14:31:56 -04:00
return setThreshold(MAX44009_THRESHOLD_HIGH, value);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
float Max44009::getHighThreshold(void)
2016-12-17 14:58:29 -05:00
{
2021-01-29 06:31:58 -05:00
return getThreshold(MAX44009_THRESHOLD_HIGH);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2021-06-04 14:31:56 -04:00
bool Max44009::setLowThreshold(const float value)
2016-12-17 14:58:29 -05:00
{
2021-06-04 14:31:56 -04:00
return setThreshold(MAX44009_THRESHOLD_LOW, value);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
float Max44009::getLowThreshold(void)
2016-12-17 14:58:29 -05:00
{
2021-01-29 06:31:58 -05:00
return getThreshold(MAX44009_THRESHOLD_LOW);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
void Max44009::setThresholdTimer(const uint8_t value)
2016-12-17 14:58:29 -05:00
{
2021-01-29 06:31:58 -05:00
write(MAX44009_THRESHOLD_TIMER, value);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2016-12-17 14:58:29 -05:00
uint8_t Max44009::getThresholdTimer()
{
2021-01-29 06:31:58 -05:00
return read(MAX44009_THRESHOLD_TIMER);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
void Max44009::setConfiguration(const uint8_t value)
2016-12-17 14:58:29 -05:00
{
2021-01-29 06:31:58 -05:00
write(MAX44009_CONFIGURATION, value);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2016-12-17 14:58:29 -05:00
uint8_t Max44009::getConfiguration()
{
2021-01-29 06:31:58 -05:00
return read(MAX44009_CONFIGURATION);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2016-12-17 14:58:29 -05:00
void Max44009::setAutomaticMode()
{
2024-05-22 04:12:43 -04:00
// CDR and TIM cannot be written in automatic mode
2021-01-29 06:31:58 -05:00
uint8_t config = read(MAX44009_CONFIGURATION);
config &= ~MAX44009_CFG_MANUAL;
write(MAX44009_CONFIGURATION, config);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2016-12-17 14:58:29 -05:00
void Max44009::setContinuousMode()
{
2021-01-29 06:31:58 -05:00
uint8_t config = read(MAX44009_CONFIGURATION);
config |= MAX44009_CFG_CONTINUOUS;
write(MAX44009_CONFIGURATION, config);
}
2021-01-29 06:31:58 -05:00
void Max44009::clrContinuousMode()
{
2021-01-29 06:31:58 -05:00
uint8_t config = read(MAX44009_CONFIGURATION);
config &= ~MAX44009_CFG_CONTINUOUS;
write(MAX44009_CONFIGURATION, config);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2016-12-17 14:58:29 -05:00
void Max44009::setManualMode(uint8_t CDR, uint8_t TIM)
{
2024-05-22 04:12:43 -04:00
if (CDR !=0) CDR = 1; // only 0 or 1
2021-01-29 06:31:58 -05:00
if (TIM > 7) TIM = 7;
uint8_t config = read(MAX44009_CONFIGURATION);
config |= MAX44009_CFG_MANUAL;
2022-11-16 10:00:38 -05:00
config &= 0xF0; // clear old CDR & TIM bits
config |= CDR << 3 | TIM; // set new CDR & TIM bits
2021-01-29 06:31:58 -05:00
write(MAX44009_CONFIGURATION, config);
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2024-05-22 04:12:43 -04:00
int Max44009::getCurrentDivisorRatio()
{
uint8_t CDR = read(MAX44009_CONFIGURATION) & 0x08;
return CDR >> 3;
}
int Max44009::getIntegrationTime()
{
uint8_t TIM = read(MAX44009_CONFIGURATION) & 0x07;
return 800 >> TIM;
}
// datahigh = [eeee mmmm]
// datalow = [ mmmm]
2021-06-04 14:31:56 -04:00
float Max44009::convertToLux(uint8_t datahigh, uint8_t datalow)
{
uint8_t exponent = datahigh >> 4;
uint32_t mantissa = ((datahigh & 0x0F) << 4) + (datalow & 0x0F);
2022-01-05 10:46:56 -05:00
float lux = ((0x0001 << exponent) * MAX44009_MIN_LUX) * mantissa;
2021-06-04 14:31:56 -04:00
return lux;
}
2016-12-17 14:58:29 -05:00
///////////////////////////////////////////////////////////
//
2022-11-16 10:00:38 -05:00
// PRIVATE
2016-12-17 14:58:29 -05:00
//
2021-06-04 14:31:56 -04:00
bool Max44009::setThreshold(const uint8_t reg, const float value)
2016-12-17 14:58:29 -05:00
{
2022-11-16 10:00:38 -05:00
// CHECK RANGE OF VALUE
2022-01-05 10:46:56 -05:00
if ((value < 0.0) || (value > MAX44009_MAX_LUX)) return false;
2021-06-04 14:31:56 -04:00
2024-05-22 04:12:43 -04:00
// compile time optimized.
uint32_t mantissa = round(value * (1.0 / MAX44009_MIN_LUX));
2021-06-04 14:31:56 -04:00
uint8_t exponent = 0;
while (mantissa > 255)
2021-01-29 06:31:58 -05:00
{
2022-11-16 10:00:38 -05:00
mantissa >>= 1; // bits get lost
2021-06-04 14:31:56 -04:00
exponent++;
2021-01-29 06:31:58 -05:00
};
2021-06-04 14:31:56 -04:00
mantissa = (mantissa >> 4) & 0x0F;
exponent <<= 4;
write(reg, exponent | mantissa);
return true;
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
float Max44009::getThreshold(uint8_t reg)
2016-12-17 14:58:29 -05:00
{
2021-06-04 14:31:56 -04:00
uint8_t datahigh = read(reg);
2024-05-22 04:12:43 -04:00
// 0x08 = correction for lost bits
float lux = convertToLux(datahigh, 0x08);
2021-06-04 14:31:56 -04:00
return lux;
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2018-05-13 10:38:11 -04:00
uint8_t Max44009::read(uint8_t reg)
2016-12-17 14:58:29 -05:00
{
2021-01-29 06:31:58 -05:00
_wire->beginTransmission(_address);
_wire->write(reg);
_error = _wire->endTransmission();
if (_error != MAX44009_OK)
{
2022-11-16 10:00:38 -05:00
return _data; // last value
2021-01-29 06:31:58 -05:00
}
if (_wire->requestFrom(_address, (uint8_t) 1) != 1)
{
_error = MAX44009_ERROR_WIRE_REQUEST;
2022-11-16 10:00:38 -05:00
return _data; // last value
2021-01-29 06:31:58 -05:00
}
_data = _wire->read();
return _data;
2016-12-17 14:58:29 -05:00
}
2021-01-29 06:31:58 -05:00
2016-12-17 14:58:29 -05:00
void Max44009::write(uint8_t reg, uint8_t value)
{
2021-01-29 06:31:58 -05:00
_wire->beginTransmission(_address);
_wire->write(reg);
_wire->write(value);
_error = _wire->endTransmission();
2016-12-17 14:58:29 -05:00
}
2021-05-28 07:37:15 -04:00
2022-11-16 10:00:38 -05:00
// -- END OF FILE --