BH1750.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /**
  2. * @file BH1750.h
  3. * @author Oleksii Kutuzov (oleksii.kutuzov@icloud.com)
  4. * @brief
  5. * @version 0.1
  6. * @date 2022-11-06
  7. *
  8. * @copyright Copyright (c) 2022
  9. *
  10. * Ported from:
  11. * https://github.com/lamik/Light_Sensors_STM32
  12. */
  13. #include "BH1750.h"
  14. BH1750_mode bh1750_mode = BH1750_DEFAULT_MODE; // Current sensor mode
  15. uint8_t bh1750_mt_reg = BH1750_DEFAULT_MTREG; // Current MT register value
  16. uint8_t bh1750_addr = BH1750_ADDRESS;
  17. BH1750_STATUS bh1750_init() {
  18. if(BH1750_OK == bh1750_reset()) {
  19. if(BH1750_OK == bh1750_set_mt_reg(BH1750_DEFAULT_MTREG)) {
  20. return BH1750_OK;
  21. }
  22. }
  23. return BH1750_ERROR;
  24. }
  25. BH1750_STATUS bh1750_init_with_addr(uint8_t addr) {
  26. bh1750_addr = (addr << 1);
  27. return bh1750_init();
  28. }
  29. BH1750_STATUS bh1750_reset() {
  30. uint8_t command = 0x07;
  31. bool status;
  32. furi_hal_i2c_acquire(I2C_BUS);
  33. status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &command, 1, I2C_TIMEOUT);
  34. furi_hal_i2c_release(I2C_BUS);
  35. if(status) {
  36. return BH1750_OK;
  37. }
  38. return BH1750_ERROR;
  39. }
  40. BH1750_STATUS bh1750_set_power_state(uint8_t PowerOn) {
  41. PowerOn = (PowerOn ? 1 : 0);
  42. bool status;
  43. furi_hal_i2c_acquire(I2C_BUS);
  44. status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &PowerOn, 1, I2C_TIMEOUT);
  45. furi_hal_i2c_release(I2C_BUS);
  46. if(status) {
  47. return BH1750_OK;
  48. }
  49. return BH1750_ERROR;
  50. }
  51. BH1750_STATUS bh1750_set_mode(BH1750_mode mode) {
  52. if(!((mode >> 4) || (mode >> 5))) {
  53. return BH1750_ERROR;
  54. }
  55. if((mode & 0x0F) > 3) {
  56. return BH1750_ERROR;
  57. }
  58. bool status;
  59. bh1750_mode = mode;
  60. furi_hal_i2c_acquire(I2C_BUS);
  61. status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &mode, 1, I2C_TIMEOUT);
  62. furi_hal_i2c_release(I2C_BUS);
  63. if(status) {
  64. return BH1750_OK;
  65. }
  66. return BH1750_ERROR;
  67. }
  68. BH1750_STATUS bh1750_set_mt_reg(uint8_t mt_reg) {
  69. if(mt_reg < 31 || mt_reg > 254) {
  70. return BH1750_ERROR;
  71. }
  72. bh1750_mt_reg = mt_reg;
  73. uint8_t tmp[2];
  74. bool status;
  75. tmp[0] = (0x40 | (mt_reg >> 5));
  76. tmp[1] = (0x60 | (mt_reg & 0x1F));
  77. furi_hal_i2c_acquire(I2C_BUS);
  78. status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &tmp[0], 1, I2C_TIMEOUT);
  79. furi_hal_i2c_release(I2C_BUS);
  80. if(!status) {
  81. return BH1750_ERROR;
  82. }
  83. furi_hal_i2c_acquire(I2C_BUS);
  84. status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &tmp[1], 1, I2C_TIMEOUT);
  85. furi_hal_i2c_release(I2C_BUS);
  86. if(status) {
  87. return BH1750_OK;
  88. }
  89. return BH1750_ERROR;
  90. }
  91. BH1750_STATUS bh1750_trigger_manual_conversion() {
  92. if(BH1750_OK == bh1750_set_mode(bh1750_mode)) {
  93. return BH1750_OK;
  94. }
  95. return BH1750_ERROR;
  96. }
  97. BH1750_STATUS bh1750_read_light(float* result) {
  98. float result_tmp;
  99. uint8_t rcv[2];
  100. bool status;
  101. furi_hal_i2c_acquire(I2C_BUS);
  102. status = furi_hal_i2c_rx(I2C_BUS, bh1750_addr, rcv, 2, I2C_TIMEOUT);
  103. furi_hal_i2c_release(I2C_BUS);
  104. if(status) {
  105. result_tmp = (rcv[0] << 8) | (rcv[1]);
  106. if(bh1750_mt_reg != BH1750_DEFAULT_MTREG) {
  107. result_tmp *= (float)((uint8_t)BH1750_DEFAULT_MTREG / (float)bh1750_mt_reg);
  108. }
  109. if(bh1750_mode == ONETIME_HIGH_RES_MODE_2 || bh1750_mode == CONTINUOUS_HIGH_RES_MODE_2) {
  110. result_tmp /= 2.0;
  111. }
  112. *result = result_tmp / BH1750_CONVERSION_FACTOR;
  113. return BH1750_OK;
  114. }
  115. return BH1750_ERROR;
  116. }