mirror of
https://github.com/richonguzman/LoRa_APRS_iGate.git
synced 2026-07-10 11:51:03 +02:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 026d6b2eeb | |||
| fe705519cb | |||
| 1fa74b8697 | |||
| a3794085b4 | |||
| 0a898a40e6 | |||
| ff8c7581fa | |||
| 449a8557d2 | |||
| 4419c98920 | |||
| 45bf90817b | |||
| ef30a1bf58 | |||
| 9a705d3dfa | |||
| 63f74396d2 |
@@ -71,6 +71,10 @@ jobs:
|
|||||||
chip: esp32c3
|
chip: esp32c3
|
||||||
- name: heltec_wireless_paper_v1
|
- name: heltec_wireless_paper_v1
|
||||||
chip: esp32s3
|
chip: esp32s3
|
||||||
|
- name: heltec_wireless_paper_v1_2
|
||||||
|
chip: esp32s3
|
||||||
|
- name: heltec_vision_master_e290
|
||||||
|
chip: esp32s3
|
||||||
- name: OE5HWN_MeshCom
|
- name: OE5HWN_MeshCom
|
||||||
chip: esp32
|
chip: esp32
|
||||||
- name: WEMOS-LOLIN32-OLED-DIY
|
- name: WEMOS-LOLIN32-OLED-DIY
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ ____________________________________________________
|
|||||||
<br />
|
<br />
|
||||||
|
|
||||||
# Timeline (Versions):
|
# Timeline (Versions):
|
||||||
|
- 2025-12-22 Heltec Wireless Paper V1.2 and VisionMaster E290 Added. Thanks HA5SZI.
|
||||||
- 2025-12-18 TCXO and packet decoding updates.
|
- 2025-12-18 TCXO and packet decoding updates.
|
||||||
- 2025-12-01 APRSPacketLib updates, AHT20 sensor added, INA219 support added.
|
- 2025-12-01 APRSPacketLib updates, AHT20 sensor added, INA219 support added.
|
||||||
- 2025-10-15 APRS Bridge for TNC added.
|
- 2025-10-15 APRS Bridge for TNC added.
|
||||||
|
|||||||
+3
-3
@@ -31,12 +31,12 @@ lib_deps =
|
|||||||
adafruit/Adafruit INA219 @ 1.2.3
|
adafruit/Adafruit INA219 @ 1.2.3
|
||||||
adafruit/Adafruit Si7021 Library @ 1.5.3
|
adafruit/Adafruit Si7021 Library @ 1.5.3
|
||||||
arduino-libraries/NTPClient @ 3.2.1
|
arduino-libraries/NTPClient @ 3.2.1
|
||||||
ayushsharma82/ElegantOTA @ 3.1.5
|
ayushsharma82/ElegantOTA @ 3.1.7
|
||||||
bblanchon/ArduinoJson @ 6.21.3
|
bblanchon/ArduinoJson @ 6.21.3
|
||||||
jgromes/RadioLib @ 7.1.0
|
jgromes/RadioLib @ 7.1.0
|
||||||
knolleary/PubSubClient @ 2.8
|
knolleary/PubSubClient @ 2.8
|
||||||
mathieucarbou/AsyncTCP @ 3.2.5
|
ESP32Async/AsyncTCP @ 3.4.9
|
||||||
mathieucarbou/ESPAsyncWebServer @ 3.2.3
|
ESP32Async/ESPAsyncWebServer @ 3.9.3
|
||||||
mikalhart/TinyGPSPlus @ 1.0.3
|
mikalhart/TinyGPSPlus @ 1.0.3
|
||||||
richonguzman/APRSPacketLib @ 1.0.4
|
richonguzman/APRSPacketLib @ 1.0.4
|
||||||
display_libs =
|
display_libs =
|
||||||
|
|||||||
@@ -67,8 +67,8 @@ ___________________________________________________________________*/
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
String versionDate = "2025-12-22";
|
String versionDate = "2025-12-29";
|
||||||
String versionNumber = "3.1.6.1";
|
String versionNumber = "3.1.7";
|
||||||
Configuration Config;
|
Configuration Config;
|
||||||
WiFiClient aprsIsClient;
|
WiFiClient aprsIsClient;
|
||||||
WiFiClient mqttClient;
|
WiFiClient mqttClient;
|
||||||
|
|||||||
@@ -290,7 +290,11 @@ bool Configuration::readFile() {
|
|||||||
if (!data["display"].containsKey("alwaysOn") ||
|
if (!data["display"].containsKey("alwaysOn") ||
|
||||||
!data["display"].containsKey("timeout") ||
|
!data["display"].containsKey("timeout") ||
|
||||||
!data["display"].containsKey("turn180")) needsRewrite = true;
|
!data["display"].containsKey("turn180")) needsRewrite = true;
|
||||||
display.alwaysOn = data["display"]["alwaysOn"] | true;
|
#ifdef HAS_EPAPER
|
||||||
|
display.alwaysOn = true;
|
||||||
|
#else
|
||||||
|
display.alwaysOn = data["display"]["alwaysOn"] | true;
|
||||||
|
#endif
|
||||||
display.timeout = data["display"]["timeout"] | 4;
|
display.timeout = data["display"]["timeout"] | 4;
|
||||||
display.turn180 = data["display"]["turn180"] | false;
|
display.turn180 = data["display"]["turn180"] | false;
|
||||||
|
|
||||||
|
|||||||
+18
-8
@@ -47,9 +47,13 @@
|
|||||||
#ifdef HELTEC_WP_V1
|
#ifdef HELTEC_WP_V1
|
||||||
EInkDisplay_WirelessPaperV1_1 display;
|
EInkDisplay_WirelessPaperV1_1 display;
|
||||||
#endif
|
#endif
|
||||||
/*#ifdef HELTEC_WP_V1_2 // SOON!
|
#ifdef HELTEC_WP_V1_2
|
||||||
EInkDisplay_WirelessPaperV1_2 display;
|
EInkDisplay_WirelessPaperV1_2 display;
|
||||||
#endif*/
|
#endif
|
||||||
|
#ifdef HELTEC_VM_E290
|
||||||
|
EInkDisplay_VisionMasterE290 display;
|
||||||
|
#endif
|
||||||
|
|
||||||
String lastEpaperText;
|
String lastEpaperText;
|
||||||
#else
|
#else
|
||||||
#include <Adafruit_GFX.h>
|
#include <Adafruit_GFX.h>
|
||||||
@@ -88,15 +92,22 @@ void displaySetup() {
|
|||||||
tft.setTextFont(0);
|
tft.setTextFont(0);
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
|
#if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
|
||||||
sprite.createSprite(320,240);
|
sprite.createSprite(320, 240);
|
||||||
#else
|
#else
|
||||||
sprite.createSprite(160,80);
|
sprite.createSprite(160, 80);
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#ifdef HAS_EPAPER
|
#ifdef HAS_EPAPER
|
||||||
display.landscape();
|
display.landscape();
|
||||||
display.printCenter("LoRa APRS iGate Initialising...");
|
display.printCenter("LoRa APRS iGate Initialising...");
|
||||||
if (Config.display.turn180) display.setRotation(2);
|
if (Config.display.turn180) {
|
||||||
|
#if defined(HELTEC_VM_E290) || defined(HELTEC_WP_V1)
|
||||||
|
display.setRotation(3);
|
||||||
|
#endif
|
||||||
|
#if defined(HELTEC_WP_V1_2)
|
||||||
|
display.setRotation(1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
display.update();
|
display.update();
|
||||||
#else
|
#else
|
||||||
#ifdef OLED_DISPLAY_HAS_RST_PIN
|
#ifdef OLED_DISPLAY_HAS_RST_PIN
|
||||||
@@ -158,7 +169,6 @@ void displayToggle(bool toggle) {
|
|||||||
digitalWrite(TFT_BL, LOW);
|
digitalWrite(TFT_BL, LOW);
|
||||||
#else
|
#else
|
||||||
#ifdef HAS_EPAPER
|
#ifdef HAS_EPAPER
|
||||||
display.printCenter("Enabled EPAPER Display...");
|
|
||||||
display.update();
|
display.update();
|
||||||
#else
|
#else
|
||||||
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
|
#if defined(TTGO_T_Beam_S3_SUPREME_V3)
|
||||||
@@ -196,7 +206,7 @@ void displayShow(const String& header, const String& line1, const String& line2,
|
|||||||
sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2);
|
sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprite.pushSprite(0,0);
|
sprite.pushSprite(0, 0);
|
||||||
#else
|
#else
|
||||||
#ifdef HAS_EPAPER
|
#ifdef HAS_EPAPER
|
||||||
display.clearMemory();
|
display.clearMemory();
|
||||||
@@ -261,7 +271,7 @@ void displayShow(const String& header, const String& line1, const String& line2,
|
|||||||
sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2);
|
sprite.drawString(*lines[i], 3, (lineSpacing * (2 + i)) - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprite.pushSprite(0,0);
|
sprite.pushSprite(0, 0);
|
||||||
#else
|
#else
|
||||||
#ifdef HAS_EPAPER
|
#ifdef HAS_EPAPER
|
||||||
lastEpaperText = header + line1 + line2 + line3 + line4 + line5 + line6;
|
lastEpaperText = header + line1 + line2 + line3 + line4 + line5 + line6;
|
||||||
|
|||||||
+31
-24
@@ -57,7 +57,7 @@ namespace GPS_Utils {
|
|||||||
String encodedGPS = APRSPacketLib::encodeGPSIntoBase91(Config.beacon.latitude, Config.beacon.longitude, 0, 0, Config.beacon.symbol, false, 0, true, Config.beacon.ambiguityLevel);
|
String encodedGPS = APRSPacketLib::encodeGPSIntoBase91(Config.beacon.latitude, Config.beacon.longitude, 0, 0, Config.beacon.symbol, false, 0, true, Config.beacon.ambiguityLevel);
|
||||||
|
|
||||||
iGateBeaconPacket = beaconPacket;
|
iGateBeaconPacket = beaconPacket;
|
||||||
iGateBeaconPacket += ",qAC:!";
|
iGateBeaconPacket += ",qAC:=";
|
||||||
iGateBeaconPacket += Config.beacon.overlay;
|
iGateBeaconPacket += Config.beacon.overlay;
|
||||||
iGateBeaconPacket += encodedGPS;
|
iGateBeaconPacket += encodedGPS;
|
||||||
|
|
||||||
@@ -132,36 +132,43 @@ namespace GPS_Utils {
|
|||||||
convertedLongitude += Longitude.substring(3,5).toFloat() / 60; // Next 2 digits (Minutes)
|
convertedLongitude += Longitude.substring(3,5).toFloat() / 60; // Next 2 digits (Minutes)
|
||||||
convertedLongitude += Longitude.substring(Longitude.indexOf(".") + 1, Longitude.indexOf(".") + 3).toFloat() / (60*100);
|
convertedLongitude += Longitude.substring(Longitude.indexOf(".") + 1, Longitude.indexOf(".") + 3).toFloat() / (60*100);
|
||||||
if (Longitude.endsWith("W")) convertedLongitude = -convertedLongitude; // Handle Western Hemisphere
|
if (Longitude.endsWith("W")) convertedLongitude = -convertedLongitude; // Handle Western Hemisphere
|
||||||
|
|
||||||
return buildDistanceAndComment(convertedLatitude, convertedLongitude, infoGPS.substring(19));
|
return buildDistanceAndComment(convertedLatitude, convertedLongitude, infoGPS.substring(19));
|
||||||
}
|
}
|
||||||
|
|
||||||
String getDistanceAndComment(const String& packet) {
|
String getDistanceAndComment(const String& packet) {
|
||||||
int indexOfAt = packet.indexOf(":@");
|
int indexOfAt = packet.indexOf(":@");
|
||||||
if (indexOfAt > 10) {
|
if (indexOfAt > 10) return getReceivedGPS(packet);
|
||||||
return getReceivedGPS(packet);
|
|
||||||
} else {
|
|
||||||
const uint8_t ENCODED_BYTE_OFFSET = 14; // Offset for encoded data in the packet
|
|
||||||
int indexOfExclamation = packet.indexOf(":!");
|
|
||||||
int indexOfEqual = packet.indexOf(":=");
|
|
||||||
uint8_t encodedBytePosition = 0;
|
|
||||||
if (indexOfExclamation > 10) { // Determine the position where encoded data starts
|
|
||||||
encodedBytePosition = indexOfExclamation + ENCODED_BYTE_OFFSET;
|
|
||||||
} else if (indexOfEqual > 10) {
|
|
||||||
encodedBytePosition = indexOfEqual + ENCODED_BYTE_OFFSET;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (encodedBytePosition != 0) {
|
const uint8_t nonEncondedLatitudeOffset = 9; // "N" / "S"
|
||||||
char currentChar = packet[encodedBytePosition];
|
const uint8_t nonEncondedLongitudeOffset = 19; // "E" / "W"
|
||||||
if (currentChar == 'G' || currentChar == 'Q' || currentChar == '[' || currentChar == 'H' || currentChar == 'X' || currentChar == '3') {
|
const uint8_t encodedByteOffset = 14;
|
||||||
return decodeEncodedGPS(packet); // If valid encoded data position is found, decode it
|
|
||||||
} else {
|
int indexOfExclamation = packet.indexOf(":!");
|
||||||
return getReceivedGPS(packet);
|
int indexOfEqual = packet.indexOf(":=");
|
||||||
}
|
int baseIndex = - 1;
|
||||||
} else {
|
if (indexOfExclamation > 10) {
|
||||||
return " _ / _ / _ ";
|
baseIndex = indexOfExclamation;
|
||||||
}
|
} else if (indexOfEqual > 10) {
|
||||||
|
baseIndex = indexOfEqual;
|
||||||
}
|
}
|
||||||
|
if (baseIndex == -1) return " _ / _ / _ ";
|
||||||
|
|
||||||
|
int latitudeIndex = baseIndex + nonEncondedLatitudeOffset;
|
||||||
|
int longitudeIndex = baseIndex + nonEncondedLongitudeOffset;
|
||||||
|
int encodedByteIndex = baseIndex + encodedByteOffset;
|
||||||
|
int packetLength = packet.length();
|
||||||
|
|
||||||
|
if (latitudeIndex < packetLength && longitudeIndex < packetLength) {
|
||||||
|
char latChar = packet[latitudeIndex];
|
||||||
|
char lngChar = packet[longitudeIndex];
|
||||||
|
if ((latChar == 'N' || latChar == 'S') && (lngChar == 'E' || lngChar == 'W')) return getReceivedGPS(packet);
|
||||||
|
}
|
||||||
|
if (encodedByteIndex < packetLength) {
|
||||||
|
char byteChar = packet[encodedByteIndex];
|
||||||
|
if (byteChar == 'G' || byteChar == 'Q' || byteChar == '[' || byteChar == 'H' || byteChar == 'X' || byteChar == '3') return decodeEncodedGPS(packet);
|
||||||
|
}
|
||||||
|
return " _ / _ / _ ";
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
|||||||
+8
-8
@@ -49,19 +49,19 @@ namespace POWER_Utils {
|
|||||||
|
|
||||||
#ifdef VEXT_CTRL
|
#ifdef VEXT_CTRL
|
||||||
void vext_ctrl_ON() {
|
void vext_ctrl_ON() {
|
||||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3)
|
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) || defined(HELTEC_VM_E290)
|
||||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH);
|
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH);
|
||||||
#endif
|
#endif
|
||||||
#if defined(HELTEC_WP_V1) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3)
|
#if defined(HELTEC_WP_V1) || defined(HELTEC_WP_V1_2) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3)
|
||||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW);
|
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void vext_ctrl_OFF() {
|
void vext_ctrl_OFF() {
|
||||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3)
|
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) || defined(HELTEC_VM_E290)
|
||||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW);
|
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW);
|
||||||
#endif
|
#endif
|
||||||
#if defined(HELTEC_WP_V1) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3)
|
#if defined(HELTEC_WP_V1) || defined(HELTEC_WP_V1_2) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3)
|
||||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH);
|
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -70,19 +70,19 @@ namespace POWER_Utils {
|
|||||||
|
|
||||||
#ifdef ADC_CTRL
|
#ifdef ADC_CTRL
|
||||||
void adc_ctrl_ON() {
|
void adc_ctrl_ON() {
|
||||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2)
|
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) || defined(HELTEC_VM_E290)
|
||||||
digitalWrite(ADC_CTRL, HIGH);
|
digitalWrite(ADC_CTRL, HIGH);
|
||||||
#endif
|
#endif
|
||||||
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP_V1)
|
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP_V1) || defined(HELTEC_WP_V1_2)
|
||||||
digitalWrite(ADC_CTRL, LOW);
|
digitalWrite(ADC_CTRL, LOW);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void adc_ctrl_OFF() {
|
void adc_ctrl_OFF() {
|
||||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2)
|
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) || defined(HELTEC_VM_E290)
|
||||||
digitalWrite(ADC_CTRL, LOW);
|
digitalWrite(ADC_CTRL, LOW);
|
||||||
#endif
|
#endif
|
||||||
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP_V1)
|
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP_V1) || defined(HELTEC_WP_V1_2)
|
||||||
digitalWrite(ADC_CTRL, HIGH);
|
digitalWrite(ADC_CTRL, HIGH);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -98,7 +98,7 @@ namespace WIFI_Utils {
|
|||||||
delay(500);
|
delay(500);
|
||||||
unsigned long start = millis();
|
unsigned long start = millis();
|
||||||
displayShow("", "Connecting to WiFi:", "", currentWiFi->ssid + " ...", 0);
|
displayShow("", "Connecting to WiFi:", "", currentWiFi->ssid + " ...", 0);
|
||||||
Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ...");
|
Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.print("' ");
|
||||||
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
|
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
|
||||||
while (WiFi.status() != WL_CONNECTED && wifiCounter<myWiFiAPSize) {
|
while (WiFi.status() != WL_CONNECTED && wifiCounter<myWiFiAPSize) {
|
||||||
delay(500);
|
delay(500);
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/* Copyright (C) 2025 Ricardo Guzman - CA2RXU
|
||||||
|
*
|
||||||
|
* This file is part of LoRa APRS iGate.
|
||||||
|
*
|
||||||
|
* LoRa APRS iGate is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* LoRa APRS iGate is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOARD_PINOUT_H_
|
||||||
|
#define BOARD_PINOUT_H_
|
||||||
|
|
||||||
|
// LoRa Radio
|
||||||
|
#define HAS_SX1262
|
||||||
|
#define HAS_TCXO
|
||||||
|
#define RADIO_SCLK_PIN 9
|
||||||
|
#define RADIO_MISO_PIN 11
|
||||||
|
#define RADIO_MOSI_PIN 10
|
||||||
|
#define RADIO_CS_PIN 8
|
||||||
|
#define RADIO_RST_PIN 12
|
||||||
|
#define RADIO_DIO1_PIN 14
|
||||||
|
#define RADIO_BUSY_PIN 13
|
||||||
|
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||||
|
#define GPIO_WAKEUP_PIN GPIO_SEL_14
|
||||||
|
|
||||||
|
// I2C
|
||||||
|
#define USE_WIRE1_WITH_BOARD_I2C_PINS
|
||||||
|
#define BOARD_I2C_SDA 39
|
||||||
|
#define BOARD_I2C_SCL 38
|
||||||
|
|
||||||
|
// Display
|
||||||
|
#define HAS_DISPLAY
|
||||||
|
#define HAS_EPAPER
|
||||||
|
#define EPAPER_BUSY 6
|
||||||
|
#define EPAPER_RST 5
|
||||||
|
#define EPAPER_DC 4
|
||||||
|
#define EPAPER_CS 3
|
||||||
|
#define EPAPER_SCL 2
|
||||||
|
#define EPAPER_SDA 1
|
||||||
|
|
||||||
|
// Aditional Config
|
||||||
|
#define INTERNAL_LED_PIN 45
|
||||||
|
#define BATTERY_PIN 7
|
||||||
|
#define ADC_CTRL 46
|
||||||
|
#define VEXT_CTRL 18
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[env:heltec_vision_master_e290]
|
||||||
|
board = esp32-s3-devkitc-1
|
||||||
|
board_build.mcu = esp32s3
|
||||||
|
build_flags =
|
||||||
|
${common.build_flags}
|
||||||
|
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||||
|
-D HELTEC_VM_E290
|
||||||
|
-D Vision_Master_E290
|
||||||
|
lib_deps =
|
||||||
|
${common.lib_deps}
|
||||||
|
https://github.com/todd-herbert/heltec-eink-modules.git
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/* Copyright (C) 2025 Ricardo Guzman - CA2RXU
|
||||||
|
*
|
||||||
|
* This file is part of LoRa APRS iGate.
|
||||||
|
*
|
||||||
|
* LoRa APRS iGate is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* LoRa APRS iGate is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOARD_PINOUT_H_
|
||||||
|
#define BOARD_PINOUT_H_
|
||||||
|
|
||||||
|
// LoRa Radio
|
||||||
|
#define HAS_SX1262
|
||||||
|
#define HAS_TCXO
|
||||||
|
#define RADIO_SCLK_PIN 9
|
||||||
|
#define RADIO_MISO_PIN 11
|
||||||
|
#define RADIO_MOSI_PIN 10
|
||||||
|
#define RADIO_CS_PIN 8
|
||||||
|
#define RADIO_RST_PIN 12
|
||||||
|
#define RADIO_DIO1_PIN 14
|
||||||
|
#define RADIO_BUSY_PIN 13
|
||||||
|
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||||
|
#define GPIO_WAKEUP_PIN GPIO_SEL_14
|
||||||
|
|
||||||
|
// I2C
|
||||||
|
#define USE_WIRE_WITH_OLED_PINS
|
||||||
|
#define USE_WIRE1_WITH_BOARD_I2C_PINS
|
||||||
|
#define BOARD_I2C_SDA 41
|
||||||
|
#define BOARD_I2C_SCL 42
|
||||||
|
|
||||||
|
// Display
|
||||||
|
#define HAS_DISPLAY
|
||||||
|
|
||||||
|
#undef OLED_SDA
|
||||||
|
#undef OLED_SCL
|
||||||
|
#undef OLED_RST
|
||||||
|
|
||||||
|
#define OLED_SDA 17
|
||||||
|
#define OLED_SCL 18
|
||||||
|
#define OLED_RST 21
|
||||||
|
#define OLED_DISPLAY_HAS_RST_PIN
|
||||||
|
|
||||||
|
// Aditional Config
|
||||||
|
#define INTERNAL_LED_PIN 35
|
||||||
|
#define BATTERY_PIN 1
|
||||||
|
#define VEXT_CTRL 36
|
||||||
|
#define ADC_CTRL 37
|
||||||
|
|
||||||
|
// GPS ??
|
||||||
|
#define VGNS_CTRL 34 // cambiar nombre para prender GPS ?
|
||||||
|
// wakeup 40
|
||||||
|
// TX 39
|
||||||
|
// RX 38
|
||||||
|
// RST 42
|
||||||
|
// PPS 41
|
||||||
|
//#define GPS_L76K
|
||||||
|
|
||||||
|
// // active low, powers the oled display and the lora antenna boost
|
||||||
|
|
||||||
|
//#define LORA_PA_POWER 7 // power en
|
||||||
|
//#define LORA_PA_EN 2
|
||||||
|
//#define LORA_PA_TX_EN 46 // enable tx
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[env:heltec_wifi_lora_32_V4]
|
||||||
|
board = heltec_wifi_lora_32_V3
|
||||||
|
board_build.mcu = esp32s3
|
||||||
|
build_flags =
|
||||||
|
${common.build_flags}
|
||||||
|
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||||
|
-D HELTEC_V4
|
||||||
|
lib_deps =
|
||||||
|
${common.lib_deps}
|
||||||
|
${common.display_libs}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/* Copyright (C) 2025 Ricardo Guzman - CA2RXU
|
||||||
|
*
|
||||||
|
* This file is part of LoRa APRS iGate.
|
||||||
|
*
|
||||||
|
* LoRa APRS iGate is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* LoRa APRS iGate is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOARD_PINOUT_H_
|
||||||
|
#define BOARD_PINOUT_H_
|
||||||
|
|
||||||
|
// LoRa Radio
|
||||||
|
#define HAS_SX1262
|
||||||
|
#define HAS_TCXO
|
||||||
|
#define RADIO_SCLK_PIN 9
|
||||||
|
#define RADIO_MISO_PIN 11
|
||||||
|
#define RADIO_MOSI_PIN 10
|
||||||
|
#define RADIO_CS_PIN 8
|
||||||
|
#define RADIO_RST_PIN 12
|
||||||
|
#define RADIO_DIO1_PIN 14
|
||||||
|
#define RADIO_BUSY_PIN 13
|
||||||
|
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||||
|
#define GPIO_WAKEUP_PIN GPIO_SEL_14
|
||||||
|
|
||||||
|
// I2C
|
||||||
|
#define USE_WIRE1_WITH_BOARD_I2C_PINS
|
||||||
|
#define BOARD_I2C_SDA 37
|
||||||
|
#define BOARD_I2C_SCL 36
|
||||||
|
|
||||||
|
// Display
|
||||||
|
#define HAS_DISPLAY
|
||||||
|
#define HAS_EPAPER
|
||||||
|
#define EPAPER_BUSY 7
|
||||||
|
#define EPAPER_RST 6
|
||||||
|
#define EPAPER_DC 5
|
||||||
|
#define EPAPER_CS 4
|
||||||
|
#define EPAPER_SCL 3
|
||||||
|
#define EPAPER_SDA 2
|
||||||
|
|
||||||
|
// Aditional Config
|
||||||
|
#define INTERNAL_LED_PIN 18
|
||||||
|
#define BATTERY_PIN 20
|
||||||
|
#define ADC_CTRL 19
|
||||||
|
#define VEXT_CTRL 45
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[env:heltec_wireless_paper_v1_2]
|
||||||
|
board = esp32-s3-devkitc-1
|
||||||
|
board_build.mcu = esp32s3
|
||||||
|
build_flags =
|
||||||
|
${common.build_flags}
|
||||||
|
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||||
|
-D HELTEC_WP_V1_2
|
||||||
|
-D WIRELESS_PAPER
|
||||||
|
-D V1_2
|
||||||
|
lib_deps =
|
||||||
|
${common.lib_deps}
|
||||||
|
https://github.com/todd-herbert/heltec-eink-modules.git
|
||||||
Reference in New Issue
Block a user