Repo for ESP32 Weather Station Development
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

146 lignes
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. }