diff options
Diffstat (limited to 'apps/Light Meter/tsl2591.c')
-rw-r--r-- | apps/Light Meter/tsl2591.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/apps/Light Meter/tsl2591.c b/apps/Light Meter/tsl2591.c new file mode 100644 index 00000000..96c53159 --- /dev/null +++ b/apps/Light Meter/tsl2591.c @@ -0,0 +1,37 @@ +#include "tsl2591.h" +#include "watch_i2c.h" + +bool tsl2591_init() { + uint8_t device_id = watch_i2c_read8(TSL2591_ADDRESS, TSL2591_REGISTER_DEVICE_ID | TSL2591_COMMAND_BIT); + if (device_id != 0x50) return false; + + tsl2591_set_gain(TSL2591_CONTROL_GAIN_LOW); + tsl2591_set_integration_time(TSL2591_CONTROL_INTEGRATIONTIME_100MS); + watch_i2c_write8(TSL2591_ADDRESS, TSL2591_REGISTER_ENABLE | TSL2591_COMMAND_BIT, TSL2591_ENABLE_POWERON | TSL2591_ENABLE_AEN); + + return true; +} + +void tsl2591_set_gain(TSL2591Control gain) { + uint8_t control = watch_i2c_read8(TSL2591_ADDRESS, TSL2591_REGISTER_CONTROL | TSL2591_COMMAND_BIT); + control &= 0b11001111; + control |= gain; + watch_i2c_write8(TSL2591_ADDRESS, TSL2591_REGISTER_CONTROL | TSL2591_COMMAND_BIT, control); +} + +void tsl2591_set_integration_time(TSL2591Control integration_time) { + uint8_t control = watch_i2c_read8(TSL2591_ADDRESS, TSL2591_REGISTER_CONTROL | TSL2591_COMMAND_BIT); + control &= 0b11111000; + control |= integration_time; + watch_i2c_write8(TSL2591_ADDRESS, TSL2591_REGISTER_CONTROL | TSL2591_COMMAND_BIT, control); +} + +uint16_t tsl2591_get_visible_light_reading() { + uint16_t full = make_le_16(watch_i2c_read16(TSL2591_ADDRESS, TSL2591_REGISTER_CHAN0_LOW | TSL2591_COMMAND_BIT)); + uint16_t infrared = make_le_16(watch_i2c_read16(TSL2591_ADDRESS, TSL2591_REGISTER_CHAN1_LOW | TSL2591_COMMAND_BIT)); + printf("Full Spectrum : %d\n", full); + printf("Infrared : %d\n", infrared); + int32_t result = full - infrared; + + return (result > 0) ? (uint16_t)result : 0; +}
\ No newline at end of file |