sensor_bosch_bme280.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. #include "sensor_bosch_bme280.h"
  2. #define DBG_ENABLE
  3. #define DBG_LEVEL DBG_LOG
  4. #define DBG_SECTION_NAME "sensor.bosch.bme280"
  5. #define DBG_COLOR
  6. #include <rtdbg.h>
  7. #define ODR_125HZ BME280_OVERSAMPLING_1X
  8. #define ODR_71HZ BME280_OVERSAMPLING_2X
  9. #define ODR_38HZ BME280_OVERSAMPLING_4X
  10. #define ODR_20HZ BME280_OVERSAMPLING_8X
  11. #define ODR_10HZ BME280_OVERSAMPLING_16X
  12. static struct bme280_dev _bme280_dev;
  13. static struct rt_i2c_bus_device *i2c_bus_dev;
  14. static void rt_delay_ms(uint32_t period)
  15. {
  16. rt_thread_mdelay(period);
  17. }
  18. static int8_t rt_i2c_write_reg(uint8_t addr, uint8_t reg, uint8_t *data, uint16_t len)
  19. {
  20. rt_uint8_t tmp = reg;
  21. struct rt_i2c_msg msgs[2];
  22. msgs[0].addr = addr; /* Slave address */
  23. msgs[0].flags = RT_I2C_WR; /* Write flag */
  24. msgs[0].buf = &tmp; /* Slave register address */
  25. msgs[0].len = 1; /* Number of bytes sent */
  26. msgs[1].addr = addr; /* Slave address */
  27. msgs[1].flags = RT_I2C_WR | RT_I2C_NO_START; /* Read flag */
  28. msgs[1].buf = data; /* Read data pointer */
  29. msgs[1].len = len; /* Number of bytes read */
  30. if (rt_i2c_transfer(i2c_bus_dev, msgs, 2) != 2)
  31. {
  32. return -RT_ERROR;
  33. }
  34. return RT_EOK;
  35. }
  36. static int8_t rt_i2c_read_reg(uint8_t addr, uint8_t reg, uint8_t *data, uint16_t len)
  37. {
  38. rt_uint8_t tmp = reg;
  39. struct rt_i2c_msg msgs[2];
  40. msgs[0].addr = addr; /* Slave address */
  41. msgs[0].flags = RT_I2C_WR; /* Write flag */
  42. msgs[0].buf = &tmp; /* Slave register address */
  43. msgs[0].len = 1; /* Number of bytes sent */
  44. msgs[1].addr = addr; /* Slave address */
  45. msgs[1].flags = RT_I2C_RD; /* Read flag */
  46. msgs[1].buf = data; /* Read data pointer */
  47. msgs[1].len = len; /* Number of bytes read */
  48. if (rt_i2c_transfer(i2c_bus_dev, msgs, 2) != 2)
  49. {
  50. return -RT_ERROR;
  51. }
  52. return RT_EOK;
  53. }
  54. static rt_err_t _bme280_init(struct rt_sensor_intf *intf)
  55. {
  56. int8_t rslt = BME280_OK;
  57. _bme280_dev.dev_id = (rt_uint32_t)(intf->user_data) & 0xff;
  58. _bme280_dev.intf = BME280_I2C_INTF;
  59. _bme280_dev.read = rt_i2c_read_reg;
  60. _bme280_dev.write = rt_i2c_write_reg;
  61. _bme280_dev.delay_ms = rt_delay_ms;
  62. i2c_bus_dev = (struct rt_i2c_bus_device *)rt_device_find(intf->dev_name);
  63. if (i2c_bus_dev == RT_NULL)
  64. {
  65. LOG_E("can not find device %s", intf->dev_name);
  66. return -RT_ERROR;
  67. }
  68. rslt = bme280_init(&_bme280_dev);
  69. if (rslt == BME280_OK)
  70. {
  71. uint8_t settings_sel;
  72. /* Recommended mode of operation: Indoor navigation */
  73. _bme280_dev.settings.osr_h = BME280_OVERSAMPLING_16X;
  74. _bme280_dev.settings.osr_p = BME280_OVERSAMPLING_16X;
  75. _bme280_dev.settings.osr_t = BME280_OVERSAMPLING_16X;
  76. _bme280_dev.settings.filter = BME280_FILTER_COEFF_16;
  77. settings_sel = BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL;
  78. rslt = bme280_set_sensor_settings(settings_sel, &_bme280_dev);
  79. return RT_EOK;
  80. }
  81. else
  82. {
  83. LOG_E("bme280 init failed");
  84. return -RT_ERROR;
  85. }
  86. }
  87. static rt_err_t _bme280_set_odr(rt_sensor_t sensor, rt_uint16_t odr)
  88. {
  89. uint8_t odr_ctr;
  90. if(odr < 10)
  91. odr_ctr = ODR_10HZ;
  92. else if(odr < 20)
  93. odr_ctr = ODR_20HZ;
  94. else if(odr < 38)
  95. odr_ctr = ODR_38HZ;
  96. else if (odr < 71)
  97. odr_ctr = ODR_71HZ;
  98. else
  99. odr_ctr = ODR_125HZ;
  100. if (sensor->info.type == RT_SENSOR_CLASS_BARO)
  101. {
  102. _bme280_dev.settings.osr_p = odr_ctr;
  103. if(bme280_set_sensor_settings(BME280_OSR_PRESS_SEL, &_bme280_dev) == 0)
  104. return RT_EOK;
  105. }
  106. else if (sensor->info.type == RT_SENSOR_CLASS_TEMP)
  107. {
  108. _bme280_dev.settings.osr_t = odr_ctr;
  109. if(bme280_set_sensor_settings(BME280_OSR_TEMP_SEL, &_bme280_dev) == 0)
  110. return RT_EOK;
  111. }
  112. else if (sensor->info.type == RT_SENSOR_CLASS_HUMI)
  113. {
  114. _bme280_dev.settings.osr_h = odr_ctr;
  115. if(bme280_set_sensor_settings(BME280_OSR_HUM_SEL, &_bme280_dev) == 0)
  116. return RT_EOK;
  117. }
  118. return RT_EOK;
  119. }
  120. static rt_err_t _bme280_set_power(rt_sensor_t sensor, rt_uint8_t power)
  121. {
  122. int8_t rslt = 0;
  123. if (power == RT_SENSOR_POWER_DOWN)
  124. {
  125. rslt = bme280_set_sensor_mode(BME280_SLEEP_MODE, &_bme280_dev);
  126. }
  127. else if (power == RT_SENSOR_POWER_NORMAL)
  128. {
  129. rslt = bme280_set_sensor_mode(BME280_NORMAL_MODE, &_bme280_dev);
  130. }
  131. else
  132. {
  133. LOG_W("Unsupported mode, code is %d", power);
  134. return -RT_ERROR;
  135. }
  136. return rslt;
  137. }
  138. static rt_size_t bme280_fetch_data(struct rt_sensor_device *sensor, void *buf, rt_size_t len)
  139. {
  140. struct bme280_data comp_data;
  141. struct rt_sensor_data *data = buf;
  142. if (sensor->info.type == RT_SENSOR_CLASS_BARO)
  143. {
  144. bme280_get_sensor_data(BME280_PRESS, &comp_data, &_bme280_dev);
  145. data->type = RT_SENSOR_CLASS_BARO;
  146. data->data.baro = comp_data.pressure;
  147. data->timestamp = rt_sensor_get_ts();
  148. }
  149. else if (sensor->info.type == RT_SENSOR_CLASS_TEMP)
  150. {
  151. bme280_get_sensor_data(BME280_TEMP, &comp_data, &_bme280_dev);
  152. data->type = RT_SENSOR_CLASS_TEMP;
  153. data->data.temp = comp_data.temperature / 10;
  154. data->timestamp = rt_sensor_get_ts();
  155. }
  156. else if (sensor->info.type == RT_SENSOR_CLASS_HUMI)
  157. {
  158. bme280_get_sensor_data(BME280_HUM, &comp_data, &_bme280_dev);
  159. data->type = RT_SENSOR_CLASS_HUMI;
  160. data->data.humi = comp_data.humidity / 100;
  161. data->timestamp = rt_sensor_get_ts();
  162. }
  163. return 1;
  164. }
  165. static rt_err_t bme280_control(struct rt_sensor_device *sensor, int cmd, void *args)
  166. {
  167. rt_err_t result = RT_EOK;
  168. switch (cmd)
  169. {
  170. case RT_SENSOR_CTRL_GET_ID:
  171. *(rt_uint8_t *)args = _bme280_dev.chip_id;
  172. break;
  173. case RT_SENSOR_CTRL_SET_ODR:
  174. result = _bme280_set_odr(sensor, (rt_uint32_t)args & 0xffff);
  175. break;
  176. case RT_SENSOR_CTRL_SET_POWER:
  177. result = _bme280_set_power(sensor, (rt_uint32_t)args & 0xff);
  178. break;
  179. case RT_SENSOR_CTRL_SELF_TEST:
  180. /* TODO */
  181. result = -RT_EINVAL;
  182. break;
  183. default:
  184. return -RT_EINVAL;
  185. }
  186. return result;
  187. }
  188. static struct rt_sensor_ops sensor_ops =
  189. {
  190. bme280_fetch_data,
  191. bme280_control
  192. };
  193. int rt_hw_bme280_init(const char *name, struct rt_sensor_config *cfg)
  194. {
  195. rt_int8_t result;
  196. rt_sensor_t sensor_baro = RT_NULL, sensor_temp = RT_NULL, sensor_humi = RT_NULL;
  197. struct rt_sensor_module *module = RT_NULL;
  198. if (_bme280_init(&cfg->intf) != RT_EOK)
  199. {
  200. return RT_ERROR;
  201. }
  202. module = rt_calloc(1, sizeof(struct rt_sensor_module));
  203. if (module == RT_NULL)
  204. {
  205. return -1;
  206. }
  207. /* barometric pressure sensor register */
  208. {
  209. sensor_baro = rt_calloc(1, sizeof(struct rt_sensor_device));
  210. if (sensor_baro == RT_NULL)
  211. goto __exit;
  212. sensor_baro->info.type = RT_SENSOR_CLASS_BARO;
  213. sensor_baro->info.vendor = RT_SENSOR_VENDOR_BOSCH;
  214. sensor_baro->info.model = "bme280_baro";
  215. sensor_baro->info.unit = RT_SENSOR_UNIT_PA;
  216. sensor_baro->info.intf_type = RT_SENSOR_INTF_I2C;
  217. sensor_baro->info.range_max = 110000;
  218. sensor_baro->info.range_min = 30000;
  219. sensor_baro->info.period_min = 100;
  220. rt_memcpy(&sensor_baro->config, cfg, sizeof(struct rt_sensor_config));
  221. sensor_baro->ops = &sensor_ops;
  222. sensor_baro->module = module;
  223. module->sen[0] = sensor_baro;
  224. module->sen_num++;
  225. result = rt_hw_sensor_register(sensor_baro, name, RT_DEVICE_FLAG_RDONLY, RT_NULL);
  226. if (result != RT_EOK)
  227. {
  228. LOG_E("device register err code: %d", result);
  229. goto __exit;
  230. }
  231. }
  232. /* temperature sensor register */
  233. {
  234. sensor_temp = rt_calloc(1, sizeof(struct rt_sensor_device));
  235. if (sensor_temp == RT_NULL)
  236. goto __exit;
  237. sensor_temp->info.type = RT_SENSOR_CLASS_TEMP;
  238. sensor_temp->info.vendor = RT_SENSOR_VENDOR_BOSCH;
  239. sensor_temp->info.model = "bme280_temp";
  240. sensor_temp->info.unit = RT_SENSOR_UNIT_DCELSIUS;
  241. sensor_temp->info.intf_type = RT_SENSOR_INTF_I2C;
  242. sensor_temp->info.range_max = 850;
  243. sensor_temp->info.range_min = -400;
  244. sensor_temp->info.period_min = 100;
  245. rt_memcpy(&sensor_temp->config, cfg, sizeof(struct rt_sensor_config));
  246. sensor_temp->ops = &sensor_ops;
  247. sensor_temp->module = module;
  248. module->sen[1] = sensor_temp;
  249. module->sen_num++;
  250. result = rt_hw_sensor_register(sensor_temp, name, RT_DEVICE_FLAG_RDONLY, RT_NULL);
  251. if (result != RT_EOK)
  252. {
  253. LOG_E("device register err code: %d", result);
  254. goto __exit;
  255. }
  256. }
  257. /* humidity sensor register */
  258. {
  259. sensor_humi = rt_calloc(1, sizeof(struct rt_sensor_device));
  260. if (sensor_humi == RT_NULL)
  261. goto __exit;
  262. sensor_humi->info.type = RT_SENSOR_CLASS_HUMI;
  263. sensor_humi->info.vendor = RT_SENSOR_VENDOR_BOSCH;
  264. sensor_humi->info.model = "bme280_humi";
  265. sensor_humi->info.unit = RT_SENSOR_UNIT_PERMILLAGE;
  266. sensor_humi->info.intf_type = RT_SENSOR_INTF_I2C;
  267. sensor_humi->info.range_max = 1000;
  268. sensor_humi->info.range_min = 0;
  269. sensor_humi->info.period_min = 100;
  270. rt_memcpy(&sensor_humi->config, cfg, sizeof(struct rt_sensor_config));
  271. sensor_humi->ops = &sensor_ops;
  272. sensor_humi->module = module;
  273. module->sen[2] = sensor_humi;
  274. module->sen_num++;
  275. result = rt_hw_sensor_register(sensor_humi, name, RT_DEVICE_FLAG_RDONLY, RT_NULL);
  276. if (result != RT_EOK)
  277. {
  278. LOG_E("device register err code: %d", result);
  279. goto __exit;
  280. }
  281. }
  282. LOG_I("sensor init success");
  283. return RT_EOK;
  284. __exit:
  285. if(sensor_baro)
  286. rt_free(sensor_baro);
  287. if(sensor_temp)
  288. rt_free(sensor_temp);
  289. if(sensor_humi)
  290. rt_free(sensor_humi);
  291. if (module)
  292. rt_free(module);
  293. return -RT_ERROR;
  294. }