Made device package and address configurable at runtime
This commit is contained in:
parent
0f6a0c59a1
commit
537cd68078
|
@ -15,12 +15,12 @@ static uint16_t ch0;
|
||||||
static uint16_t ch1;
|
static uint16_t ch1;
|
||||||
|
|
||||||
/* Initialises the device on pins sdapin and sclpin
|
/* Initialises the device on pins sdapin and sclpin
|
||||||
* Lua: status = tsl2561.init(sdapin, sclpin)
|
* Lua: status = tsl2561.init(sdapin, sclpin, address(optional), package(optional))
|
||||||
*/
|
*/
|
||||||
static int ICACHE_FLASH_ATTR tsl2561_init(lua_State* L) {
|
static int ICACHE_FLASH_ATTR tsl2561_init(lua_State* L) {
|
||||||
uint32_t sda;
|
uint32_t sda;
|
||||||
uint32_t scl;
|
uint32_t scl;
|
||||||
|
// check parameters
|
||||||
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2)) {
|
if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2)) {
|
||||||
return luaL_error(L, "wrong arg range");
|
return luaL_error(L, "wrong arg range");
|
||||||
}
|
}
|
||||||
|
@ -31,8 +31,28 @@ static int ICACHE_FLASH_ATTR tsl2561_init(lua_State* L) {
|
||||||
if (scl == 0 || sda == 0) {
|
if (scl == 0 || sda == 0) {
|
||||||
return luaL_error(L, "no i2c for D0");
|
return luaL_error(L, "no i2c for D0");
|
||||||
}
|
}
|
||||||
|
// init I2C
|
||||||
uint8_t error = tsl2561Init(sda, scl);
|
uint8_t error = tsl2561Init(sda, scl);
|
||||||
|
|
||||||
|
// Parse optional parameters
|
||||||
|
if (lua_isnumber(L, 3)) {
|
||||||
|
uint8_t address = luaL_checkinteger(L, 3);
|
||||||
|
if (!((address == TSL2561_ADDRESS_GND) || (address == TSL2561_ADDRESS_FLOAT) || (address == TSL2561_ADDRESS_VDD))) {
|
||||||
|
return luaL_error(L, "Invalid argument: address");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
tsl2561SetAddress(address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lua_isnumber(L, 4)) {
|
||||||
|
uint8_t package = luaL_checkinteger(L, 4);
|
||||||
|
if (!((package == TSL2561_PACKAGE_T_FN_CL) || (package == TSL2561_PACKAGE_CS))) {
|
||||||
|
return luaL_error(L, "Invalid argument: package");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
tsl2561SetPackage(package);
|
||||||
|
}
|
||||||
|
}
|
||||||
lua_pushnumber(L, error);
|
lua_pushnumber(L, error);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -46,11 +66,11 @@ static int ICACHE_FLASH_ATTR tsl2561_lua_settiming(lua_State* L) {
|
||||||
}
|
}
|
||||||
uint8_t integration = luaL_checkinteger(L, 1);
|
uint8_t integration = luaL_checkinteger(L, 1);
|
||||||
if (!((integration == TSL2561_INTEGRATIONTIME_13MS) || (integration == TSL2561_INTEGRATIONTIME_101MS) || (integration == TSL2561_INTEGRATIONTIME_402MS))) {
|
if (!((integration == TSL2561_INTEGRATIONTIME_13MS) || (integration == TSL2561_INTEGRATIONTIME_101MS) || (integration == TSL2561_INTEGRATIONTIME_402MS))) {
|
||||||
return luaL_error(L, "wrong range for arg integration");
|
return luaL_error(L, "Invalid argument: integration");
|
||||||
}
|
}
|
||||||
uint8_t gain = luaL_checkinteger(L, 2);
|
uint8_t gain = luaL_checkinteger(L, 2);
|
||||||
if (!((gain == TSL2561_GAIN_16X) || (gain == TSL2561_GAIN_1X))) {
|
if (!((gain == TSL2561_GAIN_16X) || (gain == TSL2561_GAIN_1X))) {
|
||||||
return luaL_error(L, "wrong range for arg gain");
|
return luaL_error(L, "Invalid argument: gain");
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_pushnumber(L, tsl2561SetTiming(integration, gain));
|
lua_pushnumber(L, tsl2561SetTiming(integration, gain));
|
||||||
|
@ -103,6 +123,13 @@ const LUA_REG_TYPE tsl2561_map[] =
|
||||||
{ LSTRKEY( "GAIN_1X" ), LNUMVAL( TSL2561_GAIN_1X )},
|
{ LSTRKEY( "GAIN_1X" ), LNUMVAL( TSL2561_GAIN_1X )},
|
||||||
{ LSTRKEY( "GAIN_16X" ), LNUMVAL( TSL2561_GAIN_16X )},
|
{ LSTRKEY( "GAIN_16X" ), LNUMVAL( TSL2561_GAIN_16X )},
|
||||||
|
|
||||||
|
{ LSTRKEY( "PACKAGE_CS" ), LNUMVAL( TSL2561_PACKAGE_CS )},
|
||||||
|
{ LSTRKEY( "PACKAGE_T_FN_CL" ), LNUMVAL( TSL2561_PACKAGE_T_FN_CL )},
|
||||||
|
|
||||||
|
{ LSTRKEY( "ADDRESS_GND" ), LNUMVAL( TSL2561_ADDRESS_GND )},
|
||||||
|
{ LSTRKEY( "ADDRESS_FLOAT" ), LNUMVAL( TSL2561_ADDRESS_FLOAT )},
|
||||||
|
{ LSTRKEY( "ADDRESS_VDD" ), LNUMVAL( TSL2561_ADDRESS_VDD )},
|
||||||
|
|
||||||
{ LNILKEY, LNILVAL}
|
{ LNILKEY, LNILVAL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,8 @@ static const uint32_t tsl2561_i2c_id = 0;
|
||||||
static bool _tsl2561Initialised = 0;
|
static bool _tsl2561Initialised = 0;
|
||||||
static tsl2561IntegrationTime_t _tsl2561IntegrationTime = TSL2561_INTEGRATIONTIME_402MS;
|
static tsl2561IntegrationTime_t _tsl2561IntegrationTime = TSL2561_INTEGRATIONTIME_402MS;
|
||||||
static tsl2561Gain_t _tsl2561Gain = TSL2561_GAIN_1X;
|
static tsl2561Gain_t _tsl2561Gain = TSL2561_GAIN_1X;
|
||||||
|
static tsl2561Address_t tsl2561Address = TSL2561_ADDRESS_FLOAT;
|
||||||
|
static tsl2561Package_t tsl2561Package = TSL2561_PACKAGE_T_FN_CL;
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
@ -80,7 +82,7 @@ static tsl2561Gain_t _tsl2561Gain = TSL2561_GAIN_1X;
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
tsl2561Error_t tsl2561Write8(uint8_t reg, uint8_t value) {
|
tsl2561Error_t tsl2561Write8(uint8_t reg, uint8_t value) {
|
||||||
platform_i2c_send_start(tsl2561_i2c_id);
|
platform_i2c_send_start(tsl2561_i2c_id);
|
||||||
platform_i2c_send_address(tsl2561_i2c_id, TSL2561_ADDRESS, PLATFORM_I2C_DIRECTION_TRANSMITTER);
|
platform_i2c_send_address(tsl2561_i2c_id, tsl2561Address, PLATFORM_I2C_DIRECTION_TRANSMITTER);
|
||||||
platform_i2c_send_byte(tsl2561_i2c_id, reg);
|
platform_i2c_send_byte(tsl2561_i2c_id, reg);
|
||||||
platform_i2c_send_byte(tsl2561_i2c_id, value);
|
platform_i2c_send_byte(tsl2561_i2c_id, value);
|
||||||
platform_i2c_send_stop(tsl2561_i2c_id);
|
platform_i2c_send_stop(tsl2561_i2c_id);
|
||||||
|
@ -94,22 +96,22 @@ tsl2561Error_t tsl2561Write8(uint8_t reg, uint8_t value) {
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
tsl2561Error_t tsl2561Read16(uint8_t reg, uint16_t *value) {
|
tsl2561Error_t tsl2561Read16(uint8_t reg, uint16_t *value) {
|
||||||
platform_i2c_send_start(tsl2561_i2c_id);
|
platform_i2c_send_start(tsl2561_i2c_id);
|
||||||
platform_i2c_send_address(tsl2561_i2c_id, TSL2561_ADDRESS, PLATFORM_I2C_DIRECTION_TRANSMITTER);
|
platform_i2c_send_address(tsl2561_i2c_id, tsl2561Address, PLATFORM_I2C_DIRECTION_TRANSMITTER);
|
||||||
platform_i2c_send_byte(tsl2561_i2c_id, reg);
|
platform_i2c_send_byte(tsl2561_i2c_id, reg);
|
||||||
platform_i2c_send_stop(tsl2561_i2c_id);
|
platform_i2c_send_stop(tsl2561_i2c_id);
|
||||||
|
|
||||||
platform_i2c_send_start(tsl2561_i2c_id);
|
platform_i2c_send_start(tsl2561_i2c_id);
|
||||||
platform_i2c_send_address(tsl2561_i2c_id, TSL2561_ADDRESS, PLATFORM_I2C_DIRECTION_RECEIVER);
|
platform_i2c_send_address(tsl2561_i2c_id, tsl2561Address, PLATFORM_I2C_DIRECTION_RECEIVER);
|
||||||
uint8_t ch_low = platform_i2c_recv_byte(tsl2561_i2c_id, 0);
|
uint8_t ch_low = platform_i2c_recv_byte(tsl2561_i2c_id, 0);
|
||||||
platform_i2c_send_stop(tsl2561_i2c_id);
|
platform_i2c_send_stop(tsl2561_i2c_id);
|
||||||
|
|
||||||
platform_i2c_send_start(tsl2561_i2c_id);
|
platform_i2c_send_start(tsl2561_i2c_id);
|
||||||
platform_i2c_send_address(tsl2561_i2c_id, TSL2561_ADDRESS, PLATFORM_I2C_DIRECTION_TRANSMITTER);
|
platform_i2c_send_address(tsl2561_i2c_id, tsl2561Address, PLATFORM_I2C_DIRECTION_TRANSMITTER);
|
||||||
platform_i2c_send_byte(tsl2561_i2c_id, reg + 1);
|
platform_i2c_send_byte(tsl2561_i2c_id, reg + 1);
|
||||||
platform_i2c_send_stop(tsl2561_i2c_id);
|
platform_i2c_send_stop(tsl2561_i2c_id);
|
||||||
|
|
||||||
platform_i2c_send_start(tsl2561_i2c_id);
|
platform_i2c_send_start(tsl2561_i2c_id);
|
||||||
platform_i2c_send_address(tsl2561_i2c_id, TSL2561_ADDRESS, PLATFORM_I2C_DIRECTION_RECEIVER);
|
platform_i2c_send_address(tsl2561_i2c_id, tsl2561Address, PLATFORM_I2C_DIRECTION_RECEIVER);
|
||||||
uint8_t ch_high = platform_i2c_recv_byte(tsl2561_i2c_id, 0);
|
uint8_t ch_high = platform_i2c_recv_byte(tsl2561_i2c_id, 0);
|
||||||
platform_i2c_send_stop(tsl2561_i2c_id);
|
platform_i2c_send_stop(tsl2561_i2c_id);
|
||||||
|
|
||||||
|
@ -147,6 +149,15 @@ tsl2561Error_t tsl2561Disable(void) {
|
||||||
TSL2561_CONTROL_POWEROFF);
|
TSL2561_CONTROL_POWEROFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tsl2561SetAddress(uint8_t address){
|
||||||
|
tsl2561Address = address;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void tsl2561SetPackage(uint8_t package){
|
||||||
|
tsl2561Package = package;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
@brief Initialises the I2C block
|
@brief Initialises the I2C block
|
||||||
|
@ -289,7 +300,7 @@ uint32_t tsl2561CalculateLux(uint16_t ch0, uint16_t ch1) {
|
||||||
|
|
||||||
unsigned int b, m;
|
unsigned int b, m;
|
||||||
|
|
||||||
#ifdef TSL2561_PACKAGE_CS
|
if (tsl2561Package == TSL2561_PACKAGE_CS){
|
||||||
if ((ratio >= 0) && (ratio <= TSL2561_LUX_K1C)) {
|
if ((ratio >= 0) && (ratio <= TSL2561_LUX_K1C)) {
|
||||||
b = TSL2561_LUX_B1C;
|
b = TSL2561_LUX_B1C;
|
||||||
m = TSL2561_LUX_M1C;
|
m = TSL2561_LUX_M1C;
|
||||||
|
@ -315,7 +326,8 @@ uint32_t tsl2561CalculateLux(uint16_t ch0, uint16_t ch1) {
|
||||||
b = TSL2561_LUX_B8C;
|
b = TSL2561_LUX_B8C;
|
||||||
m = TSL2561_LUX_M8C;
|
m = TSL2561_LUX_M8C;
|
||||||
}
|
}
|
||||||
#else
|
}
|
||||||
|
else{
|
||||||
if ((ratio >= 0) && (ratio <= TSL2561_LUX_K1T))
|
if ((ratio >= 0) && (ratio <= TSL2561_LUX_K1T))
|
||||||
{ b=TSL2561_LUX_B1T; m=TSL2561_LUX_M1T;}
|
{ b=TSL2561_LUX_B1T; m=TSL2561_LUX_M1T;}
|
||||||
else if (ratio <= TSL2561_LUX_K2T)
|
else if (ratio <= TSL2561_LUX_K2T)
|
||||||
|
@ -332,7 +344,7 @@ uint32_t tsl2561CalculateLux(uint16_t ch0, uint16_t ch1) {
|
||||||
{ b=TSL2561_LUX_B7T; m=TSL2561_LUX_M7T;}
|
{ b=TSL2561_LUX_B7T; m=TSL2561_LUX_M7T;}
|
||||||
else if (ratio > TSL2561_LUX_K8T)
|
else if (ratio > TSL2561_LUX_K8T)
|
||||||
{ b=TSL2561_LUX_B8T; m=TSL2561_LUX_M8T;}
|
{ b=TSL2561_LUX_B8T; m=TSL2561_LUX_M8T;}
|
||||||
#endif
|
}
|
||||||
|
|
||||||
unsigned long temp;
|
unsigned long temp;
|
||||||
temp = ((channel0 * b) - (channel1 * m));
|
temp = ((channel0 * b) - (channel1 * m));
|
||||||
|
|
|
@ -38,10 +38,6 @@
|
||||||
#ifndef _TSL2561_H_
|
#ifndef _TSL2561_H_
|
||||||
#define _TSL2561_H_
|
#define _TSL2561_H_
|
||||||
|
|
||||||
#define TSL2561_PACKAGE_CS // Lux calculations differ slightly for CS package
|
|
||||||
// #define TSL2561_PACKAGE_T_FN_CL
|
|
||||||
|
|
||||||
#define TSL2561_ADDRESS (0x39) // GND=>0x29, float=>0x39 or VDD=>0x49
|
|
||||||
#define TSL2561_READBIT (0x01)
|
#define TSL2561_READBIT (0x01)
|
||||||
|
|
||||||
#define TSL2561_COMMAND_BIT (0x80) // Must be 1
|
#define TSL2561_COMMAND_BIT (0x80) // Must be 1
|
||||||
|
@ -152,11 +148,29 @@ typedef enum
|
||||||
}
|
}
|
||||||
tsl2561Error_t;
|
tsl2561Error_t;
|
||||||
|
|
||||||
|
// GND=>0x29, float=>0x39 or VDD=>0x49
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
TSL2561_ADDRESS_GND = 0x29,
|
||||||
|
TSL2561_ADDRESS_FLOAT = 0x39,
|
||||||
|
TSL2561_ADDRESS_VDD = 0x49,
|
||||||
|
|
||||||
|
}
|
||||||
|
tsl2561Address_t;
|
||||||
|
|
||||||
|
// Lux calculations differ slightly for CS package
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
TSL2561_PACKAGE_CS = 0,
|
||||||
|
TSL2561_PACKAGE_T_FN_CL
|
||||||
|
}tsl2561Package_t;
|
||||||
|
|
||||||
tsl2561Error_t tsl2561Init(uint8_t sda, uint8_t scl);
|
tsl2561Error_t tsl2561Init(uint8_t sda, uint8_t scl);
|
||||||
tsl2561Error_t tsl2561SetTiming(tsl2561IntegrationTime_t integration, tsl2561Gain_t gain);
|
tsl2561Error_t tsl2561SetTiming(tsl2561IntegrationTime_t integration, tsl2561Gain_t gain);
|
||||||
tsl2561Error_t tsl2561GetLuminosity (uint16_t *broadband, uint16_t *ir);
|
tsl2561Error_t tsl2561GetLuminosity (uint16_t *broadband, uint16_t *ir);
|
||||||
uint32_t tsl2561CalculateLux(uint16_t ch0, uint16_t ch1);
|
uint32_t tsl2561CalculateLux(uint16_t ch0, uint16_t ch1);
|
||||||
|
void tsl2561SetAddress(uint8_t address);
|
||||||
|
void tsl2561SetPackage(uint8_t package);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue