From a320507d3ec22c3e2a117f66af0d2b21108f88c2 Mon Sep 17 00:00:00 2001 From: RichardPar Date: Mon, 2 Feb 2026 12:26:56 +0000 Subject: [PATCH 1/2] Changes to get Wireless paper Voltage. --- .../HeltecV3WirelessPaper.h | 98 +++++++++++++++++++ variants/heltec_wireless_paper/target.cpp | 2 +- variants/heltec_wireless_paper/target.h | 4 +- 3 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 variants/heltec_wireless_paper/HeltecV3WirelessPaper.h diff --git a/variants/heltec_wireless_paper/HeltecV3WirelessPaper.h b/variants/heltec_wireless_paper/HeltecV3WirelessPaper.h new file mode 100644 index 000000000..257a31610 --- /dev/null +++ b/variants/heltec_wireless_paper/HeltecV3WirelessPaper.h @@ -0,0 +1,98 @@ +#pragma once + +#include +#include +#include + +// built-ins +#ifndef PIN_VBAT_READ // set in platformio.ini for boards like Heltec Wireless Paper (20) + #define PIN_VBAT_READ 1 +#endif +#ifndef PIN_ADC_CTRL // set in platformio.ini for Heltec Wireless Tracker (2) + #define PIN_ADC_CTRL 37 +#endif +#define PIN_ADC_CTRL_ACTIVE LOW +#define PIN_ADC_CTRL_INACTIVE HIGH + +#include + +class HeltecV3WirelessPaper : public ESP32Board { +private: + bool adc_active_state; + +public: + RefCountedDigitalPin periph_power; + + HeltecV3WirelessPaper() : periph_power(PIN_VEXT_EN) { } + + void begin() { + ESP32Board::begin(); + + // Auto-detect correct ADC_CTRL pin polarity (different for boards >3.2) + pinMode(PIN_ADC_CTRL, INPUT); + adc_active_state = !digitalRead(PIN_ADC_CTRL); + + pinMode(PIN_ADC_CTRL, OUTPUT); + digitalWrite(PIN_ADC_CTRL, !adc_active_state); // Initially inactive + + periph_power.begin(); + + esp_reset_reason_t reason = esp_reset_reason(); + if (reason == ESP_RST_DEEPSLEEP) { + long wakeup_source = esp_sleep_get_ext1_wakeup_status(); + if (wakeup_source & (1 << P_LORA_DIO_1)) { // received a LoRa packet (while in deep sleep) + startup_reason = BD_STARTUP_RX_PACKET; + } + + rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS); + rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1); + } + } + + void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) { + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); + + // Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep + rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY); + rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1); + + rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS); + + if (pin_wake_btn < 0) { + esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet + } else { + esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn + } + + if (secs > 0) { + esp_sleep_enable_timer_wakeup(secs * 1000000); + } + + // Finally set ESP32 into sleep + esp_deep_sleep_start(); // CPU halts here and never returns! + } + + void powerOff() override { + enterDeepSleep(0); + } + + uint16_t getBattMilliVolts() override { + analogReadResolution(10); + digitalWrite(PIN_ADC_CTRL, adc_active_state); + MESH_DEBUG_PRINT("ADC CTRL pin set to active state %d\n", adc_active_state); + + uint32_t raw = 0; + for (int i = 0; i < 8; i++) { + raw += analogRead(PIN_VBAT_READ); + } + + digitalWrite(PIN_ADC_CTRL, !adc_active_state); + uint32_t voltage = (0.842 * (4.2 / 1024.0) * raw) * 1000; + + return voltage; + } + + const char* getManufacturerName() const override { + return "Heltec V3 Wireless Paper"; + } +}; diff --git a/variants/heltec_wireless_paper/target.cpp b/variants/heltec_wireless_paper/target.cpp index dd2d51c0f..5cb04f6a5 100644 --- a/variants/heltec_wireless_paper/target.cpp +++ b/variants/heltec_wireless_paper/target.cpp @@ -1,7 +1,7 @@ #include "target.h" #include -HeltecV3Board board; +HeltecV3WirelessPaper board; #if defined(P_LORA_SCLK) static SPIClass spi; diff --git a/variants/heltec_wireless_paper/target.h b/variants/heltec_wireless_paper/target.h index b89c486fb..dc20eeddd 100644 --- a/variants/heltec_wireless_paper/target.h +++ b/variants/heltec_wireless_paper/target.h @@ -3,7 +3,7 @@ #define RADIOLIB_STATIC_ONLY 1 #include #include -#include <../heltec_v3/HeltecV3Board.h> +#include "HeltecV3WirelessPaper.h" #include #include #include @@ -12,7 +12,7 @@ #include #endif -extern HeltecV3Board board; +extern HeltecV3WirelessPaper board; extern WRAPPER_CLASS radio_driver; extern AutoDiscoverRTCClock rtc_clock; extern SensorManager sensors; From a51523119ecabc07a92a4cd001210aa21387f3f1 Mon Sep 17 00:00:00 2001 From: Richard P Date: Tue, 3 Feb 2026 14:48:43 +0000 Subject: [PATCH 2/2] Update manufacturer name in HeltecV3WirelessPaper Changed to Heltec Wireless Paper --- variants/heltec_wireless_paper/HeltecV3WirelessPaper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/heltec_wireless_paper/HeltecV3WirelessPaper.h b/variants/heltec_wireless_paper/HeltecV3WirelessPaper.h index 257a31610..c8ce85366 100644 --- a/variants/heltec_wireless_paper/HeltecV3WirelessPaper.h +++ b/variants/heltec_wireless_paper/HeltecV3WirelessPaper.h @@ -93,6 +93,6 @@ class HeltecV3WirelessPaper : public ESP32Board { } const char* getManufacturerName() const override { - return "Heltec V3 Wireless Paper"; + return "Heltec Wireless Paper"; } };