Add temporary directory

This commit is contained in:
lewis 2023-04-28 19:00:28 +08:00
commit bca48931c4
18 changed files with 3785 additions and 0 deletions

View file

@ -0,0 +1,200 @@
#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
//******* 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
const int8_t RangingTXPower = 3; //Transmit power used !!Cannot be greater than 3dbm!!
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"));
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, 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
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++) {
Serial.println(F("Start Ranging"));
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) {
range_result_average = (range_result_sum / rangeing_results);
if (rangeing_results == 0) {
distance_average = 0;
} else {
distance_average = (distance_sum / rangeing_results);
}
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
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,221 @@
#pragma once
/*
* This sample program only supports SX1280
* */
// #define LILYGO_TBeam_V0_7 //NO SUPPOTR
// #define LILYGO_TBeam_V1_X //NO SUPPOTR
// #define LILYGO_T3_V1_0 //NO SUPPOTR
// #define LILYGO_T3_V1_3 //NO SUPPOTR
// #define LILYGO_T3_V1_6 //NO SUPPOTR
// #define LILYGO_T3_V2_0 //NO SUPPOTR
// #define LILYGO_T3_V1_8
#define LILYGO_T3_S3_V1_0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#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
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_X)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#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
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#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 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_3)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#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 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define ADC_PIN 35
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#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
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#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 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#elif defined(LILYGO_T3_V1_8)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DIO1_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO2_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_S3_V1_0)
#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 21
#define RADIO_TX_PIN 10
#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
#else
#error "For the first use, please define the board version and model in <utilities. h>"
#endif

View file

@ -0,0 +1,112 @@
#include <SPI.h>
#include <SX128XLT.h>
#include "boards.h"
#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
const int8_t TXpower = 3; //Transmit power used !!Cannot be greater than 3dbm!!
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");
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, 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);
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,221 @@
#pragma once
/*
* This sample program only supports SX1280
* */
// #define LILYGO_TBeam_V0_7 //NO SUPPOTR
// #define LILYGO_TBeam_V1_X //NO SUPPOTR
// #define LILYGO_T3_V1_0 //NO SUPPOTR
// #define LILYGO_T3_V1_3 //NO SUPPOTR
// #define LILYGO_T3_V1_6 //NO SUPPOTR
// #define LILYGO_T3_V2_0 //NO SUPPOTR
// #define LILYGO_T3_V1_8
#define LILYGO_T3_S3_V1_0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#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
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_X)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#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
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#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 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_3)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#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 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define ADC_PIN 35
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#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
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#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 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#elif defined(LILYGO_T3_V1_8)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DIO1_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO2_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_S3_V1_0)
#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 21
#define RADIO_TX_PIN 10
#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
#else
#error "For the first use, please define the board version and model in <utilities. h>"
#endif

View file

@ -0,0 +1,203 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.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
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#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 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);
digitalWrite(BOARD_LED, LED_ON);
#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(300);
}
#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,28 @@
#define WiFi_Logo_width 60
#define WiFi_Logo_height 36
const uint8_t WiFi_Logo_bits[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0x07, 0xC0, 0x83, 0x01, 0x80, 0xFF, 0xFF, 0xFF,
0x01, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00,
0xC0, 0xFF, 0xFF, 0x7C, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x31, 0x46, 0x7C,
0xFC, 0x77, 0x08, 0x00, 0xE0, 0x23, 0xC6, 0x3C, 0xFC, 0x67, 0x18, 0x00,
0xE0, 0x23, 0xE4, 0x3F, 0x1C, 0x00, 0x18, 0x00, 0xE0, 0x23, 0x60, 0x3C,
0x1C, 0x70, 0x18, 0x00, 0xE0, 0x03, 0x60, 0x3C, 0x1C, 0x70, 0x18, 0x00,
0xE0, 0x07, 0x60, 0x3C, 0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C,
0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00,
0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00, 0xE0, 0x8F, 0x71, 0x3C,
0x1C, 0x70, 0x18, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x08, 0x00,
0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x0C, 0x00, 0x80, 0xFF, 0xFF, 0x1F,
0x00, 0x00, 0x06, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x07, 0x00,
0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0xFF,
0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00,
0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

View file

@ -0,0 +1,426 @@
#include "Arduino.h"
#include "esp_adc_cal.h"
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306Wire.h" // legacy: #include "SSD1306.h"
#include "images.h"
#include "boards.h"
#include "OLEDDisplayUi.h"
#include "utilities.h"
// include the library
#include <RadioLib.h>
SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN,
RADIO_RST_PIN, RADIO_BUSY_PIN);
// SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DI0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
#define ERR_NONE 0
// save transmission state between loops
int transmissionState = RADIOLIB_ERR_NONE;
int send_num = 0;
char send_str[2] = "";
String send_state = "";
// flag to indicate that a packet was sent
volatile bool transmittedFlag = false;
uint8_t LoRa_state = 1;
uint8_t SD_state = 1;
uint8_t wifi_state = 1;
uint32_t lora_Millis = 0;
uint32_t bat_adc_Millis = 0;
char tx_str[1] = {0};
// you can read received data as an Arduino String
char RSSI_str[20] = {0};
float Voltage = 0.0;
//oled
SSD1306Wire display(0x3c, I2C_SDA, I2C_SCL);
OLEDDisplayUi ui ( &display );
//wifi
#include <WiFi.h>
const char *ssid = "xinyuandianzi";
const char *password = "AA15994823428";
String rx_str = "";
int i = 0;
float latitude_mdeg;
float longitude_mdeg;
int satellites_num;
char BAT_lon_str[20];
// SPIClass SDSPI(HSPI);
bool readkey();
void lora_tx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void lora_rx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void hardware_state(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void setFlag(void);
void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state);
uint32_t readADC_Cal(int ADC_Raw);
// This array keeps function pointers to all frames
// frames are the single views that slide in
FrameCallback frames[] = { hardware_state, lora_tx, lora_rx};
// how many frames are there?
int frameCount = 3;
// Overlays are statically drawn on top of a frame eg. a clock
OverlayCallback overlays[] = { msOverlay };
int overlaysCount = 1;
String rssi_str = "RSSI --";
String SNR_str = "SNR --";
String packSize = "--";
String packet ;
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we got a packet, set the flag
receivedFlag = true;
}
void setup()
{
Serial.begin(115200);
Serial.println("initBoard");
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
SD_state = 0;
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
SD_state = 1;
}
initBoard();
delay(1500);
pinMode(RADIO_TCXO_EN_PIN, OUTPUT);
digitalWrite(RADIO_TCXO_EN_PIN, HIGH);
delay(500);
// Initialising the UI will init the display too.
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
display.clear();
// display.fillRect(0, 0, 200, 200);
// display.display();
// while (1) {
// delay(200);
// }
display.drawString(0, 0, "Lora sx1262");
// display.drawString(0, 10, "WiFi connected....");
// display.display();
// //wifi
// WiFi.begin(ssid, password);
// while (WiFi.status() != WL_CONNECTED) {
// Serial.print(".");
// delay(500);SX1262
// }
// Serial.println("");
// Serial.println("WiFi connected");
// Serial.println("IP address: ");
// Serial.println(WiFi.localIP());
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
// initialize SX1280 with default settings
Serial.print(F("[SX1262] Initializing ... "));
int state = radio.begin(868.0);
if ( state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
LoRa_state = 0; //while (1);
}
// // // set carrier frequency to 433.5 MHz
// // if (radio.setFrequency(868.0) == RADIOLIB_ERR_INVALID_FREQUENCY) {
// // Serial.println(F("Selected frequency is invalid for this module!"));
// // LoRa_state = 0;
// // }
// // set bandwidth to 250 kHz
// if (radio.setBandwidth(250.0) == RADIOLIB_ERR_INVALID_BANDWIDTH) {
// Serial.println(F("Selected bandwidth is invalid for this module!"));
// LoRa_state = 0;
// }
// // set spreading factor to 10
// if (radio.setSpreadingFactor(10) == RADIOLIB_ERR_INVALID_SPREADING_FACTOR) {
// Serial.println(F("Selected spreading factor is invalid for this module!"));
// LoRa_state = 0;
// }
// // set coding rate to 6
// if (radio.setCodingRate(6) == RADIOLIB_ERR_INVALID_CODING_RATE) {
// Serial.println(F("Selected coding rate is invalid for this module!"));
// LoRa_state = 0;
// }
// set LoRa sync word to 0x14
// NOTE: value 0x34 is reserved for LoRaWAN networks and should not be used
if (radio.setSyncWord(0x14) != RADIOLIB_ERR_NONE) {
Serial.println(F("Unable to set sync word!"));
LoRa_state = 0;
}
// // set output power to 10 dBm (accepted range is -3 - 17 dBm)
// // NOTE: 20 dBm value allows high power operation, but transmission
// // duty cycle MUST NOT exceed 1%
// if (radio.setOutputPower(22) == RADIOLIB_ERR_INVALID_OUTPUT_POWER) {
// Serial.println(F("Selected output power is invalid for this module!"));
// LoRa_state = 0;
// }
// // set over current protection limit to 80 mA (accepted range is 45 - 240 mA)
// // NOTE: set value to 0 to disable overcurrent protection
// if (radio.setCurrentLimit(80) == RADIOLIB_ERR_INVALID_CURRENT_LIMIT) {
// Serial.println(F("Selected current limit is invalid for this module!"));
// LoRa_state = 0;
// }
// // // set LoRa preamble length to 15 symbols (accepted range is 6 - 65535)
// // if (radio.setPreambleLength(15) == RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH) {
// // Serial.println(F("Selected preamble length is invalid for this module!"));
// // LoRa_state = 0;
// // }
// set the function that will be called
// when new packet is received
radio.setDio1Action(setFlag);
// start listening for LoRa packets
Serial.print(F("[SX1262] Starting to listen ... "));
state = radio.startReceive();
//ui
// The ESP is capable of rendering 60fps in 80Mhz mode
// but that won't give you much time for anything else
// run it in 160Mhz mode or just set it to 30 fps
ui.setTargetFPS(60);
// Customize the active and inactive symbol
// ui.setActiveSymbol(activeSymbol);
// ui.setInactiveSymbol(inactiveSymbol);
// You can change this to
// TOP, LEFT, BOTTOM, RIGHT
ui.setIndicatorPosition(BOTTOM);
// Defines where the first frame is located in the bar.
ui.setIndicatorDirection(LEFT_RIGHT);
// You can change the transition that is used
// SLIDE_LEFT, SLIDE_RIGHT, SLIDE_UP, SLIDE_DOWN
ui.setFrameAnimation(SLIDE_LEFT);
// Add frames
ui.setFrames(frames, frameCount);
// Add overlays
ui.setOverlays(overlays, overlaysCount);
ui.disableAutoTransition();
// Initialising the UI will init the display too.
ui.init();
display.flipScreenVertically();
}
void loop()
{
int remainingTimeBudget = ui.update();
if (remainingTimeBudget > 0) {
// You can do some work here
// Don't do stuff if you are below your
// time budget.
delay(remainingTimeBudget);
}
if (readkey()) {
ui.nextFrame();
}
}
void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state)
{
}
bool readkey()
{
if (!digitalRead(0)) {
delay(50);
if (!digitalRead(0)) {
return true;
}
}
return false;
}
void lora_tx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
int tx_state;
display->setFont(ArialMT_Plain_10);
// The coordinates define the left starting point of the text
display->setTextAlignment(TEXT_ALIGN_LEFT);
if (millis() - lora_Millis > 1000) {
int state = radio.transmit(send_str);
send_num++;
sprintf(send_str, "%d", send_num);
lora_Millis = millis();
}
display->drawString(0 + x, 0 + y, "Lora_send");
display->drawString(0 + x, 12 + y, "TX :");
display->drawString(30 + x, 12 + y, send_str);
display->setFont(ArialMT_Plain_10);
display->drawString(0 + x, 0 + y, send_state);
}
void lora_rx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setFont(ArialMT_Plain_10);
// The coordinates define the left starting point of the text
display->setTextAlignment(TEXT_ALIGN_LEFT);
// check if the flag is set
if (receivedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
int state = radio.readData(rx_str);
// you can also read received data as byte array
/*
byte byteArr[8];
int state = radio.readData(byteArr, 8);
*/
if (state == RADIOLIB_ERR_NONE) {
// packet was successfully received
Serial.println(F("[SX1262] Received packet!"));
rssi_str = "RSSI: " + String(radio.getRSSI());
} else if (state == RADIOLIB_ERR_CRC_MISMATCH) {
// packet was received, but is malformed
Serial.println(F("[SX1262] CRC error!"));
} else {
// some other error occurred
Serial.print(F("[SX1262] Failed, code "));
Serial.println(state);
}
// put module back to listen mode
radio.startReceive();
// we're ready to receive more packets,
// enable interrupt service routine
enableInterrupt = true;
}
display->drawString(0 + x, 0 + y, "Lora_receive");
display->drawString(0 + x, 10 + y, rssi_str);
// display->drawString(0 + x, 20 + y, SNR_str);
display->drawString(0 + x, 22 + y, "RX :");
display->drawString(30 + x, 22 + y, rx_str);
}
char Bat_str[10] = "";
void hardware_state(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
if (millis() - bat_adc_Millis > 1000) {
// Serial.println(readADC_Cal(BAT_ADC));
//
Voltage = ((readADC_Cal(analogRead(ADC_PIN))) * 2 / 1000.0);
Serial.printf("%.2f", Voltage); // Print Voltage (in V)
sprintf(Bat_str, "%.2fV", Voltage);
bat_adc_Millis = millis();
}
display->setFont(ArialMT_Plain_10);
// display->drawString(0 + x, 11 + y, "Left aligned (0,10)");
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->drawString(0 + x, 0 + y, "SX1262 ");
// display->drawString(50 + x, 0 + y, wifi_state & 1 ? "+" : "NA");
display->drawString(0 + x, 10 + y, "LORA ");
display->drawString(50 + x, 10 + y, LoRa_state & 1 ? "+" : "NA");
display->drawString(0 + x, 20 + y, "SD ");
display->drawString(50 + x, 20 + y, SD_state & 1 ? "+" : "NA");
display->drawString(0 + x, 30 + y, "BAT ");
display->drawString(50 + x, 30 + y, Bat_str);
}
uint32_t readADC_Cal(int ADC_Raw)
{
esp_adc_cal_characteristics_t adc_chars;
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars);
// return (((esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars)) * 2) / 1000.0);
return (esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars));
}

View file

@ -0,0 +1,215 @@
#pragma once
/*
* This sample program only supports T-Beam
* */
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_3
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
#define LILYGO_T3_S3_V1_0
/*
* * The default program uses 868MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 915.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_3)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define ADC_PIN 35
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#elif defined(LILYGO_T3_S3_V1_0)
#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_DIO0_PIN 9
#define RADIO_TCXO_EN_PIN 33
#define RADIO_DIO1_PIN 33
#define RADIO_RST_PIN 8
#define RADIO_DIO3_PIN 34
#define RADIO_BUSY_PIN 36
#define RADIO_RX_PIN 21
#define RADIO_TX_PIN 10
#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 ADC_PIN 1
#define BUTTON_PIN 0
#define HAS_SDCARD
#define HAS_DISPLAY
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,203 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.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
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#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 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);
digitalWrite(BOARD_LED, LED_ON);
#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(300);
}
#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(300);
// #endif
}

View file

@ -0,0 +1,28 @@
#define WiFi_Logo_width 60
#define WiFi_Logo_height 36
const uint8_t WiFi_Logo_bits[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0x07, 0xC0, 0x83, 0x01, 0x80, 0xFF, 0xFF, 0xFF,
0x01, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00,
0xC0, 0xFF, 0xFF, 0x7C, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x31, 0x46, 0x7C,
0xFC, 0x77, 0x08, 0x00, 0xE0, 0x23, 0xC6, 0x3C, 0xFC, 0x67, 0x18, 0x00,
0xE0, 0x23, 0xE4, 0x3F, 0x1C, 0x00, 0x18, 0x00, 0xE0, 0x23, 0x60, 0x3C,
0x1C, 0x70, 0x18, 0x00, 0xE0, 0x03, 0x60, 0x3C, 0x1C, 0x70, 0x18, 0x00,
0xE0, 0x07, 0x60, 0x3C, 0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C,
0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00,
0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00, 0xE0, 0x8F, 0x71, 0x3C,
0x1C, 0x70, 0x18, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x08, 0x00,
0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x0C, 0x00, 0x80, 0xFF, 0xFF, 0x1F,
0x00, 0x00, 0x06, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x07, 0x00,
0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0xFF,
0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00,
0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

View file

@ -0,0 +1,484 @@
#include "Arduino.h"
#include "esp_adc_cal.h"
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306Wire.h" // legacy: #include "SSD1306.h"
#include "images.h"
#include "boards.h"
#include "OLEDDisplayUi.h"
#include "utilities.h"
// include the library
#include <RadioLib.h>
SX1276 radio = new Module(RADIO_CS_PIN, RADIO_DIO0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
// SX1276 radio = new Module(RADIO_CS_PIN, RADIO_DI0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
#define ERR_NONE 0
// save transmission state between loops
int transmissionState = RADIOLIB_ERR_NONE;
int send_num = 0;
char send_str[2] = "";
String send_state = "";
// flag to indicate that a packet was sent
volatile bool transmittedFlag = false;
uint8_t LoRa_state = 1;
uint8_t SD_state = 1;
uint8_t wifi_state = 1;
uint32_t lora_Millis = 0;
uint32_t bat_adc_Millis = 0;
char tx_str[1] = {0};
// you can read received data as an Arduino String
char RSSI_str[20] = {0};
float Voltage = 0.0;
//oled
SSD1306Wire display(0x3c, I2C_SDA, I2C_SCL);
OLEDDisplayUi ui ( &display );
//wifi
#include <WiFi.h>
// const char *ssid = "xinyuan-2";
// const char *password = "Xydz202104";
const char *ssid = "xinyuandianzi";
const char *password = "AA15994823428";
String rx_str = "";
int i = 0;
float latitude_mdeg;
float longitude_mdeg;
int satellites_num;
char BAT_lon_str[20];
// SPIClass SDSPI(HSPI);
bool readkey();
void lora_tx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void lora_rx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void hardware_state(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void setFlag(void);
void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state);
uint32_t readADC_Cal(int ADC_Raw);
// This array keeps function pointers to all frames
// frames are the single views that slide in
FrameCallback frames[] = { hardware_state, lora_tx, lora_rx};
// how many frames are there?
int frameCount = 3;
// Overlays are statically drawn on top of a frame eg. a clock
OverlayCallback overlays[] = { msOverlay };
int overlaysCount = 1;
String rssi_str = "RSSI --";
String SNR_str = "SNR --";
String packSize = "--";
String packet ;
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we got a packet, set the flag
receivedFlag = true;
}
void setup()
{
Serial.begin(115200);
Serial.println("initBoard");
// SPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
// if (!SD.begin(SD_CS)) {
// Serial.println("SDCard MOUNT FAIL");
// SD_state = 0;
// } else {
// uint32_t cardSize = SD.cardSize() / (1024 * 1024);
// String str = "SDCard Size: " + String(cardSize) + "MB";
// Serial.println(str);
// SD_state = 1;
// }
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
SD_state = 0;
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
SD_state = 1;
}
initBoard();
delay(1500);
pinMode(RADIO_TCXO_EN_PIN, OUTPUT);
digitalWrite(RADIO_TCXO_EN_PIN, HIGH);
delay(500);
// Initialising the UI will init the display too.
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
display.clear();
// display.fillRect(0, 0, 200, 200);
// display.display();
// while (1) {
// delay(200);
// }
display.drawString(0, 0, "Lora sx1276");
// display.drawString(0, 10, "WiFi connected....");
// display.display();
// //wifi
// WiFi.begin(ssid, password);
// while (WiFi.status() != WL_CONNECTED) {
// Serial.print(".");
// delay(500);
// }
// Serial.println("");
// Serial.println("WiFi connected");
// Serial.println("IP address: ");
// Serial.println(WiFi.localIP());
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
// initialize SX1280 with default settings
Serial.print(F("[SX1276] Initializing ... "));
int state = radio.begin();
if ( state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
LoRa_state = 0; //while (1);
}
// set carrier frequency to 433.5 MHz
if (radio.setFrequency(868.0) == RADIOLIB_ERR_INVALID_FREQUENCY) {
Serial.println(F("Selected frequency is invalid for this module!"));
LoRa_state = 0;
}
// set bandwidth to 250 kHz
if (radio.setBandwidth(250.0) == RADIOLIB_ERR_INVALID_BANDWIDTH) {
Serial.println(F("Selected bandwidth is invalid for this module!"));
LoRa_state = 0;
}
// set spreading factor to 10
if (radio.setSpreadingFactor(10) == RADIOLIB_ERR_INVALID_SPREADING_FACTOR) {
Serial.println(F("Selected spreading factor is invalid for this module!"));
LoRa_state = 0;
}
// set coding rate to 6
if (radio.setCodingRate(6) == RADIOLIB_ERR_INVALID_CODING_RATE) {
Serial.println(F("Selected coding rate is invalid for this module!"));
LoRa_state = 0;
}
// set LoRa sync word to 0x14
// NOTE: value 0x34 is reserved for LoRaWAN networks and should not be used
if (radio.setSyncWord(0x14) != RADIOLIB_ERR_NONE) {
Serial.println(F("Unable to set sync word!"));
LoRa_state = 0;
}
// set output power to 10 dBm (accepted range is -3 - 17 dBm)
// NOTE: 20 dBm value allows high power operation, but transmission
// duty cycle MUST NOT exceed 1%
if (radio.setOutputPower(10) == RADIOLIB_ERR_INVALID_OUTPUT_POWER) {
Serial.println(F("Selected output power is invalid for this module!"));
LoRa_state = 0;
}
// set over current protection limit to 80 mA (accepted range is 45 - 240 mA)
// NOTE: set value to 0 to disable overcurrent protection
if (radio.setCurrentLimit(80) == RADIOLIB_ERR_INVALID_CURRENT_LIMIT) {
Serial.println(F("Selected current limit is invalid for this module!"));
LoRa_state = 0;
}
// set LoRa preamble length to 15 symbols (accepted range is 6 - 65535)
if (radio.setPreambleLength(15) == RADIOLIB_ERR_INVALID_PREAMBLE_LENGTH) {
Serial.println(F("Selected preamble length is invalid for this module!"));
LoRa_state = 0;
}
// set the function that will be called
// when new packet is received
radio.setDio0Action(setFlag);
// start listening for LoRa packets
Serial.print(F("[SX1276] Starting to listen ... "));
state = radio.startReceive();
#ifdef HAS_DISPLAY
if (u8g2) {
if (state != RADIOLIB_ERR_NONE) {
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Initializing: FAIL!");
u8g2->sendBuffer();
}
}
#endif
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
//ui
// The ESP is capable of rendering 60fps in 80Mhz mode
// but that won't give you much time for anything else
// run it in 160Mhz mode or just set it to 30 fps
ui.setTargetFPS(60);
// Customize the active and inactive symbol
// ui.setActiveSymbol(activeSymbol);
// ui.setInactiveSymbol(inactiveSymbol);
// You can change this to
// TOP, LEFT, BOTTOM, RIGHT
ui.setIndicatorPosition(BOTTOM);
// Defines where the first frame is located in the bar.
ui.setIndicatorDirection(LEFT_RIGHT);
// You can change the transition that is used
// SLIDE_LEFT, SLIDE_RIGHT, SLIDE_UP, SLIDE_DOWN
ui.setFrameAnimation(SLIDE_LEFT);
// Add frames
ui.setFrames(frames, frameCount);
// Add overlays
ui.setOverlays(overlays, overlaysCount);
ui.disableAutoTransition();
// Initialising the UI will init the display too.
ui.init();
display.flipScreenVertically();
}
void loop()
{
int remainingTimeBudget = ui.update();
if (remainingTimeBudget > 0) {
// You can do some work here
// Don't do stuff if you are below your
// time budget.
delay(remainingTimeBudget);
}
if (readkey()) {
ui.nextFrame();
}
}
void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state)
{
}
bool readkey()
{
if (!digitalRead(0)) {
delay(50);
if (!digitalRead(0)) {
return true;
}
}
return false;
}
void lora_tx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
int tx_state;
display->setFont(ArialMT_Plain_10);
// The coordinates define the left starting point of the text
display->setTextAlignment(TEXT_ALIGN_LEFT);
if (millis() - lora_Millis > 1000) {
int state = radio.transmit(send_str);
send_num++;
sprintf(send_str, "%d", send_num);
lora_Millis = millis();
}
display->drawString(0 + x, 0 + y, "Lora_send");
display->drawString(0 + x, 12 + y, "TX :");
display->drawString(30 + x, 12 + y, send_str);
display->setFont(ArialMT_Plain_10);
display->drawString(0 + x, 0 + y, send_state);
}
void lora_rx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setFont(ArialMT_Plain_10);
// The coordinates define the left starting point of the text
display->setTextAlignment(TEXT_ALIGN_LEFT);
// check if the flag is set
if (receivedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
int state = radio.readData(rx_str);
// you can also read received data as byte array
/*
byte byteArr[8];
int state = radio.readData(byteArr, 8);
*/
if (state == RADIOLIB_ERR_NONE) {
// packet was successfully received
Serial.println(F("[SX1276] Received packet!"));
rssi_str = "RSSI: " + String(radio.getRSSI());
} else if (state == RADIOLIB_ERR_CRC_MISMATCH) {
// packet was received, but is malformed
Serial.println(F("[SX1276] CRC error!"));
} else {
// some other error occurred
Serial.print(F("[SX1276] Failed, code "));
Serial.println(state);
}
// put module back to listen mode
radio.startReceive();
// we're ready to receive more packets,
// enable interrupt service routine
enableInterrupt = true;
}
// //这个是中断接收
// if (receivedFlag) {
// // disable the interrupt service routine while
// // processing the data
// enableInterrupt = false;
// // reset flag
// receivedFlag = false;
// int state = radio.readData(rx_str);
// if (state == RADIOLIB_ERR_NONE) {
// rssi_str = "RSSI: " + String(radio.getRSSI());
// // SNR_str = "SNR: " + String(radio.getSNR());
// // print RSSI (Received Signal Strength Indicator)
// // Serial.print(F("[SX1280] RSSI:\t\t"));
// // Serial.print(radio.getRSSI());
// // Serial.println(F(" dBm"));
// // // print SNR (Signal-to-Noise Ratio)
// // Serial.print(F("[SX1280] SNR:\t\t"));
// // Serial.print(radio.getSNR());
// // Serial.println(F(" dB"));
// }
// // put module back to listen mode
// radio.startReceive();
// // we're ready to receive more packets,
// // enable interrupt service routine
// enableInterrupt = true;
// }
display->drawString(0 + x, 0 + y, "Lora_receive");
display->drawString(0 + x, 10 + y, rssi_str);
// display->drawString(0 + x, 20 + y, SNR_str);
display->drawString(0 + x, 22 + y, "RX :");
display->drawString(30 + x, 22 + y, rx_str);
}
char Bat_str[10] = "";
void hardware_state(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
if (millis() - bat_adc_Millis > 1000) {
// Serial.println(readADC_Cal(BAT_ADC));
//
Voltage = ((readADC_Cal(analogRead(ADC_PIN))) * 2 / 1000.0);
Serial.printf("%.2f", Voltage); // Print Voltage (in V)
sprintf(Bat_str, "%.2fV", Voltage);
bat_adc_Millis = millis();
}
display->setFont(ArialMT_Plain_10);
// display->drawString(0 + x, 11 + y, "Left aligned (0,10)");
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->drawString(0 + x, 0 + y, "SX1276 ");
// display->drawString(50 + x, 0 + y, wifi_state & 1 ? "+" : "NA");
display->drawString(0 + x, 10 + y, "LORA ");
display->drawString(50 + x, 10 + y, LoRa_state & 1 ? "+" : "NA");
display->drawString(0 + x, 20 + y, "SD ");
display->drawString(50 + x, 20 + y, SD_state & 1 ? "+" : "NA");
display->drawString(0 + x, 30 + y, "BAT ");
display->drawString(50 + x, 30 + y, Bat_str);
}
uint32_t readADC_Cal(int ADC_Raw)
{
esp_adc_cal_characteristics_t adc_chars;
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars);
// return (((esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars)) * 2) / 1000.0);
return (esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars));
}

