mirror of
https://github.com/esphome/esphome.git
synced 2024-11-26 08:55:22 +01:00
Attempt to fix rp2040 adc with vcc (#5378)
This commit is contained in:
parent
47b1b45828
commit
fc354eec0e
2 changed files with 30 additions and 34 deletions
|
@ -5,10 +5,7 @@ from esphome.const import CONF_ANALOG, CONF_INPUT
|
||||||
|
|
||||||
from esphome.core import CORE
|
from esphome.core import CORE
|
||||||
from esphome.components.esp32 import get_esp32_variant
|
from esphome.components.esp32 import get_esp32_variant
|
||||||
from esphome.const import (
|
from esphome.const import PLATFORM_ESP8266
|
||||||
PLATFORM_ESP8266,
|
|
||||||
PLATFORM_RP2040,
|
|
||||||
)
|
|
||||||
from esphome.components.esp32.const import (
|
from esphome.components.esp32.const import (
|
||||||
VARIANT_ESP32,
|
VARIANT_ESP32,
|
||||||
VARIANT_ESP32C2,
|
VARIANT_ESP32C2,
|
||||||
|
@ -147,7 +144,9 @@ ESP32_VARIANT_ADC2_PIN_TO_CHANNEL = {
|
||||||
|
|
||||||
def validate_adc_pin(value):
|
def validate_adc_pin(value):
|
||||||
if str(value).upper() == "VCC":
|
if str(value).upper() == "VCC":
|
||||||
return cv.only_on([PLATFORM_ESP8266, PLATFORM_RP2040])("VCC")
|
if CORE.is_rp2040:
|
||||||
|
return pins.internal_gpio_input_pin_schema(29)
|
||||||
|
return cv.only_on([PLATFORM_ESP8266])("VCC")
|
||||||
|
|
||||||
if str(value).upper() == "TEMPERATURE":
|
if str(value).upper() == "TEMPERATURE":
|
||||||
return cv.only_on_rp2040("TEMPERATURE")
|
return cv.only_on_rp2040("TEMPERATURE")
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "adc_sensor.h"
|
#include "adc_sensor.h"
|
||||||
#include "esphome/core/log.h"
|
|
||||||
#include "esphome/core/helpers.h"
|
#include "esphome/core/helpers.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
|
||||||
#ifdef USE_ESP8266
|
#ifdef USE_ESP8266
|
||||||
#ifdef USE_ADC_SENSOR_VCC
|
#ifdef USE_ADC_SENSOR_VCC
|
||||||
|
@ -246,45 +246,42 @@ float ADCSensor::sample() {
|
||||||
adc_set_temp_sensor_enabled(true);
|
adc_set_temp_sensor_enabled(true);
|
||||||
delay(1);
|
delay(1);
|
||||||
adc_select_input(4);
|
adc_select_input(4);
|
||||||
|
|
||||||
|
int32_t raw = adc_read();
|
||||||
|
adc_set_temp_sensor_enabled(false);
|
||||||
|
if (this->output_raw_) {
|
||||||
|
return raw;
|
||||||
|
}
|
||||||
|
return raw * 3.3f / 4096.0f;
|
||||||
} else {
|
} else {
|
||||||
uint8_t pin;
|
uint8_t pin = this->pin_->get_pin();
|
||||||
#ifdef USE_ADC_SENSOR_VCC
|
|
||||||
#ifdef CYW43_USES_VSYS_PIN
|
#ifdef CYW43_USES_VSYS_PIN
|
||||||
|
if (pin == PICO_VSYS_PIN) {
|
||||||
// Measuring VSYS on Raspberry Pico W needs to be wrapped with
|
// Measuring VSYS on Raspberry Pico W needs to be wrapped with
|
||||||
// `cyw43_thread_enter()`/`cyw43_thread_exit()` as discussed in
|
// `cyw43_thread_enter()`/`cyw43_thread_exit()` as discussed in
|
||||||
// https://github.com/raspberrypi/pico-sdk/issues/1222, since Wifi chip and
|
// https://github.com/raspberrypi/pico-sdk/issues/1222, since Wifi chip and
|
||||||
// VSYS ADC both share GPIO29
|
// VSYS ADC both share GPIO29
|
||||||
cyw43_thread_enter();
|
cyw43_thread_enter();
|
||||||
|
}
|
||||||
#endif // CYW43_USES_VSYS_PIN
|
#endif // CYW43_USES_VSYS_PIN
|
||||||
pin = PICO_VSYS_PIN;
|
|
||||||
#else
|
|
||||||
pin = this->pin_->get_pin();
|
|
||||||
#endif // USE_ADC_SENSOR_VCC
|
|
||||||
|
|
||||||
adc_gpio_init(pin);
|
adc_gpio_init(pin);
|
||||||
adc_select_input(pin - 26);
|
adc_select_input(pin - 26);
|
||||||
}
|
|
||||||
|
|
||||||
int32_t raw = adc_read();
|
int32_t raw = adc_read();
|
||||||
if (this->is_temperature_) {
|
|
||||||
adc_set_temp_sensor_enabled(false);
|
|
||||||
} else {
|
|
||||||
#ifdef USE_ADC_SENSOR_VCC
|
|
||||||
#ifdef CYW43_USES_VSYS_PIN
|
#ifdef CYW43_USES_VSYS_PIN
|
||||||
|
if (pin == PICO_VSYS_PIN) {
|
||||||
cyw43_thread_exit();
|
cyw43_thread_exit();
|
||||||
#endif // CYW43_USES_VSYS_PIN
|
|
||||||
#endif // USE_ADC_SENSOR_VCC
|
|
||||||
}
|
}
|
||||||
|
#endif // CYW43_USES_VSYS_PIN
|
||||||
|
|
||||||
if (output_raw_) {
|
if (output_raw_) {
|
||||||
return raw;
|
return raw;
|
||||||
}
|
}
|
||||||
float coeff = 1.0;
|
float coeff = pin == PICO_VSYS_PIN ? 3.0 : 1.0;
|
||||||
#ifdef USE_ADC_SENSOR_VCC
|
|
||||||
// As per Raspberry Pico (W) datasheet (section 2.1) the VSYS/3 is measured
|
|
||||||
coeff = 3.0;
|
|
||||||
#endif // USE_ADC_SENSOR_VCC
|
|
||||||
return raw * 3.3f / 4096.0f * coeff;
|
return raw * 3.3f / 4096.0f * coeff;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue