From b4283e9f54e739832eb857545f14f7db0411327a Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Wed, 27 May 2026 20:22:43 +0300 Subject: [PATCH 01/23] Updati STCC4 driver. --- .gitignore | 16 +++++ main/boards/aether_esp32_c6.h | 2 +- main/controller.cpp | 8 ++- main/sensors/bme688.c | 2 +- main/sensors/esp_main_utils.c | 29 ++++++--- main/sensors/sht45.c | 2 +- main/sensors/shtc3.c | 2 +- main/sensors/stcc4.c | 110 ++++++++++++++++++++++++++-------- main/sensors/ulp_utils.c | 2 +- main/sensors/utils.h | 2 +- main/user_config.h | 8 ++- 11 files changed, 143 insertions(+), 40 deletions(-) diff --git a/.gitignore b/.gitignore index e4ce498..c20d5b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,18 @@ sdkconfig* !sdkconfig.defaults + +# Build directory +build/ +build*/**.cmake +build*/**.xcodeproj +build*/**/CMakeCache.txt +build*/**/CMakeFiles +build*/**/CMakeScripts +build*/**/Debug + +# IDE directory +.pio +.vscode + +# CLang +.clangd \ No newline at end of file diff --git a/main/boards/aether_esp32_c6.h b/main/boards/aether_esp32_c6.h index 5e813c5..923327b 100644 --- a/main/boards/aether_esp32_c6.h +++ b/main/boards/aether_esp32_c6.h @@ -36,7 +36,7 @@ #endif // --- Sensors --- #define BOARD_HAS_SHTC3 0 -#define BOARD_HAS_SHT45 1 +#define BOARD_HAS_SHT45 0 #define BOARD_HAS_STCC4 1 #define BOARD_HAS_BME688 0 // --- Hardware Settings --- diff --git a/main/controller.cpp b/main/controller.cpp index 8553e43..b0639f1 100644 --- a/main/controller.cpp +++ b/main/controller.cpp @@ -41,7 +41,7 @@ static constexpr auto kServiceUid = #ifdef ESP_PLATFORM static const auto kWifiCreds = ae::WifiCreds{ - /* .ssid*/ std::string{WIFI_SSID}, + /* .ssid*/ std::string{{WIFI_SSID}, /* .password*/ std::string{WIFI_PASSWORD}, }; static const auto kWifiInit = ae::WiFiInit{ @@ -145,8 +145,12 @@ void loop() { // implemented in sensors/ void UpdateSensors() { std::int16_t temperature = {}; - ReadSensors(&temperature, nullptr, nullptr, nullptr, nullptr); + std::uint32_t humidity = {}; + std::uint32_t co2 = {}; + ReadSensors(&temperature, &humidity, nullptr, &co2, nullptr); std::cout << ae::Format(" >>> Temperature: [{}]\n", temperature); + std::cout << ae::Format(" >>> Humidity: [{}]\n", humidity); + std::cout << ae::Format(" >>> Co2: [{}]\n", co2); // TODO: add check if wakeup cause is ulp then send value SendValue(temperature); } diff --git a/main/sensors/bme688.c b/main/sensors/bme688.c index 06fdac0..fa86717 100644 --- a/main/sensors/bme688.c +++ b/main/sensors/bme688.c @@ -84,7 +84,7 @@ uint8_t dev_addr = BME68X_I2C_ADDR_LOW; bool Init() { // 1. INSTALL I2C DRIVER - if (i2c_init(BME_I2C_NUM, SENSOR_SDA_PIN, SENSOR_SCL_PIN) != ESP_OK) { + if (i2c_init(BME_I2C_NUM, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { return false; } diff --git a/main/sensors/esp_main_utils.c b/main/sensors/esp_main_utils.c index 4788fa1..1c79f17 100644 --- a/main/sensors/esp_main_utils.c +++ b/main/sensors/esp_main_utils.c @@ -18,23 +18,38 @@ # include # include +//#define I2C_LEGACY_DRIVER # include "driver/i2c.h" # include "esp_log.h" -esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin) { +static const char *TAG_I2C = "I2C"; + +esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed) { + esp_err_t err; + i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = sda_pin, .scl_io_num = scl_pin, - .sda_pullup_en = GPIO_PULLUP_ENABLE, - .scl_pullup_en = GPIO_PULLUP_ENABLE, - .master = {.clk_speed = 100000}, - .clk_flags = 0, + .sda_pullup_en = GPIO_PULLUP_DISABLE, + .scl_pullup_en = GPIO_PULLUP_DISABLE, + .master = {.clk_speed = i2c_speed}, + .clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL, }; - if (i2c_param_config(port, &conf) != ESP_OK) { + ESP_LOGI(TAG_I2C, "Init i2c"); + port = I2C_NUM_0; + err = i2c_param_config(port, &conf); + if (err != ESP_OK) { + ESP_LOGE(TAG_I2C, "Failed to configure I2C! Error: %s", esp_err_to_name(err)); return ESP_ERR_INVALID_STATE; } - return i2c_driver_install(port, conf.mode, 0, 0, 0); + err = i2c_driver_install(port, conf.mode, 0, 0, 0); + if (err != ESP_OK) { + ESP_LOGE(TAG_I2C, "Failed to install the i2c driver! Error: %s", esp_err_to_name(err)); + return ESP_ERR_INVALID_STATE; + } + + return ESP_OK; } esp_err_t i2c_write(i2c_port_t port, uint8_t address, uint8_t const* data, diff --git a/main/sensors/sht45.c b/main/sensors/sht45.c index 6cc9fe2..90acf7b 100644 --- a/main/sensors/sht45.c +++ b/main/sensors/sht45.c @@ -60,7 +60,7 @@ static void send_command_8bit(uint8_t cmd, uint8_t slave_addr) { bool Init() { // 1. INSTALL I2C DRIVER - if (i2c_init(SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN) != ESP_OK) { + if (i2c_init(SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { return false; } return true; diff --git a/main/sensors/shtc3.c b/main/sensors/shtc3.c index 4818513..8763d0a 100644 --- a/main/sensors/shtc3.c +++ b/main/sensors/shtc3.c @@ -69,7 +69,7 @@ static void send_command_8bit(uint8_t cmd, uint8_t slave_addr) { bool Init() { // 1. INSTALL I2C DRIVER - if (i2c_init(SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN) != ESP_OK) { + if (i2c_init(SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { return false; } return true; diff --git a/main/sensors/stcc4.c b/main/sensors/stcc4.c index d88ae2f..d2a3613 100644 --- a/main/sensors/stcc4.c +++ b/main/sensors/stcc4.c @@ -16,7 +16,7 @@ #include "user_config.h" -#if BOARD_HAS_STTC4 == 1 +#if BOARD_HAS_STCC4 == 1 #if ((ULP_COMP == 1) && (BOARD_HAS_ULP == 1)) || ((ULP_COMP == 0) && (BOARD_HAS_ULP == 0)) #pragma message("STTC4 is enabled") @@ -27,14 +27,14 @@ # include "sensors/utils.h" // Constants for STCC4 -# define STCC4_SLAVE_ADDR 0x65 // Typical address for Sensirion sensors +# define STCC4_SLAVE_ADDR 0x64 // Typical address for Sensirion sensors +# define CRC8_POLYNOMIAL 0x31 // Commands (16-bit, transmitted MSB first) -# define STCC4_CMD_MEASURE_SINGLE_SHOT \ - 0x2C1F // Command for single shot measurement -# define STCC4_CMD_MEASURE_CONTINUOUS \ - 0x21B1 // Command for continuous measurement -# define STCC4_CMD_READ_DATA 0xE000 // Command to read data -# define STCC4_CMD_SLEEP 0xB009 // Command to enter sleep +# define STCC4_CMD_START_CONTINUOUS 0x218B // Command for continuous measurement +# define STCC4_CMD_STOP_CONTINUOUS 0x3F86 // Stop for continuous measurement +# define STCC4_CMD_MEASURE_SINGLE_SHOT 0x219D // Command for single shot measurement +# define STCC4_CMD_READ_DATA 0xEC05 // Command to read data +# define STCC4_CMD_SLEEP 0x3650 // Command to enter sleep // Constants # define LP_I2C_TRANS_TIMEOUT_CYCLES 5000 @@ -42,7 +42,8 @@ // I2C Buffers static uint8_t data_wr[2]; -static uint8_t data_rd[6]; +static uint8_t data_rd[12]; +static bool initialized = false; #ifdef IS_ULP_COCPU # define STCC4_I2C_NUM_0 LP_I2C_NUM_0 @@ -50,37 +51,45 @@ static uint8_t data_rd[6]; # define STCC4_I2C_NUM_0 I2C_NUM_0 #endif -bool initialized = false; +bool check_crc(const uint8_t *data, uint8_t crc); // Helper function to send a 16-bit command -static void send_command_16bit(uint16_t cmd, uint8_t slave_addr) { +static esp_err_t send_command_16bit(uint16_t cmd, uint8_t slave_addr) { data_wr[0] = (cmd >> 8) & 0xFF; // High byte data_wr[1] = cmd & 0xFF; // Low byte - esp_err_t ret = i2c_write(STCC4_I2C_NUM_0, slave_addr, data_wr, + esp_err_t err = i2c_write(STCC4_I2C_NUM_0, slave_addr, data_wr, sizeof(data_wr), LP_I2C_TRANS_WAIT_FOREVER); - if (ret != ESP_OK) { + if (err != ESP_OK) { // Bail and try again - return; + return err; } -} -// Helper function to send an 8-bit command -static void send_command_8bit(uint8_t cmd, uint8_t slave_addr) { - data_wr[0] = cmd; - i2c_write(STCC4_I2C_NUM_0, slave_addr, data_wr, 1, LP_I2C_TRANS_WAIT_FOREVER); + return ESP_OK; } bool Init() { - // 1. INSTALL I2C DRIVER - if (i2c_init(STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN) != ESP_OK) { + // 1. power ON + gpio_set_direction((gpio_num_t)GPIO_NUM_14, GPIO_MODE_OUTPUT); + gpio_set_level((gpio_num_t)GPIO_NUM_14, 1); + // 2. Install I2C driver + if (i2c_init(STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 100000) != ESP_OK) { return false; } -return true; + + wait_for(125000); // 125 ms + + esp_err_t err = send_command_16bit(STCC4_CMD_SLEEP, STCC4_SLAVE_ADDR); + if (err != ESP_OK) { + return false; + } + + return true; } void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, uint32_t* co2, uint32_t* gas_resistance) { esp_err_t ret; + uint16_t tmp; if (!initialized) { initialized = Init(); @@ -92,18 +101,71 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, wait_for(500000); // 500 ms // Read 3 bytes: CO2 with CRC - ret = i2c_read(STCC4_I2C_NUM_0, STCC4_SLAVE_ADDR, data_rd, 3, - LP_I2C_TRANS_TIMEOUT_CYCLES); + ret = i2c_read(STCC4_I2C_NUM_0, STCC4_SLAVE_ADDR, data_rd, sizeof(data_rd), + LP_I2C_TRANS_WAIT_FOREVER); if (ret != ESP_OK) { return; } + + // Read CO2 + // Checking CRC + if (!check_crc(data_rd, data_rd[2])) { + return; + } // Convert to CO2 value (format depends on sensor, typically 16 bits) uint16_t co2_ppm = (data_rd[0] << 8) | data_rd[1]; if (co2) { *co2 = (uint32_t)co2_ppm; } + + // Read Temperature + // Checking CRC + if (!check_crc(&data_rd[3], data_rd[5])) { + return; + } + + // Temperature: T = -45 + 175 * raw_temp / 65535 + tmp = (data_rd[3] << 8) | data_rd[4]; + int32_t temp_x100 = (17500ULL * tmp) / 65535 - 4500; + if (temperature) { + *temperature = (uint32_t)temp_x100; + } + + // Read Humidity + // Checking CRC + if (!check_crc(&data_rd[6], data_rd[8])) { + return; + } + + // Humidity: RH = 100 * raw_hum / 65535 + tmp = (data_rd[6] << 8) | data_rd[7]; + int32_t hum_x100 = (10000ULL * tmp) / 65535; + + // Humidity limitation within 0..100% + if (hum_x100 > 10000) hum_x100 = 10000; + if (hum_x100 < 0) hum_x100 = 0; + + if (humidity) { + *humidity = (uint32_t)hum_x100; + } +} + +bool check_crc(const uint8_t *data, uint8_t crc) { + // CRC-8 алгоритм для Sensirion (полином 0x31, начальное значение 0xFF) + uint8_t crc_calc = 0xFF; + for (int i = 0; i < 2; i++) { + crc_calc ^= data[i]; + for (int bit = 0; bit < 8; bit++) { + if (crc_calc & 0x80) { + crc_calc = (crc_calc << 1) ^ CRC8_POLYNOMIAL; + } else { + crc_calc <<= 1; + } + } + } + return (crc_calc == crc); } #endif diff --git a/main/sensors/ulp_utils.c b/main/sensors/ulp_utils.c index b49786d..3319568 100644 --- a/main/sensors/ulp_utils.c +++ b/main/sensors/ulp_utils.c @@ -24,7 +24,7 @@ # include "ulp_lp_core_i2c.h" # include "ulp_lp_core_utils.h" -esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin) { return ESP_OK; } +esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed) { return ESP_OK; } esp_err_t i2c_write(i2c_port_t port, uint8_t address, uint8_t const* data, uint8_t len, int32_t ms_dur) { diff --git a/main/sensors/utils.h b/main/sensors/utils.h index 4757403..82255a7 100644 --- a/main/sensors/utils.h +++ b/main/sensors/utils.h @@ -24,7 +24,7 @@ extern "C" { # endif -esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin); +esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed); esp_err_t i2c_write(i2c_port_t port, uint8_t address, uint8_t const* data, uint8_t len, int32_t ms_dur); diff --git a/main/user_config.h b/main/user_config.h index 8579c3e..1fc810a 100644 --- a/main/user_config.h +++ b/main/user_config.h @@ -54,7 +54,7 @@ # define BOARD_M5STACK_ATOM_LITE 4 # ifndef BOARD -# define BOARD BOARD_NANO_ESP32_C6 +# define BOARD BOARD_AETHER_ESP32_C6 # endif # if BOARD == BOARD_AETHER_ESP32_C6 @@ -76,10 +76,16 @@ #if BOARD_HAS_ULP == 1 # define ULP_SLEEP 1 +# define THREAD_SLEEP 0 +# define ESP_MAIN_SLEEP 0 #elif defined ESP_PLATFORM +# define ULP_SLEEP 0 +# define THREAD_SLEEP 0 # define ESP_MAIN_SLEEP 1 #else +# define ULP_SLEEP 0 # define THREAD_SLEEP 1 +# define ESP_MAIN_SLEEP 0 #endif #if defined IS_ULP_COCPU From 217e4f39d10a0b588e99c5e56fe715e69c684837 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Wed, 27 May 2026 20:26:49 +0300 Subject: [PATCH 02/23] Fixing WiFi SSID name bug. --- main/controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/controller.cpp b/main/controller.cpp index b0639f1..72b8eeb 100644 --- a/main/controller.cpp +++ b/main/controller.cpp @@ -41,7 +41,7 @@ static constexpr auto kServiceUid = #ifdef ESP_PLATFORM static const auto kWifiCreds = ae::WifiCreds{ - /* .ssid*/ std::string{{WIFI_SSID}, + /* .ssid*/ std::string{WIFI_SSID}, /* .password*/ std::string{WIFI_PASSWORD}, }; static const auto kWifiInit = ae::WiFiInit{ From 01c390c1f4771c4cb2ec1b4655f626557d110f2a Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 28 May 2026 12:40:07 +0300 Subject: [PATCH 03/23] Updating Power ON logic for STCC4 sensor. --- main/boards/aether_esp32_c6.h | 8 ++++++++ main/boards/m5stack_atom_lite.h | 7 +++++++ main/boards/nano_esp32_c6.h | 6 ++++++ main/sensors/stcc4.c | 18 ++++++++++++++++-- 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/main/boards/aether_esp32_c6.h b/main/boards/aether_esp32_c6.h index 923327b..89e32ce 100644 --- a/main/boards/aether_esp32_c6.h +++ b/main/boards/aether_esp32_c6.h @@ -21,6 +21,7 @@ #endif #include "hal/i2c_types.h" +#include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP # define BOARD_HAS_ULP 0 @@ -28,9 +29,16 @@ #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 #endif +#ifndef BOARD_HAS_PWR_ON +# define BOARD_HAS_PWR_ON 1 +#endif #ifndef STATUS_LED_PIN # define STATUS_LED_PIN GPIO_NUM_7 #endif +#ifndef PWR_ON_GPIO +# define PWR_ON_GPIO GPIO_NUM_14 +# define LP_PWR_ON_GPIO LP_IO_NUM_14 +#endif #ifndef RESET_BUTTON_PIN # define RESET_BUTTON_PIN GPIO_NUM_9 #endif diff --git a/main/boards/m5stack_atom_lite.h b/main/boards/m5stack_atom_lite.h index 509b70b..d076556 100644 --- a/main/boards/m5stack_atom_lite.h +++ b/main/boards/m5stack_atom_lite.h @@ -21,6 +21,7 @@ #endif #include "hal/i2c_types.h" +#include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP # define BOARD_HAS_ULP 0 @@ -28,9 +29,15 @@ #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 #endif +#ifndef BOARD_HAS_PWR_ON +# define BOARD_HAS_PWR_ON 0 +#endif #ifndef STATUS_LED_PIN # define STATUS_LED_PIN GPIO_NUM_35 #endif +#ifndef PWR_ON_GPIO +# define PWR_ON_GPIO -1 +#endif #ifndef RESET_BUTTON_PIN # define RESET_BUTTON_PIN GPIO_NUM_41 #endif diff --git a/main/boards/nano_esp32_c6.h b/main/boards/nano_esp32_c6.h index d0ae5a5..658f11f 100644 --- a/main/boards/nano_esp32_c6.h +++ b/main/boards/nano_esp32_c6.h @@ -29,9 +29,15 @@ #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 #endif +#ifndef BOARD_HAS_PWR_ON +# define BOARD_HAS_PWR_ON 0 +#endif #ifndef STATUS_LED_PIN # define STATUS_LED_PIN GPIO_NUM_8 #endif +#ifndef PWR_ON_GPIO +# define PWR_ON_GPIO -1 +#endif #ifndef RESET_BUTTON_PIN # define RESET_BUTTON_PIN GPIO_NUM_9 #endif diff --git a/main/sensors/stcc4.c b/main/sensors/stcc4.c index d2a3613..847009b 100644 --- a/main/sensors/stcc4.c +++ b/main/sensors/stcc4.c @@ -23,6 +23,12 @@ # include # include +# ifdef IS_ULP_COCPU +# include "ulp_lp_core_gpio.h" +# else +# include "driver/gpio.h" +# endif + # include "sensors/sensors.h" # include "sensors/utils.h" @@ -69,8 +75,16 @@ static esp_err_t send_command_16bit(uint16_t cmd, uint8_t slave_addr) { bool Init() { // 1. power ON - gpio_set_direction((gpio_num_t)GPIO_NUM_14, GPIO_MODE_OUTPUT); - gpio_set_level((gpio_num_t)GPIO_NUM_14, 1); +#if BOARD_HAS_PWR_ON == 1 +# ifdef IS_ULP_COCPU + ulp_lp_core_gpio_init(LP_PWR_ON_GPIO); + ulp_lp_core_gpio_output_enable(LP_PWR_ON_GPIO); + ulp_lp_core_gpio_set_level(LP_PWR_ON_GPIO, 1); +# else + gpio_set_direction((gpio_num_t)PWR_ON_GPIO, GPIO_MODE_OUTPUT); + gpio_set_level((gpio_num_t)PWR_ON_GPIO, 1); +# endif +#endif // 2. Install I2C driver if (i2c_init(STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 100000) != ESP_OK) { return false; From e86e3ffdaa3bcde7298fd14c7e33c8338def0f3d Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 28 May 2026 13:17:48 +0300 Subject: [PATCH 04/23] Updating IO pins. --- main/boards/m5stack_atom_lite.h | 1 + main/boards/nano_esp32_c6.h | 1 + 2 files changed, 2 insertions(+) diff --git a/main/boards/m5stack_atom_lite.h b/main/boards/m5stack_atom_lite.h index d076556..0245214 100644 --- a/main/boards/m5stack_atom_lite.h +++ b/main/boards/m5stack_atom_lite.h @@ -37,6 +37,7 @@ #endif #ifndef PWR_ON_GPIO # define PWR_ON_GPIO -1 +# define LP_PWR_ON_GPIO -1 #endif #ifndef RESET_BUTTON_PIN # define RESET_BUTTON_PIN GPIO_NUM_41 diff --git a/main/boards/nano_esp32_c6.h b/main/boards/nano_esp32_c6.h index 658f11f..f983c8a 100644 --- a/main/boards/nano_esp32_c6.h +++ b/main/boards/nano_esp32_c6.h @@ -37,6 +37,7 @@ #endif #ifndef PWR_ON_GPIO # define PWR_ON_GPIO -1 +# define LP_PWR_ON_GPIO -1 #endif #ifndef RESET_BUTTON_PIN # define RESET_BUTTON_PIN GPIO_NUM_9 From 698241c3956a62569af48b2390343a0f99f94b80 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 28 May 2026 13:44:05 +0300 Subject: [PATCH 05/23] Test build. --- main/boards/aether_esp32_c6.h | 4 ++-- main/boards/nano_esp32_c6.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/main/boards/aether_esp32_c6.h b/main/boards/aether_esp32_c6.h index 89e32ce..e0a8117 100644 --- a/main/boards/aether_esp32_c6.h +++ b/main/boards/aether_esp32_c6.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 0 +# define BOARD_HAS_ULP 1 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 @@ -37,7 +37,7 @@ #endif #ifndef PWR_ON_GPIO # define PWR_ON_GPIO GPIO_NUM_14 -# define LP_PWR_ON_GPIO LP_IO_NUM_14 +# define LP_PWR_ON_GPIO LP_IO_NUM_4 #endif #ifndef RESET_BUTTON_PIN # define RESET_BUTTON_PIN GPIO_NUM_9 diff --git a/main/boards/nano_esp32_c6.h b/main/boards/nano_esp32_c6.h index f983c8a..2438c57 100644 --- a/main/boards/nano_esp32_c6.h +++ b/main/boards/nano_esp32_c6.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 1 +# define BOARD_HAS_ULP 0 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 From 251c212983f171fc84664b07dbb59ba7cf90f11e Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 28 May 2026 14:44:21 +0300 Subject: [PATCH 06/23] Test build. --- main/boards/m5stack_atom_lite.h | 2 +- main/boards/nano_esp32_c6.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main/boards/m5stack_atom_lite.h b/main/boards/m5stack_atom_lite.h index 0245214..4c905c5 100644 --- a/main/boards/m5stack_atom_lite.h +++ b/main/boards/m5stack_atom_lite.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 0 +# define BOARD_HAS_ULP 1 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 diff --git a/main/boards/nano_esp32_c6.h b/main/boards/nano_esp32_c6.h index 2438c57..f983c8a 100644 --- a/main/boards/nano_esp32_c6.h +++ b/main/boards/nano_esp32_c6.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 0 +# define BOARD_HAS_ULP 1 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 From a3daffc16988eb71b432cccd95cac2177dc56f0d Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 28 May 2026 14:58:31 +0300 Subject: [PATCH 07/23] Test build. --- main/boards/aether_esp32_c6.h | 2 +- main/boards/m5stack_atom_lite.h | 2 +- main/boards/nano_esp32_c6.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/main/boards/aether_esp32_c6.h b/main/boards/aether_esp32_c6.h index e0a8117..534fabe 100644 --- a/main/boards/aether_esp32_c6.h +++ b/main/boards/aether_esp32_c6.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 1 +# define BOARD_HAS_ULP 0 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 diff --git a/main/boards/m5stack_atom_lite.h b/main/boards/m5stack_atom_lite.h index 4c905c5..0245214 100644 --- a/main/boards/m5stack_atom_lite.h +++ b/main/boards/m5stack_atom_lite.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 1 +# define BOARD_HAS_ULP 0 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 diff --git a/main/boards/nano_esp32_c6.h b/main/boards/nano_esp32_c6.h index f983c8a..2438c57 100644 --- a/main/boards/nano_esp32_c6.h +++ b/main/boards/nano_esp32_c6.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 1 +# define BOARD_HAS_ULP 0 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 From b8dbf65dc71f88ec7e2632a5634988c37b032e71 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 28 May 2026 15:37:16 +0300 Subject: [PATCH 08/23] Test build. --- main/boards/nano_esp32_c6.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/boards/nano_esp32_c6.h b/main/boards/nano_esp32_c6.h index 2438c57..f983c8a 100644 --- a/main/boards/nano_esp32_c6.h +++ b/main/boards/nano_esp32_c6.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 0 +# define BOARD_HAS_ULP 1 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 From 02550bb57bb2b1426192cf4ff7ce55e824e3d912 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 28 May 2026 16:28:47 +0300 Subject: [PATCH 09/23] Test build. --- main/boards/nano_esp32_c6.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/boards/nano_esp32_c6.h b/main/boards/nano_esp32_c6.h index f983c8a..a42e022 100644 --- a/main/boards/nano_esp32_c6.h +++ b/main/boards/nano_esp32_c6.h @@ -44,8 +44,8 @@ #endif // --- Sensors --- #define BOARD_HAS_SHTC3 0 -#define BOARD_HAS_SHT45 1 -#define BOARD_HAS_STCC4 0 +#define BOARD_HAS_SHT45 0 +#define BOARD_HAS_STCC4 1 #define BOARD_HAS_BME688 0 // --- Hardware Settings --- #define SENSOR_SDA_PIN GPIO_NUM_6 From d1086a1ea1613733e71584e9af7f60e0bd7bc8c9 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 28 May 2026 16:45:57 +0300 Subject: [PATCH 10/23] Test build. --- main/boards/m5stack_atom_lite.h | 6 +++--- main/boards/nano_esp32_c6.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/main/boards/m5stack_atom_lite.h b/main/boards/m5stack_atom_lite.h index 0245214..8c39da0 100644 --- a/main/boards/m5stack_atom_lite.h +++ b/main/boards/m5stack_atom_lite.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 0 +# define BOARD_HAS_ULP 1 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 @@ -44,9 +44,9 @@ #endif // --- Sensors --- #define BOARD_HAS_SHTC3 0 -#define BOARD_HAS_SHT45 0 +#define BOARD_HAS_SHT45 1 #define BOARD_HAS_STCC4 0 -#define BOARD_HAS_BME688 1 +#define BOARD_HAS_BME688 0 // --- Hardware Settings --- #define SENSOR_SDA_PIN 2 #define SENSOR_SCL_PIN 1 diff --git a/main/boards/nano_esp32_c6.h b/main/boards/nano_esp32_c6.h index a42e022..2438c57 100644 --- a/main/boards/nano_esp32_c6.h +++ b/main/boards/nano_esp32_c6.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 1 +# define BOARD_HAS_ULP 0 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 @@ -44,8 +44,8 @@ #endif // --- Sensors --- #define BOARD_HAS_SHTC3 0 -#define BOARD_HAS_SHT45 0 -#define BOARD_HAS_STCC4 1 +#define BOARD_HAS_SHT45 1 +#define BOARD_HAS_STCC4 0 #define BOARD_HAS_BME688 0 // --- Hardware Settings --- #define SENSOR_SDA_PIN GPIO_NUM_6 From 6a496d725572693cb369c2c1ff3db8f6e10a834d Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 28 May 2026 17:20:41 +0300 Subject: [PATCH 11/23] Fixing Ci/Cd. --- main/boards/aether_esp32_c6.h | 4 ++-- main/boards/m5stack_atom_lite.h | 10 +++++----- main/boards/nano_esp32_c6.h | 6 +++--- main/sensors/shtc3.c | 2 +- main/user_config.h | 1 + 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/main/boards/aether_esp32_c6.h b/main/boards/aether_esp32_c6.h index 534fabe..5a8a78b 100644 --- a/main/boards/aether_esp32_c6.h +++ b/main/boards/aether_esp32_c6.h @@ -48,8 +48,8 @@ #define BOARD_HAS_STCC4 1 #define BOARD_HAS_BME688 0 // --- Hardware Settings --- -#define SENSOR_SDA_PIN 19 -#define SENSOR_SCL_PIN 18 +#define SENSOR_SDA_PIN GPIO_NUM_19 +#define SENSOR_SCL_PIN GPIO_NUM_18 // FIX 1: Use a Fixed Buffer instead of VLA (Variable Length Array) to prevent // stack smash #define MAX_I2C_BUFFER 64 diff --git a/main/boards/m5stack_atom_lite.h b/main/boards/m5stack_atom_lite.h index 8c39da0..d89f8c0 100644 --- a/main/boards/m5stack_atom_lite.h +++ b/main/boards/m5stack_atom_lite.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 1 +# define BOARD_HAS_ULP 0 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 @@ -44,12 +44,12 @@ #endif // --- Sensors --- #define BOARD_HAS_SHTC3 0 -#define BOARD_HAS_SHT45 1 +#define BOARD_HAS_SHT45 0 #define BOARD_HAS_STCC4 0 -#define BOARD_HAS_BME688 0 +#define BOARD_HAS_BME688 1 // --- Hardware Settings --- -#define SENSOR_SDA_PIN 2 -#define SENSOR_SCL_PIN 1 +#define SENSOR_SDA_PIN GPIO_NUM_2 +#define SENSOR_SCL_PIN GPIO_NUM_1 // FIX 1: Use a Fixed Buffer instead of VLA (Variable Length Array) to prevent // stack smash #define MAX_I2C_BUFFER 64 diff --git a/main/boards/nano_esp32_c6.h b/main/boards/nano_esp32_c6.h index 2438c57..266137f 100644 --- a/main/boards/nano_esp32_c6.h +++ b/main/boards/nano_esp32_c6.h @@ -24,7 +24,7 @@ #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP -# define BOARD_HAS_ULP 0 +# define BOARD_HAS_ULP 1 #endif #ifndef BOARD_HAS_LED # define BOARD_HAS_LED 1 @@ -44,9 +44,9 @@ #endif // --- Sensors --- #define BOARD_HAS_SHTC3 0 -#define BOARD_HAS_SHT45 1 +#define BOARD_HAS_SHT45 0 #define BOARD_HAS_STCC4 0 -#define BOARD_HAS_BME688 0 +#define BOARD_HAS_BME688 1 // --- Hardware Settings --- #define SENSOR_SDA_PIN GPIO_NUM_6 #define SENSOR_SCL_PIN GPIO_NUM_7 diff --git a/main/sensors/shtc3.c b/main/sensors/shtc3.c index 8763d0a..15bd391 100644 --- a/main/sensors/shtc3.c +++ b/main/sensors/shtc3.c @@ -97,7 +97,7 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, // Read 6 bytes: [TempMSB, TempLSB, TempCRC, HumMSB, HumLSB, HumCRC] // In this example, we ignore CRC for simplicity. - ret = i2c_write_read(SHTC3_I2C_NUM_0, SHTC3_SLAVE_ADDR, data_rd, + ret = i2c_read(SHTC3_I2C_NUM_0, SHTC3_SLAVE_ADDR, data_rd, sizeof(data_rd), LP_I2C_TRANS_TIMEOUT_CYCLES); if (ret == ESP_OK) { // 5. Raw values diff --git a/main/user_config.h b/main/user_config.h index 1fc810a..a02a0b7 100644 --- a/main/user_config.h +++ b/main/user_config.h @@ -54,6 +54,7 @@ # define BOARD_M5STACK_ATOM_LITE 4 # ifndef BOARD +//# define BOARD BOARD_AETHER_ESP32_C6 # define BOARD BOARD_AETHER_ESP32_C6 # endif From 33156c1e2e80699152ff05079181575e935d4860 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Fri, 29 May 2026 10:44:18 +0300 Subject: [PATCH 12/23] Fixing BOARD definition for the ULP build. --- ulp/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ulp/CMakeLists.txt b/ulp/CMakeLists.txt index 3eb0dbd..3b56fca 100644 --- a/ulp/CMakeLists.txt +++ b/ulp/CMakeLists.txt @@ -37,6 +37,10 @@ add_executable(${ULP_APP_NAME} ${main_src} ${sensors_src}) add_compile_definitions(ESP_PLATFORM) add_compile_definitions(BME68X_DO_NOT_USE_FPU) +if (NOT "${BOARD}" STREQUAL "") + target_compile_definitions(${TARGET_NAME} PRIVATE "BOARD=${BOARD}") +endif() + # Import the ULP project helper functions include(IDFULPProject) From d3268f3c1e07a56c58472e54029c62cf0f8b81c4 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Fri, 29 May 2026 11:13:22 +0300 Subject: [PATCH 13/23] Fixing target_compile_definitions for BOARD. --- ulp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ulp/CMakeLists.txt b/ulp/CMakeLists.txt index 3b56fca..8dc749b 100644 --- a/ulp/CMakeLists.txt +++ b/ulp/CMakeLists.txt @@ -38,7 +38,7 @@ add_compile_definitions(ESP_PLATFORM) add_compile_definitions(BME68X_DO_NOT_USE_FPU) if (NOT "${BOARD}" STREQUAL "") - target_compile_definitions(${TARGET_NAME} PRIVATE "BOARD=${BOARD}") + target_compile_definitions(${ULP_APP_NAME} PRIVATE "BOARD=${BOARD}") endif() # Import the ULP project helper functions From 617ef3fc6ec020b750bddc58531daa7608ca5eb0 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Fri, 29 May 2026 17:28:48 +0300 Subject: [PATCH 14/23] Fixing Ci/Cd build. --- main/CMakeLists.txt | 15 +++++++++++++-- ulp/CMakeLists.txt | 27 +++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 096ee4b..4fb2c20 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -68,8 +68,6 @@ else() esp_hw_support driver) - ulp_add_project("ulp_main" "${CMAKE_CURRENT_LIST_DIR}/../ulp") - set(TARGET_NAME "${COMPONENT_LIB}") if (NOT "${WIFI_SSID}" STREQUAL "") target_compile_definitions(${TARGET_NAME} PRIVATE "WIFI_SSID=\"${WIFI_SSID}\"") @@ -81,6 +79,19 @@ else() target_compile_definitions(${TARGET_NAME} PRIVATE "BOARD=${BOARD}") endif() + # Define the path to the board configuration file in the build folder + set(ULP_BOARD_FILE "${CMAKE_BINARY_DIR}/ulp_board_config.cmake") + + # Write the value of the BOARD variable to this file + if(NOT "${BOARD}" STREQUAL "") + file(WRITE "${ULP_BOARD_FILE}" "set(BOARD \"${BOARD}\")\n") + else() + file(WRITE "${ULP_BOARD_FILE}" "set(BOARD \"\")\n") + endif() + + # We call the project addition as usual + ulp_add_project("ulp_main" "${CMAKE_CURRENT_LIST_DIR}/../ulp") + else() #Other platforms message(FATAL_ERROR "Platform ${CM_PLATFORM} is not supported") diff --git a/ulp/CMakeLists.txt b/ulp/CMakeLists.txt index 8dc749b..baf6e5f 100644 --- a/ulp/CMakeLists.txt +++ b/ulp/CMakeLists.txt @@ -37,10 +37,6 @@ add_executable(${ULP_APP_NAME} ${main_src} ${sensors_src}) add_compile_definitions(ESP_PLATFORM) add_compile_definitions(BME68X_DO_NOT_USE_FPU) -if (NOT "${BOARD}" STREQUAL "") - target_compile_definitions(${ULP_APP_NAME} PRIVATE "BOARD=${BOARD}") -endif() - # Import the ULP project helper functions include(IDFULPProject) @@ -56,3 +52,26 @@ ulp_add_build_binary_targets(${ULP_APP_NAME}) target_include_directories(${ULP_APP_NAME} PUBLIC "${CMAKE_CURRENT_LIST_DIR}/../main" "${CMAKE_CURRENT_LIST_DIR}/../aether-client-cpp/") target_compile_definitions(${ULP_APP_NAME} PRIVATE "ULP_MODE=1") + +# Calculate where the build folder of the main project is located +# ExternalProject is usually built inside build/ulp_main-prefix/src/ulp_main-build +# We need to go up to the root of the build folder +set(MAIN_BUILD_DIR "${CMAKE_BINARY_DIR}/../../..") +set(ULP_BOARD_FILE "${MAIN_BUILD_DIR}/ulp_board_config.cmake") + +# If the configuration file exists, connect it +if(EXISTS "${ULP_BOARD_FILE}") + include("${ULP_BOARD_FILE}") +endif() + +# Проверяем, появилось ли значение переменной BOARD после инклуда +if(NOT "${BOARD}" STREQUAL "") + message(STATUS "--------------------------------------------------") + message(STATUS "ULP Project SUCCESS! Board loaded from file: ${BOARD}") + message(STATUS "--------------------------------------------------") + + # Checking if the BOARD variable has been included + add_compile_definitions(BOARD=${BOARD}) +else() + message(WARNING "ULP Project: BOARD is not defined!") +endif() From 9b1d1b79225850afc4e7676c707d95e882468ac7 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Wed, 3 Jun 2026 17:01:45 +0300 Subject: [PATCH 15/23] Fixing gitmodules. --- .gitmodules | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitmodules b/.gitmodules index e69de29..f751e47 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "aether-client-cpp"] + path = cpp/desktop-ping-pong/aether-client-cpp + url = https://github.com/aethernetio/aether-client-cpp.git + branch = main \ No newline at end of file From 258ff5b57dcf5460d0c7b10bf1f80dfaaf19d36e Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Wed, 3 Jun 2026 17:05:58 +0300 Subject: [PATCH 16/23] Removing submodules. --- .gitmodules | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index f751e47..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +0,0 @@ -[submodule "aether-client-cpp"] - path = cpp/desktop-ping-pong/aether-client-cpp - url = https://github.com/aethernetio/aether-client-cpp.git - branch = main \ No newline at end of file From 517b5dca19e5e1d8a969c8bb7b5b5a5f8b3a18b8 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Wed, 3 Jun 2026 17:11:55 +0300 Subject: [PATCH 17/23] Deleting aether-client-cpp submodule. --- aether-client-cpp | 1 - 1 file changed, 1 deletion(-) delete mode 160000 aether-client-cpp diff --git a/aether-client-cpp b/aether-client-cpp deleted file mode 160000 index b9498a4..0000000 --- a/aether-client-cpp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b9498a4eccff35d7cb541e6c76133fdfbeace40d From ea52a70b475445ac8a00bb3fdadba4cb7c187a88 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Mon, 8 Jun 2026 11:35:29 +0300 Subject: [PATCH 18/23] Fixing comments. --- ulp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ulp/CMakeLists.txt b/ulp/CMakeLists.txt index ca4d612..94ce3c8 100644 --- a/ulp/CMakeLists.txt +++ b/ulp/CMakeLists.txt @@ -70,7 +70,7 @@ if(EXISTS "${ULP_BOARD_FILE}") include("${ULP_BOARD_FILE}") endif() -# Проверяем, появилось ли значение переменной BOARD после инклуда +# Checking if the BOARD variable value appears after including if(NOT "${BOARD}" STREQUAL "") message(STATUS "--------------------------------------------------") message(STATUS "ULP Project SUCCESS! Board loaded from file: ${BOARD}") From 5510419c102248c08aac40e48673af28541f8c55 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 18 Jun 2026 15:51:11 +0300 Subject: [PATCH 19/23] Migrating to the new ESP32 I2C driver. --- main/CMakeLists.txt | 17 +++++----- main/boards/aether_esp32_c6.h | 1 - main/sensors/bme688.c | 56 +++++++++++++++++++++++++++----- main/sensors/esp_main_utils.c | 42 +++++++++++++++++------- main/sensors/sht45.c | 52 ++++++++++++++++++++++++++---- main/sensors/shtc3.c | 60 +++++++++++++++++++++++++++++------ main/sensors/stcc4.c | 60 +++++++++++++++++++++++++++++------ main/sensors/utils.h | 21 +++++++++++- 8 files changed, 255 insertions(+), 54 deletions(-) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 1443ff3..ab499eb 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -65,14 +65,15 @@ else() INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/.." REQUIRES soc ulp PRIV_REQUIRES - esp_driver_tsens - esp_driver_gpio - esp_http_server - esp_event - esp_timer - esp_netif - esp_hw_support - driver) + idf::driver + idf::esp_driver_i2c + idf::esp_driver_tsens + idf::esp_driver_gpio + idf::esp_http_server + idf::esp_event + idf::esp_timer + idf::esp_netif + idf::esp_hw_support) set(TARGET_NAME "${COMPONENT_LIB}") include(../cmake/CPM.cmake) diff --git a/main/boards/aether_esp32_c6.h b/main/boards/aether_esp32_c6.h index 5a8a78b..747f69e 100644 --- a/main/boards/aether_esp32_c6.h +++ b/main/boards/aether_esp32_c6.h @@ -20,7 +20,6 @@ # error "Illegal CPU! It must be an ESP32C6." #endif -#include "hal/i2c_types.h" #include "soc/gpio_num.h" #ifndef BOARD_HAS_ULP diff --git a/main/sensors/bme688.c b/main/sensors/bme688.c index fa86717..dc9f838 100644 --- a/main/sensors/bme688.c +++ b/main/sensors/bme688.c @@ -34,21 +34,31 @@ # include "sensors/utils.h" # ifdef IS_ULP_COCPU -# define BME_I2C_NUM LP_I2C_NUM_0 +# define BME688_I2C_NUM_0 LP_I2C_NUM_0 # else -# define BME_I2C_NUM I2C_NUM_0 +# define BME688_I2C_NUM_0 I2C_NUM_0 # endif // Constants # define I2C_TRANS_TIMEOUT_CYCLES 5000 # define I2C_TRANS_WAIT_FOREVER -1 +# if ULP_COMP == 0 +static i2c_master_bus_handle_t bus_handle; +static i2c_master_dev_handle_t dev_handle_bme688; +# endif + // --- SAFER Interface Functions --- static BME68X_INTF_RET_TYPE bme_i2c_read(uint8_t reg_addr, uint8_t* reg_data, uint32_t len, void* intf_ptr) { uint8_t dev_addr = *(uint8_t*)intf_ptr; - esp_err_t err = i2c_write_read(BME_I2C_NUM, dev_addr, ®_addr, 1, reg_data, +#if ULP_COMP == 1 + esp_err_t err = i2c_write_read(BME688_I2C_NUM_0, dev_addr, ®_addr, 1, reg_data, + len, I2C_TRANS_TIMEOUT_CYCLES); +#elif ULP_COMP == 0 + esp_err_t err = i2c_write_read(dev_handle_bme688, dev_addr, ®_addr, 1, reg_data, len, I2C_TRANS_TIMEOUT_CYCLES); +#endif return (err == ESP_OK) ? BME68X_OK : BME68X_E_COM_FAIL; } @@ -66,9 +76,12 @@ static BME68X_INTF_RET_TYPE bme_i2c_write(uint8_t reg_addr, buffer[0] = reg_addr; // Safe copy memcpy(&buffer[1], reg_data, len); +#if ULP_COMP == 1 + esp_err_t err = i2c_write(BME688_I2C_NUM_0, dev_addr, buffer, len + 1, I2C_TRANS_WAIT_FOREVER); +#elif ULP_COMP == 0 + esp_err_t err = i2c_write(dev_handle_bme688, dev_addr, buffer, len + 1, I2C_TRANS_WAIT_FOREVER); +#endif - esp_err_t err = - i2c_write(BME_I2C_NUM, dev_addr, buffer, len + 1, I2C_TRANS_WAIT_FOREVER); return (err == ESP_OK) ? BME68X_OK : BME68X_E_COM_FAIL; } @@ -82,12 +95,35 @@ struct bme68x_dev bme; struct bme68x_conf conf; uint8_t dev_addr = BME68X_I2C_ADDR_LOW; -bool Init() { - // 1. INSTALL I2C DRIVER - if (i2c_init(BME_I2C_NUM, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { +bool init_i2c(uint8_t dev_addr){ +# if ULP_COMP == 1 + // 2. Install I2C driver + if (i2c_init(BME688_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + return false; + } +#elif ULP_COMP == 0 + // 2. Install I2C driver + if (i2c_init(&bus_handle, BME688_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + return false; + } + + // Configuration of a specific device on the bus + i2c_device_config_t dev_cfg_bme688 = {}; + dev_cfg_bme688.dev_addr_length = I2C_ADDR_BIT_LEN_7; + dev_cfg_bme688.device_address = BME68X_I2C_ADDR_LOW; // Address BME688 + dev_cfg_bme688.scl_speed_hz = 400000; // 400 KHz + + if(i2c_master_bus_add_device(bus_handle, &dev_cfg_bme688, &dev_handle_bme688) != ESP_OK){ return false; } +#endif + return true; +} + +bool Init() { + init_i2c(dev_addr); + // 2. Initialize BME Sensor bme.read = bme_i2c_read; bme.write = bme_i2c_write; @@ -98,6 +134,10 @@ bool Init() { if (bme68x_init(&bme) != BME68X_OK) { dev_addr = BME68X_I2C_ADDR_HIGH; // Try alternate address +#if ULP_COMP == 0 + i2c_master_bus_rm_device(dev_handle_bme688); +#endif + init_i2c(dev_addr); if (bme68x_init(&bme) != BME68X_OK) { return false; } diff --git a/main/sensors/esp_main_utils.c b/main/sensors/esp_main_utils.c index 1c79f17..b0ddb4c 100644 --- a/main/sensors/esp_main_utils.c +++ b/main/sensors/esp_main_utils.c @@ -14,20 +14,22 @@ * limitations under the License. */ -#if defined ESP_PLATFORM && !defined IS_ULP_COCPU +#include "user_config.h" + +#if defined ESP_PLATFORM && ULP_COMP == 0 # include # include -//#define I2C_LEGACY_DRIVER -# include "driver/i2c.h" +# include "driver/i2c_master.h" # include "esp_log.h" static const char *TAG_I2C = "I2C"; -esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed) { +esp_err_t i2c_init(i2c_master_bus_handle_t *bus_handle, i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed) { esp_err_t err; - i2c_config_t conf = { +# if ULP_COMP == 1 +i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = sda_pin, .scl_io_num = scl_pin, @@ -48,25 +50,41 @@ esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed) { ESP_LOGE(TAG_I2C, "Failed to install the i2c driver! Error: %s", esp_err_to_name(err)); return ESP_ERR_INVALID_STATE; } +# elif ULP_COMP == 0 + i2c_master_bus_config_t bus_cfg = {}; + bus_cfg.i2c_port = port; + bus_cfg.sda_io_num = sda_pin; + bus_cfg.scl_io_num = scl_pin; + bus_cfg.clk_source = I2C_CLK_SRC_DEFAULT; + bus_cfg.glitch_ignore_cnt = 7; + bus_cfg.intr_priority = 0; + bus_cfg.flags.enable_internal_pullup = 0; + bus_cfg.flags.allow_pd = 0; + err = i2c_new_master_bus(&bus_cfg, bus_handle); + if(err != ESP_OK){ + ESP_LOGE(TAG_I2C, "Failed to install the i2c driver! Error: %s", esp_err_to_name(err)); + return ESP_ERR_INVALID_STATE; + } +# endif + return ESP_OK; } -esp_err_t i2c_write(i2c_port_t port, uint8_t address, uint8_t const* data, +esp_err_t i2c_write(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t const* data, uint8_t len, int32_t ms_dur) { - return i2c_master_write_to_device(port, address, data, len, - ms_dur); + return i2c_master_transmit(dev_handle, data, len, ms_dur); } -esp_err_t i2c_read(i2c_port_t port, uint8_t address, uint8_t* data, uint8_t len, +esp_err_t i2c_read(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t* data, uint8_t len, int32_t ms_dur) { - return i2c_master_read_from_device(port, address, data, len, ms_dur); + return i2c_master_receive(dev_handle, data, len, ms_dur); } -esp_err_t i2c_write_read(i2c_port_t port, uint8_t address, +esp_err_t i2c_write_read(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t const* write_data, uint8_t write_len, uint8_t* read_data, uint8_t read_len, int32_t ms_dur) { - return i2c_master_write_read_device(port, address, write_data, write_len, + return i2c_master_transmit_receive(dev_handle, write_data, write_len, read_data, read_len, ms_dur); } diff --git a/main/sensors/sht45.c b/main/sensors/sht45.c index 90acf7b..2f3547a 100644 --- a/main/sensors/sht45.c +++ b/main/sensors/sht45.c @@ -43,6 +43,10 @@ // I2C Buffers static uint8_t data_wr[2]; static uint8_t data_rd[6]; +# if ULP_COMP == 0 +static i2c_master_bus_handle_t bus_handle; +static i2c_master_dev_handle_t dev_handle_sht45; +# endif #if ULP_COMP == 1 # define SHT45_I2C_NUM_0 LP_I2C_NUM_0 @@ -53,16 +57,45 @@ static uint8_t data_rd[6]; bool initialized = false; // Helper function to send an 8-bit command -static void send_command_8bit(uint8_t cmd, uint8_t slave_addr) { +static esp_err_t send_command_8bit(uint8_t cmd, uint8_t slave_addr) { data_wr[0] = cmd; - i2c_write(SHT45_I2C_NUM_0, slave_addr, data_wr, 1, LP_I2C_TRANS_WAIT_FOREVER); +#if ULP_COMP == 1 + esp_err_t err = i2c_write(SHT45_I2C_NUM_0, slave_addr, data_wr, 1, LP_I2C_TRANS_WAIT_FOREVER); +#elif ULP_COMP == 0 + esp_err_t err = i2c_write(dev_handle_sht45, slave_addr, data_wr, 1, LP_I2C_TRANS_WAIT_FOREVER); +#endif + + if (err != ESP_OK) { + // Bail and try again + return err; + } + + return ESP_OK; } bool Init() { - // 1. INSTALL I2C DRIVER +# if ULP_COMP == 1 + // 2. Install I2C driver if (i2c_init(SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { return false; } +#elif ULP_COMP == 0 + // 2. Install I2C driver + if (i2c_init(&bus_handle, SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + return false; + } + + // Configuration of a specific device on the bus + i2c_device_config_t dev_cfg_sht45 = {}; + dev_cfg_sht45.dev_addr_length = I2C_ADDR_BIT_LEN_7; + dev_cfg_sht45.device_address = SHT45_SLAVE_ADDR; // Address SHT45 + dev_cfg_sht45.scl_speed_hz = 400000; // 400 KHz + + if(i2c_master_bus_add_device(bus_handle, &dev_cfg_sht45, &dev_handle_sht45) != ESP_OK){ + return false; + } +#endif + return true; } @@ -77,14 +110,21 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, } // Send measurement command - send_command_8bit(SHT4X_CMD_MEASURE_HIGH_PRECISION, SHT45_SLAVE_ADDR); + ret = send_command_8bit(SHT4X_CMD_MEASURE_HIGH_PRECISION, SHT45_SLAVE_ADDR); + + if (ret != ESP_OK) { + return; + } // Measurement time for high precision wait_for(1100000); // 1.1 S // Read 6 bytes: temperature and humidity with CRC - ret = i2c_read(SHT45_I2C_NUM_0, SHT45_SLAVE_ADDR, data_rd, 6, - LP_I2C_TRANS_TIMEOUT_CYCLES); +#if ULP_COMP == 1 + ret = i2c_read(SHT45_I2C_NUM_0, SHT45_SLAVE_ADDR, data_rd, 6, LP_I2C_TRANS_TIMEOUT_CYCLES); +#elif ULP_COMP == 0 + ret = i2c_read(dev_handle_sht45, SHT45_SLAVE_ADDR, data_rd, 6, LP_I2C_TRANS_TIMEOUT_CYCLES); +#endif if (ret == ESP_OK) { uint16_t raw_temp = (data_rd[0] << 8) | data_rd[1]; diff --git a/main/sensors/shtc3.c b/main/sensors/shtc3.c index 15bd391..24e5e4a 100644 --- a/main/sensors/shtc3.c +++ b/main/sensors/shtc3.c @@ -40,6 +40,11 @@ // I2C Buffers static uint8_t data_wr[2]; static uint8_t data_rd[6]; +static bool initialized = false; +# if ULP_COMP == 0 +static i2c_master_bus_handle_t bus_handle; +static i2c_master_dev_handle_t dev_handle_shtc3; +# endif #ifdef IS_ULP_COCPU # define SHTC3_I2C_NUM_0 LP_I2C_NUM_0 @@ -47,31 +52,62 @@ static uint8_t data_rd[6]; # define SHTC3_I2C_NUM_0 I2C_NUM_0 #endif -bool initialized = false; // Helper function to send a 16-bit command -static void send_command_16bit(uint16_t cmd, uint8_t slave_addr) { +static esp_err_t send_command_16bit(uint16_t cmd, uint8_t slave_addr) { data_wr[0] = (cmd >> 8) & 0xFF; // High byte data_wr[1] = cmd & 0xFF; // Low byte - esp_err_t ret = i2c_write(SHTC3_I2C_NUM_0, slave_addr, data_wr, +#if ULP_COMP == 1 + esp_err_t err = i2c_write(SHTC3_I2C_NUM_0, slave_addr, data_wr, sizeof(data_wr), LP_I2C_TRANS_WAIT_FOREVER); - if (ret != ESP_OK) { +#elif ULP_COMP == 0 + esp_err_t err = i2c_write(dev_handle_shtc3, slave_addr, data_wr, + sizeof(data_wr), LP_I2C_TRANS_WAIT_FOREVER); +#endif + + if (err != ESP_OK) { // Bail and try again - return; + return err; } + + return ESP_OK; } // Helper function to send an 8-bit command static void send_command_8bit(uint8_t cmd, uint8_t slave_addr) { data_wr[0] = cmd; - i2c_write(SHTC3_I2C_NUM_0, slave_addr, data_wr, 1, LP_I2C_TRANS_WAIT_FOREVER); + #if ULP_COMP == 1 + esp_err_t err = i2c_write(SHTC3_I2C_NUM_0, slave_addr, data_wr, + 1, LP_I2C_TRANS_WAIT_FOREVER); +#elif ULP_COMP == 0 + esp_err_t err = i2c_write(dev_handle_shtc3, slave_addr, data_wr, + 1, LP_I2C_TRANS_WAIT_FOREVER); +#endif } bool Init() { - // 1. INSTALL I2C DRIVER +# if ULP_COMP == 1 + // 2. Install I2C driver if (i2c_init(SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { return false; } +#elif ULP_COMP == 0 + // 2. Install I2C driver + if (i2c_init(&bus_handle, SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + return false; + } + + // Configuration of a specific device on the bus + i2c_device_config_t dev_cfg_shtc3 = {}; + dev_cfg_shtc3.dev_addr_length = I2C_ADDR_BIT_LEN_7; + dev_cfg_shtc3.device_address = SHTC3_SLAVE_ADDR; // Address SHTC3 + dev_cfg_shtc3.scl_speed_hz = 400000; // 400 KHz + + if(i2c_master_bus_add_device(bus_handle, &dev_cfg_shtc3, &dev_handle_shtc3) != ESP_OK){ + return false; + } +#endif + return true; } @@ -97,8 +133,14 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, // Read 6 bytes: [TempMSB, TempLSB, TempCRC, HumMSB, HumLSB, HumCRC] // In this example, we ignore CRC for simplicity. - ret = i2c_read(SHTC3_I2C_NUM_0, SHTC3_SLAVE_ADDR, data_rd, - sizeof(data_rd), LP_I2C_TRANS_TIMEOUT_CYCLES); +#if ULP_COMP == 1 + ret = i2c_read(SHTC3_I2C_NUM_0, SHTC3_SLAVE_ADDR, data_rd, sizeof(data_rd), + LP_I2C_TRANS_TIMEOUT_CYCLES); +#elif ULP_COMP == 0 + ret = i2c_read(dev_handle_shtc3, SHTC3_SLAVE_ADDR, data_rd, sizeof(data_rd), + LP_I2C_TRANS_TIMEOUT_CYCLES); +#endif + if (ret == ESP_OK) { // 5. Raw values uint16_t raw_temp = (data_rd[0] << 8) | data_rd[1]; diff --git a/main/sensors/stcc4.c b/main/sensors/stcc4.c index 847009b..a4ae3b4 100644 --- a/main/sensors/stcc4.c +++ b/main/sensors/stcc4.c @@ -23,9 +23,9 @@ # include # include -# ifdef IS_ULP_COCPU +# if ULP_COMP == 1 # include "ulp_lp_core_gpio.h" -# else +# elif ULP_COMP == 0 # include "driver/gpio.h" # endif @@ -50,10 +50,15 @@ static uint8_t data_wr[2]; static uint8_t data_rd[12]; static bool initialized = false; +# if ULP_COMP == 0 +static i2c_master_bus_handle_t bus_handle; +static i2c_master_dev_handle_t dev_handle_stcc4; +# endif + -#ifdef IS_ULP_COCPU +#if ULP_COMP == 1 # define STCC4_I2C_NUM_0 LP_I2C_NUM_0 -#else +#elif ULP_COMP == 0 # define STCC4_I2C_NUM_0 I2C_NUM_0 #endif @@ -63,8 +68,14 @@ bool check_crc(const uint8_t *data, uint8_t crc); static esp_err_t send_command_16bit(uint16_t cmd, uint8_t slave_addr) { data_wr[0] = (cmd >> 8) & 0xFF; // High byte data_wr[1] = cmd & 0xFF; // Low byte +#if ULP_COMP == 1 esp_err_t err = i2c_write(STCC4_I2C_NUM_0, slave_addr, data_wr, sizeof(data_wr), LP_I2C_TRANS_WAIT_FOREVER); +#elif ULP_COMP == 0 + esp_err_t err = i2c_write(dev_handle_stcc4, slave_addr, data_wr, + sizeof(data_wr), LP_I2C_TRANS_WAIT_FOREVER); +#endif + if (err != ESP_OK) { // Bail and try again return err; @@ -76,19 +87,37 @@ static esp_err_t send_command_16bit(uint16_t cmd, uint8_t slave_addr) { bool Init() { // 1. power ON #if BOARD_HAS_PWR_ON == 1 -# ifdef IS_ULP_COCPU +# if ULP_COMP == 1 ulp_lp_core_gpio_init(LP_PWR_ON_GPIO); ulp_lp_core_gpio_output_enable(LP_PWR_ON_GPIO); ulp_lp_core_gpio_set_level(LP_PWR_ON_GPIO, 1); -# else +# elif ULP_COMP == 0 gpio_set_direction((gpio_num_t)PWR_ON_GPIO, GPIO_MODE_OUTPUT); gpio_set_level((gpio_num_t)PWR_ON_GPIO, 1); # endif #endif + +# if ULP_COMP == 1 // 2. Install I2C driver if (i2c_init(STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 100000) != ESP_OK) { return false; } +#elif ULP_COMP == 0 + // 2. Install I2C driver + if (i2c_init(&bus_handle, STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 100000) != ESP_OK) { + return false; + } + + // Configuration of a specific device on the bus + i2c_device_config_t dev_cfg_stcc4 = {}; + dev_cfg_stcc4.dev_addr_length = I2C_ADDR_BIT_LEN_7; + dev_cfg_stcc4.device_address = STCC4_SLAVE_ADDR; // Address STCC4 + dev_cfg_stcc4.scl_speed_hz = 100000; // 100 KHz + + if(i2c_master_bus_add_device(bus_handle, &dev_cfg_stcc4, &dev_handle_stcc4) != ESP_OK){ + return false; + } +#endif wait_for(125000); // 125 ms @@ -109,14 +138,22 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, initialized = Init(); } - send_command_16bit(STCC4_CMD_MEASURE_SINGLE_SHOT, STCC4_SLAVE_ADDR); + ret = send_command_16bit(STCC4_CMD_MEASURE_SINGLE_SHOT, STCC4_SLAVE_ADDR); + if (ret != ESP_OK) { + return; + } // Wait for measurement completion (according to STCC4 datasheet ~500-720ms) wait_for(500000); // 500 ms // Read 3 bytes: CO2 with CRC +#if ULP_COMP == 1 ret = i2c_read(STCC4_I2C_NUM_0, STCC4_SLAVE_ADDR, data_rd, sizeof(data_rd), LP_I2C_TRANS_WAIT_FOREVER); +#elif ULP_COMP == 0 + ret = i2c_read(dev_handle_stcc4, STCC4_SLAVE_ADDR, data_rd, sizeof(data_rd), + LP_I2C_TRANS_WAIT_FOREVER); +#endif if (ret != ESP_OK) { return; @@ -136,10 +173,12 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, // Read Temperature // Checking CRC +#if ULP_COMP == 0 if (!check_crc(&data_rd[3], data_rd[5])) { return; } - +#endif + // Temperature: T = -45 + 175 * raw_temp / 65535 tmp = (data_rd[3] << 8) | data_rd[4]; int32_t temp_x100 = (17500ULL * tmp) / 65535 - 4500; @@ -149,9 +188,11 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, // Read Humidity // Checking CRC +#if ULP_COMP == 0 if (!check_crc(&data_rd[6], data_rd[8])) { return; } +#endif // Humidity: RH = 100 * raw_hum / 65535 tmp = (data_rd[6] << 8) | data_rd[7]; @@ -167,7 +208,7 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, } bool check_crc(const uint8_t *data, uint8_t crc) { - // CRC-8 алгоритм для Sensirion (полином 0x31, начальное значение 0xFF) + // CRC-8 algorithm for Sensirion (polynomial 0x31, initial value 0xFF) uint8_t crc_calc = 0xFF; for (int i = 0; i < 2; i++) { crc_calc ^= data[i]; @@ -182,5 +223,6 @@ bool check_crc(const uint8_t *data, uint8_t crc) { return (crc_calc == crc); } + #endif #endif diff --git a/main/sensors/utils.h b/main/sensors/utils.h index 82255a7..e019b6c 100644 --- a/main/sensors/utils.h +++ b/main/sensors/utils.h @@ -16,14 +16,21 @@ #if defined ESP_PLATFORM +#include "user_config.h" + # include -# include # include +# if ULP_COMP == 1 +# include +# else +# include +# endif # ifdef __cplusplus extern "C" { # endif +# if ULP_COMP == 1 esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed); esp_err_t i2c_write(i2c_port_t port, uint8_t address, uint8_t const* data, @@ -33,6 +40,18 @@ esp_err_t i2c_read(i2c_port_t port, uint8_t address, uint8_t* data, uint8_t len, esp_err_t i2c_write_read(i2c_port_t port, uint8_t address, uint8_t const* write_data, uint8_t write_len, uint8_t* read_data, uint8_t read_len, int32_t ms_dur); +# else +esp_err_t i2c_init(i2c_master_bus_handle_t *bus_handle, i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed); + +esp_err_t i2c_write(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t const* data, + uint8_t len, int32_t ms_dur); +esp_err_t i2c_read(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t* data, uint8_t len, + int32_t ms_dur); +esp_err_t i2c_write_read(i2c_master_dev_handle_t dev_handle, uint8_t address, + uint8_t const* write_data, uint8_t write_len, + uint8_t* read_data, uint8_t read_len, int32_t ms_dur); +# endif + void wait_for(int32_t us_dur); # ifdef __cplusplus From 67c5bebb30f9ba1f65713da47f600713c23f9017 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Thu, 25 Jun 2026 11:25:10 +0300 Subject: [PATCH 20/23] Updating STCC4 ULP code. --- main/boards/aether_esp32_c6.h | 11 ++++++----- main/sensors/esp_main_utils.c | 28 +++------------------------- main/sensors/ulp_saved_val.c | 4 ++++ main/sensors/ulp_utils.c | 2 +- main/sleeping/ulp_sleep.cpp | 6 +++--- 5 files changed, 17 insertions(+), 34 deletions(-) diff --git a/main/boards/aether_esp32_c6.h b/main/boards/aether_esp32_c6.h index 747f69e..bc92e41 100644 --- a/main/boards/aether_esp32_c6.h +++ b/main/boards/aether_esp32_c6.h @@ -32,11 +32,12 @@ # define BOARD_HAS_PWR_ON 1 #endif #ifndef STATUS_LED_PIN -# define STATUS_LED_PIN GPIO_NUM_7 +# define STATUS_LED_ON_PIN GPIO_NUM_17 +# define STATUS_LED_PIN GPIO_NUM_18 #endif #ifndef PWR_ON_GPIO -# define PWR_ON_GPIO GPIO_NUM_14 -# define LP_PWR_ON_GPIO LP_IO_NUM_4 +# define PWR_ON_GPIO GPIO_NUM_2 +# define LP_PWR_ON_GPIO LP_IO_NUM_2 #endif #ifndef RESET_BUTTON_PIN # define RESET_BUTTON_PIN GPIO_NUM_9 @@ -47,8 +48,8 @@ #define BOARD_HAS_STCC4 1 #define BOARD_HAS_BME688 0 // --- Hardware Settings --- -#define SENSOR_SDA_PIN GPIO_NUM_19 -#define SENSOR_SCL_PIN GPIO_NUM_18 +#define SENSOR_SDA_PIN GPIO_NUM_6 +#define SENSOR_SCL_PIN GPIO_NUM_7 // FIX 1: Use a Fixed Buffer instead of VLA (Variable Length Array) to prevent // stack smash #define MAX_I2C_BUFFER 64 diff --git a/main/sensors/esp_main_utils.c b/main/sensors/esp_main_utils.c index b0ddb4c..caf05eb 100644 --- a/main/sensors/esp_main_utils.c +++ b/main/sensors/esp_main_utils.c @@ -28,30 +28,9 @@ static const char *TAG_I2C = "I2C"; esp_err_t i2c_init(i2c_master_bus_handle_t *bus_handle, i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed) { esp_err_t err; -# if ULP_COMP == 1 -i2c_config_t conf = { - .mode = I2C_MODE_MASTER, - .sda_io_num = sda_pin, - .scl_io_num = scl_pin, - .sda_pullup_en = GPIO_PULLUP_DISABLE, - .scl_pullup_en = GPIO_PULLUP_DISABLE, - .master = {.clk_speed = i2c_speed}, - .clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL, - }; - ESP_LOGI(TAG_I2C, "Init i2c"); - port = I2C_NUM_0; - err = i2c_param_config(port, &conf); - if (err != ESP_OK) { - ESP_LOGE(TAG_I2C, "Failed to configure I2C! Error: %s", esp_err_to_name(err)); - return ESP_ERR_INVALID_STATE; - } - err = i2c_driver_install(port, conf.mode, 0, 0, 0); - if (err != ESP_OK) { - ESP_LOGE(TAG_I2C, "Failed to install the i2c driver! Error: %s", esp_err_to_name(err)); - return ESP_ERR_INVALID_STATE; - } -# elif ULP_COMP == 0 i2c_master_bus_config_t bus_cfg = {}; + + ESP_LOGI(TAG_I2C, "Init ESP i2c"); bus_cfg.i2c_port = port; bus_cfg.sda_io_num = sda_pin; bus_cfg.scl_io_num = scl_pin; @@ -66,8 +45,7 @@ i2c_config_t conf = { ESP_LOGE(TAG_I2C, "Failed to install the i2c driver! Error: %s", esp_err_to_name(err)); return ESP_ERR_INVALID_STATE; } -# endif - + return ESP_OK; } diff --git a/main/sensors/ulp_saved_val.c b/main/sensors/ulp_saved_val.c index 0368190..c42af12 100644 --- a/main/sensors/ulp_saved_val.c +++ b/main/sensors/ulp_saved_val.c @@ -26,6 +26,10 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, uint32_t* co2, uint32_t* gas_resistance) { printf(" >>> ULP Temperature: [%d]\n", (int16_t)ulp_temperature); + printf(" >>> ULP Humidity: [%d]\n", (int16_t)ulp_humidity); + printf(" >>> ULP Pressure: [%d]\n", (int16_t)ulp_pressure); + printf(" >>> ULP Co2: [%d]\n", (int16_t)ulp_co2); + printf(" >>> ULP Gas_resistance: [%d]\n", (int16_t)ulp_gas_resistance); if (temperature) { *temperature = (int16_t)ulp_temperature; diff --git a/main/sensors/ulp_utils.c b/main/sensors/ulp_utils.c index 3319568..9e2394b 100644 --- a/main/sensors/ulp_utils.c +++ b/main/sensors/ulp_utils.c @@ -16,7 +16,7 @@ #include "user_config.h" -#if ULP_COMP == 1 +#if defined ESP_PLATFORM && ULP_COMP == 1 # include "utils.h" diff --git a/main/sleeping/ulp_sleep.cpp b/main/sleeping/ulp_sleep.cpp index 303178d..bcfcacc 100644 --- a/main/sleeping/ulp_sleep.cpp +++ b/main/sleeping/ulp_sleep.cpp @@ -73,12 +73,12 @@ static void lp_i2c_init(void) { lp_core_i2c_cfg_t i2c_cfg{}; lp_core_i2c_timing_cfg_t i2c_timing_cfg{}; - i2c_timing_cfg.clk_speed_hz = 100000; + i2c_timing_cfg.clk_speed_hz = 400000; i2c_cfg.i2c_pin_cfg.sda_io_num = LP_I2C_SDA_IO; i2c_cfg.i2c_pin_cfg.scl_io_num = LP_I2C_SCL_IO; - i2c_cfg.i2c_pin_cfg.sda_pullup_en = true; - i2c_cfg.i2c_pin_cfg.scl_pullup_en = true; + i2c_cfg.i2c_pin_cfg.sda_pullup_en = false; + i2c_cfg.i2c_pin_cfg.scl_pullup_en = false; i2c_cfg.i2c_timing_cfg = i2c_timing_cfg; i2c_cfg.i2c_src_clk = LP_I2C_SCLK_LP_FAST; From 8acaaa89977938b1f327875c35b2ba40b85a19ff Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Mon, 29 Jun 2026 14:20:33 +0300 Subject: [PATCH 21/23] Updating I2C speed. --- main/sensors/stcc4.c | 11 ++++++----- main/sleeping/ulp_sleep.cpp | 4 +++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/main/sensors/stcc4.c b/main/sensors/stcc4.c index a4ae3b4..c4f2117 100644 --- a/main/sensors/stcc4.c +++ b/main/sensors/stcc4.c @@ -45,6 +45,7 @@ // Constants # define LP_I2C_TRANS_TIMEOUT_CYCLES 5000 # define LP_I2C_TRANS_WAIT_FOREVER -1 +# define I2C_BUS_SPEED 100000 // 100 KHz // I2C Buffers static uint8_t data_wr[2]; @@ -99,20 +100,20 @@ bool Init() { # if ULP_COMP == 1 // 2. Install I2C driver - if (i2c_init(STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 100000) != ESP_OK) { + if (i2c_init(STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } #elif ULP_COMP == 0 // 2. Install I2C driver - if (i2c_init(&bus_handle, STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 100000) != ESP_OK) { + if (i2c_init(&bus_handle, STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } // Configuration of a specific device on the bus i2c_device_config_t dev_cfg_stcc4 = {}; dev_cfg_stcc4.dev_addr_length = I2C_ADDR_BIT_LEN_7; - dev_cfg_stcc4.device_address = STCC4_SLAVE_ADDR; // Address STCC4 - dev_cfg_stcc4.scl_speed_hz = 100000; // 100 KHz + dev_cfg_stcc4.device_address = STCC4_SLAVE_ADDR; + dev_cfg_stcc4.scl_speed_hz = I2C_BUS_SPEED; if(i2c_master_bus_add_device(bus_handle, &dev_cfg_stcc4, &dev_handle_stcc4) != ESP_OK){ return false; @@ -144,7 +145,7 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, return; } // Wait for measurement completion (according to STCC4 datasheet ~500-720ms) - wait_for(500000); // 500 ms + wait_for(750000); // 750 ms // Read 3 bytes: CO2 with CRC #if ULP_COMP == 1 diff --git a/main/sleeping/ulp_sleep.cpp b/main/sleeping/ulp_sleep.cpp index bcfcacc..5e1c08b 100644 --- a/main/sleeping/ulp_sleep.cpp +++ b/main/sleeping/ulp_sleep.cpp @@ -33,6 +33,8 @@ # include # include "ulp_main.h" +# define I2C_BUS_SPEED 100000 // 100 KHz + extern const uint8_t ulp_main_bin_start[] asm("_binary_ulp_main_bin_start"); extern const uint8_t ulp_main_bin_end[] asm("_binary_ulp_main_bin_end"); @@ -73,7 +75,7 @@ static void lp_i2c_init(void) { lp_core_i2c_cfg_t i2c_cfg{}; lp_core_i2c_timing_cfg_t i2c_timing_cfg{}; - i2c_timing_cfg.clk_speed_hz = 400000; + i2c_timing_cfg.clk_speed_hz = I2C_BUS_SPEED; i2c_cfg.i2c_pin_cfg.sda_io_num = LP_I2C_SDA_IO; i2c_cfg.i2c_pin_cfg.scl_io_num = LP_I2C_SCL_IO; From b6a0cab8ebef9450f12620c060720ebc3a5cc1e3 Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Tue, 30 Jun 2026 13:00:34 +0300 Subject: [PATCH 22/23] Fixing issues based on the results of review. --- .gitignore | 6 ------ main/controller.cpp | 5 ++--- main/sensors/bme688.c | 7 ++++--- main/sensors/esp_main_utils.c | 16 ++++++++-------- main/sensors/sht45.c | 7 ++++--- main/sensors/shtc3.c | 7 ++++--- main/sensors/stcc4.c | 2 +- main/sensors/ulp_utils.c | 14 +++++++------- main/sensors/utils.h | 21 +++++++++++++++++---- 9 files changed, 47 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index c20d5b2..ec8c6ab 100644 --- a/.gitignore +++ b/.gitignore @@ -3,12 +3,6 @@ sdkconfig* # Build directory build/ -build*/**.cmake -build*/**.xcodeproj -build*/**/CMakeCache.txt -build*/**/CMakeFiles -build*/**/CMakeScripts -build*/**/Debug # IDE directory .pio diff --git a/main/controller.cpp b/main/controller.cpp index 400911d..9e753b5 100644 --- a/main/controller.cpp +++ b/main/controller.cpp @@ -158,9 +158,8 @@ void UpdateSensors() { std::uint32_t humidity = {}; std::uint32_t co2 = {}; ReadSensors(&temperature, &humidity, nullptr, &co2, nullptr); - std::cout << ae::Format(" >>> Temperature: [{}]\n", temperature); - std::cout << ae::Format(" >>> Humidity: [{}]\n", humidity); - std::cout << ae::Format(" >>> Co2: [{}]\n", co2); + std::cout << ae::Format(" >>> Temperature: [{}], Humidity: [{}], CO2: [{}]\n", + temperature, humidity, co2); // TODO: add check if wakeup cause is ulp then send value SendValue(temperature); } diff --git a/main/sensors/bme688.c b/main/sensors/bme688.c index dc9f838..0d509da 100644 --- a/main/sensors/bme688.c +++ b/main/sensors/bme688.c @@ -42,6 +42,7 @@ // Constants # define I2C_TRANS_TIMEOUT_CYCLES 5000 # define I2C_TRANS_WAIT_FOREVER -1 +# define I2C_BUS_SPEED 400000 // 400 KHz # if ULP_COMP == 0 static i2c_master_bus_handle_t bus_handle; @@ -98,12 +99,12 @@ uint8_t dev_addr = BME68X_I2C_ADDR_LOW; bool init_i2c(uint8_t dev_addr){ # if ULP_COMP == 1 // 2. Install I2C driver - if (i2c_init(BME688_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + if (i2c_init(0, BME688_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } #elif ULP_COMP == 0 // 2. Install I2C driver - if (i2c_init(&bus_handle, BME688_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + if (i2c_init(&bus_handle, BME688_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } @@ -111,7 +112,7 @@ bool init_i2c(uint8_t dev_addr){ i2c_device_config_t dev_cfg_bme688 = {}; dev_cfg_bme688.dev_addr_length = I2C_ADDR_BIT_LEN_7; dev_cfg_bme688.device_address = BME68X_I2C_ADDR_LOW; // Address BME688 - dev_cfg_bme688.scl_speed_hz = 400000; // 400 KHz + dev_cfg_bme688.scl_speed_hz = I2C_BUS_SPEED; if(i2c_master_bus_add_device(bus_handle, &dev_cfg_bme688, &dev_handle_bme688) != ESP_OK){ return false; diff --git a/main/sensors/esp_main_utils.c b/main/sensors/esp_main_utils.c index caf05eb..850d998 100644 --- a/main/sensors/esp_main_utils.c +++ b/main/sensors/esp_main_utils.c @@ -25,13 +25,13 @@ static const char *TAG_I2C = "I2C"; -esp_err_t i2c_init(i2c_master_bus_handle_t *bus_handle, i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed) { +esp_err_t i2c_init(i2c_master_bus_handle_t *bus_handle, i2c_port_t i2c_handle_port, int sda_pin, int scl_pin, int i2c_speed) { esp_err_t err; i2c_master_bus_config_t bus_cfg = {}; ESP_LOGI(TAG_I2C, "Init ESP i2c"); - bus_cfg.i2c_port = port; + bus_cfg.i2c_port = i2c_handle_port; bus_cfg.sda_io_num = sda_pin; bus_cfg.scl_io_num = scl_pin; bus_cfg.clk_source = I2C_CLK_SRC_DEFAULT; @@ -49,20 +49,20 @@ esp_err_t i2c_init(i2c_master_bus_handle_t *bus_handle, i2c_port_t port, int sda return ESP_OK; } -esp_err_t i2c_write(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t const* data, +esp_err_t i2c_write(i2c_master_bus_handle_t *bus_handle, i2c_master_dev_handle_t i2c_handle_port, uint8_t address, uint8_t const* data, uint8_t len, int32_t ms_dur) { - return i2c_master_transmit(dev_handle, data, len, ms_dur); + return i2c_master_transmit(i2c_handle_port, data, len, ms_dur); } -esp_err_t i2c_read(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t* data, uint8_t len, +esp_err_t i2c_read(i2c_master_bus_handle_t *bus_handle, i2c_master_dev_handle_t i2c_handle_port, uint8_t address, uint8_t* data, uint8_t len, int32_t ms_dur) { - return i2c_master_receive(dev_handle, data, len, ms_dur); + return i2c_master_receive(i2c_handle_port, data, len, ms_dur); } -esp_err_t i2c_write_read(i2c_master_dev_handle_t dev_handle, uint8_t address, +esp_err_t i2c_write_read(i2c_master_bus_handle_t *bus_handle, i2c_master_dev_handle_t i2c_handle_port, uint8_t address, uint8_t const* write_data, uint8_t write_len, uint8_t* read_data, uint8_t read_len, int32_t ms_dur) { - return i2c_master_transmit_receive(dev_handle, write_data, write_len, + return i2c_master_transmit_receive(i2c_handle_port, write_data, write_len, read_data, read_len, ms_dur); } diff --git a/main/sensors/sht45.c b/main/sensors/sht45.c index 2f3547a..51df23a 100644 --- a/main/sensors/sht45.c +++ b/main/sensors/sht45.c @@ -39,6 +39,7 @@ // Constants # define LP_I2C_TRANS_TIMEOUT_CYCLES 5000 # define LP_I2C_TRANS_WAIT_FOREVER -1 +# define I2C_BUS_SPEED 400000 // 400 KHz // I2C Buffers static uint8_t data_wr[2]; @@ -76,12 +77,12 @@ static esp_err_t send_command_8bit(uint8_t cmd, uint8_t slave_addr) { bool Init() { # if ULP_COMP == 1 // 2. Install I2C driver - if (i2c_init(SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + if (i2c_init(0, SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } #elif ULP_COMP == 0 // 2. Install I2C driver - if (i2c_init(&bus_handle, SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + if (i2c_init(&bus_handle, SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } @@ -89,7 +90,7 @@ bool Init() { i2c_device_config_t dev_cfg_sht45 = {}; dev_cfg_sht45.dev_addr_length = I2C_ADDR_BIT_LEN_7; dev_cfg_sht45.device_address = SHT45_SLAVE_ADDR; // Address SHT45 - dev_cfg_sht45.scl_speed_hz = 400000; // 400 KHz + dev_cfg_sht45.scl_speed_hz = I2C_BUS_SPEED; if(i2c_master_bus_add_device(bus_handle, &dev_cfg_sht45, &dev_handle_sht45) != ESP_OK){ return false; diff --git a/main/sensors/shtc3.c b/main/sensors/shtc3.c index 24e5e4a..f5fa6fb 100644 --- a/main/sensors/shtc3.c +++ b/main/sensors/shtc3.c @@ -36,6 +36,7 @@ // Constants # define LP_I2C_TRANS_TIMEOUT_CYCLES 5000 # define LP_I2C_TRANS_WAIT_FOREVER -1 +# define I2C_BUS_SPEED 400000 // 400 KHz // I2C Buffers static uint8_t data_wr[2]; @@ -88,12 +89,12 @@ static void send_command_8bit(uint8_t cmd, uint8_t slave_addr) { bool Init() { # if ULP_COMP == 1 // 2. Install I2C driver - if (i2c_init(SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + if (i2c_init(0, SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } #elif ULP_COMP == 0 // 2. Install I2C driver - if (i2c_init(&bus_handle, SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, 400000) != ESP_OK) { + if (i2c_init(&bus_handle, SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } @@ -101,7 +102,7 @@ bool Init() { i2c_device_config_t dev_cfg_shtc3 = {}; dev_cfg_shtc3.dev_addr_length = I2C_ADDR_BIT_LEN_7; dev_cfg_shtc3.device_address = SHTC3_SLAVE_ADDR; // Address SHTC3 - dev_cfg_shtc3.scl_speed_hz = 400000; // 400 KHz + dev_cfg_shtc3.scl_speed_hz = I2C_BUS_SPEED; if(i2c_master_bus_add_device(bus_handle, &dev_cfg_shtc3, &dev_handle_shtc3) != ESP_OK){ return false; diff --git a/main/sensors/stcc4.c b/main/sensors/stcc4.c index c4f2117..f8752ef 100644 --- a/main/sensors/stcc4.c +++ b/main/sensors/stcc4.c @@ -100,7 +100,7 @@ bool Init() { # if ULP_COMP == 1 // 2. Install I2C driver - if (i2c_init(STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { + if (i2c_init(0, STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } #elif ULP_COMP == 0 diff --git a/main/sensors/ulp_utils.c b/main/sensors/ulp_utils.c index 9e2394b..7b237c1 100644 --- a/main/sensors/ulp_utils.c +++ b/main/sensors/ulp_utils.c @@ -24,23 +24,23 @@ # include "ulp_lp_core_i2c.h" # include "ulp_lp_core_utils.h" -esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed) { return ESP_OK; } +esp_err_t i2c_init(int /*bus_handle*/, i2c_port_t i2c_handle_port, int sda_pin, int scl_pin, int i2c_speed) { return ESP_OK; } -esp_err_t i2c_write(i2c_port_t port, uint8_t address, uint8_t const* data, +esp_err_t i2c_write(i2c_port_t i2c_handle_port, uint8_t address, uint8_t const* data, uint8_t len, int32_t ms_dur) { - return lp_core_i2c_master_write_to_device(port, address, data, len, ms_dur); + return lp_core_i2c_master_write_to_device(i2c_handle_port, address, data, len, ms_dur); } -esp_err_t i2c_read(i2c_port_t port, uint8_t address, uint8_t* data, uint8_t len, +esp_err_t i2c_read(i2c_port_t i2c_handle_port, uint8_t address, uint8_t* data, uint8_t len, int32_t ms_dur) { - return lp_core_i2c_master_read_from_device(port, address, data, len, ms_dur); + return lp_core_i2c_master_read_from_device(i2c_handle_port, address, data, len, ms_dur); } -esp_err_t i2c_write_read(i2c_port_t port, uint8_t address, +esp_err_t i2c_write_read(i2c_port_t i2c_handle_port, uint8_t address, uint8_t const* write_data, uint8_t write_len, uint8_t* read_data, uint8_t read_len, int32_t ms_dur) { return lp_core_i2c_master_write_read_device( - port, address, write_data, write_len, read_data, read_len, ms_dur); + i2c_handle_port, address, write_data, write_len, read_data, read_len, ms_dur); } void wait_for(int32_t us_dur) { ulp_lp_core_delay_us(us_dur); } diff --git a/main/sensors/utils.h b/main/sensors/utils.h index e019b6c..b90bb22 100644 --- a/main/sensors/utils.h +++ b/main/sensors/utils.h @@ -22,15 +22,28 @@ # include # if ULP_COMP == 1 # include -# else +# define I2C_BUS_HANDLE int +# define I2C_HANDLE_PORT i2c_port_t +# elif ULP_COMP == 0 # include +# define I2C_BUS_HANDLE i2c_master_bus_handle_t* +# define I2C_HANDLE_PORT i2c_master_dev_handle_t # endif # ifdef __cplusplus extern "C" { # endif -# if ULP_COMP == 1 +esp_err_t i2c_init(I2C_BUS_HANDLE bus_handle, I2C_HANDLE_PORT i2c_handle_port, int sda_pin, int scl_pin, int i2c_speed); + +esp_err_t i2c_write(I2C_HANDLE_PORT i2c_handle_port, uint8_t address, uint8_t const* data, + uint8_t len, int32_t ms_dur); +esp_err_t i2c_read(I2C_HANDLE_PORT i2c_handle_port, uint8_t address, uint8_t* data, uint8_t len, + int32_t ms_dur); +esp_err_t i2c_write_read(I2C_HANDLE_PORT i2c_handle_port, uint8_t address, + uint8_t const* write_data, uint8_t write_len, + uint8_t* read_data, uint8_t read_len, int32_t ms_dur); +/*# if ULP_COMP == 1 esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed); esp_err_t i2c_write(i2c_port_t port, uint8_t address, uint8_t const* data, @@ -40,7 +53,7 @@ esp_err_t i2c_read(i2c_port_t port, uint8_t address, uint8_t* data, uint8_t len, esp_err_t i2c_write_read(i2c_port_t port, uint8_t address, uint8_t const* write_data, uint8_t write_len, uint8_t* read_data, uint8_t read_len, int32_t ms_dur); -# else +# elif ULP_COMP == 0 esp_err_t i2c_init(i2c_master_bus_handle_t *bus_handle, i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed); esp_err_t i2c_write(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t const* data, @@ -50,7 +63,7 @@ esp_err_t i2c_read(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t* esp_err_t i2c_write_read(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t const* write_data, uint8_t write_len, uint8_t* read_data, uint8_t read_len, int32_t ms_dur); -# endif +# endif*/ void wait_for(int32_t us_dur); From cef2dec949c1717224fa81bc2de847881b81972b Mon Sep 17 00:00:00 2001 From: Kiryanov D V Date: Tue, 30 Jun 2026 14:23:17 +0300 Subject: [PATCH 23/23] Removing some unnecessary preprocessor directives. --- main/sensors/bme688.c | 45 ++++++++++++++++++------------------------- main/sensors/sht45.c | 29 ++++++++++------------------ main/sensors/shtc3.c | 45 ++++++++++++------------------------------- main/sensors/stcc4.c | 28 +++++++++------------------ main/sensors/utils.h | 21 -------------------- 5 files changed, 50 insertions(+), 118 deletions(-) diff --git a/main/sensors/bme688.c b/main/sensors/bme688.c index 0d509da..84cc6bb 100644 --- a/main/sensors/bme688.c +++ b/main/sensors/bme688.c @@ -33,10 +33,19 @@ # include "sensors/sensors.h" # include "sensors/utils.h" -# ifdef IS_ULP_COCPU +# if ULP_COMP == 0 +static i2c_master_bus_handle_t bus_handle; +static i2c_master_dev_handle_t dev_handle_bme688; +# endif + +# if ULP_COMP == 1 # define BME688_I2C_NUM_0 LP_I2C_NUM_0 -# else +# define I2C_BUS_HANDLE_S 0 +# define I2C_HANDLE_PORT_S BME688_I2C_NUM_0 +# elif ULP_COMP == 0 # define BME688_I2C_NUM_0 I2C_NUM_0 +# define I2C_BUS_HANDLE_S &bus_handle +# define I2C_HANDLE_PORT_S dev_handle_bme688 # endif // Constants @@ -44,22 +53,14 @@ # define I2C_TRANS_WAIT_FOREVER -1 # define I2C_BUS_SPEED 400000 // 400 KHz -# if ULP_COMP == 0 -static i2c_master_bus_handle_t bus_handle; -static i2c_master_dev_handle_t dev_handle_bme688; -# endif - // --- SAFER Interface Functions --- static BME68X_INTF_RET_TYPE bme_i2c_read(uint8_t reg_addr, uint8_t* reg_data, uint32_t len, void* intf_ptr) { uint8_t dev_addr = *(uint8_t*)intf_ptr; -#if ULP_COMP == 1 - esp_err_t err = i2c_write_read(BME688_I2C_NUM_0, dev_addr, ®_addr, 1, reg_data, - len, I2C_TRANS_TIMEOUT_CYCLES); -#elif ULP_COMP == 0 - esp_err_t err = i2c_write_read(dev_handle_bme688, dev_addr, ®_addr, 1, reg_data, + + esp_err_t err = i2c_write_read(I2C_HANDLE_PORT_S, dev_addr, ®_addr, 1, reg_data, len, I2C_TRANS_TIMEOUT_CYCLES); -#endif + return (err == ESP_OK) ? BME68X_OK : BME68X_E_COM_FAIL; } @@ -77,11 +78,8 @@ static BME68X_INTF_RET_TYPE bme_i2c_write(uint8_t reg_addr, buffer[0] = reg_addr; // Safe copy memcpy(&buffer[1], reg_data, len); -#if ULP_COMP == 1 - esp_err_t err = i2c_write(BME688_I2C_NUM_0, dev_addr, buffer, len + 1, I2C_TRANS_WAIT_FOREVER); -#elif ULP_COMP == 0 - esp_err_t err = i2c_write(dev_handle_bme688, dev_addr, buffer, len + 1, I2C_TRANS_WAIT_FOREVER); -#endif + + esp_err_t err = i2c_write(I2C_HANDLE_PORT_S, dev_addr, buffer, len + 1, I2C_TRANS_WAIT_FOREVER); return (err == ESP_OK) ? BME68X_OK : BME68X_E_COM_FAIL; } @@ -97,21 +95,16 @@ struct bme68x_conf conf; uint8_t dev_addr = BME68X_I2C_ADDR_LOW; bool init_i2c(uint8_t dev_addr){ -# if ULP_COMP == 1 // 2. Install I2C driver - if (i2c_init(0, BME688_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { - return false; - } -#elif ULP_COMP == 0 - // 2. Install I2C driver - if (i2c_init(&bus_handle, BME688_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { + if (i2c_init(I2C_BUS_HANDLE_S, BME688_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } +#if ULP_COMP == 0 // Configuration of a specific device on the bus i2c_device_config_t dev_cfg_bme688 = {}; dev_cfg_bme688.dev_addr_length = I2C_ADDR_BIT_LEN_7; - dev_cfg_bme688.device_address = BME68X_I2C_ADDR_LOW; // Address BME688 + dev_cfg_bme688.device_address = dev_addr; // Address BME688 dev_cfg_bme688.scl_speed_hz = I2C_BUS_SPEED; if(i2c_master_bus_add_device(bus_handle, &dev_cfg_bme688, &dev_handle_bme688) != ESP_OK){ diff --git a/main/sensors/sht45.c b/main/sensors/sht45.c index 51df23a..81eb773 100644 --- a/main/sensors/sht45.c +++ b/main/sensors/sht45.c @@ -51,8 +51,12 @@ static i2c_master_dev_handle_t dev_handle_sht45; #if ULP_COMP == 1 # define SHT45_I2C_NUM_0 LP_I2C_NUM_0 -#else +# define I2C_BUS_HANDLE_S 0 +# define I2C_HANDLE_PORT_S SHT45_I2C_NUM_0 +#elif ULP_COMP == 0 # define SHT45_I2C_NUM_0 I2C_NUM_0 +# define I2C_BUS_HANDLE_S &bus_handle +# define I2C_HANDLE_PORT_S dev_handle_sht45 #endif bool initialized = false; @@ -60,11 +64,8 @@ bool initialized = false; // Helper function to send an 8-bit command static esp_err_t send_command_8bit(uint8_t cmd, uint8_t slave_addr) { data_wr[0] = cmd; -#if ULP_COMP == 1 - esp_err_t err = i2c_write(SHT45_I2C_NUM_0, slave_addr, data_wr, 1, LP_I2C_TRANS_WAIT_FOREVER); -#elif ULP_COMP == 0 - esp_err_t err = i2c_write(dev_handle_sht45, slave_addr, data_wr, 1, LP_I2C_TRANS_WAIT_FOREVER); -#endif + + esp_err_t err = i2c_write(I2C_HANDLE_PORT_S, slave_addr, data_wr, 1, LP_I2C_TRANS_WAIT_FOREVER); if (err != ESP_OK) { // Bail and try again @@ -75,17 +76,11 @@ static esp_err_t send_command_8bit(uint8_t cmd, uint8_t slave_addr) { } bool Init() { -# if ULP_COMP == 1 // 2. Install I2C driver - if (i2c_init(0, SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { + if (i2c_init(I2C_BUS_HANDLE_S, SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } -#elif ULP_COMP == 0 - // 2. Install I2C driver - if (i2c_init(&bus_handle, SHT45_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { - return false; - } - +#if ULP_COMP == 0 // Configuration of a specific device on the bus i2c_device_config_t dev_cfg_sht45 = {}; dev_cfg_sht45.dev_addr_length = I2C_ADDR_BIT_LEN_7; @@ -121,11 +116,7 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, wait_for(1100000); // 1.1 S // Read 6 bytes: temperature and humidity with CRC -#if ULP_COMP == 1 - ret = i2c_read(SHT45_I2C_NUM_0, SHT45_SLAVE_ADDR, data_rd, 6, LP_I2C_TRANS_TIMEOUT_CYCLES); -#elif ULP_COMP == 0 - ret = i2c_read(dev_handle_sht45, SHT45_SLAVE_ADDR, data_rd, 6, LP_I2C_TRANS_TIMEOUT_CYCLES); -#endif + ret = i2c_read(I2C_HANDLE_PORT_S, SHT45_SLAVE_ADDR, data_rd, 6, LP_I2C_TRANS_TIMEOUT_CYCLES); if (ret == ESP_OK) { uint16_t raw_temp = (data_rd[0] << 8) | data_rd[1]; diff --git a/main/sensors/shtc3.c b/main/sensors/shtc3.c index f5fa6fb..1db2027 100644 --- a/main/sensors/shtc3.c +++ b/main/sensors/shtc3.c @@ -47,10 +47,14 @@ static i2c_master_bus_handle_t bus_handle; static i2c_master_dev_handle_t dev_handle_shtc3; # endif -#ifdef IS_ULP_COCPU +#if ULP_COMP == 1 # define SHTC3_I2C_NUM_0 LP_I2C_NUM_0 -#else +# define I2C_BUS_HANDLE_S 0 +# define I2C_HANDLE_PORT_S HTC3_I2C_NUM_0 +#elif ULP_COMP == 0 # define SHTC3_I2C_NUM_0 I2C_NUM_0 +# define I2C_BUS_HANDLE_S &bus_handle +# define I2C_HANDLE_PORT_S dev_handle_shtc3 #endif @@ -58,13 +62,9 @@ static i2c_master_dev_handle_t dev_handle_shtc3; static esp_err_t send_command_16bit(uint16_t cmd, uint8_t slave_addr) { data_wr[0] = (cmd >> 8) & 0xFF; // High byte data_wr[1] = cmd & 0xFF; // Low byte -#if ULP_COMP == 1 - esp_err_t err = i2c_write(SHTC3_I2C_NUM_0, slave_addr, data_wr, - sizeof(data_wr), LP_I2C_TRANS_WAIT_FOREVER); -#elif ULP_COMP == 0 - esp_err_t err = i2c_write(dev_handle_shtc3, slave_addr, data_wr, + + esp_err_t err = i2c_write(I2C_HANDLE_PORT_S, slave_addr, data_wr, sizeof(data_wr), LP_I2C_TRANS_WAIT_FOREVER); -#endif if (err != ESP_OK) { // Bail and try again @@ -74,30 +74,14 @@ static esp_err_t send_command_16bit(uint16_t cmd, uint8_t slave_addr) { return ESP_OK; } -// Helper function to send an 8-bit command -static void send_command_8bit(uint8_t cmd, uint8_t slave_addr) { - data_wr[0] = cmd; - #if ULP_COMP == 1 - esp_err_t err = i2c_write(SHTC3_I2C_NUM_0, slave_addr, data_wr, - 1, LP_I2C_TRANS_WAIT_FOREVER); -#elif ULP_COMP == 0 - esp_err_t err = i2c_write(dev_handle_shtc3, slave_addr, data_wr, - 1, LP_I2C_TRANS_WAIT_FOREVER); -#endif -} - bool Init() { -# if ULP_COMP == 1 - // 2. Install I2C driver - if (i2c_init(0, SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { - return false; - } -#elif ULP_COMP == 0 + // 2. Install I2C driver - if (i2c_init(&bus_handle, SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { + if (i2c_init(I2C_BUS_HANDLE_S, SHTC3_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } +#if ULP_COMP == 0 // Configuration of a specific device on the bus i2c_device_config_t dev_cfg_shtc3 = {}; dev_cfg_shtc3.dev_addr_length = I2C_ADDR_BIT_LEN_7; @@ -134,13 +118,8 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, // Read 6 bytes: [TempMSB, TempLSB, TempCRC, HumMSB, HumLSB, HumCRC] // In this example, we ignore CRC for simplicity. -#if ULP_COMP == 1 - ret = i2c_read(SHTC3_I2C_NUM_0, SHTC3_SLAVE_ADDR, data_rd, sizeof(data_rd), + ret = i2c_read(I2C_HANDLE_PORT_S, SHTC3_SLAVE_ADDR, data_rd, sizeof(data_rd), LP_I2C_TRANS_TIMEOUT_CYCLES); -#elif ULP_COMP == 0 - ret = i2c_read(dev_handle_shtc3, SHTC3_SLAVE_ADDR, data_rd, sizeof(data_rd), - LP_I2C_TRANS_TIMEOUT_CYCLES); -#endif if (ret == ESP_OK) { // 5. Raw values diff --git a/main/sensors/stcc4.c b/main/sensors/stcc4.c index f8752ef..e96d23c 100644 --- a/main/sensors/stcc4.c +++ b/main/sensors/stcc4.c @@ -59,8 +59,12 @@ static i2c_master_dev_handle_t dev_handle_stcc4; #if ULP_COMP == 1 # define STCC4_I2C_NUM_0 LP_I2C_NUM_0 +# define I2C_BUS_HANDLE_S 0 +# define I2C_HANDLE_PORT_S STCC4_I2C_NUM_0 #elif ULP_COMP == 0 # define STCC4_I2C_NUM_0 I2C_NUM_0 +# define I2C_BUS_HANDLE_S &bus_handle +# define I2C_HANDLE_PORT_S dev_handle_stcc4 #endif bool check_crc(const uint8_t *data, uint8_t crc); @@ -69,13 +73,9 @@ bool check_crc(const uint8_t *data, uint8_t crc); static esp_err_t send_command_16bit(uint16_t cmd, uint8_t slave_addr) { data_wr[0] = (cmd >> 8) & 0xFF; // High byte data_wr[1] = cmd & 0xFF; // Low byte -#if ULP_COMP == 1 - esp_err_t err = i2c_write(STCC4_I2C_NUM_0, slave_addr, data_wr, - sizeof(data_wr), LP_I2C_TRANS_WAIT_FOREVER); -#elif ULP_COMP == 0 - esp_err_t err = i2c_write(dev_handle_stcc4, slave_addr, data_wr, + + esp_err_t err = i2c_write(I2C_HANDLE_PORT_S, slave_addr, data_wr, sizeof(data_wr), LP_I2C_TRANS_WAIT_FOREVER); -#endif if (err != ESP_OK) { // Bail and try again @@ -98,17 +98,12 @@ bool Init() { # endif #endif -# if ULP_COMP == 1 // 2. Install I2C driver - if (i2c_init(0, STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { - return false; - } -#elif ULP_COMP == 0 - // 2. Install I2C driver - if (i2c_init(&bus_handle, STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { + if (i2c_init(I2C_BUS_HANDLE_S, STCC4_I2C_NUM_0, SENSOR_SDA_PIN, SENSOR_SCL_PIN, I2C_BUS_SPEED) != ESP_OK) { return false; } +#if ULP_COMP == 0 // Configuration of a specific device on the bus i2c_device_config_t dev_cfg_stcc4 = {}; dev_cfg_stcc4.dev_addr_length = I2C_ADDR_BIT_LEN_7; @@ -148,13 +143,8 @@ void ReadSensors(int16_t* temperature, uint32_t* humidity, uint32_t* pressure, wait_for(750000); // 750 ms // Read 3 bytes: CO2 with CRC -#if ULP_COMP == 1 - ret = i2c_read(STCC4_I2C_NUM_0, STCC4_SLAVE_ADDR, data_rd, sizeof(data_rd), + ret = i2c_read(I2C_HANDLE_PORT_S, STCC4_SLAVE_ADDR, data_rd, sizeof(data_rd), LP_I2C_TRANS_WAIT_FOREVER); -#elif ULP_COMP == 0 - ret = i2c_read(dev_handle_stcc4, STCC4_SLAVE_ADDR, data_rd, sizeof(data_rd), - LP_I2C_TRANS_WAIT_FOREVER); -#endif if (ret != ESP_OK) { return; diff --git a/main/sensors/utils.h b/main/sensors/utils.h index b90bb22..9aa03f2 100644 --- a/main/sensors/utils.h +++ b/main/sensors/utils.h @@ -43,27 +43,6 @@ esp_err_t i2c_read(I2C_HANDLE_PORT i2c_handle_port, uint8_t address, uint8_t* da esp_err_t i2c_write_read(I2C_HANDLE_PORT i2c_handle_port, uint8_t address, uint8_t const* write_data, uint8_t write_len, uint8_t* read_data, uint8_t read_len, int32_t ms_dur); -/*# if ULP_COMP == 1 -esp_err_t i2c_init(i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed); - -esp_err_t i2c_write(i2c_port_t port, uint8_t address, uint8_t const* data, - uint8_t len, int32_t ms_dur); -esp_err_t i2c_read(i2c_port_t port, uint8_t address, uint8_t* data, uint8_t len, - int32_t ms_dur); -esp_err_t i2c_write_read(i2c_port_t port, uint8_t address, - uint8_t const* write_data, uint8_t write_len, - uint8_t* read_data, uint8_t read_len, int32_t ms_dur); -# elif ULP_COMP == 0 -esp_err_t i2c_init(i2c_master_bus_handle_t *bus_handle, i2c_port_t port, int sda_pin, int scl_pin, int i2c_speed); - -esp_err_t i2c_write(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t const* data, - uint8_t len, int32_t ms_dur); -esp_err_t i2c_read(i2c_master_dev_handle_t dev_handle, uint8_t address, uint8_t* data, uint8_t len, - int32_t ms_dur); -esp_err_t i2c_write_read(i2c_master_dev_handle_t dev_handle, uint8_t address, - uint8_t const* write_data, uint8_t write_len, - uint8_t* read_data, uint8_t read_len, int32_t ms_dur); -# endif*/ void wait_for(int32_t us_dur);