mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
176 lines
3.7 KiB
C++
176 lines
3.7 KiB
C++
//
|
|
// FILE: Max44009.cpp
|
|
// AUTHOR: Rob Tillaart
|
|
// VERSION: 0.1.5
|
|
// PURPOSE: library for MAX44009 lux sensor Arduino
|
|
// URL:
|
|
//
|
|
// Released to the public domain
|
|
//
|
|
|
|
// 0.1.5 - updated history
|
|
// 0.1.4 - added setAutomaticMode() to max44009.h (thanks debsahu)
|
|
// 0.1.03 - added configuration
|
|
// 0.1.02 - added threshold code
|
|
// 0.1.01 - added interrupt code
|
|
// 0.1.00 - initial version
|
|
|
|
#include "Max44009.h"
|
|
|
|
Max44009::Max44009(uint8_t address)
|
|
{
|
|
_address = address;
|
|
Wire.begin();
|
|
// TWBR = 12; // 400KHz
|
|
_data = 0;
|
|
_error = 0;
|
|
}
|
|
|
|
double Max44009::getLux(void)
|
|
{
|
|
uint16_t data = read(MAX44009_LUX_READING, 2);
|
|
uint8_t e = (data & 0xF000) >> 12;
|
|
uint32_t m = ((data & 0x0F00) >> 4) + (data & 0x000F);
|
|
m <<= e;
|
|
double val = m * 0.045;
|
|
return val;
|
|
}
|
|
|
|
int Max44009::getError()
|
|
{
|
|
int e = _error;
|
|
_error = 0;
|
|
return e;
|
|
}
|
|
|
|
void Max44009::setHighThreshold(double value)
|
|
{
|
|
setThreshold(MAX44009_THRESHOLD_HIGH, value);
|
|
}
|
|
|
|
double Max44009::getHighThreshold(void)
|
|
{
|
|
return getThreshold(MAX44009_THRESHOLD_HIGH);
|
|
}
|
|
|
|
void Max44009::setLowThreshold(double value)
|
|
{
|
|
setThreshold(MAX44009_THRESHOLD_LOW, value);
|
|
}
|
|
|
|
double Max44009::getLowThreshold(void)
|
|
{
|
|
return getThreshold(MAX44009_THRESHOLD_LOW);
|
|
}
|
|
|
|
void Max44009::setThresholdTimer(uint8_t value)
|
|
{
|
|
write(MAX44009_THRESHOLD_TIMER, value);
|
|
}
|
|
|
|
uint8_t Max44009::getThresholdTimer()
|
|
{
|
|
return read(MAX44009_THRESHOLD_TIMER, 1);
|
|
}
|
|
|
|
void Max44009::setConfiguration(uint8_t value)
|
|
{
|
|
write(MAX44009_CONFIGURATION, value);
|
|
}
|
|
|
|
uint8_t Max44009::getConfiguration()
|
|
{
|
|
read(MAX44009_CONFIGURATION);
|
|
}
|
|
|
|
void Max44009::setAutomaticMode()
|
|
{
|
|
uint8_t config = read(MAX44009_CONFIGURATION);
|
|
config &= ~MAX44009_CFG_CONTINUOUS; // off
|
|
config &= ~MAX44009_CFG_MANUAL; // off
|
|
write(MAX44009_CONFIGURATION, config);
|
|
}
|
|
|
|
void Max44009::setContinuousMode()
|
|
{
|
|
uint8_t config = read(MAX44009_CONFIGURATION);
|
|
config |= MAX44009_CFG_CONTINUOUS; // on
|
|
config &= ~MAX44009_CFG_MANUAL; // off
|
|
write(MAX44009_CONFIGURATION, config);
|
|
}
|
|
|
|
void Max44009::setManualMode(uint8_t CDR, uint8_t TIM)
|
|
{
|
|
if (CDR !=0) CDR = 1;
|
|
if (TIM > 7) TIM = 7;
|
|
uint8_t config = read(MAX44009_CONFIGURATION);
|
|
config &= ~MAX44009_CFG_CONTINUOUS; // off
|
|
config |= MAX44009_CFG_MANUAL; // on
|
|
config &= 0xF0; // clear CDR & TIM bits
|
|
config |= CDR << 3 | TIM;
|
|
write(MAX44009_CONFIGURATION, config);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// PRIVATE
|
|
//
|
|
void Max44009::setThreshold(uint8_t reg, double value)
|
|
{
|
|
// TODO CHECK RANGE
|
|
uint32_t m = round(value / 0.045);
|
|
uint8_t e = 0;
|
|
while (m > 255)
|
|
{
|
|
m >>= 1;
|
|
e++;
|
|
};
|
|
m = (m >> 4) & 0x0F;
|
|
e <<= 4;
|
|
write(reg, e | m);
|
|
}
|
|
|
|
double Max44009::getThreshold(uint8_t reg)
|
|
{
|
|
uint16_t data = read(MAX44009_THRESHOLD_LOW, 1);
|
|
uint8_t e = (data & 0xF0) >> 4;
|
|
uint32_t m = (data & 0x0F) << 4 + 0x0F;
|
|
m <<= e;
|
|
double val = m * 0.045;
|
|
return val;
|
|
}
|
|
|
|
// bytes is 1 or 2
|
|
uint16_t Max44009::read(uint8_t reg, uint8_t bytes)
|
|
{
|
|
Wire.beginTransmission(_address);
|
|
Wire.write(reg);
|
|
_error = Wire.endTransmission();
|
|
if (_error != 0)
|
|
{
|
|
return _data; // last value
|
|
}
|
|
if (Wire.requestFrom(_address, (uint8_t) bytes) != bytes)
|
|
{
|
|
_error = 10;
|
|
return _data; // last value
|
|
}
|
|
#if (ARDUINO < 100)
|
|
_data = Wire.receive();
|
|
if (bytes == 2) _data = _data * 256 + Wire.receive();
|
|
#else
|
|
_data = Wire.read();
|
|
if (bytes == 2) _data = _data * 256 + Wire.read();
|
|
#endif
|
|
return _data;
|
|
}
|
|
|
|
void Max44009::write(uint8_t reg, uint8_t value)
|
|
{
|
|
Wire.beginTransmission(_address);
|
|
Wire.write(reg);
|
|
Wire.write(value);
|
|
_error = Wire.endTransmission();
|
|
}
|
|
|
|
// --- END OF FILE ---
|