From 2947df3349dd3d5e38bfa5124c80fd02ac443bab Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Sat, 1 Nov 2025 15:33:24 +0100 Subject: [PATCH] Added Heltec v4 board defines and scaffold --- Boards.h | 42 ++++++++++++++++++++++++++++++++++++++++++ Display.h | 20 ++++++++++++++++++++ Power.h | 25 ++++++++++++++++++++++++- Utilities.h | 19 ++++++++++++++----- sx126x.cpp | 2 +- sx128x.cpp | 2 +- 6 files changed, 102 insertions(+), 8 deletions(-) diff --git a/Boards.h b/Boards.h index 74b96d7..47e79c8 100644 --- a/Boards.h +++ b/Boards.h @@ -95,6 +95,10 @@ #define MODEL_C5 0xC5 // Heltec Lora32 v3, 433 MHz #define MODEL_CA 0xCA // Heltec Lora32 v3, 868 MHz + #define PRODUCT_H32_V4 0xC3 + #define BOARD_HELTEC32_V4 0x3B + #define MODEL_C8 0xC8 // Heltec Lora32 v3, 850-950 MHz, 28dBm + #define PRODUCT_HELTEC_T114 0xC2 // Heltec Mesh Node T114 #define BOARD_HELTEC_T114 0x3C #define MODEL_C6 0xC6 // Heltec Mesh Node T114, 470-510 MHz @@ -375,6 +379,44 @@ const int pin_miso = 11; const int pin_sclk = 9; + #elif BOARD_MODEL == BOARD_HELTEC32_V4 + #define IS_ESP32S3 true + #define HAS_DISPLAY true + #define HAS_BLUETOOTH false + #define HAS_BLE true + #define HAS_PMU true + #define HAS_CONSOLE true + #define HAS_EEPROM true + #define HAS_INPUT true + #define HAS_SLEEP true + #define PIN_WAKEUP GPIO_NUM_0 + #define WAKEUP_LEVEL 0 + #define OCP_TUNED 0x18 + + const int pin_btn_usr1 = 0; + + #if defined(EXTERNAL_LEDS) + const int pin_led_rx = 13; + const int pin_led_tx = 14; + #else + const int pin_led_rx = 35; + const int pin_led_tx = 35; + #endif + + #define MODEM SX1262 + #define HAS_TCXO true + const int pin_tcxo_enable = -1; + #define HAS_BUSY true + #define DIO2_AS_RF_SWITCH true + + const int pin_cs = 8; + const int pin_busy = 13; + const int pin_dio = 14; + const int pin_reset = 12; + const int pin_mosi = 10; + const int pin_miso = 11; + const int pin_sclk = 9; + #elif BOARD_MODEL == BOARD_RNODE_NG_20 #define HAS_DISPLAY true #define HAS_BLUETOOTH true diff --git a/Display.h b/Display.h index c42283c..ebc02fd 100644 --- a/Display.h +++ b/Display.h @@ -60,6 +60,11 @@ #define DISP_ADDR 0x3C #define SCL_OLED 18 #define SDA_OLED 17 +#elif BOARD_MODEL == BOARD_HELTEC32_V4 + #define DISP_RST 21 + #define DISP_ADDR 0x3C + #define SCL_OLED 18 + #define SDA_OLED 17 #elif BOARD_MODEL == BOARD_RAK4631 // RAK1921/SSD1306 #define DISP_RST -1 @@ -265,6 +270,18 @@ bool display_init() { digitalWrite(pin_display_en, HIGH); delay(50); Wire.begin(SDA_OLED, SCL_OLED); + #elif BOARD_MODEL == BOARD_HELTEC32_V4 + // enable vext / pin 36 + pinMode(Vext, OUTPUT); + digitalWrite(Vext, LOW); + delay(50); + int pin_display_en = 21; + pinMode(pin_display_en, OUTPUT); + digitalWrite(pin_display_en, LOW); + delay(50); + digitalWrite(pin_display_en, HIGH); + delay(50); + Wire.begin(SDA_OLED, SCL_OLED); #elif BOARD_MODEL == BOARD_LORA32_V1_0 int pin_display_en = 16; digitalWrite(pin_display_en, LOW); @@ -382,6 +399,9 @@ bool display_init() { #elif BOARD_MODEL == BOARD_HELTEC32_V3 disp_mode = DISP_MODE_PORTRAIT; display.setRotation(1); + #elif BOARD_MODEL == BOARD_HELTEC32_V4 + disp_mode = DISP_MODE_PORTRAIT; + display.setRotation(1); #elif BOARD_MODEL == BOARD_HELTEC_T114 disp_mode = DISP_MODE_PORTRAIT; display.setRotation(1); diff --git a/Power.h b/Power.h index d6af640..766bf55 100644 --- a/Power.h +++ b/Power.h @@ -111,6 +111,23 @@ bool bat_voltage_dropping = false; float bat_delay_v = 0; float bat_state_change_v = 0; +#elif BOARD_MODEL == BOARD_HELTEC32_V4 + #define BAT_V_MIN 3.15 + #define BAT_V_MAX 4.3 + #define BAT_V_CHG 4.48 + #define BAT_V_FLOAT 4.33 + #define BAT_SAMPLES 7 + const uint8_t pin_vbat = 1; + const uint8_t pin_ctrl = 37; + float bat_p_samples[BAT_SAMPLES]; + float bat_v_samples[BAT_SAMPLES]; + uint8_t bat_samples_count = 0; + int bat_discharging_samples = 0; + int bat_charging_samples = 0; + int bat_charged_samples = 0; + bool bat_voltage_dropping = false; + float bat_delay_v = 0; + float bat_state_change_v = 0; #elif BOARD_MODEL == BOARD_HELTEC_T114 #define BAT_V_MIN 3.15 #define BAT_V_MAX 4.165 @@ -154,12 +171,14 @@ uint8_t pmu_rc = 0; void kiss_indicate_battery(); void measure_battery() { - #if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC_T114 || BOARD_MODEL == BOARD_TECHO + #if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_HELTEC32_V4 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC_T114 || BOARD_MODEL == BOARD_TECHO battery_installed = true; battery_indeterminate = true; #if BOARD_MODEL == BOARD_HELTEC32_V3 float battery_measurement = (float)(analogRead(pin_vbat)) * 0.0041; + #elif BOARD_MODEL == BOARD_HELTEC32_V4 + float battery_measurement = (float)(analogRead(pin_vbat)) * 0.0041; #elif BOARD_MODEL == BOARD_T3S3 float battery_measurement = (float)(analogRead(pin_vbat)) / 4095.0*6.7828; #elif BOARD_MODEL == BOARD_HELTEC_T114 @@ -351,6 +370,10 @@ bool init_pmu() { pinMode(pin_ctrl,OUTPUT); digitalWrite(pin_ctrl, LOW); return true; + #elif BOARD_MODEL == BOARD_HELTEC32_V4 + pinMode(pin_ctrl,OUTPUT); + digitalWrite(pin_ctrl, LOW); + return true; #elif BOARD_MODEL == BOARD_HELTEC_T114 pinMode(pin_ctrl,OUTPUT); digitalWrite(pin_ctrl, HIGH); diff --git a/Utilities.h b/Utilities.h index cfd523c..79546cd 100644 --- a/Utilities.h +++ b/Utilities.h @@ -72,8 +72,8 @@ uint8_t eeprom_read(uint32_t mapped_addr); #include "Device.h" #endif #if MCU_VARIANT == MCU_ESP32 + //https://github.com/espressif/esp-idf/issues/8855 #if BOARD_MODEL == BOARD_HELTEC32_V3 - //https://github.com/espressif/esp-idf/issues/8855 #include "hal/wdt_hal.h" #elif BOARD_MODEL == BOARD_T3S3 #include "hal/wdt_hal.h" @@ -301,6 +301,13 @@ uint8_t boot_vector = 0x00; void led_tx_off() { digitalWrite(pin_led_tx, LOW); } void led_id_on() { } void led_id_off() { } + #elif BOARD_MODEL == BOARD_HELTEC32_V4 + void led_rx_on() { digitalWrite(pin_led_rx, HIGH); } + void led_rx_off() { digitalWrite(pin_led_rx, LOW); } + void led_tx_on() { digitalWrite(pin_led_tx, HIGH); } + void led_tx_off() { digitalWrite(pin_led_tx, LOW); } + void led_id_on() { } + void led_id_off() { } #elif BOARD_MODEL == BOARD_LORA32_V2_1 void led_rx_on() { digitalWrite(pin_led_rx, HIGH); } void led_rx_off() { digitalWrite(pin_led_rx, LOW); } @@ -1548,10 +1555,12 @@ bool eeprom_model_valid() { if (model == MODEL_C4 || model == MODEL_C9) { #elif BOARD_MODEL == BOARD_HELTEC32_V3 if (model == MODEL_C5 || model == MODEL_CA) { - #elif BOARD_MODEL == BOARD_HELTEC_T114 - if (model == MODEL_C6 || model == MODEL_C7) { - #elif BOARD_MODEL == BOARD_RAK4631 - if (model == MODEL_11 || model == MODEL_12) { + #elif BOARD_MODEL == BOARD_HELTEC32_V4 + if (model == MODEL_C8) { + #elif BOARD_MODEL == BOARD_HELTEC_T114 + if (model == MODEL_C6 || model == MODEL_C7) { + #elif BOARD_MODEL == BOARD_RAK4631 + if (model == MODEL_11 || model == MODEL_12) { #elif BOARD_MODEL == BOARD_HUZZAH32 if (model == MODEL_FF) { #elif BOARD_MODEL == BOARD_GENERIC_ESP32 diff --git a/sx126x.cpp b/sx126x.cpp index 30c22d9..18ae7e2 100644 --- a/sx126x.cpp +++ b/sx126x.cpp @@ -125,7 +125,7 @@ bool sx126x::preInit() { pinMode(_ss, OUTPUT); digitalWrite(_ss, HIGH); - #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_XIAO_S3 + #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_HELTEC32_V4 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_XIAO_S3 SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs); #elif BOARD_MODEL == BOARD_TECHO SPI.setPins(pin_miso, pin_sclk, pin_mosi); diff --git a/sx128x.cpp b/sx128x.cpp index 71ddac6..59c464e 100644 --- a/sx128x.cpp +++ b/sx128x.cpp @@ -134,7 +134,7 @@ bool sx128x::preInit() { // TODO: Check if this change causes issues on any platforms #if MCU_VARIANT == MCU_ESP32 - #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK + #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_HELTEC32_V4 || BOARD_MODEL == BOARD_TDECK SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs); #else SPI.begin();