ESP32 ADC use esp-idf (#2024)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
Otto Winter 2021-07-20 07:05:56 +02:00 committed by Jesse Hills
parent 73ead5f328
commit e5afb1c4ea
No known key found for this signature in database
GPG Key ID: BEAAE804EFD8E83A
3 changed files with 51 additions and 17 deletions

View File

@ -11,7 +11,30 @@ namespace adc {
static const char *const TAG = "adc"; static const char *const TAG = "adc";
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
void ADCSensor::set_attenuation(adc_attenuation_t attenuation) { this->attenuation_ = attenuation; } void ADCSensor::set_attenuation(adc_atten_t attenuation) { this->attenuation_ = attenuation; }
inline adc1_channel_t gpio_to_adc1(uint8_t pin) {
switch (pin) {
case 36:
return ADC1_CHANNEL_0;
case 37:
return ADC1_CHANNEL_1;
case 38:
return ADC1_CHANNEL_2;
case 39:
return ADC1_CHANNEL_3;
case 32:
return ADC1_CHANNEL_4;
case 33:
return ADC1_CHANNEL_5;
case 34:
return ADC1_CHANNEL_6;
case 35:
return ADC1_CHANNEL_7;
default:
return ADC1_CHANNEL_MAX;
}
}
#endif #endif
void ADCSensor::setup() { void ADCSensor::setup() {
@ -21,7 +44,9 @@ void ADCSensor::setup() {
#endif #endif
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
analogSetPinAttenuation(this->pin_, this->attenuation_); adc1_config_channel_atten(gpio_to_adc1(pin_), attenuation_);
adc1_config_width(ADC_WIDTH_BIT_12);
adc_gpio_init(ADC_UNIT_1, (adc_channel_t) gpio_to_adc1(pin_));
#endif #endif
} }
void ADCSensor::dump_config() { void ADCSensor::dump_config() {
@ -36,18 +61,20 @@ void ADCSensor::dump_config() {
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
ESP_LOGCONFIG(TAG, " Pin: %u", this->pin_); ESP_LOGCONFIG(TAG, " Pin: %u", this->pin_);
switch (this->attenuation_) { switch (this->attenuation_) {
case ADC_0db: case ADC_ATTEN_DB_0:
ESP_LOGCONFIG(TAG, " Attenuation: 0db (max 1.1V)"); ESP_LOGCONFIG(TAG, " Attenuation: 0db (max 1.1V)");
break; break;
case ADC_2_5db: case ADC_ATTEN_DB_2_5:
ESP_LOGCONFIG(TAG, " Attenuation: 2.5db (max 1.5V)"); ESP_LOGCONFIG(TAG, " Attenuation: 2.5db (max 1.5V)");
break; break;
case ADC_6db: case ADC_ATTEN_DB_6:
ESP_LOGCONFIG(TAG, " Attenuation: 6db (max 2.2V)"); ESP_LOGCONFIG(TAG, " Attenuation: 6db (max 2.2V)");
break; break;
case ADC_11db: case ADC_ATTEN_DB_11:
ESP_LOGCONFIG(TAG, " Attenuation: 11db (max 3.9V)"); ESP_LOGCONFIG(TAG, " Attenuation: 11db (max 3.9V)");
break; break;
default: // This is to satisfy the unused ADC_ATTEN_MAX
break;
} }
#endif #endif
LOG_UPDATE_INTERVAL(this); LOG_UPDATE_INTERVAL(this);
@ -60,20 +87,23 @@ void ADCSensor::update() {
} }
float ADCSensor::sample() { float ADCSensor::sample() {
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
float value_v = analogRead(this->pin_) / 4095.0f; // NOLINT int raw = adc1_get_raw(gpio_to_adc1(pin_));
float value_v = raw / 4095.0f;
switch (this->attenuation_) { switch (this->attenuation_) {
case ADC_0db: case ADC_ATTEN_DB_0:
value_v *= 1.1; value_v *= 1.1;
break; break;
case ADC_2_5db: case ADC_ATTEN_DB_2_5:
value_v *= 1.5; value_v *= 1.5;
break; break;
case ADC_6db: case ADC_ATTEN_DB_6:
value_v *= 2.2; value_v *= 2.2;
break; break;
case ADC_11db: case ADC_ATTEN_DB_11:
value_v *= 3.9; value_v *= 3.9;
break; break;
default: // This is to satisfy the unused ADC_ATTEN_MAX
break;
} }
return value_v; return value_v;
#endif #endif

View File

@ -6,6 +6,10 @@
#include "esphome/components/sensor/sensor.h" #include "esphome/components/sensor/sensor.h"
#include "esphome/components/voltage_sampler/voltage_sampler.h" #include "esphome/components/voltage_sampler/voltage_sampler.h"
#ifdef ARDUINO_ARCH_ESP32
#include "driver/adc.h"
#endif
namespace esphome { namespace esphome {
namespace adc { namespace adc {
@ -13,7 +17,7 @@ class ADCSensor : public sensor::Sensor, public PollingComponent, public voltage
public: public:
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
/// Set the attenuation for this pin. Only available on the ESP32. /// Set the attenuation for this pin. Only available on the ESP32.
void set_attenuation(adc_attenuation_t attenuation); void set_attenuation(adc_atten_t attenuation);
#endif #endif
/// Update adc values. /// Update adc values.
@ -34,7 +38,7 @@ class ADCSensor : public sensor::Sensor, public PollingComponent, public voltage
uint8_t pin_; uint8_t pin_;
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
adc_attenuation_t attenuation_{ADC_0db}; adc_atten_t attenuation_{ADC_ATTEN_DB_0};
#endif #endif
}; };

View File

@ -16,10 +16,10 @@ from esphome.const import (
AUTO_LOAD = ["voltage_sampler"] AUTO_LOAD = ["voltage_sampler"]
ATTENUATION_MODES = { ATTENUATION_MODES = {
"0db": cg.global_ns.ADC_0db, "0db": cg.global_ns.ADC_ATTEN_DB_0,
"2.5db": cg.global_ns.ADC_2_5db, "2.5db": cg.global_ns.ADC_ATTEN_DB_2_5,
"6db": cg.global_ns.ADC_6db, "6db": cg.global_ns.ADC_ATTEN_DB_6,
"11db": cg.global_ns.ADC_11db, "11db": cg.global_ns.ADC_ATTEN_DB_11,
} }