Publish refactoring (#298)
* factoring of the publishing function * integration of json publishing to MQTT * receiving and transcode json messages from mqtt * replace the TRACE runtime condition by a buildtime one so as to decrease program size * remove retainFlag parameter not necessary for the moment * Increase the scope of tests for arduino mega and esp32 * Update arduinojson library to 5.13.3 * add macros to choose between simple or json publishing or both * differentiate build test for ATmega2560 * correct wrong sprintf definition * change IDE version for continuous integration * let default warning level in arduino ide * correct pins for ESP32 * reorganize user_config
This commit is contained in:
1 parent
f77df7347f
commit
d8dba15a81
182 files changed
+2701
-20768
No files matched your search
@@ -1,179 +1,58 @@
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@file Adafruit_TSL2561.cpp
|
||||
@author K.Townsend (Adafruit Industries)
|
||||
@license BSD (see license.txt)
|
||||
|
||||
Driver for the TSL2561 digital luminosity (light) sensors.
|
||||
|
||||
Pick one up at http://www.adafruit.com/products/439
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
@section HISTORY
|
||||
|
||||
v2.0 - Rewrote driver for Adafruit_Sensor and Auto-Gain support, and
|
||||
added lux clipping check (returns 0 lux on sensor saturation)
|
||||
v1.0 - First release (previously TSL2561)
|
||||
* @file Adafruit_TSL2561_U.cpp
|
||||
*
|
||||
* @mainpage Adafruit TSL2561 Light/Lux sensor driver
|
||||
*
|
||||
* @section intro_sec Introduction
|
||||
*
|
||||
* This is the documentation for Adafruit's TSL2561 driver for the
|
||||
* Arduino platform. It is designed specifically to work with the
|
||||
* Adafruit TSL2561 breakout: http://www.adafruit.com/products/439
|
||||
*
|
||||
* These sensors use I2C to communicate, 2 pins (SCL+SDA) are required
|
||||
* to interface with the breakout.
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit and open-source hardware by purchasing
|
||||
* products from Adafruit!
|
||||
*
|
||||
* @section dependencies Dependencies
|
||||
*
|
||||
* This library depends on <a href="https://github.com/adafruit/Adafruit_Sensor">
|
||||
* Adafruit_Sensor</a> being present on your system. Please make sure you have
|
||||
* installed the latest version before using this library.
|
||||
*
|
||||
* @section author Author
|
||||
*
|
||||
* Written by Kevin "KTOWN" Townsend for Adafruit Industries.
|
||||
*
|
||||
* @section license License
|
||||
*
|
||||
* BSD license, all text here must be included in any redistribution.
|
||||
*
|
||||
* @section HISTORY
|
||||
*
|
||||
* v2.0 - Rewrote driver for Adafruit_Sensor and Auto-Gain support, and
|
||||
* added lux clipping check (returns 0 lux on sensor saturation)
|
||||
* v1.0 - First release (previously TSL2561)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
#if defined(__AVR__)
|
||||
#include <avr/pgmspace.h>
|
||||
#include <util/delay.h>
|
||||
#else
|
||||
#include "pgmspace.h"
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "Adafruit_TSL2561_U.h"
|
||||
|
||||
#define TSL2561_DELAY_INTTIME_13MS (15)
|
||||
#define TSL2561_DELAY_INTTIME_101MS (120)
|
||||
#define TSL2561_DELAY_INTTIME_402MS (450)
|
||||
|
||||
/*========================================================================*/
|
||||
/* PRIVATE FUNCTIONS */
|
||||
/*========================================================================*/
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Writes a register and an 8 bit value over I2C
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::write8 (uint8_t reg, uint32_t value)
|
||||
{
|
||||
Wire.beginTransmission(_addr);
|
||||
#if ARDUINO >= 100
|
||||
Wire.write(reg);
|
||||
Wire.write(value & 0xFF);
|
||||
#else
|
||||
Wire.send(reg);
|
||||
Wire.send(value & 0xFF);
|
||||
#endif
|
||||
Wire.endTransmission();
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Reads an 8 bit value over I2C
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint8_t Adafruit_TSL2561_Unified::read8(uint8_t reg)
|
||||
{
|
||||
Wire.beginTransmission(_addr);
|
||||
#if ARDUINO >= 100
|
||||
Wire.write(reg);
|
||||
#else
|
||||
Wire.send(reg);
|
||||
#endif
|
||||
Wire.endTransmission();
|
||||
|
||||
Wire.requestFrom(_addr, 1);
|
||||
#if ARDUINO >= 100
|
||||
return Wire.read();
|
||||
#else
|
||||
return Wire.receive();
|
||||
#endif
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Reads a 16 bit values over I2C
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint16_t Adafruit_TSL2561_Unified::read16(uint8_t reg)
|
||||
{
|
||||
uint16_t x; uint16_t t;
|
||||
|
||||
Wire.beginTransmission(_addr);
|
||||
#if ARDUINO >= 100
|
||||
Wire.write(reg);
|
||||
#else
|
||||
Wire.send(reg);
|
||||
#endif
|
||||
Wire.endTransmission();
|
||||
|
||||
Wire.requestFrom(_addr, 2);
|
||||
#if ARDUINO >= 100
|
||||
t = Wire.read();
|
||||
x = Wire.read();
|
||||
#else
|
||||
t = Wire.receive();
|
||||
x = Wire.receive();
|
||||
#endif
|
||||
x <<= 8;
|
||||
x |= t;
|
||||
return x;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Enables the device
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::enable(void)
|
||||
{
|
||||
/* Enable the device by setting the control bit to 0x03 */
|
||||
write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWERON);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Disables the device (putting it in lower power sleep mode)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::disable(void)
|
||||
{
|
||||
/* Turn the device off to save power */
|
||||
write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWEROFF);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Private function to read luminosity on both channels
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::getData (uint16_t *broadband, uint16_t *ir)
|
||||
{
|
||||
/* Enable the device by setting the control bit to 0x03 */
|
||||
enable();
|
||||
|
||||
/* Wait x ms for ADC to complete */
|
||||
switch (_tsl2561IntegrationTime)
|
||||
{
|
||||
case TSL2561_INTEGRATIONTIME_13MS:
|
||||
delay(TSL2561_DELAY_INTTIME_13MS); // KTOWN: Was 14ms
|
||||
break;
|
||||
case TSL2561_INTEGRATIONTIME_101MS:
|
||||
delay(TSL2561_DELAY_INTTIME_101MS); // KTOWN: Was 102ms
|
||||
break;
|
||||
default:
|
||||
delay(TSL2561_DELAY_INTTIME_402MS); // KTOWN: Was 403ms
|
||||
break;
|
||||
}
|
||||
|
||||
/* Reads a two byte value from channel 0 (visible + infrared) */
|
||||
*broadband = read16(TSL2561_COMMAND_BIT | TSL2561_WORD_BIT | TSL2561_REGISTER_CHAN0_LOW);
|
||||
|
||||
/* Reads a two byte value from channel 1 (infrared) */
|
||||
*ir = read16(TSL2561_COMMAND_BIT | TSL2561_WORD_BIT | TSL2561_REGISTER_CHAN1_LOW);
|
||||
|
||||
/* Turn the device off to save power */
|
||||
disable();
|
||||
}
|
||||
|
||||
/*========================================================================*/
|
||||
/* CONSTRUCTORS */
|
||||
/*========================================================================*/
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Constructor
|
||||
@brief Constructor
|
||||
@param addr The I2C address this chip can be found on, 0x29, 0x39 or 0x49
|
||||
@param sensorID An optional ID that will be placed in sensor events to help
|
||||
keep track if you have many sensors in use
|
||||
*/
|
||||
/**************************************************************************/
|
||||
Adafruit_TSL2561_Unified::Adafruit_TSL2561_Unified(uint8_t addr, int32_t sensorID)
|
||||
Adafruit_TSL2561_Unified::Adafruit_TSL2561_Unified(uint8_t addr, int32_t sensorID)
|
||||
{
|
||||
_addr = addr;
|
||||
_tsl2561Initialised = false;
|
||||
@@ -189,18 +68,46 @@ Adafruit_TSL2561_Unified::Adafruit_TSL2561_Unified(uint8_t addr, int32_t sensorI
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Initializes I2C and configures the sensor (call this function before
|
||||
doing anything else)
|
||||
@brief Initializes I2C and configures the sensor with default Wire I2C
|
||||
(call this function before doing anything else)
|
||||
@returns True if sensor is found and initialized, false otherwise.
|
||||
*/
|
||||
/**************************************************************************/
|
||||
boolean Adafruit_TSL2561_Unified::begin(void)
|
||||
boolean Adafruit_TSL2561_Unified::begin()
|
||||
{
|
||||
Wire.begin();
|
||||
_i2c = &Wire;
|
||||
_i2c->begin();
|
||||
return init();
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Initializes I2C and configures the sensor with provided I2C device
|
||||
(call this function before doing anything else)
|
||||
@param theWire A pointer to any I2C interface (e.g. &Wire1)
|
||||
@returns True if sensor is found and initialized, false otherwise.
|
||||
*/
|
||||
/**************************************************************************/
|
||||
boolean Adafruit_TSL2561_Unified::begin(TwoWire *theWire)
|
||||
{
|
||||
_i2c = theWire;
|
||||
_i2c-> begin();
|
||||
return init();
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Initializes I2C connection and settings.
|
||||
Attempts to determine if the sensor is contactable, then sets up a default
|
||||
integration time and gain. Then powers down the chip.
|
||||
@returns True if sensor is found and initialized, false otherwise.
|
||||
*/
|
||||
/**************************************************************************/
|
||||
boolean Adafruit_TSL2561_Unified::init()
|
||||
{
|
||||
/* Make sure we're actually connected */
|
||||
uint8_t x = read8(TSL2561_REGISTER_ID);
|
||||
if (!(x & 0x0A))
|
||||
{
|
||||
if (x & 0xF0 != 0x10) { // ID code for TSL2561
|
||||
return false;
|
||||
}
|
||||
_tsl2561Initialised = true;
|
||||
@@ -214,11 +121,12 @@ boolean Adafruit_TSL2561_Unified::begin(void)
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Enables or disables the auto-gain settings when reading
|
||||
data from the sensor
|
||||
@param enable Set to true to enable, False to disable
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::enableAutoRange(bool enable)
|
||||
@@ -228,7 +136,10 @@ void Adafruit_TSL2561_Unified::enableAutoRange(bool enable)
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Sets the integration time for the TSL2561
|
||||
@brief Sets the integration time for the TSL2561. Higher time means
|
||||
more light captured (better for low light conditions) but will
|
||||
take longer to run readings.
|
||||
@param time The amount of time we'd like to add up values
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::setIntegrationTime(tsl2561IntegrationTime_t time)
|
||||
@@ -250,7 +161,8 @@ void Adafruit_TSL2561_Unified::setIntegrationTime(tsl2561IntegrationTime_t time)
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Adjusts the gain on the TSL2561 (adjusts the sensitivity to light)
|
||||
@brief Adjusts the gain on the TSL2561 (adjusts the sensitivity to light)
|
||||
@param gain The value we'd like to set the gain to
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::setGain(tsl2561Gain_t gain)
|
||||
@@ -274,6 +186,10 @@ void Adafruit_TSL2561_Unified::setGain(tsl2561Gain_t gain)
|
||||
/*!
|
||||
@brief Gets the broadband (mixed lighting) and IR only values from
|
||||
the TSL2561, adjusting gain if auto-gain is enabled
|
||||
@param broadband Pointer to a uint16_t we will fill with a sensor
|
||||
reading from the IR+visible light diode.
|
||||
@param ir Pointer to a uint16_t we will fill with a sensor the
|
||||
IR-only light diode.
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::getLuminosity (uint16_t *broadband, uint16_t *ir)
|
||||
@@ -358,18 +274,87 @@ void Adafruit_TSL2561_Unified::getLuminosity (uint16_t *broadband, uint16_t *ir)
|
||||
} while (!valid);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Converts the raw sensor values to the standard SI lux equivalent.
|
||||
Returns 0 if the sensor is saturated and the values are unreliable.
|
||||
Enables the device
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::enable(void)
|
||||
{
|
||||
/* Enable the device by setting the control bit to 0x03 */
|
||||
write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWERON);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Disables the device (putting it in lower power sleep mode)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::disable(void)
|
||||
{
|
||||
/* Turn the device off to save power */
|
||||
write8(TSL2561_COMMAND_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWEROFF);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
Private function to read luminosity on both channels
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::getData (uint16_t *broadband, uint16_t *ir)
|
||||
{
|
||||
/* Enable the device by setting the control bit to 0x03 */
|
||||
enable();
|
||||
|
||||
/* Wait x ms for ADC to complete */
|
||||
switch (_tsl2561IntegrationTime)
|
||||
{
|
||||
case TSL2561_INTEGRATIONTIME_13MS:
|
||||
delay(TSL2561_DELAY_INTTIME_13MS); // KTOWN: Was 14ms
|
||||
break;
|
||||
case TSL2561_INTEGRATIONTIME_101MS:
|
||||
delay(TSL2561_DELAY_INTTIME_101MS); // KTOWN: Was 102ms
|
||||
break;
|
||||
default:
|
||||
delay(TSL2561_DELAY_INTTIME_402MS); // KTOWN: Was 403ms
|
||||
break;
|
||||
}
|
||||
|
||||
/* Reads a two byte value from channel 0 (visible + infrared) */
|
||||
*broadband = read16(TSL2561_COMMAND_BIT | TSL2561_WORD_BIT | TSL2561_REGISTER_CHAN0_LOW);
|
||||
|
||||
/* Reads a two byte value from channel 1 (infrared) */
|
||||
*ir = read16(TSL2561_COMMAND_BIT | TSL2561_WORD_BIT | TSL2561_REGISTER_CHAN1_LOW);
|
||||
|
||||
/* Turn the device off to save power */
|
||||
disable();
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Converts the raw sensor values to the standard SI lux equivalent.
|
||||
@param broadband The 16-bit sensor reading from the IR+visible light diode.
|
||||
@param ir The 16-bit sensor reading from the IR-only light diode.
|
||||
@returns The integer Lux value we calcuated.
|
||||
Returns 0 if the sensor is saturated and the values are
|
||||
unreliable, or 65536 if the sensor is saturated.
|
||||
*/
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
|
||||
Returns
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint32_t Adafruit_TSL2561_Unified::calculateLux(uint16_t broadband, uint16_t ir)
|
||||
{
|
||||
unsigned long chScale;
|
||||
unsigned long channel1;
|
||||
unsigned long channel0;
|
||||
|
||||
unsigned long channel0;
|
||||
|
||||
/* Make sure the sensor isn't saturated! */
|
||||
uint16_t clipThreshold;
|
||||
switch (_tsl2561IntegrationTime)
|
||||
@@ -385,10 +370,10 @@ uint32_t Adafruit_TSL2561_Unified::calculateLux(uint16_t broadband, uint16_t ir)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Return 0 lux if the sensor is saturated */
|
||||
/* Return 65536 lux if the sensor is saturated */
|
||||
if ((broadband > clipThreshold) || (ir > clipThreshold))
|
||||
{
|
||||
return 0;
|
||||
return 65536;
|
||||
}
|
||||
|
||||
/* Get the correct scale depending on the intergration time */
|
||||
@@ -476,15 +461,19 @@ uint32_t Adafruit_TSL2561_Unified::calculateLux(uint16_t broadband, uint16_t ir)
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Gets the most recent sensor event
|
||||
@param event Pointer to a sensor_event_t type that will be filled
|
||||
with the lux value, timestamp, data type and sensor ID.
|
||||
@returns True if sensor reading is between 0 and 65535 lux,
|
||||
false if sensor is saturated
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool Adafruit_TSL2561_Unified::getEvent(sensors_event_t *event)
|
||||
{
|
||||
uint16_t broadband, ir;
|
||||
|
||||
|
||||
/* Clear the event */
|
||||
memset(event, 0, sizeof(sensors_event_t));
|
||||
|
||||
|
||||
event->version = sizeof(sensors_event_t);
|
||||
event->sensor_id = _tsl2561SensorID;
|
||||
event->type = SENSOR_TYPE_LIGHT;
|
||||
@@ -493,13 +482,18 @@ bool Adafruit_TSL2561_Unified::getEvent(sensors_event_t *event)
|
||||
/* Calculate the actual lux value */
|
||||
getLuminosity(&broadband, &ir);
|
||||
event->light = calculateLux(broadband, ir);
|
||||
|
||||
|
||||
if (event->light == 65536) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Gets the sensor_t data
|
||||
@param sensor A pointer to a sensor_t structure that we will fill with
|
||||
details about the TSL2561 and its capabilities
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::getSensor(sensor_t *sensor)
|
||||
@@ -515,6 +509,67 @@ void Adafruit_TSL2561_Unified::getSensor(sensor_t *sensor)
|
||||
sensor->type = SENSOR_TYPE_LIGHT;
|
||||
sensor->min_delay = 0;
|
||||
sensor->max_value = 17000.0; /* Based on trial and error ... confirm! */
|
||||
sensor->min_value = 0.0;
|
||||
sensor->min_value = 1.0;
|
||||
sensor->resolution = 1.0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*========================================================================*/
|
||||
/* PRIVATE FUNCTIONS */
|
||||
/*========================================================================*/
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Writes a register and an 8 bit value over I2C
|
||||
@param reg I2C register to write the value to
|
||||
@param value The 8-bit value we're writing to the register
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void Adafruit_TSL2561_Unified::write8 (uint8_t reg, uint8_t value)
|
||||
{
|
||||
_i2c->beginTransmission(_addr);
|
||||
_i2c->write(reg);
|
||||
_i2c->write(value);
|
||||
_i2c->endTransmission();
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Reads an 8 bit value over I2C
|
||||
@param reg I2C register to read from
|
||||
@returns 8-bit value containing single byte data read
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint8_t Adafruit_TSL2561_Unified::read8(uint8_t reg)
|
||||
{
|
||||
_i2c->beginTransmission(_addr);
|
||||
_i2c->write(reg);
|
||||
_i2c->endTransmission();
|
||||
|
||||
_i2c->requestFrom(_addr, 1);
|
||||
return _i2c-> read();
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Reads a 16 bit values over I2C
|
||||
@param reg I2C register to read from
|
||||
@returns 16-bit value containing 2-byte data read
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint16_t Adafruit_TSL2561_Unified::read16(uint8_t reg)
|
||||
{
|
||||
uint16_t x, t;
|
||||
|
||||
_i2c->beginTransmission(_addr);
|
||||
_i2c->write(reg);
|
||||
_i2c->endTransmission();
|
||||
|
||||
_i2c->requestFrom(_addr, 2);
|
||||
t = _i2c->read();
|
||||
x = _i2c->read();
|
||||
x <<= 8;
|
||||
x |= t;
|
||||
return x;
|
||||
}
|
||||
Reference in new issue
Block a user