Added SX1280 ranging example, using open source code, accuracy is not guaranteed

This commit is contained in:
lewisxhe 2025-09-17 16:08:44 +08:00
commit c541fa2d71
7 changed files with 863 additions and 0 deletions

View file

@ -0,0 +1,213 @@
#include "Arduino.h"
#include <SPI.h>
#include <SX128XLT.h>
#include "boards.h"
#define LORA_DEVICE DEVICE_SX1280 //we need to define the device we are using
// Using open source code, no guarantee of accuracy
#define T3_S3_V1_2_SX1280_PA
//******* Setup LoRa Parameters Here ! ***************
const uint32_t Frequency = 2445000000; //frequency of transmissions in hz
const int32_t Offset = 0; //offset frequency in hz for calibration purposes
const uint8_t Bandwidth = LORA_BW_0800; //LoRa bandwidth
const uint8_t SpreadingFactor = LORA_SF8; //LoRa spreading factor
const uint8_t CodeRate = LORA_CR_4_5; //LoRa coding rate
const uint16_t Calibration = 11350; //Manual Ranging calibrarion value
#ifdef T3_S3_V1_2_SX1280_PA
const int8_t RangingTXPower = 3; //Transmit power used !!Cannot be greater than 3dbm!!
#else
const int8_t RangingTXPower = 13; //Transmit power used !!Cannot be greater than 3dbm!!
#endif
const uint32_t RangingAddress = 16; //must match address in recever
const uint16_t waittimemS = 10000; //wait this long in mS for packet before assuming timeout
const uint16_t TXtimeoutmS = 5000; //ranging TX timeout in mS
const uint16_t packet_delaymS = 0; //forced extra delay in mS between ranging requests
const uint16_t rangeingcount = 10; //number of times ranging is cqarried out for each distance measurment
float distance_adjustment = 1.0000; //adjustment factor to calculated distance
#define ENABLEOLED //enable this define to use display
#define ENABLEDISPLAY //enable this define to use display
SX128XLT LT;
uint16_t rangeing_errors, rangeings_valid, rangeing_results;
uint16_t IrqStatus;
uint32_t endwaitmS, range_result_sum, range_result_average;
float distance, distance_sum, distance_average;
bool ranging_error;
int32_t range_result;
int16_t RangingRSSI;
void led_Flash(uint16_t flashes, uint16_t delaymS);
void setup()
{
pinMode(BOARD_LED, OUTPUT); //setup pin as output for indicator LED
led_Flash(4, 125); //two quick LED flashes to indicate program start
initBoard();
delay(100);
Serial.println(F("Ranging Master Starting, Using open source code, no guarantee of accuracy"));
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
if (LT.begin(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN, RADIO_DIO1_PIN, RADIO_RX_PIN, RADIO_TX_PIN, LORA_DEVICE)) {
Serial.println(F("Device found"));
led_Flash(2, 125);
delay(1000);
} else {
Serial.println(F("No device responding"));
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "No device responding");
u8g2->sendBuffer();
while (1) {
led_Flash(50, 50); //long fast speed flash indicates device error
}
}
LT.setupRanging(Frequency, Offset, SpreadingFactor, Bandwidth, CodeRate, RangingAddress, RANGING_MASTER);
LT.setRangingCalibration(Calibration); //override automatic lookup of calibration value from library table
Serial.println();
LT.printModemSettings(); //reads and prints the configured LoRa settings, useful check
Serial.println();
LT.printOperatingSettings(); //reads and prints the configured operating settings, useful check
Serial.println();
Serial.println();
LT.printRegisters(0x900, 0x9FF); //print contents of device registers, normally 0x900 to 0x9FF
Serial.println();
Serial.println();
#ifdef ENABLEDISPLAY
if (u8g2) {
Serial.println("Display Enabled");
u8g2->setFont(u8g2_font_unifont_t_chinese2); // use chinese2 for all the glyphs of "你好世界"
u8g2->setFontDirection(0);
char buf[256];
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Ranging RAW Ready");
snprintf(buf, sizeof(buf), "Power:%.d dBm", RangingTXPower);
u8g2->drawStr(0, 12 * 2, buf);
snprintf(buf, sizeof(buf), "Cal: %d ", Calibration);
u8g2->drawStr(0, 12 * 3, buf);
snprintf(buf, sizeof(buf), "Adjust: %d ", distance_adjustment);
u8g2->sendBuffer();
}
#endif
Serial.print(F("Address "));
Serial.println(RangingAddress);
Serial.print(F("CalibrationValue "));
Serial.println(LT.getSetCalibrationValue());
Serial.println(F("Ranging master RAW ready"));
delay(2000);
}
void loop()
{
uint8_t index;
distance_sum = 0;
range_result_sum = 0;
rangeing_results = 0; //count of valid results in each loop
for (index = 1; index <= rangeingcount; index++) {
LT.transmitRanging(RangingAddress, TXtimeoutmS, RangingTXPower, WAIT_TX);
IrqStatus = LT.readIrqStatus();
if (IrqStatus & IRQ_RANGING_MASTER_RESULT_VALID) {
rangeing_results++;
rangeings_valid++;
digitalWrite(BOARD_LED, HIGH);
Serial.print(F("Valid"));
range_result = LT.getRangingResultRegValue(RANGING_RESULT_RAW);
Serial.print(F(",Register,"));
Serial.print(range_result);
if (range_result > 800000) {
range_result = 0;
}
range_result_sum = range_result_sum + range_result;
distance = LT.getRangingDistance(RANGING_RESULT_RAW, range_result, distance_adjustment);
distance_sum = distance_sum + distance;
Serial.print(F(",Distance,"));
Serial.print(distance, 1);
RangingRSSI = LT.getRangingRSSI();
digitalWrite(BOARD_LED, LOW);
} else {
rangeing_errors++;
distance = 0;
range_result = 0;
Serial.print(F("NotValid"));
Serial.print(F(",Irq,"));
Serial.print(IrqStatus, HEX);
}
delay(packet_delaymS);
if (index == rangeingcount) {
if (rangeing_results > 0) {
range_result_average = range_result_sum / rangeing_results;
distance_average = distance_sum / rangeing_results;
} else {
range_result_average = 0;
distance_average = 0.0;
RangingRSSI = 0;
}
Serial.print(F(",TotalValid,"));
Serial.print(rangeings_valid);
Serial.print(F(",TotalErrors,"));
Serial.print(rangeing_errors);
Serial.print(F(",AverageRAWResult,"));
Serial.print(range_result_average);
Serial.print(F(",AverageDistance,"));
Serial.print(distance_average, 1);
#ifdef ENABLEDISPLAY
if (u8g2) {
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Rang_Master");
snprintf(buf, sizeof(buf), "Distance:%.2f m", distance_average);
u8g2->drawStr(0, 12 * 2, buf);
snprintf(buf, sizeof(buf), "RSSI: %d dBm", RangingRSSI);
u8g2->drawStr(0, 12 * 3, buf);
// snprintf(buf, sizeof(buf), "OK: %d ", rangeings_valid);
// u8g2->drawStr(0, 12 * 4, buf);
// snprintf(buf, sizeof(buf), "Err: %d ", rangeing_errors);
// u8g2->drawStr(0, 12 * 5, buf);
u8g2->sendBuffer();
}
#endif
delay(2000);
}
Serial.println();
}
}
void led_Flash(uint16_t flashes, uint16_t delaymS)
{
uint16_t index;
for (index = 1; index <= flashes; index++) {
digitalWrite(BOARD_LED, HIGH);
delay(delaymS);
digitalWrite(BOARD_LED, LOW);
delay(delaymS);
}
}

View file

@ -0,0 +1,216 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <Ticker.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
Ticker ledTicker;
#if defined(LILYGO_TBeam_V1_X)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef LILYGO_T3_S3_V1_0
pinMode(RADIO_TX_PIN, OUTPUT);
pinMode(RADIO_RX_PIN, OUTPUT);
digitalWrite(RADIO_TX_PIN, LOW);
digitalWrite(RADIO_RX_PIN, HIGH);
#endif
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
ledTicker.attach_ms(500, []() {
static bool level;
digitalWrite(BOARD_LED, level);
level = !level;
});
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(3000);
}
#endif
#ifdef HAS_SDCARD
if (u8g2) {
u8g2->setFont(u8g2_font_ncenB08_tr);
}
pinMode(SDCARD_MISO, INPUT_PULLUP);
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (u8g2) {
u8g2->clearBuffer();
}
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
if (u8g2) {
do {
u8g2->setCursor(0, 16);
u8g2->println( "SDCard FAILED");;
} while ( u8g2->nextPage() );
}
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
if (u8g2) {
do {
u8g2->setCursor(0, 16);
u8g2->print( "SDCard:");;
u8g2->print(cardSize / 1024.0);;
u8g2->println(" GB");;
} while ( u8g2->nextPage() );
}
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize / 1024.0);
Serial.println(" GB");
}
if (u8g2) {
u8g2->sendBuffer();
}
delay(3000);
#endif
}

View file

@ -0,0 +1,47 @@
#pragma once
/*
* This sample program only supports SX1280
* */
#define I2C_SDA 18
#define I2C_SCL 17
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 3
#define RADIO_MOSI_PIN 6
#define RADIO_CS_PIN 7
#define RADIO_DIO1_PIN 9
#define RADIO_DIO2_PIN 33
#define RADIO_DIO3_PIN 34
#define RADIO_RST_PIN 8
#define RADIO_BUSY_PIN 36
#define RADIO_RX_PIN 10
#define RADIO_TX_PIN 21
#define SDCARD_MOSI 11
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 37
#define LED_ON HIGH
#define BAT_ADC_PIN 1
#define BUTTON_PIN 0
#define HAS_SDCARD
#define HAS_DISPLAY

View file

@ -0,0 +1,119 @@
#include <SPI.h>
#include <SX128XLT.h>
#include "boards.h"
// Using open source code, no guarantee of accuracy
#define T3_S3_V1_2_SX1280_PA
#define LORA_DEVICE DEVICE_SX1280 //we need to define the device we are using
//******* Setup LoRa Parameters Here ! ***************
//LoRa Modem Parameters
const uint32_t Frequency = 2445000000; //frequency of transmissions in hz
const int32_t Offset = 0; //offset frequency in hz for calibration purposes
const uint8_t Bandwidth = LORA_BW_0800; //LoRa bandwidth
const uint8_t SpreadingFactor = LORA_SF8; //LoRa spreading factor
const uint8_t CodeRate = LORA_CR_4_5; //LoRa coding rate
const uint16_t Calibration = 11350; //Manual Ranging calibration value
#ifdef T3_S3_V1_2_SX1280_PA
const int8_t TXpower = 3; //Transmit power used !!Cannot be greater than 3dbm!!
#else
const int8_t TXpower = 13; //Transmit power used !!Cannot be greater than 3dbm!!
#endif
const uint32_t RangingAddress = 16; //must match address in master
const uint16_t rangingRXTimeoutmS = 0xFFFF; //ranging RX timeout in mS
SX128XLT LT;
uint32_t endwaitmS;
uint16_t IrqStatus;
uint32_t response_sent;
void led_Flash(unsigned int flashes, unsigned int delaymS);
void setup()
{
Serial.begin(115200); //setup Serial console ouput
Serial.println("Ranging Slave Starting , Using open source code, no guarantee of accuracy");
pinMode(BOARD_LED, OUTPUT);
led_Flash(2, 125);
initBoard();
delay(100);
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
if (LT.begin(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN, RADIO_DIO1_PIN, RADIO_RX_PIN, RADIO_TX_PIN, LORA_DEVICE)) {
Serial.println(F("Device found"));
led_Flash(2, 125);
delay(1000);
} else {
Serial.println(F("No device responding"));
while (1) {
led_Flash(50, 50); //long fast speed flash indicates device error
}
}
//The function call list below shows the complete setup for the LoRa device for ranging using the information
LT.setupRanging(Frequency, Offset, SpreadingFactor, Bandwidth, CodeRate, RangingAddress, RANGING_SLAVE);
LT.setRangingCalibration(11350); //override automatic lookup of calibration value from library table
Serial.print(F("Calibration,"));
Serial.println(LT.getSetCalibrationValue()); //reads the calibratuion value currently set
delay(2000);
if (u8g2) {
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Rang_Slave");
u8g2->sendBuffer();
}
}
char buf[256];
void loop()
{
LT.receiveRanging(RangingAddress, 0, TXpower, NO_WAIT);
endwaitmS = millis() + rangingRXTimeoutmS;
while (!digitalRead(RADIO_DIO1_PIN) && (millis() <= endwaitmS)); //wait for Ranging valid or timeout
if (millis() >= endwaitmS) {
Serial.println("Error - Ranging Receive Timeout!!");
led_Flash(2, 100); //single flash to indicate timeout
} else {
IrqStatus = LT.readIrqStatus();
digitalWrite(BOARD_LED, HIGH);
if (IrqStatus & IRQ_RANGING_SLAVE_RESPONSE_DONE) {
response_sent++;
Serial.print(response_sent);
Serial.print(" Response sent");
} else {
Serial.print("Slave error,");
Serial.print(",Irq,");
Serial.print(IrqStatus, HEX);
LT.printIrqStatus();
}
digitalWrite(BOARD_LED, LOW);
Serial.println();
}
}
void led_Flash(unsigned int flashes, unsigned int delaymS)
{
//flash LED to show board is alive
unsigned int index;
for (index = 1; index <= flashes; index++) {
digitalWrite(BOARD_LED, HIGH);
delay(delaymS);
digitalWrite(BOARD_LED, LOW);
delay(delaymS);
}
}

