Skip to content

Commit 32eb5cb

Browse files
committed
Merge branch 'feat/ntc_driver_add_filter_v2.0' into 'release/v2.0'
feat(ntc_driver): improve adc result using filter (v2.0) See merge request ae_group/esp-iot-solution!1145
2 parents e9fb383 + 60d6ab7 commit 32eb5cb

File tree

6 files changed

+76
-5
lines changed

6 files changed

+76
-5
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ The registered components in ESP-IoT-Solution are listed below:
109109
| [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) |
110110
| [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) |
111111
| [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) |
112-
| [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) |
112+
| [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) |
113113
| [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) |
114114
| [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) |
115115
| [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) |

README_CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ ESP-IoT-Solution 中注册的组件如下:
109109
| [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) |
110110
| [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) |
111111
| [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) |
112-
| [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) |
112+
| [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) |
113113
| [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) |
114114
| [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) |
115115
| [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) |

components/sensors/ntc_driver/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# ChangeLog
22

3+
## v1.1.0 - 2024-11-5
4+
5+
### Improvements
6+
7+
* Add NTC ADC filter to reduce the noise.
8+
39
## v1.0.0 - 2024-10-15
410

511
* Update the version of ntc_driver component.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
menu "NTC Driver Configuration"
2+
3+
config ENABLE_NTC_ADC_FILTER
4+
bool "Enable ADC Filter for NTC"
5+
default y
6+
help
7+
Enable ADC Filter for NTC, the driver will take multiple ADC measurements
8+
and then filters them to avoid ADC noise
9+
10+
config NTC_FILTER_WINDOW_SIZE
11+
int "NTC Filter Window Size"
12+
default 50
13+
depends on ENABLE_NTC_ADC_FILTER
14+
help
15+
The number of ADC measurements to take before filtering the NTC value, the
16+
higher the value the more stable the NTC value will be, but will take longer
17+
to update
18+
19+
endmenu

components/sensors/ntc_driver/idf_component.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: "1.0.0"
1+
version: "1.1.0"
22
description: ntc driver
33
url: https://github.com/espressif/esp-iot-solution/tree/master/components/sensors/ntc_driver
44
repository: https://github.com/espressif/esp-iot-solution.git

components/sensors/ntc_driver/ntc_driver.c

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,21 +183,67 @@ static esp_err_t ntc_voltage_to_temperature(ntc_device_handle_t ntc_handle, uint
183183
return ESP_FAIL;
184184
}
185185

186+
#ifdef CONFIG_ENABLE_NTC_ADC_FILTER
187+
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)
188+
{
189+
NTC_DRIVER_CHECK(filtered_result != NULL, "Pointer of filtered_result is invalid", ESP_FAIL);
190+
int vol[CONFIG_NTC_FILTER_WINDOW_SIZE] = {0};
191+
int avg = 0;
192+
for (int i = 0; i < sizeof(vol) / sizeof(vol[0]); i++) {
193+
int raw = 0;
194+
NTC_DRIVER_CHECK(adc_oneshot_read(handle, chan, &raw) == ESP_OK, "adc oneshot read fail", ESP_FAIL);
195+
ESP_LOGV(TAG, "raw: %d", raw);
196+
NTC_DRIVER_CHECK(adc_cali_raw_to_voltage(cali_handle, raw, &vol[i]) == ESP_OK, "adc calibration fail", ESP_FAIL);
197+
ESP_LOGV(TAG, "vol: %d", vol[i]);
198+
avg += vol[i];
199+
}
200+
// calculate the average value
201+
avg /= sizeof(vol) / sizeof(vol[0]);
202+
*filtered_result = avg;
203+
// calculate the standard deviation
204+
int std_vol = 0;
205+
for (int i = 0; i < sizeof(vol) / sizeof(vol[0]); i++) {
206+
std_vol += (vol[i] - avg) * (vol[i] - avg);
207+
}
208+
std_vol = (int)sqrt(std_vol / (sizeof(vol) / sizeof(vol[0])));
209+
// filter the result, if the difference between the value and the average value is greater than the standard deviation, the value is discarded
210+
int count = 0;
211+
int filtered_vol = 0;
212+
for (int i = 0; i < sizeof(vol) / sizeof(vol[0]); i++) {
213+
if (abs(vol[i] - avg) < std_vol) {
214+
count++;
215+
filtered_vol += vol[i];
216+
} else {
217+
ESP_LOGV(TAG, "filtered out: %d", vol[i]);
218+
}
219+
}
220+
if (count > 0) {
221+
*filtered_result = filtered_vol / count;
222+
}
223+
224+
return ESP_OK;
225+
}
226+
#endif
227+
186228
esp_err_t ntc_dev_get_temperature(ntc_device_handle_t ntc_handle, float *temperature)
187229
{
188-
int voltage, adc_raw = 0;
230+
int voltage = 0;
189231

190232
if (ntc_handle == NULL) {
191233
ESP_LOGW(TAG, "Pointer of handle is invalid");
192234
return ESP_ERR_INVALID_ARG;
193235
}
194236

195237
ntc_driver_dev_t *ndd = (ntc_driver_dev_t *)ntc_handle;
238+
#ifdef CONFIG_ENABLE_NTC_ADC_FILTER
239+
esp_err_t ret = adc_oneshot_get_filtered_result(ndd->adc_handle, ndd->adc_cali_handle, ndd->s_ntc_config.channel, &voltage);
240+
#else
241+
int adc_raw = 0;
196242
esp_err_t ret = adc_oneshot_read(ndd->adc_handle, ndd->s_ntc_config.channel, &adc_raw);
197243
NTC_DRIVER_CHECK(ret == ESP_OK, "adc oneshot read fail", ESP_FAIL);
198244
NTC_DRIVER_CHECK(adc_raw != 0, "adc raw data equal to 0", ESP_FAIL);
199-
200245
ret = adc_cali_raw_to_voltage(ndd->adc_cali_handle, adc_raw, &voltage);
246+
#endif
201247
NTC_DRIVER_CHECK(ret == ESP_OK, "adc calibration raw to voltage fail", ESP_FAIL);
202248
NTC_DRIVER_CHECK(voltage != 0, "voltage equal to 0", ESP_FAIL);
203249
ntc_voltage_to_temperature(ndd, voltage, temperature);

0 commit comments

Comments
 (0)