From 0d114ecfbdde099f17b395079c27478418f73eb8 Mon Sep 17 00:00:00 2001 From: recrof Date: Sun, 23 Mar 2025 15:57:33 +0100 Subject: [PATCH 1/2] LilyGo T-ECHO: report correct battery voltage --- src/helpers/nrf52/TechoBoard.cpp | 28 +++++++++++++++++++++++++++- src/helpers/nrf52/TechoBoard.h | 28 ++++++++++++---------------- variants/techo/variant.h | 14 +++++++------- 3 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/helpers/nrf52/TechoBoard.cpp b/src/helpers/nrf52/TechoBoard.cpp index c82fabd8..09c8c7d2 100644 --- a/src/helpers/nrf52/TechoBoard.cpp +++ b/src/helpers/nrf52/TechoBoard.cpp @@ -22,7 +22,18 @@ void TechoBoard::begin() { // for future use, sub-classes SHOULD call this from their begin() startup_reason = BD_STARTUP_NORMAL; - pinMode(PIN_VBAT_READ, INPUT); + delay(200); + pinMode(PIN_PWR_EN, OUTPUT); + digitalWrite(PIN_PWR_EN, HIGH); + pinMode(PIN_BUTTON1, INPUT_PULLUP); + pinMode(PIN_BUTTON2, INPUT_PULLUP); + pinMode(LED_RED, OUTPUT); + pinMode(LED_GREEN, OUTPUT); + pinMode(LED_BLUE, OUTPUT); + delay(200); + + pinMode(PIN_TXCO, OUTPUT); + digitalWrite(PIN_TXCO, HIGH); #if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL) @@ -35,6 +46,21 @@ void TechoBoard::begin() { delay(10); // give sx1262 some time to power up } +uint16_t TechoBoard::getBattMilliVolts() { + int adcvalue = 0; + + analogReference(AR_INTERNAL_3_0); + analogReadResolution(12); + delay(10); + + // ADC range is 0..3000mV and resolution is 12-bit (0..4095) + adcvalue = analogRead(PIN_VBAT_READ); + Serial.println(adcvalue); + // Convert the raw value to compensated mv, taking the resistor- + // divider into account (providing the actual LIPO voltage) + return (uint16_t)((float)adcvalue * REAL_VBAT_MV_PER_LSB); +} + bool TechoBoard::startOTAUpdate(const char* id, char reply[]) { // Config the peripheral connection with maximum bandwidth // more SRAM required by SoftDevice diff --git a/src/helpers/nrf52/TechoBoard.h b/src/helpers/nrf52/TechoBoard.h index b0bc0608..c8ef7006 100644 --- a/src/helpers/nrf52/TechoBoard.h +++ b/src/helpers/nrf52/TechoBoard.h @@ -17,28 +17,26 @@ #define SX126X_DIO3_TCXO_VOLTAGE 1.8 // built-ins -#define PIN_VBAT_READ 4 -#define ADC_MULTIPLIER (2.0) +#define VBAT_MV_PER_LSB (0.73242188F) // 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096 + +#define VBAT_DIVIDER (0.5F) // 150K + 150K voltage divider on VBAT +#define VBAT_DIVIDER_COMP (2.0F) // Compensation factor for the VBAT divider + +#define PIN_VBAT_READ (4) +#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB) class TechoBoard : public mesh::MainBoard { protected: uint8_t startup_reason; public: + void begin(); - uint8_t getStartupReason() const override { return startup_reason; } + uint16_t getBattMilliVolts() override; + bool startOTAUpdate(const char* id, char reply[]) override; - #define BATTERY_SAMPLES 8 - - uint16_t getBattMilliVolts() override { - analogReadResolution(12); - uint32_t raw = 0; - for (int i = 0; i < BATTERY_SAMPLES; i++) { - raw += analogRead(PIN_VBAT_READ); - } - raw = raw / BATTERY_SAMPLES; - - return (ADC_MULTIPLIER * raw) / 4096; + uint8_t getStartupReason() const override { + return startup_reason; } const char* getManufacturerName() const override { @@ -48,6 +46,4 @@ public: void reboot() override { NVIC_SystemReset(); } - - bool startOTAUpdate(const char* id, char reply[]) override; }; diff --git a/variants/techo/variant.h b/variants/techo/variant.h index 10b22ada..8fcb765e 100644 --- a/variants/techo/variant.h +++ b/variants/techo/variant.h @@ -14,12 +14,12 @@ #define USE_LFXO // 32.768 kHz crystal oscillator #define VARIANT_MCK (64000000ul) -#define WIRE_INTERFACES_COUNT (1) - +#define WIRE_INTERFACES_COUNT (1) +#define PIN_TXCO (21) //////////////////////////////////////////////////////////////////////////////// // Power -#define PIN_PWR_EN (6) +#define PIN_PWR_EN (12) #define BATTERY_PIN (4) #define ADC_MULTIPLIER (4.90F) @@ -62,11 +62,11 @@ //////////////////////////////////////////////////////////////////////////////// // Builtin LEDs -#define LED_RED (13) +#define LED_RED (34) +#define LED_GREEN (33) #define LED_BLUE (14) -#define LED_GREEN (15) -#define LED_BUILTIN (15) +#define LED_BUILTIN LED_GREEN #define PIN_LED LED_BUILTIN #define LED_PIN LED_BUILTIN #define LED_STATE_ON LOW @@ -80,7 +80,7 @@ #define PIN_BUTTON1 (42) #define BUTTON_PIN PIN_BUTTON1 -#define PIN_BUTTON2 (18) +#define PIN_BUTTON2 (11) #define BUTTON_PIN2 PIN_BUTTON2 #define EXTERNAL_FLASH_DEVICES MX25R1635F From ac71bac4cf6f326c972f3ece66377bdc90560b66 Mon Sep 17 00:00:00 2001 From: recrof Date: Sun, 23 Mar 2025 18:31:39 +0100 Subject: [PATCH 2/2] cleanup --- src/helpers/nrf52/TechoBoard.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/helpers/nrf52/TechoBoard.cpp b/src/helpers/nrf52/TechoBoard.cpp index 09c8c7d2..0b2e1952 100644 --- a/src/helpers/nrf52/TechoBoard.cpp +++ b/src/helpers/nrf52/TechoBoard.cpp @@ -35,10 +35,6 @@ void TechoBoard::begin() { pinMode(PIN_TXCO, OUTPUT); digitalWrite(PIN_TXCO, HIGH); -#if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) - Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL) -#endif - Wire.begin(); pinMode(SX126X_POWER_EN, OUTPUT); @@ -55,7 +51,6 @@ uint16_t TechoBoard::getBattMilliVolts() { // ADC range is 0..3000mV and resolution is 12-bit (0..4095) adcvalue = analogRead(PIN_VBAT_READ); - Serial.println(adcvalue); // Convert the raw value to compensated mv, taking the resistor- // divider into account (providing the actual LIPO voltage) return (uint16_t)((float)adcvalue * REAL_VBAT_MV_PER_LSB);