BH1750.c 3.2 KB

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