From 60d6ab7312249159c64ce82282f0db4f32d3a9ca Mon Sep 17 00:00:00 2001 From: Li Bo Date: Mon, 4 Nov 2024 21:08:35 +0800 Subject: [PATCH] feat(ntc_driver): improve adc result using filter --- README.md | 2 +- README_CN.md | 2 +- components/sensors/ntc_driver/CHANGELOG.md | 6 +++ components/sensors/ntc_driver/Kconfig | 19 +++++++ .../sensors/ntc_driver/idf_component.yml | 2 +- components/sensors/ntc_driver/ntc_driver.c | 50 ++++++++++++++++++- 6 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 components/sensors/ntc_driver/Kconfig diff --git a/README.md b/README.md index 62be71a97..c0c27f142 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ The registered components in ESP-IoT-Solution are listed below: | [knob](https://components.espressif.com/components/espressif/knob/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/knob/versions/1.0.0) | | [led_indicator](https://components.espressif.com/components/espressif/led_indicator/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/led_indicator/versions/1.0.0) | | [lightbulb_driver](https://components.espressif.com/components/espressif/lightbulb_driver/versions/1.3.3) | [![1.3.3](https://img.shields.io/badge/Stable-1.3.3-blue)](https://components.espressif.com/components/espressif/lightbulb_driver/versions/1.3.3) | -| [ntc_driver](https://components.espressif.com/components/espressif/ntc_driver/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/ntc_driver/versions/1.0.0) | +| [ntc_driver](https://components.espressif.com/components/espressif/ntc_driver/versions/1.1.0) | [![1.1.0](https://img.shields.io/badge/Stable-1.1.0-blue)](https://components.espressif.com/components/espressif/ntc_driver/versions/1.1.0) | | [openai](https://components.espressif.com/components/espressif/openai/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/openai/versions/1.0.0) | | [pwm_audio](https://components.espressif.com/components/espressif/pwm_audio/versions/1.1.2) | [![1.1.2](https://img.shields.io/badge/Stable-1.1.2-blue)](https://components.espressif.com/components/espressif/pwm_audio/versions/1.1.2) | | [spi_bus](https://components.espressif.com/components/espressif/spi_bus/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/spi_bus/versions/1.0.0) | diff --git a/README_CN.md b/README_CN.md index bd77e74ba..317ca8143 100644 --- a/README_CN.md +++ b/README_CN.md @@ -109,7 +109,7 @@ ESP-IoT-Solution 中注册的组件如下: | [knob](https://components.espressif.com/components/espressif/knob/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/knob/versions/1.0.0) | | [led_indicator](https://components.espressif.com/components/espressif/led_indicator/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/led_indicator/versions/1.0.0) | | [lightbulb_driver](https://components.espressif.com/components/espressif/lightbulb_driver/versions/1.3.3) | [![1.3.3](https://img.shields.io/badge/Stable-1.3.3-blue)](https://components.espressif.com/components/espressif/lightbulb_driver/versions/1.3.3) | -| [ntc_driver](https://components.espressif.com/components/espressif/ntc_driver/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/ntc_driver/versions/1.0.0) | +| [ntc_driver](https://components.espressif.com/components/espressif/ntc_driver/versions/1.1.0) | [![1.1.0](https://img.shields.io/badge/Stable-1.1.0-blue)](https://components.espressif.com/components/espressif/ntc_driver/versions/1.1.0) | | [openai](https://components.espressif.com/components/espressif/openai/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/openai/versions/1.0.0) | | [pwm_audio](https://components.espressif.com/components/espressif/pwm_audio/versions/1.1.2) | [![1.1.2](https://img.shields.io/badge/Stable-1.1.2-blue)](https://components.espressif.com/components/espressif/pwm_audio/versions/1.1.2) | | [spi_bus](https://components.espressif.com/components/espressif/spi_bus/versions/1.0.0) | [![1.0.0](https://img.shields.io/badge/Stable-1.0.0-blue)](https://components.espressif.com/components/espressif/spi_bus/versions/1.0.0) | diff --git a/components/sensors/ntc_driver/CHANGELOG.md b/components/sensors/ntc_driver/CHANGELOG.md index db147f086..6155cceca 100644 --- a/components/sensors/ntc_driver/CHANGELOG.md +++ b/components/sensors/ntc_driver/CHANGELOG.md @@ -1,5 +1,11 @@ # ChangeLog +## v1.1.0 - 2024-11-5 + +### Improvements + +* Add NTC ADC filter to reduce the noise. + ## v1.0.0 - 2024-10-15 * Update the version of ntc_driver component. diff --git a/components/sensors/ntc_driver/Kconfig b/components/sensors/ntc_driver/Kconfig new file mode 100644 index 000000000..18801b7c4 --- /dev/null +++ b/components/sensors/ntc_driver/Kconfig @@ -0,0 +1,19 @@ +menu "NTC Driver Configuration" + + config ENABLE_NTC_ADC_FILTER + bool "Enable ADC Filter for NTC" + default y + help + Enable ADC Filter for NTC, the driver will take multiple ADC measurements + and then filters them to avoid ADC noise + + config NTC_FILTER_WINDOW_SIZE + int "NTC Filter Window Size" + default 50 + depends on ENABLE_NTC_ADC_FILTER + help + The number of ADC measurements to take before filtering the NTC value, the + higher the value the more stable the NTC value will be, but will take longer + to update + +endmenu diff --git a/components/sensors/ntc_driver/idf_component.yml b/components/sensors/ntc_driver/idf_component.yml index 3218f58a8..57ad0bfd4 100644 --- a/components/sensors/ntc_driver/idf_component.yml +++ b/components/sensors/ntc_driver/idf_component.yml @@ -1,4 +1,4 @@ -version: "1.0.0" +version: "1.1.0" description: ntc driver url: https://github.com/espressif/esp-iot-solution/tree/master/components/sensors/ntc_driver repository: https://github.com/espressif/esp-iot-solution.git diff --git a/components/sensors/ntc_driver/ntc_driver.c b/components/sensors/ntc_driver/ntc_driver.c index 66520e268..e32b7f367 100644 --- a/components/sensors/ntc_driver/ntc_driver.c +++ b/components/sensors/ntc_driver/ntc_driver.c @@ -183,9 +183,51 @@ static esp_err_t ntc_voltage_to_temperature(ntc_device_handle_t ntc_handle, uint return ESP_FAIL; } +#ifdef CONFIG_ENABLE_NTC_ADC_FILTER +static esp_err_t adc_oneshot_get_filtered_result(adc_oneshot_unit_handle_t handle, adc_cali_handle_t cali_handle, adc_channel_t chan, int *filtered_result) +{ + NTC_DRIVER_CHECK(filtered_result != NULL, "Pointer of filtered_result is invalid", ESP_FAIL); + int vol[CONFIG_NTC_FILTER_WINDOW_SIZE] = {0}; + int avg = 0; + for (int i = 0; i < sizeof(vol) / sizeof(vol[0]); i++) { + int raw = 0; + NTC_DRIVER_CHECK(adc_oneshot_read(handle, chan, &raw) == ESP_OK, "adc oneshot read fail", ESP_FAIL); + ESP_LOGV(TAG, "raw: %d", raw); + NTC_DRIVER_CHECK(adc_cali_raw_to_voltage(cali_handle, raw, &vol[i]) == ESP_OK, "adc calibration fail", ESP_FAIL); + ESP_LOGV(TAG, "vol: %d", vol[i]); + avg += vol[i]; + } + // calculate the average value + avg /= sizeof(vol) / sizeof(vol[0]); + *filtered_result = avg; + // calculate the standard deviation + int std_vol = 0; + for (int i = 0; i < sizeof(vol) / sizeof(vol[0]); i++) { + std_vol += (vol[i] - avg) * (vol[i] - avg); + } + std_vol = (int)sqrt(std_vol / (sizeof(vol) / sizeof(vol[0]))); + // filter the result, if the difference between the value and the average value is greater than the standard deviation, the value is discarded + int count = 0; + int filtered_vol = 0; + for (int i = 0; i < sizeof(vol) / sizeof(vol[0]); i++) { + if (abs(vol[i] - avg) < std_vol) { + count++; + filtered_vol += vol[i]; + } else { + ESP_LOGV(TAG, "filtered out: %d", vol[i]); + } + } + if (count > 0) { + *filtered_result = filtered_vol / count; + } + + return ESP_OK; +} +#endif + esp_err_t ntc_dev_get_temperature(ntc_device_handle_t ntc_handle, float *temperature) { - int voltage, adc_raw = 0; + int voltage = 0; if (ntc_handle == NULL) { ESP_LOGW(TAG, "Pointer of handle is invalid"); @@ -193,11 +235,15 @@ esp_err_t ntc_dev_get_temperature(ntc_device_handle_t ntc_handle, float *tempera } ntc_driver_dev_t *ndd = (ntc_driver_dev_t *)ntc_handle; +#ifdef CONFIG_ENABLE_NTC_ADC_FILTER + esp_err_t ret = adc_oneshot_get_filtered_result(ndd->adc_handle, ndd->adc_cali_handle, ndd->s_ntc_config.channel, &voltage); +#else + int adc_raw = 0; esp_err_t ret = adc_oneshot_read(ndd->adc_handle, ndd->s_ntc_config.channel, &adc_raw); NTC_DRIVER_CHECK(ret == ESP_OK, "adc oneshot read fail", ESP_FAIL); NTC_DRIVER_CHECK(adc_raw != 0, "adc raw data equal to 0", ESP_FAIL); - ret = adc_cali_raw_to_voltage(ndd->adc_cali_handle, adc_raw, &voltage); +#endif NTC_DRIVER_CHECK(ret == ESP_OK, "adc calibration raw to voltage fail", ESP_FAIL); NTC_DRIVER_CHECK(voltage != 0, "voltage equal to 0", ESP_FAIL); ntc_voltage_to_temperature(ndd, voltage, temperature);