Pierre Bourdin 3 hete
szülő
commit
d1b823cb36
2 módosított fájl, 126 hozzáadás és 14 törlés
  1. 1 0
      platformio.ini
  2. 125 14
      src/main.cpp

+ 1 - 0
platformio.ini

@@ -23,6 +23,7 @@ lib_deps =
 	adafruit/Adafruit GFX Library
 	mikalhart/TinyGPSPlus
 	lewisxhe/XPowersLib
+	jgromes/RadioLib
 
 [env:ttgo-t-beam-AXP2101-v1_2]
 board = ttgo-t-beam

+ 125 - 14
src/main.cpp

@@ -5,10 +5,24 @@
 #include <XPowersLib.h>
 #include "display.h"
 #include "pins.h"
+#include "RadioLib.h"
+
+#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
+SX1278 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
 
 logging::Logger logger;
 TinyGPSPlus    gps;
+char nmea[512];
 HardwareSerial ss(1);
+char trameg[128] = "#G";
+
 
 XPowersAXP2101 power;
 #define XPOWERS_CHIP_AXP2101
@@ -16,8 +30,6 @@ XPowersAXP2101 power;
 #define PMU_SDA 21
 #define PMU_SCK 22
 
-
-
 void setup() {
   Serial.begin(115200);
 
@@ -29,12 +41,12 @@ void setup() {
   */
 
   setup_display();
-  show_display("PIOTest", "GPS and other stuffs", 3000);
-  show_display("WiFi", "Scanning around", "Please wait...", 2000);
+  show_display("PIOTest", "GPS and other stuffs", 2000);
 
   /* Scan for WiFi networks
    * On commence par scanner les réseaux WiFi disponibles
    * On attend que le scan soit terminé et on affiche les réseaux trouvés  
+  show_display("WiFi", "Scanning around", "Please wait...", 2000);
   WiFi.scanNetworks();
   int n = WiFi.scanComplete();
   if (n == -2) {
@@ -73,23 +85,122 @@ void setup() {
   show_display("GPS", "Initializing GPS", "Please wait...", 2000);
 
   ss.begin(9600, SERIAL_8N1, GPS_TX, GPS_RX);
+  // setup GPS for only GPRMC sentences, but don't work anyway...
+  ss.println("PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0");
 
-
-
+  /* Initialize the LoRa radio
+   */
+  logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "RADIO", "Initializing LoRa radio");
+  radio.beginFSK(435);
 }
 
 
 void loop() {
 
+  int size = 0;
+  char * pch;
+
   while (ss.available() > 0) { 
-	gps.encode(ss.read());
+	char c = ss.read();
+	gps.encode(c);
+  	// add char to trame
+	nmea[size] = c;
+	//
+	size++;
   }
-  
-  /* Display GPS data
-   */
-
-	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "Latitude: %f, Longitude: %f", "Number of satellites : %d", gps.location.lat(), gps.location.lng(), gps.satellites.value());
-	show_display("GPS", "Number of satellites: " + String(gps.satellites.value()), "", 2000);
-
+  nmea[size] = '\0';
+
+  if (gps.location.isValid()) {
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "Full NMEA:"); 
+	pch = strtok (nmea,"\n");
+	while (pch != NULL) {
+	  logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\t%s", pch);
+	  pch = strtok (NULL, "\n");
+	}
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "Parsing NMEA:");
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\tLatitude: %f", gps.location.lat());
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\tLongitude: %f", gps.location.lng());
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\tNumber of satellites : %d", gps.satellites.value());
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\tAltitude: %f", gps.altitude.meters());
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\tSpeed: %f", gps.speed.kmph());
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\tCourse: %f", gps.course.deg());
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\tDate: %d/%d/%d", gps.date.day(), gps.date.month(), gps.date.year());
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\tTime: %d:%d:%d", gps.time.hour(), gps.time.minute(), gps.time.second());
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "\tHDOP: %f", gps.hdop.hdop());
+	}
+    else {
+		logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "No GPS data available");
+  	}
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "GPS", "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
+
+	// erase trameg with \0
+    memset(trameg, 0, sizeof(trameg));
+	strcat(trameg, "#G");
+
+	char strday[4];
+	char strmonth[4];
+	char stryear[6];
+	char stryear2[4];
+	char strhour[4];
+	char strminute[4];
+	char strsecond[4];
+	sprintf(strday, "%u", gps.date.day());
+	sprintf(strmonth, "%u", gps.date.month());
+	sprintf(stryear, "%u", gps.date.year());
+	sprintf(strhour, "%u", gps.time.hour());
+	sprintf(strminute, "%u", gps.time.minute());
+	sprintf(strsecond, "%u", gps.time.second());
+
+	// Trame = "#GDDMMYY;HHMMSS;LATITUDE;LONGITUDE;ALTITUDE;SATELLITES;*RSSI%\r\n"
+    strcat(trameg, strday);
+    strcat(trameg, strmonth);
+	strcat(trameg, stryear);
+//    stryear2[0] = stryear[2];
+//    stryear2[1] = stryear[3];
+    strcat(trameg, stryear2);
+    strcat(trameg, ";");
+    strcat(trameg, strhour);
+    strcat(trameg, strminute);
+    strcat(trameg, strsecond);
+	strcat(trameg, ";");
+	char strlat[16];
+	char strlng[16];
+	dtostrf(gps.location.lat(), 8, 6, strlat);
+	dtostrf(gps.location.lng(), 8, 6, strlng);
+	strcat(trameg, strlat);
+	strcat(trameg, ";");
+	strcat(trameg, strlng);
+	strcat(trameg, ";");
+	char stralt[16];
+	dtostrf(gps.altitude.meters(), 8, 2, stralt);
+	strcat(trameg, stralt);
+	strcat(trameg, ";");
+	char strsat[4];
+	sprintf(strsat, "%u", gps.satellites.value());
+	strcat(trameg, strsat);
+	strcat(trameg, "*");
+	strcat(trameg, "RSSSSSSSSI");
+	strcat(trameg, "%");
+	strcat(trameg, "\r\n");
+
+	strcat(trameg, "\0");
+
+	// count bytes until \0
+	int sizestr = 0;
+	while (trameg[sizestr] != '\0') {
+	  sizestr++;
+	}
+    logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "TRAME_BUILD", "Trame: %s", trameg);
+
+  int state = radio.transmit(trameg, sizestr);
+  //int state = radio.transmit(nmea, strlen(nmea));
+  if (state == RADIOLIB_ERR_NONE) {
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "RADIO", "Trame sent. Size: %d bytes", strlen(trameg));
+	// print trame
+    logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "RADIO", "Trame: %s", trameg);
+  } else {
+	logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "RADIO", "Failed to send trame");
+  }
+  delay(1000);
 
 }