View file

@ -0,0 +1,214 @@
#pragma once
/*
* This sample program only supports T-Beam
* */
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_3
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
#define LILYGO_T3_S3_V1_0
/*
* * The default program uses 868MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 915.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_3)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define ADC_PIN 35
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#elif defined(LILYGO_T3_S3_V1_0)
#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_DIO0_PIN 9
#define RADIO_TCXO_EN_PIN 33
#define RADIO_DIO2_PIN 34
#define RADIO_RST_PIN 8
#define RADIO_BUSY_PIN 36
#define RADIO_RX_PIN 21
#define RADIO_TX_PIN 10
#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 ADC_PIN 1
#define BUTTON_PIN 0
#define HAS_SDCARD
#define HAS_DISPLAY
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.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
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#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 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 HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#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);
digitalWrite(BOARD_LED, LED_ON);
#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(5000);
}
#endif
}

View file

@ -0,0 +1,28 @@
#define WiFi_Logo_width 60
#define WiFi_Logo_height 36
const uint8_t WiFi_Logo_bits[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0x07, 0xC0, 0x83, 0x01, 0x80, 0xFF, 0xFF, 0xFF,
0x01, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00,
0xC0, 0xFF, 0xFF, 0x7C, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x31, 0x46, 0x7C,
0xFC, 0x77, 0x08, 0x00, 0xE0, 0x23, 0xC6, 0x3C, 0xFC, 0x67, 0x18, 0x00,
0xE0, 0x23, 0xE4, 0x3F, 0x1C, 0x00, 0x18, 0x00, 0xE0, 0x23, 0x60, 0x3C,
0x1C, 0x70, 0x18, 0x00, 0xE0, 0x03, 0x60, 0x3C, 0x1C, 0x70, 0x18, 0x00,
0xE0, 0x07, 0x60, 0x3C, 0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C,
0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00,
0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00, 0xE0, 0x8F, 0x71, 0x3C,
0x1C, 0x70, 0x18, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x08, 0x00,
0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x0C, 0x00, 0x80, 0xFF, 0xFF, 0x1F,
0x00, 0x00, 0x06, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x07, 0x00,
0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0xFF,
0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00,
0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

View file

@ -0,0 +1,373 @@
#include "Arduino.h"
#include "esp_adc_cal.h"
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306Wire.h" // legacy: #include "SSD1306.h"
#include "images.h"
#include "boards.h"
#include "OLEDDisplayUi.h"
#include "utilities.h"
// include the library
#include <RadioLib.h>
SX1280 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
#define ERR_NONE 0
// save transmission state between loops
int transmissionState = RADIOLIB_ERR_NONE;
int send_num = 0;
char send_str[2] = "";
char RSSI_str[20] = "";
uint8_t LoRa_state = 1;
uint8_t SD_state = 1;
uint8_t wifi_state = 1;
uint32_t lora_Millis = 0;
uint32_t bat_adc_Millis = 0;
float Voltage = 0.0;
String rssi_str = "RSSI --";
String SNR_str = "SNR --";
String rx_str;
// flag to indicate that a packet was sent
volatile bool transmittedFlag = false;
//oled
SSD1306Wire display(0x3c, I2C_SDA, I2C_SCL);
OLEDDisplayUi ui ( &display );
//wifi
#include <WiFi.h>
// const char *ssid = "xinyuan-2";
// const char *password = "Xydz202104";
const char *ssid = "xinyuandianzi";
const char *password = "AA15994823428";
bool readkey();
void lora_tx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void lora_rx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void hardware_state(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void setFlag(void);
void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state);
uint32_t readADC_Cal(int ADC_Raw);
// This array keeps function pointers to all frames
// frames are the single views that slide in
FrameCallback frames[] = { hardware_state, lora_tx, lora_rx};
// how many frames are there?
int frameCount = 3;
// Overlays are statically drawn on top of a frame eg. a clock
OverlayCallback overlays[] = { msOverlay };
int overlaysCount = 1;
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we got a packet, set the flag
receivedFlag = true;
}
void setup()
{
Serial.begin(115200);
Serial.println("initBoard");
// SPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
// if (!SD.begin(SD_CS)) {
// Serial.println("SDCard MOUNT FAIL");
// SD_state = 0;
// } else {
// uint32_t cardSize = SD.cardSize() / (1024 * 1024);
// String str = "SDCard Size: " + String(cardSize) + "MB";
// Serial.println(str);
// SD_state = 1;
// }
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
SD_state = 0;
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
SD_state = 1;
}
initBoard();
delay(1500);
// Initialising the UI will init the display too.
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
display.clear();
// display.fillRect(0, 0, 200, 200);
// display.display();
// while (1) {
// delay(200);
// }
// display.drawString(0, 0, "Lora 2.4G");
// display.drawString(0, 10, "WiFi connected....");
// display.display();
// //wifi
// WiFi.begin(ssid, password);
// while (WiFi.status() != WL_CONNECTED) {
// Serial.print(".");
// delay(500);
// }
// Serial.println("");
// Serial.println("WiFi connected");
// Serial.println("IP address: ");
// Serial.println(WiFi.localIP());
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
// initialize SX1280 with default settings
Serial.print(F("[SX1280] Initializing ... "));
int state = radio.begin();
if ( state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
LoRa_state = 0;
}
if (radio.setOutputPower(3) == RADIOLIB_ERR_INVALID_OUTPUT_POWER) {
Serial.println(F("Selected output power is invalid for this module!"));
LoRa_state = 0;
}
// set spreading factor to 10
if (radio.setSpreadingFactor(10) == RADIOLIB_ERR_INVALID_SPREADING_FACTOR) {
Serial.println(F("Selected spreading factor is invalid for this module!"));
LoRa_state = 0;
}
// set the function that will be called
// when new packet is received
radio.setDio1Action(setFlag);
// start listening for LoRa packets
// Serial.print(F("[SX1280] Starting to listen ... "));
// state = radio.startReceive();
// if (state == RADIOLIB_ERR_NONE) {
// Serial.println(F("success!"));
// } else {
// Serial.print(F("failed, code "));
// }
//LoRa.onReceive(cbk);
// register the receive callback
// LoRa.onReceive(onReceive);
// put the radio into receive mode
// LoRa.receive();
//ui
// The ESP is capable of rendering 60fps in 80Mhz mode
// but that won't give you much time for anything else
// run it in 160Mhz mode or just set it to 30 fps
ui.setTargetFPS(60);
// Customize the active and inactive symbol
// ui.setActiveSymbol(activeSymbol);
// ui.setInactiveSymbol(inactiveSymbol);
// You can change this to
// TOP, LEFT, BOTTOM, RIGHT
ui.setIndicatorPosition(BOTTOM);
// Defines where the first frame is located in the bar.
ui.setIndicatorDirection(LEFT_RIGHT);
// You can change the transition that is used
// SLIDE_LEFT, SLIDE_RIGHT, SLIDE_UP, SLIDE_DOWN
ui.setFrameAnimation(SLIDE_LEFT);
// Add frames
ui.setFrames(frames, frameCount);
// Add overlays
ui.setOverlays(overlays, overlaysCount);
ui.disableAutoTransition();
// Initialising the UI will init the display too.
ui.init();
display.flipScreenVertically();
}
void loop()
{
int remainingTimeBudget = ui.update();
if (remainingTimeBudget > 0) {
// You can do some work here
// Don't do stuff if you are below your
// time budget.
delay(remainingTimeBudget);
}
if (readkey()) {
ui.nextFrame();
}
}
void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state)
{
}
bool readkey()
{
if (!digitalRead(BUTTON_PIN)) {
delay(50);
if (!digitalRead(BUTTON_PIN)) {
return true;
}
}
return false;
}
void lora_tx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
int tx_state;
// Serial.print(F("lora_tx"));
display->setFont(ArialMT_Plain_10);
display->setTextAlignment(TEXT_ALIGN_LEFT);
if (millis() - lora_Millis > 1000) {
int state = radio.transmit(send_str);
send_num++;
sprintf(send_str, "%d", send_num);
lora_Millis = millis();
}
display->drawString(0 + x, 0 + y, "Lora_send");
display->drawString(0 + x, 12 + y, "TX :");
display->drawString(30 + x, 12 + y, send_str);
}
void lora_rx(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setFont(ArialMT_Plain_10);
// The coordinates define the left starting point of the text
display->setTextAlignment(TEXT_ALIGN_LEFT);
if (receivedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
int state = radio.readData(rx_str);
if (state == RADIOLIB_ERR_NONE) {
rssi_str = "RSSI: " + String(radio.getRSSI());
// SNR_str = "SNR: " + String(radio.getSNR());
// print RSSI (Received Signal Strength Indicator)
// Serial.print(F("[SX1280] RSSI:\t\t"));
// Serial.print(radio.getRSSI());
// Serial.println(F(" dBm"));
// // print SNR (Signal-to-Noise Ratio)
// Serial.print(F("[SX1280] SNR:\t\t"));
// Serial.print(radio.getSNR());
// Serial.println(F(" dB"));
}
// put module back to listen mode
radio.startReceive();
// we're ready to receive more packets,
// enable interrupt service routine
enableInterrupt = true;
}
display->drawString(0 + x, 0 + y, "Lora_receive");
display->drawString(0 + x, 10 + y, rssi_str);
// display->drawString(0 + x, 20 + y, SNR_str);
display->drawString(0 + x, 22 + y, "RX :");
display->drawString(30 + x, 22 + y, rx_str);
}
char Bat_str[10] = "";
void hardware_state(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
if (millis() - bat_adc_Millis > 1000) {
// Serial.println(readADC_Cal(BAT_ADC));
//
Voltage = ((readADC_Cal(analogRead(ADC_PIN))) * 2 / 1000.0);
Serial.printf("%.2f", Voltage); // Print Voltage (in V)
sprintf(Bat_str, "%.2fV", Voltage);
bat_adc_Millis = millis();
}
display->setFont(ArialMT_Plain_10);
// display->drawString(0 + x, 11 + y, "Left aligned (0,10)");
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->drawString(0 + x, 0 + y, "SX1280 ");
// display->drawString(50 + x, 0 + y, wifi_state & 1 ? "+" : "NA");
display->drawString(0 + x, 10 + y, "LORA ");
display->drawString(50 + x, 10 + y, LoRa_state & 1 ? "+" : "NA");
display->drawString(0 + x, 20 + y, "SD ");
display->drawString(50 + x, 20 + y, SD_state & 1 ? "+" : "NA");
display->drawString(0 + x, 30 + y, "BAT ");
display->drawString(50 + x, 30 + y, Bat_str);
}
uint32_t readADC_Cal(int ADC_Raw)
{
esp_adc_cal_characteristics_t adc_chars;
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars);
// return (((esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars)) * 2) / 1000.0);
return (esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars));
}

View file

@ -0,0 +1,226 @@
#pragma once
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
// #define LILYGO_T3_V1_7
#define LILYGO_T3_S3_SX1280
/*
* The default program uses 433MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 433.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_7)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_S3_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 21
#define RADIO_TX_PIN 10
#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 ADC_PIN 1
#define BUTTON_PIN 0
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif