Repo for ESP32 Weather Station Development
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
4.2KB

  1. /*
  2. * sensors.c
  3. *
  4. * Created on: 20 Apr 2020
  5. * Author: Chris
  6. */
  7. #include "sensors.h"
  8. static struct bme280_dev* dev;
  9. static struct bme280_dev* dev2;
  10. void i2c_setup()
  11. {
  12. printf("Setting up I2C driver on port 1... ");
  13. i2c_config_t config;
  14. config.mode = I2C_MODE_MASTER;
  15. config.sda_io_num = 33;
  16. config.sda_pullup_en = GPIO_PULLUP_ENABLE;
  17. config.scl_io_num = 32;
  18. config.scl_pullup_en = GPIO_PULLUP_ENABLE;
  19. config.master.clk_speed = 100000;
  20. i2c_param_config(I2C_NUM_0, &config);
  21. printf("Set driver parameters... ");
  22. esp_err_t err = i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0);
  23. if (err == ESP_OK)
  24. printf("Driver installed!\n");
  25. else if (err == ESP_ERR_INVALID_ARG)
  26. printf("Driver install failed, invalid arguments!\n");
  27. else
  28. printf("Driver install failed!\n");
  29. }
  30. int8_t i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len) {
  31. i2c_cmd_handle_t cmd = i2c_cmd_link_create();
  32. i2c_master_start(cmd);
  33. i2c_master_write_byte(cmd, dev_id << 1 | I2C_MASTER_WRITE, 1);
  34. i2c_master_write_byte(cmd, reg_addr, 1);
  35. i2c_master_start(cmd);
  36. i2c_master_write_byte(cmd, dev_id << 1 | I2C_MASTER_READ, 1);
  37. if (len > 1) {
  38. i2c_master_read(cmd, data, len - 1, I2C_MASTER_ACK);
  39. }
  40. i2c_master_read_byte(cmd, data + len - 1, I2C_MASTER_NACK);
  41. i2c_master_stop(cmd);
  42. i2c_master_cmd_begin(I2C_NUM_0, cmd, 500 / portTICK_RATE_MS);
  43. i2c_cmd_link_delete(cmd);
  44. return 0;
  45. }
  46. int8_t i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len) {
  47. //printf("Writing to bus: dev_id=%x, reg_addr=%x, data=%p, length=%u\n", dev_id, reg_addr, data, len);
  48. i2c_cmd_handle_t cmd = i2c_cmd_link_create();
  49. i2c_master_start(cmd);
  50. i2c_master_write_byte(cmd, (dev_id << 1) | I2C_MASTER_WRITE, 1);
  51. i2c_master_write_byte(cmd, reg_addr, 1);
  52. i2c_master_write(cmd, data, len, 1);
  53. i2c_master_stop(cmd);
  54. i2c_master_cmd_begin(I2C_NUM_0, cmd, 500 / portTICK_RATE_MS);
  55. i2c_cmd_link_delete(cmd);
  56. return 0;
  57. }
  58. void i2c_delay(uint32_t period) {
  59. vTaskDelay(period / portTICK_PERIOD_MS);
  60. }
  61. void i2c_shutdown()
  62. {
  63. printf("Shutting down I�C bus... ");
  64. esp_err_t err = i2c_driver_delete(I2C_NUM_0);
  65. if (err == ESP_ERR_INVALID_ARG)
  66. printf("Failed, invalid arguments!\n");
  67. else
  68. printf("Success!\n");
  69. }
  70. void read_sensor(int32_t* temp, uint32_t* pressure, uint32_t* humidity) {
  71. uint8_t settings_sel;
  72. uint32_t req_delay;
  73. struct bme280_data comp_data;
  74. dev->settings.osr_h = BME280_OVERSAMPLING_16X;
  75. dev->settings.osr_p = BME280_OVERSAMPLING_16X;
  76. dev->settings.osr_t = BME280_OVERSAMPLING_16X;
  77. dev->settings.filter = BME280_FILTER_COEFF_16;
  78. settings_sel = BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL;
  79. bme280_set_sensor_settings(settings_sel, dev);
  80. req_delay = 12*bme280_cal_meas_delay(&(dev->settings));
  81. bme280_set_sensor_mode(BME280_FORCED_MODE, dev);
  82. dev->delay_ms(req_delay / portTICK_PERIOD_MS);
  83. bme280_get_sensor_data(BME280_ALL, &comp_data, dev);
  84. *temp = comp_data.temperature;
  85. *pressure = comp_data.pressure;
  86. *humidity = comp_data.humidity;
  87. }
  88. void read_sensor2(int32_t* temp, uint32_t* pressure, uint32_t* humidity) {
  89. uint8_t settings_sel;
  90. uint32_t req_delay;
  91. struct bme280_data comp_data;
  92. dev2->settings.osr_h = BME280_OVERSAMPLING_16X;
  93. dev2->settings.osr_p = BME280_OVERSAMPLING_16X;
  94. dev2->settings.osr_t = BME280_OVERSAMPLING_16X;
  95. dev2->settings.filter = BME280_FILTER_COEFF_16;
  96. settings_sel = BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL;
  97. bme280_set_sensor_settings(settings_sel, dev2);
  98. req_delay = 12*bme280_cal_meas_delay(&(dev2->settings));
  99. bme280_set_sensor_mode(BME280_FORCED_MODE, dev2);
  100. dev2->delay_ms(req_delay / portTICK_PERIOD_MS);
  101. bme280_get_sensor_data(BME280_ALL, &comp_data, dev2);
  102. *temp = comp_data.temperature;
  103. *pressure = comp_data.pressure;
  104. *humidity = comp_data.humidity;
  105. }
  106. void init_sensors()
  107. {
  108. // INIT SENSOR
  109. i2c_setup();
  110. dev = malloc(sizeof(struct bme280_dev));
  111. dev->dev_id = 0x76;
  112. dev->intf = BME280_I2C_INTF;
  113. dev->read = i2c_read;
  114. dev->write = i2c_write;
  115. dev->delay_ms = i2c_delay;
  116. bme280_init(dev);
  117. // INIT SENSOR2
  118. dev2 = malloc(sizeof(struct bme280_dev));
  119. dev2->dev_id = 0x77;
  120. dev2->intf = BME280_I2C_INTF;
  121. dev2->read = i2c_read;
  122. dev2->write = i2c_write;
  123. dev2->delay_ms = i2c_delay;
  124. bme280_init(dev2);
  125. }