View file

@ -0,0 +1,216 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <Ticker.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
Ticker ledTicker;
#if defined(LILYGO_TBeam_V1_X)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef LILYGO_T3_S3_V1_0
pinMode(RADIO_TX_PIN, OUTPUT);
pinMode(RADIO_RX_PIN, OUTPUT);
digitalWrite(RADIO_TX_PIN, LOW);
digitalWrite(RADIO_RX_PIN, HIGH);
#endif
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
ledTicker.attach_ms(500, []() {
static bool level;
digitalWrite(BOARD_LED, level);
level = !level;
});
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(3000);
}
#endif
#ifdef HAS_SDCARD
if (u8g2) {
u8g2->setFont(u8g2_font_ncenB08_tr);
}
pinMode(SDCARD_MISO, INPUT_PULLUP);
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (u8g2) {
u8g2->clearBuffer();
}
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
if (u8g2) {
do {
u8g2->setCursor(0, 16);
u8g2->println( "SDCard FAILED");;
} while ( u8g2->nextPage() );
}
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
if (u8g2) {
do {
u8g2->setCursor(0, 16);
u8g2->print( "SDCard:");;
u8g2->print(cardSize / 1024.0);;
u8g2->println(" GB");;
} while ( u8g2->nextPage() );
}
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize / 1024.0);
Serial.println(" GB");
}
if (u8g2) {
u8g2->sendBuffer();
}
delay(3000);
#endif
}

View file

@ -0,0 +1,47 @@
#pragma once
/*
* This sample program only supports SX1280
* */
#define I2C_SDA 18
#define I2C_SCL 17
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 3
#define RADIO_MOSI_PIN 6
#define RADIO_CS_PIN 7
#define RADIO_DIO1_PIN 9
#define RADIO_DIO2_PIN 33
#define RADIO_DIO3_PIN 34
#define RADIO_RST_PIN 8
#define RADIO_BUSY_PIN 36
#define RADIO_RX_PIN 10
#define RADIO_TX_PIN 21
#define SDCARD_MOSI 11
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 37
#define LED_ON HIGH
#define BAT_ADC_PIN 1
#define BUTTON_PIN 0
#define HAS_SDCARD
#define HAS_DISPLAY

View file

@ -89,6 +89,11 @@
; src_dir = examples/RadioLibExamples/Transmit_Interrupt
; src_dir = examples/RadioLibExamples/SX1280_Ranging
; ! SX1280 Ranging examples just only support T3_S3_V1_2_SX1280 or T3_S3_V1_2_SX1280_PA
; ! Using open source code, no guarantee of accuracy
; src_dir = examples/RadioLibExamples/SX1280/Ranging_Master
; src_dir = examples/RadioLibExamples/SX1280/Ranging_Slave
; ! LMIC_Library_OTTA only support SX1276 radio model , other model and T3_V1_6_SX1276_TCXO not support
; src_dir = examples/LoRaWAN/LMIC_Library_OTTA