mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Attempt to fix rp2040 adc with vcc (#5378)
This commit is contained in:
		| @@ -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 | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user