MAX44009.c 1016 B

123456789101112131415161718192021222324252627
  1. #include <MAX44009.h>
  2. #include <math.h>
  3. #include <furi.h>
  4. void max44009_init() {
  5. furi_hal_i2c_acquire(I2C_BUS);
  6. furi_hal_i2c_write_reg_8(I2C_BUS, MAX44009_ADDR,
  7. MAX44009_REG_CONFIG, MAX44009_REG_CONFIG_CONT_MODE, I2C_TIMEOUT);
  8. furi_hal_i2c_release(I2C_BUS);
  9. }
  10. int max44009_read_light(float* result) {
  11. uint8_t data_one = 0;
  12. uint8_t exp, mantissa;
  13. int status;
  14. furi_hal_i2c_acquire(I2C_BUS);
  15. furi_hal_i2c_read_reg_8(I2C_BUS, MAX44009_ADDR, MAX44009_REG_LUX_HI, &data_one, I2C_TIMEOUT);
  16. exp = (data_one & MAX44009_REG_LUX_HI_EXP_MASK) >> 4;
  17. mantissa = (data_one & MAX44009_REG_LUX_HI_MANT_HI_MASK) << 4;
  18. status = furi_hal_i2c_read_reg_8(I2C_BUS, MAX44009_ADDR, MAX44009_REG_LUX_LO, &data_one, I2C_TIMEOUT);
  19. mantissa |= (data_one & MAX44009_REG_LUX_LO_MANT_LO_MASK);
  20. furi_hal_i2c_release(I2C_BUS);
  21. *result = (float)pow(2, exp) * mantissa * 0.045;
  22. FURI_LOG_D("MAX44009", "exp %d, mant %d, lux %f", exp, mantissa, (double)*result);
  23. return status;
  24. }