diff --git a/README.md b/README.md index 876502e..c27f486 100644 --- a/README.md +++ b/README.md @@ -336,6 +336,14 @@ Video Out - Video IN
#define OSD_MOSI 34 #define OSD_SCK 26 ``` +FOR LYLIGO board + +``` +#define OSD_SCK 38 +#define OSD_CS 39 +#define OSD_MISO 40 +#define OSD_MOSI 41 +``` diff --git a/include/global_config.h b/include/global_config.h index 8297d73..93074a8 100644 --- a/include/global_config.h +++ b/include/global_config.h @@ -25,6 +25,8 @@ #ifdef LILYGO #define BUZZER_PIN 45 +#define COMPASS_SCL 42 +#define COMPASS_SDA 46 #endif #ifdef T3_V1_6_SX1276 #define BUZZER_PIN 35 diff --git a/platformio.ini b/platformio.ini index 3aa7f9f..e9b391f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -248,6 +248,38 @@ build_flags = -DARDUINO_LILYGO_T3_S3_V1_X -DARDUINO_USB_MODE=1 +[env:lilygo-T3S3-v1-2-lr1121-900-compass] +platform = espressif32 +board = t3_s3_v1_x +framework = arduino +upload_speed = 921600 +monitor_speed = 115200 +board_build.f_cpu = 240000000 +board_build.filesystem = littlefs +lib_deps = + ropg/Heltec_ESP32_LoRa_v3@^0.9.1 + RadioLib + U8g2 + XPowersLib + ESP Async WebServer + https://github.com/Genaker/Adafruit_HMC5883_Unified +build_flags = + -DLILYGO + -DT3_S3_V1_2_LR1121 + -DARDUINO_LILYGO_T3S3_LR1121 + -DESP32 + -DSAMPLES_RSSI=5 + -DUSING_LR1121 + -DINIT_FREQ=900 + -DFREQ_BEGIN=800 + -DFREQ_END=950 + -DFREQ_RX=2440 + -DARDUINO_ARCH_ESP32 + -DARDUINO_USB_CDC_ON_BOOT=1 + -DARDUINO_LILYGO_T3_S3_V1_X + -DARDUINO_USB_MODE=1 + -DCOMPASS_ENABLED + [env:lilygo-T3S3-v1-2-sx1280] platform = espressif32 board = t3_s3_v1_x diff --git a/src/main.cpp b/src/main.cpp index 8fb307c..1438dd3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -112,13 +113,21 @@ unsigned int osdCyclesCount = 0; #define SIDEBAR_DB_LEVEL 80 // Absolute value without minus #define SIDEBAR_DB_DELTA 2 // detect changes <> threshold +#ifdef LILYGO +#define OSD_SCK 38 +#define OSD_CS 39 +#define OSD_MISO 40 +#define OSD_MOSI 41 +#else // SPI pins +#define OSD_SCK 26 #define OSD_CS 47 #define OSD_MISO 33 #define OSD_MOSI 34 -#define OSD_SCK 26 #endif +#endif // End OSD_ENABLED + #define OSD_WIDTH 30 #define OSD_HEIGHT 16 #define OSD_CHART_WIDTH 15 @@ -152,6 +161,41 @@ DFRobot_OSD osd(OSD_CS); #include "global_config.h" #include "ui.h" +#ifdef COMPASS_ENABLED +#include +#include +/* Assign a unique ID to this sensor at the same time */ +Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345); +void displaySensorDetails(void) +{ + sensor_t sensor; + mag.getSensor(&sensor); + Serial.println("------------------------------------"); + Serial.print("Sensor: "); + Serial.println(sensor.name); + Serial.print("Driver Ver: "); + Serial.println(sensor.version); + Serial.print("Unique ID: "); + Serial.println(sensor.sensor_id); + Serial.print("Max Value: "); + Serial.print(sensor.max_value); + Serial.println(" uT"); + Serial.print("Min Value: "); + Serial.print(sensor.min_value); + Serial.println(" uT"); + Serial.print("Resolution: "); + Serial.print(sensor.resolution); + Serial.println(" uT"); + Serial.println("------------------------------------"); + Serial.println(""); + delay(500); +} + +// Variables for dynamic calibration +float x_min = 1000, x_max = -1000; +float y_min = 1000, y_max = -1000; +float z_min = 1000, z_max = -1000; +#endif // ----------------------------------------------------------------- // CONFIGURATION OPTIONS // ----------------------------------------------------------------- @@ -1462,6 +1506,26 @@ void setup(void) r.addEventListener(ALL_EVENTS, eventListenerForReport, NULL); +#ifdef COMPASS_ENABLED + Serial.println("Compass Init Start"); + Wire1.end(); + Wire1.begin(46, 42); + + Serial.println("Compass BEGIN"); + Serial.println("HMC5883 Magnetometer Test"); + + /* Initialise the sensor */ + if (!mag.begin()) + { + /* There was a problem detecting the HMC5883 ... check your connections */ + Serial.println("Ooops, no HMC5883 detected ... Check your wiring!"); + } + + /* Display some basic information on this sensor */ + displaySensorDetails(); + Serial.println("Compass Success!!!"); +#endif + #ifdef UPTIME_CLOCK uptime = new UptimeClock(display, millis()); #endif @@ -1970,6 +2034,95 @@ void loop(void) doScan(); reportScan(); } +#ifdef COMPASS_ENABLED + /* Get a new sensor event */ + sensors_event_t event; + mag.getEvent(&event); + +#ifdef COMPASS_DEBUG + /* Display the results (magnetic vector values are in micro-Tesla (uT)) */ + Serial.print("X: "); + Serial.print(event.magnetic.x); + Serial.print(" "); + Serial.print("Y: "); + Serial.print(event.magnetic.y); + Serial.print(" "); + Serial.print("Z: "); + Serial.print(event.magnetic.z); + Serial.print(" "); + Serial.println("uT"); +#endif + + // Hold the module so that Z is pointing 'up' and you can measure the heading with x&y + // Calculate heading when the magnetometer is level, then correct for signs of axis. + // float heading = atan2(event.magnetic.y, event.magnetic.x); + // Use Y as the forward axis + // float heading = atan2(event.magnetic.x, event.magnetic.y); + /// If Z-axis is forward and Y-axis points upward: + // float heading = atan2(event.magnetic.x, event.magnetic.y); + // If Z-axis is forward and X-axis points upward: + // float heading = atan2(event.magnetic.y, -event.magnetic.x); + + // heading based on the magnetic readings from the Z-axis (forward) and the X-axis + // (perpendicular to Z, horizontal). + // float heading = atan2(event.magnetic.z, event.magnetic.x); + + // Dynamicly Calibrated out + + // Read raw magnetometer data + float x = event.magnetic.x; + float y = event.magnetic.y; + float z = event.magnetic.z; + + // Update min/max values dynamically + x_min = min(x_min, x); + x_max = max(x_max, x); + y_min = min(y_min, y); + y_max = max(y_max, y); + z_min = min(z_min, z); + z_max = max(z_max, z); + + // Calculate offsets and scales in real-time + float x_offset = (x_max + x_min) / 2; + float y_offset = (y_max + y_min) / 2; + float z_offset = (z_max + z_min) / 2; + + float x_scale = (x_max - x_min) / 2; + float y_scale = (y_max - y_min) / 2; + float z_scale = (z_max - z_min) / 2; + + // Apply calibration to raw data + float calibrated_x = (x - x_offset) / x_scale; + float calibrated_y = (y - y_offset) / y_scale; + float calibrated_z = (z - z_offset) / z_scale; + + // Calculate heading using Z-axis forward, X-axis horizontal + float heading = atan2(calibrated_z, calibrated_x); + + // Once you have your heading, you must then add your 'Declination Angle', which is + // the 'Error' of the magnetic field in your location. Find yours here: + // http://www.magnetic-declination.com/ Mine is: -13* 2' W, which is ~13 Degrees, or + // (which we need) 0.22 radians If you cannot find your Declination, comment out these + // two lines, your compass will be slightly off. + float declinationAngle = 0.22; + heading += declinationAngle; + + // Correct for when signs are reversed. + if (heading < 0) + heading += 2 * PI; + + // Check for wrap due to addition of declination. + if (heading > 2 * PI) + heading -= 2 * PI; + + // Convert radians to degrees for readability. + float headingDegrees = heading * 180 / M_PI; + + Serial.println("Heading (degrees): " + String(headingDegrees)); + /// Serial.println(); + display.drawString(80, 0, String((int)headingDegrees)); + display.display(); +#endif } void doScan()