diff --git a/README.md b/README.md index 93ed9bd..a1bdeb7 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ ____________________________________________________ ____________________________________________________ ## Timeline (Versions): +- 2024.01.03 Added support for T-Beam V1, V1.2, V1 + SX1268, V1.2 + SX1262. - 2024.01.02 Added support for EByte 400M30S 1Watt LoRa module for DIY ESP32 iGate. - 2023.12.27 HELTEC V3 board support added. - 2023.12.26 Added BME680 module to BME/BMP280 modules supported. diff --git a/platformio.ini b/platformio.ini index 88763f7..f0c2bda 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,6 +26,7 @@ lib_deps = adafruit/Adafruit BMP280 Library@^2.6.8 adafruit/Adafruit BME680 Library@^2.0.4 jgromes/RadioLib @ 6.1.0 + lewisxhe/XPowersLib@^0.1.8 [env:ttgo-lora32-v21] @@ -43,8 +44,24 @@ board_build.mcu = esp32s3 [env:ESP32_DIY_LoRa] board = esp32dev -build_flags = -Werror -Wall -DESP32_DIY_LoRa +build_flags = -Werror -Wall -DESP32_DIY_LoRa -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 [env:ESP32_DIY_1W_LoRa] board = esp32dev -build_flags = -Werror -Wall -DESP32_DIY_1W_LoRa \ No newline at end of file +build_flags = -Werror -Wall -DESP32_DIY_1W_LoRa -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 + +[env:ttgo-t-beam-v1_2] +board = ttgo-t-beam +build_flags = -Werror -Wall -DTTGO_T_Beam_V1_2 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 + +[env:ttgo-t-beam-v1] +board = ttgo-t-beam +build_flags = -Werror -Wall -DTTGO_T_Beam_V1_0 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 + +[env:ttgo-t-beam-v1_SX1268] +board = ttgo-t-beam +build_flags = -Werror -Wall -DTTGO_T_Beam_V1_0_SX1268 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 + +[env:ttgo-t-beam-v1_2_SX1262] +board = ttgo-t-beam +build_flags = -Werror -Wall -DTTGO_T_Beam_V1_2_SX1262 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 \ No newline at end of file diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index fbaeaf1..673500f 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -7,6 +7,7 @@ #include "syslog_utils.h" #include "pins_config.h" #include "query_utils.h" +#include "power_utils.h" #include "lora_utils.h" #include "wifi_utils.h" #include "digi_utils.h" @@ -19,7 +20,7 @@ Configuration Config; WiFiClient espClient; -String versionDate = "2024.01.02"; +String versionDate = "2024.01.03"; int myWiFiAPIndex = 0; int myWiFiAPSize = Config.wifiAPs.size(); WiFi_AP *currentWiFi = &Config.wifiAPs[myWiFiAPIndex]; @@ -49,10 +50,15 @@ void setup() { #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) pinMode(batteryPin, INPUT); #endif + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(HELTEC_V3) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) pinMode(internalLedPin, OUTPUT); + #endif if (Config.externalVoltageMeasurement) { pinMode(Config.externalVoltagePin, INPUT); } + #if defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_SX1262) + POWER_Utils::setup(); + #endif delay(1000); Utils::setupDisplay(); WIFI_Utils::setup(); diff --git a/src/lora_utils.cpp b/src/lora_utils.cpp index 2752ea9..7adcca6 100644 --- a/src/lora_utils.cpp +++ b/src/lora_utils.cpp @@ -10,12 +10,12 @@ extern Configuration Config; extern int stationMode; -#ifdef HELTEC_V3 +#if defined(HELTEC_V3) || defined(TTGO_T_Beam_V1_2_SX1262) SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN); bool transmissionFlag = true; bool enableInterrupt = true; #endif -#ifdef ESP32_DIY_1W_LoRa +#if defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0_SX1268) SX1268 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN); bool transmissionFlag = true; bool enableInterrupt = true; @@ -27,13 +27,13 @@ float snr; namespace LoRa_Utils { void setFlag(void) { - #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) + #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) transmissionFlag = true; #endif } void setup() { - #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS); LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ); long freq; @@ -56,7 +56,7 @@ namespace LoRa_Utils { LoRa.setTxPower(Config.loramodule.power); Serial.print("init : LoRa Module ... done!"); #endif - #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) + #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN); float freq = (float)Config.loramodule.iGateFreq/1000000; int state = radio.begin(freq); @@ -70,7 +70,7 @@ namespace LoRa_Utils { radio.setSpreadingFactor(Config.loramodule.spreadingFactor); radio.setBandwidth(Config.loramodule.signalBandwidth); radio.setCodingRate(Config.loramodule.codingRate4); - #ifdef HELTEC_V3 + #if defined(HELTEC_V3) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) state = radio.setOutputPower(Config.loramodule.power + 2); // values available: 10, 17, 22 --> if 20 in tracker_conf.json it will be updated to 22. #endif #ifdef ESP32_DIY_1W_LoRa_GPS @@ -86,8 +86,10 @@ namespace LoRa_Utils { } void sendNewPacket(const String &typeOfMessage, const String &newPacket) { + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(HELTEC_V3) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) digitalWrite(internalLedPin,HIGH); - #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) + #endif + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) LoRa.beginPacket(); LoRa.write('<'); if (typeOfMessage == "APRS") { @@ -99,7 +101,7 @@ namespace LoRa_Utils { LoRa.write((const uint8_t *)newPacket.c_str(), newPacket.length()); LoRa.endPacket(); #endif - #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) + #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) int state = radio.transmit("\x3c\xff\x01" + newPacket); if (state == RADIOLIB_ERR_NONE) { //Serial.println(F("success!")); @@ -112,7 +114,9 @@ namespace LoRa_Utils { Serial.println(state); } #endif + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(HELTEC_V3) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) digitalWrite(internalLedPin,LOW); + #endif SYSLOG_Utils::log("LoRa Tx", newPacket,0,0,0); Serial.print("---> LoRa Packet Tx : "); Serial.println(newPacket); @@ -128,7 +132,7 @@ namespace LoRa_Utils { String receivePacket() { String loraPacket = ""; - #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) int packetSize = LoRa.parsePacket(); if (packetSize) { while (LoRa.available()) { @@ -140,7 +144,7 @@ namespace LoRa_Utils { freqError = LoRa.packetFrequencyError(); } #endif - #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) + #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) if (transmissionFlag) { transmissionFlag = false; radio.startReceive(); @@ -173,10 +177,10 @@ namespace LoRa_Utils { void changeFreqTx() { delay(500); - #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) LoRa.setFrequency(Config.loramodule.digirepeaterTxFreq); #endif - #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) + #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) float freq = (float)Config.loramodule.digirepeaterTxFreq/1000000; radio.setFrequency(freq); #endif @@ -184,10 +188,10 @@ namespace LoRa_Utils { void changeFreqRx() { delay(500); - #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) LoRa.setFrequency(Config.loramodule.digirepeaterRxFreq); #endif - #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) + #if defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) float freq = (float)Config.loramodule.digirepeaterRxFreq/1000000; radio.setFrequency(freq); #endif diff --git a/src/pins_config.h b/src/pins_config.h index cd8799e..d4d17af 100644 --- a/src/pins_config.h +++ b/src/pins_config.h @@ -6,10 +6,11 @@ #undef OLED_SDA #undef OLED_SCL #undef OLED_RST -#undef LORA_RST + // LORA MODULES #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) +#undef LORA_RST #define LORA_SCK 5 // GPIO5 - SX1276 SCK #define LORA_MISO 19 // GPIO19 - SX1276 MISO #define LORA_MOSI 27 // GPIO27 - SX1276 MOSI @@ -40,9 +41,20 @@ #define RADIO_TXEN 25 #endif +#if defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) +#define RADIO_SCLK_PIN 5 +#define RADIO_MISO_PIN 19 +#define RADIO_MOSI_PIN 27 +#define RADIO_CS_PIN 18 +#define RADIO_DIO0_PIN 26 +#define RADIO_RST_PIN 23 +#define RADIO_DIO1_PIN 33 +#define RADIO_BUSY_PIN 32 +#endif + // OLED -#if defined(TTGO_T_LORA_V2_1) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) +#if defined(TTGO_T_LORA_V2_1) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) #define OLED_SDA 21 #define OLED_SCL 22 #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) diff --git a/src/power_utils.cpp b/src/power_utils.cpp new file mode 100644 index 0000000..84af4c3 --- /dev/null +++ b/src/power_utils.cpp @@ -0,0 +1,143 @@ +#include "configuration.h" +#include "power_utils.h" +#include "pins_config.h" + +#if defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_SX1262) +#define I2C_SDA 21 +#define I2C_SCL 22 +#define IRQ_PIN 35 +#endif + +#if defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_SX1268) +XPowersAXP192 PMU; +#endif +#if defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_SX1262) +XPowersAXP2101 PMU; +#endif + +extern Configuration Config; + + +namespace POWER_Utils { + + bool BatteryIsConnected = false; + String batteryVoltage = ""; + String batteryChargeDischargeCurrent = ""; + + void activateMeasurement() { + #if defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_SX1262) + PMU.disableTSPinMeasure(); + PMU.enableBattDetection(); + PMU.enableVbusVoltageMeasure(); + PMU.enableBattVoltageMeasure(); + PMU.enableSystemVoltageMeasure(); + #endif + } + + void activateLoRa() { + #if defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_SX1268) + PMU.setLDO2Voltage(3300); + PMU.enableLDO2(); + #endif + #if defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_SX1262) + PMU.setALDO2Voltage(3300); + PMU.enableALDO2(); + #endif + } + + void deactivateLoRa() { + #if defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_SX1268) + PMU.disableLDO2(); + #endif + #if defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_SX1262) + PMU.disableALDO2(); + #endif + } + + bool begin(TwoWire &port) { + #if defined (TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(HELTEC_V3) || defined(ESP32_DIY_1W_LoRa) + return true; + #endif + + #if defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_SX1268) + bool result = PMU.begin(Wire, AXP192_SLAVE_ADDRESS, I2C_SDA, I2C_SCL); + if (result) { + PMU.disableDC2(); + PMU.disableLDO2(); + PMU.disableLDO3(); + PMU.setDC1Voltage(3300); + PMU.enableDC1(); + PMU.setProtectedChannel(XPOWERS_DCDC3); + PMU.disableIRQ(XPOWERS_AXP192_ALL_IRQ); + } + return result; + #endif + + #if defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_SX1262) + bool result = PMU.begin(Wire, AXP2101_SLAVE_ADDRESS, I2C_SDA, I2C_SCL); + if (result) { + PMU.disableDC2(); + PMU.disableDC3(); + PMU.disableDC4(); + PMU.disableDC5(); + PMU.disableALDO1(); + PMU.disableALDO4(); + PMU.disableBLDO1(); + PMU.disableBLDO2(); + PMU.disableDLDO1(); + PMU.disableDLDO2(); + PMU.setDC1Voltage(3300); + PMU.enableDC1(); + PMU.disableIRQ(XPOWERS_AXP2101_ALL_IRQ); + } + return result; + #endif + } + + void setup() { + Wire.end(); + #if defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_SX1268) + Wire.begin(SDA, SCL); + if (begin(Wire)) { + Serial.println("AXP192 init done!"); + } else { + Serial.println("AXP192 init failed!"); + } + activateLoRa(); + //activateGPS(); + activateMeasurement(); + PMU.setChargerTerminationCurr(XPOWERS_AXP192_CHG_ITERM_LESS_10_PERCENT); + PMU.setChargeTargetVoltage(XPOWERS_AXP192_CHG_VOL_4V2); + PMU.setChargerConstantCurr(XPOWERS_AXP192_CHG_CUR_780MA); + PMU.setSysPowerDownVoltage(2600); + #endif + + #if defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_SX1262) + Wire.begin(SDA, SCL); + if (begin(Wire)) { + Serial.println("AXP2101 init done!"); + } else { + Serial.println("AXP2101 init failed!"); + } + activateLoRa(); + //activateGPS(); + activateMeasurement(); + PMU.setPrechargeCurr(XPOWERS_AXP2101_PRECHARGE_200MA); + PMU.setChargerTerminationCurr(XPOWERS_AXP2101_CHG_ITERM_25MA); + PMU.setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2); + PMU.setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_800MA); + PMU.setSysPowerDownVoltage(2600); + #endif + } + + /*void lowerCpuFrequency() { + #if defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2) || defined(ESP32_DIY_LoRa_GPS) || defined(TTGO_T_LORA_V2_1_GPS) || defined(TTGO_T_LORA_V2_1_TNC) || defined(ESP32_DIY_1W_LoRa_GPS) || defined(TTGO_T_Beam_V1_2_SX1262) + if (setCpuFrequencyMhz(80)) { + logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Main", "CPU frequency set to 80MHz"); + } else { + logger.log(logging::LoggerLevel::LOGGER_LEVEL_WARN, "Main", "CPU frequency unchanged"); + } + #endif + }*/ + +} \ No newline at end of file diff --git a/src/power_utils.h b/src/power_utils.h new file mode 100644 index 0000000..b57623b --- /dev/null +++ b/src/power_utils.h @@ -0,0 +1,20 @@ +#ifndef POWER_UTILS_H_ +#define POWER_UTILS_H_ + +#include +#include "XPowersLib.h" + +namespace POWER_Utils { + + void activateMeasurement(); + + void activateLoRa(); + void deactivateLoRa(); + + bool begin(TwoWire &port); + void setup(); + + //void lowerCpuFrequency(); +} + +#endif diff --git a/src/utils.cpp b/src/utils.cpp index a2bfc6d..596a9c2 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -81,10 +81,14 @@ namespace Utils { void setupDisplay() { setup_display(); + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(HELTEC_V3) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) digitalWrite(internalLedPin,HIGH); + #endif Serial.println("\nStarting iGate: " + Config.callsign + " Version: " + versionDate); show_display(" LoRa APRS", "", " ( iGATE )", "", "", "Richonguzman / CA2RXU", " " + versionDate, 4000); + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(HELTEC_V3) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) digitalWrite(internalLedPin,LOW); + #endif firstLine = Config.callsign; seventhLine = " listening..."; } diff --git a/src/wifi_utils.cpp b/src/wifi_utils.cpp index 5cf9c18..60ca513 100644 --- a/src/wifi_utils.cpp +++ b/src/wifi_utils.cpp @@ -36,10 +36,14 @@ namespace WIFI_Utils { WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); while (WiFi.status() != WL_CONNECTED && wifiCounter<2) { delay(500); + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(HELTEC_V3) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) digitalWrite(internalLedPin,HIGH); + #endif Serial.print('.'); delay(500); + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(HELTEC_V3) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) digitalWrite(internalLedPin,LOW); + #endif if ((millis() - start) > 10000){ delay(1000); if(myWiFiAPIndex >= (myWiFiAPSize-1)) { @@ -58,7 +62,9 @@ namespace WIFI_Utils { WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); } } + #if defined(TTGO_T_LORA_V2_1) || defined(HELTEC_V2) || defined(HELTEC_V3) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) digitalWrite(internalLedPin,LOW); + #endif if (WiFi.status() == WL_CONNECTED) { Serial.print("Connected as "); Serial.println(WiFi.localIP());