Files
MeshCore-Solo/variants/heltec_v3/HeltecV3Board.h
T

72 lines
1.9 KiB
C++
Raw Normal View History

2025-01-13 14:07:48 +11:00
#pragma once
#include <Arduino.h>
#include <helpers/RefCountedDigitalPin.h>
2025-10-11 21:52:48 +02:00
#include <helpers/ESP32Board.h>
2025-01-13 14:07:48 +11:00
// built-ins
2025-06-27 22:57:49 -07:00
#ifndef PIN_VBAT_READ // set in platformio.ini for boards like Heltec Wireless Paper (20)
#define PIN_VBAT_READ 1
#endif
2025-05-07 21:40:27 +12:00
#ifndef PIN_ADC_CTRL // set in platformio.ini for Heltec Wireless Tracker (2)
#define PIN_ADC_CTRL 37
#endif
2026-03-27 01:23:04 +00:00
#ifndef ADC_MULTIPLIER //default ADC multiplier
#define ADC_MULTIPLIER 5.42
#endif
2025-01-13 14:07:48 +11:00
#define PIN_ADC_CTRL_ACTIVE LOW
#define PIN_ADC_CTRL_INACTIVE HIGH
2025-01-13 14:07:48 +11:00
class HeltecV3Board : public ESP32Board {
2025-03-05 19:52:24 -08:00
private:
bool adc_active_state;
2025-01-13 14:07:48 +11:00
public:
RefCountedDigitalPin periph_power;
HeltecV3Board() : periph_power(PIN_VEXT_EN) { }
2025-01-13 14:07:48 +11:00
void begin() {
ESP32Board::begin();
2025-03-05 19:52:24 -08:00
// Auto-detect correct ADC_CTRL pin polarity (different for boards >3.2)
pinMode(PIN_ADC_CTRL, INPUT);
adc_active_state = !digitalRead(PIN_ADC_CTRL);
2025-10-11 21:52:48 +02:00
pinMode(PIN_ADC_CTRL, OUTPUT);
2025-03-05 19:52:24 -08:00
digitalWrite(PIN_ADC_CTRL, !adc_active_state); // Initially inactive
periph_power.begin();
2025-01-13 14:07:48 +11:00
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);
}
}
uint16_t getBattMilliVolts() override {
analogReadResolution(10);
2025-03-05 19:52:24 -08:00
digitalWrite(PIN_ADC_CTRL, adc_active_state);
2025-01-13 14:07:48 +11:00
uint32_t raw = 0;
for (int i = 0; i < 8; i++) {
raw += analogRead(PIN_VBAT_READ);
}
raw = raw / 8;
2025-03-05 19:52:24 -08:00
digitalWrite(PIN_ADC_CTRL, !adc_active_state);
2025-01-13 14:07:48 +11:00
return (ADC_MULTIPLIER * (3.3 / 1024.0) * raw) * 1000;
2025-01-13 14:07:48 +11:00
}
const char* getManufacturerName() const override {
return "Heltec V3";
}
};