#include #include #include #include #include #include // -------------------- BMP280 -------------------- #define I2C_SDA D2 #define I2C_SCL D3 Adafruit_BMP280 bmp; bool bmp_ready = false; // -------------------- GPS -------------------- #define GPS_RX D7 #define GPS_TX D6 HardwareSerial GPSserial(1); TinyGPSPlus gps; // -------------------- LoRa SPI remapped -------------------- #define LORA_SCK D8 #define LORA_MISO D9 #define LORA_MOSI D10 #define LORA_CS D1 #define LORA_RST D5 #define LORA_IRQ -1 SPIClass SPI_LORA(FSPI); // -------------------- Timing -------------------- unsigned long lastSendTime = 0; const unsigned long interval = 2000; // 2 seconds void setup() { Serial.begin(115200); delay(1000); Serial.println("🔧 Initializing LoRa + BMP280 + GPS..."); // GPS UART GPSserial.begin(9600, SERIAL_8N1, GPS_RX, GPS_TX); // BMP280 I2C Wire.begin(I2C_SDA, I2C_SCL); if (bmp.begin(0x76)) { bmp_ready = true; Serial.println("✅ BMP280 initialized (0x76)."); } else if (bmp.begin(0x77)) { bmp_ready = true; Serial.println("✅ BMP280 initialized (0x77)."); } else { Serial.println("⚠️ BMP280 not found. Skipping temperature."); } // LoRa SPI SPI_LORA.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS); LoRa.setSPI(SPI_LORA); LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ); if (!LoRa.begin(433E6)) { Serial.println("❌ LoRa init failed."); while (true); } LoRa.setTxPower(20); LoRa.setSpreadingFactor(12); LoRa.setSignalBandwidth(125E3); LoRa.enableCrc(); Serial.println("✅ LoRa initialized."); } void loop() { while (GPSserial.available()) { gps.encode(GPSserial.read()); } unsigned long now = millis(); if (now - lastSendTime >= interval) { lastSendTime = now; if (gps.location.isValid()) { String msg = "Lat=" + String(gps.location.lat(), 6); msg += ",Lng=" + String(gps.location.lng(), 6); msg += ",Sat=" + String(gps.satellites.value()); msg += ",Alt=" + String(gps.altitude.meters(), 1); if (bmp_ready) { float temp = bmp.readTemperature(); msg += ",T=" + String(temp, 2) + "C"; } else { msg += ",T=N/A"; } Serial.println("📤 Sending: " + msg); LoRa.beginPacket(); LoRa.print(msg); LoRa.endPacket(); } else { Serial.println("⚠️ GPS not fixed yet..."); } } }