// #include // void app_main(void) // { // } #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/i2c.h" #include "bme680.h" #define I2C_PORT I2C_NUM_0 #define I2C_SDA_PIN 0 // GPIO0 #define I2C_SCL_PIN 2 // GPIO2 #define I2C_FREQ_HZ 100000 #define BME680_ADDR BME680_I2C_ADDR_PRIMARY // 0x76 (SDO=GND) // #define BME680_ADDR BME680_I2C_ADDR_SECONDARY // 0x77 (SDO=VCC) // --- I2C helpers (ESP-IDF style) --- static int8_t i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len) { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (dev_id << 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, reg_addr, true); i2c_master_start(cmd); i2c_master_write_byte(cmd, (dev_id << 1) | I2C_MASTER_READ, true); if (len > 1) { i2c_master_read(cmd, data, len - 1, I2C_MASTER_ACK); } i2c_master_read_byte(cmd, data + len - 1, I2C_MASTER_NACK); i2c_master_stop(cmd); esp_err_t ret = i2c_master_cmd_begin(I2C_PORT, cmd, pdMS_TO_TICKS(1000)); i2c_cmd_link_delete(cmd); return (ret == ESP_OK) ? BME680_OK : BME680_E_COM_FAIL; } static int8_t i2c_write(uint8_t dev_id, uint8_t reg_addr, const uint8_t *data, uint16_t len) { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (dev_id << 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, reg_addr, true); i2c_master_write(cmd, (uint8_t*)data, len, true); i2c_master_stop(cmd); esp_err_t ret = i2c_master_cmd_begin(I2C_PORT, cmd, pdMS_TO_TICKS(1000)); i2c_cmd_link_delete(cmd); return (ret == ESP_OK) ? BME680_OK : BME680_E_COM_FAIL; } static void delay_ms(uint32_t period_ms) { vTaskDelay(pdMS_TO_TICKS(period_ms)); } static void i2c_init(void) { i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = I2C_SDA_PIN, .scl_io_num = I2C_SCL_PIN, .sda_pullup_en = GPIO_PULLUP_ENABLE, .scl_pullup_en = GPIO_PULLUP_ENABLE, .master.clk_speed = I2C_FREQ_HZ, }; i2c_param_config(I2C_PORT, &conf); i2c_driver_install(I2C_PORT, conf.mode, 0, 0, 0); } void app_main(void) { i2c_init(); struct bme680_dev dev = {0}; dev.dev_id = BME680_ADDR; dev.intf = BME680_I2C_INTF; dev.read = i2c_read; dev.write = i2c_write; dev.delay_ms = delay_ms; if (bme680_init(&dev) != BME680_OK) { printf("BME680 init failed\n"); return; } // Oversampling / filter dev.tph_sett.os_hum = BME680_OS_2X; dev.tph_sett.os_pres = BME680_OS_4X; dev.tph_sett.os_temp = BME680_OS_8X; dev.tph_sett.filter = BME680_FILTER_SIZE_3; // Gas sensor dev.gas_sett.run_gas = BME680_ENABLE_GAS_MEAS; dev.gas_sett.heatr_temp = 320; // °C dev.gas_sett.heatr_dur = 150; // ms uint8_t set_required_settings = BME680_OST_SEL | BME680_OSP_SEL | BME680_OSH_SEL | BME680_FILTER_SEL | BME680_GAS_SENSOR_SEL; if (bme680_set_sensor_settings(set_required_settings, &dev) != BME680_OK) { printf("Sensor settings failed\n"); return; } while (1) { // Force mode, one-shot if (bme680_set_sensor_mode(&dev) != BME680_OK) { printf("Set mode failed\n"); vTaskDelay(pdMS_TO_TICKS(1000)); continue; } // Wait for measurement time uint16_t meas_period; bme680_get_profile_dur(&meas_period, &dev); vTaskDelay(pdMS_TO_TICKS(meas_period)); struct bme680_field_data data; if (bme680_get_sensor_data(&data, &dev) == BME680_OK) { printf("T=%.2f °C RH=%.2f %% P=%.2f hPa Gas=%.2f kΩ\n", data.temperature / 100.0f, data.humidity / 1000.0f, data.pressure / 100.0f, data.gas_resistance / 1000.0f); } else { printf("Read failed\n"); } vTaskDelay(pdMS_TO_TICKS(2000)); } }