|
| 1 | +#pragma once |
| 2 | + |
| 3 | +#include "ESP32Board.h" |
| 4 | +#include <driver/rtc_io.h> |
| 5 | +#include <Wire.h> |
| 6 | +#include <Arduino.h> |
| 7 | +#include "XPowersLib.h" |
| 8 | + |
| 9 | +// LoRa radio module pins for TBeam S3 Supreme |
| 10 | +#define P_LORA_DIO_1 1 //SX1262 IRQ pin |
| 11 | +#define P_LORA_NSS 10 //SX1262 SS pin |
| 12 | +#define P_LORA_RESET 5 //SX1262 Rest pin |
| 13 | +#define P_LORA_BUSY 4 //SX1262 Busy pin |
| 14 | +#define P_LORA_SCLK 12 //SX1262 SCLK pin |
| 15 | +#define P_LORA_MISO 13 //SX1262 MISO pin |
| 16 | +#define P_LORA_MOSI 11 //SX1262 MOSI pin |
| 17 | + |
| 18 | +#define PIN_BOARD_SDA 17 //SDA for OLED, BME280, and QMC6310U (0x1C) |
| 19 | +#define PIN_BOARD_SCL 18 //SCL for OLED, BME280, and QMC6310U (0x1C) |
| 20 | + |
| 21 | +#define PIN_BOARD_SDA1 42 //SDA for PMU and PFC8563 (RTC) |
| 22 | +#define PIN_BOARD_SCL1 41 //SCL for PMU and PFC8563 (RTC) |
| 23 | +#define PIN_PMU_IRQ 40 //IRQ pin for PMU |
| 24 | + |
| 25 | +#define PIN_USER_BTN 0 |
| 26 | + |
| 27 | +#define P_BOARD_SPI_MOSI 35 //SPI for SD Card and QMI8653 (IMU) |
| 28 | +#define P_BOARD_SPI_MISO 37 //SPI for SD Card and QMI8653 (IMU) |
| 29 | +#define P_BOARD_SPI_SCK 36 //SPI for SD Card and QMI8653 (IMU) |
| 30 | +#define P_BPARD_SPI_CS 47 //SPI for SD Card and QMI8653 (IMU) |
| 31 | +#define P_BOARD_IMU_CS 34 //Pin for QMI8653 (IMU) CS |
| 32 | + |
| 33 | +#define P_BOARD_IMU_INT 33 //IMU Int pin |
| 34 | +#define P_BOARD_RTC_INT 14 //RTC Int pin |
| 35 | + |
| 36 | +#define P_GPS_RX 9 //GPS RX pin |
| 37 | +#define P_GPS_TX 8 //GPS TX pin |
| 38 | +#define P_GPS_WAKE 7 //GPS Wakeup pin |
| 39 | +#define P_GPS_1PPS 6 //GPS 1PPS pin |
| 40 | + |
| 41 | +//I2C Wire addresses |
| 42 | +#define I2C_BME280_ADD 0x76 //BME280 sensor I2C address on Wire |
| 43 | +#define I2C_OLED_ADD 0x3C //SH1106 OLED I2C address on Wire |
| 44 | +#define I2C_QMC6310U_ADD 0x1C //QMC6310U mag sensor I2C address on Wire |
| 45 | + |
| 46 | +//I2C Wire1 addresses |
| 47 | +#define I2C_RTC_ADD 0x51 //RTC I2C address on Wire1 |
| 48 | +#define I2C_PMU_ADD 0x34 //AXP2101 I2C address on Wire1 |
| 49 | + |
| 50 | + |
| 51 | + |
| 52 | +class TBeamS3SupremeBoard : public ESP32Board { |
| 53 | + |
| 54 | +public: |
| 55 | + void begin() { |
| 56 | + |
| 57 | + bool power_init(); |
| 58 | + |
| 59 | + ESP32Board::begin(); |
| 60 | + |
| 61 | + esp_reset_reason_t reason = esp_reset_reason(); |
| 62 | + if (reason == ESP_RST_DEEPSLEEP) { |
| 63 | + long wakeup_source = esp_sleep_get_ext1_wakeup_status(); |
| 64 | + if (wakeup_source & (1 << P_LORA_DIO_1)) { // received a LoRa packet (while in deep sleep) |
| 65 | + startup_reason = BD_STARTUP_RX_PACKET; |
| 66 | + } |
| 67 | + |
| 68 | + rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS); |
| 69 | + rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1); |
| 70 | + } |
| 71 | + } |
| 72 | + |
| 73 | + void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) { |
| 74 | + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); |
| 75 | + |
| 76 | + // Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep |
| 77 | + rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY); |
| 78 | + rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1); |
| 79 | + |
| 80 | + rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS); |
| 81 | + |
| 82 | + if (pin_wake_btn < 0) { |
| 83 | + esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet |
| 84 | + } else { |
| 85 | + 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 |
| 86 | + } |
| 87 | + |
| 88 | + if (secs > 0) { |
| 89 | + esp_sleep_enable_timer_wakeup(secs * 1000000); |
| 90 | + } |
| 91 | + |
| 92 | + // Finally set ESP32 into sleep |
| 93 | + esp_deep_sleep_start(); // CPU halts here and never returns! |
| 94 | + } |
| 95 | + |
| 96 | + uint16_t getBattMilliVolts() override { |
| 97 | + |
| 98 | + return 0; |
| 99 | + } |
| 100 | + |
| 101 | + uint16_t getBattPercent(); |
| 102 | + |
| 103 | + const char* getManufacturerName() const override { |
| 104 | + return "LilyGo T-Beam S3 Supreme SX1262"; |
| 105 | + } |
| 106 | +}; |
0 commit comments