wrighizilla

gps 4.1 crono

May 23rd, 2021 (edited)
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.88 KB | None | 0 0
  1. #include <SPI.h>
  2. #include <SD.h>
  3. #include <Wire.h>
  4. #include "SSD1306Ascii.h"
  5. #include "SSD1306AsciiWire.h"
  6. #include <NMEAGPS.h>
  7. #include <NeoSWSerial.h>
  8. #define I2C_ADDRESS 0x3C
  9. #define RST_PIN -1
  10. #define MAX_CHARS 24
  11. #define RX_pin 5
  12. #define TX_pin 4
  13. #define SHOW_INTERVAL 1
  14. #define GPS_baud 9600
  15. SSD1306AsciiWire oled;
  16. NMEAGPS gps;
  17. gps_fix fix;
  18. float odo, Speed, alt, Dist, head, maxs = 0, Am = 0;
  19. unsigned int Sat = 0;
  20. unsigned long tmp, var = 0;
  21. int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
  22. NeoGPS::Location_t lastLoc, base;
  23. bool stScan = true, lastLocOK = false;
  24. static NeoSWSerial gpsPort(RX_pin, TX_pin);
  25. static constexpr int INITIAL_SHOW = (2 * SHOW_INTERVAL) - 1;
  26. int show = INITIAL_SHOW;
  27. const int LED_PIN = 3;
  28. const float SPEED_LIMIT = 0.1; // speed limit value
  29. void disp(int c, int r)
  30. {
  31. oled.clear();
  32. oled.setCursor(c, r);
  33. }
  34. void setup() {
  35.  
  36. pinMode (LED_PIN, OUTPUT);
  37. Serial.begin(9600);
  38. gpsPort.begin(GPS_baud);
  39. Wire.begin();
  40. oled.begin(&SH1106_128x64, I2C_ADDRESS);
  41. oled.setFont(ZevvPeep8x16);
  42. oled.clear();
  43.  
  44. const int cs_sd = 2;
  45. if (!SD.begin (cs_sd)) {
  46. oled.clear();
  47. disp(65, 2);
  48. oled.print("SD");//if you read this mean SD is not present
  49. delay(10000);
  50. oled.clear();
  51. return;
  52. }
  53.  
  54. File data = SD.open("L.csv", FILE_WRITE);
  55. data.println("");
  56. data.println("Da Hr Tm La Lo At Am Km Di Ve He Sa" );
  57. data.close();
  58. }
  59. void loop() {
  60. tmp = (millis() / 1000);
  61. secondi = tmp - (var * 10) + fct;
  62. if (secondi > 60) {
  63. secondi = secondi - 60;
  64. }
  65. if (secondi == 60) {
  66. minuti = minuti + 1;
  67. var = var + 6;
  68. }
  69. if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1)) {
  70. fct = fct + fcl;
  71. }
  72. if (minuti >= 60) {
  73. minuti = 0;
  74. ore = ore + 1;
  75. }
  76. if (ore >= 24) {
  77. ore = 0;
  78. }
  79. if (gps.available( gpsPort )) {
  80. gps_fix fix = gps.read();
  81. show = (show + 1) % SHOW_INTERVAL;
  82. if (fix.valid.speed && (fix.speed_kph() > SPEED_LIMIT)) {
  83. digitalWrite( LED_PIN, HIGH );
  84. } else {
  85. digitalWrite( LED_PIN, LOW );
  86. }
  87. if (fix.valid.location) {
  88. if (lastLocOK) {
  89. odo += fix.location.DistanceKm( lastLoc );
  90. Speed = fix.speed_kph();
  91. }
  92. lastLoc = fix.location;
  93. lastLocOK = true;
  94. if (stScan) {
  95. stScan = false;
  96. base = fix.location;
  97. } else {
  98. Dist = ( fix.location.DistanceKm( base ) );
  99. }
  100. }
  101. if ( Speed > maxs) maxs = Speed;
  102. if (fix.valid.heading ) head = fix.heading() ;
  103. if (fix.valid.satellites ) Sat = fix.satellites ;
  104. if (fix.valid.altitude) alt = fix.altitude();
  105. if ( alt > Am) Am = alt;
  106. if (show == 0) {
  107. char displayBufffer[MAX_CHARS];
  108. oled.setCursor(0, 0);
  109. snprintf(displayBufffer, MAX_CHARS, "Km:%2d.%1d", (int)odo, (int)(odo * 100) % 100);
  110. oled.println(displayBufffer);
  111. oled.setCursor(65, 0);
  112. snprintf(displayBufffer, MAX_CHARS, "Di:%2d.%1d", (int)Dist, (int)(Dist * 100) % 100);
  113. oled.println(displayBufffer);
  114. snprintf(displayBufffer, MAX_CHARS, "Ve:%2d.%1d", (int)Speed, (int)(Speed * 10) % 10);
  115. oled.println(displayBufffer);
  116. oled.setCursor(65, 2);
  117. snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 10) % 10);
  118. oled.println(displayBufffer);
  119. snprintf(displayBufffer, MAX_CHARS, "Al:%2d.%1d", (int)alt, (int)(alt * 100) % 100);
  120. oled.println(displayBufffer);
  121. oled.setCursor(65, 4);
  122. snprintf(displayBufffer, MAX_CHARS, "Am:%2d.%1d", (int)Am, (int)(Am * 100) % 100);
  123. oled.println(displayBufffer);
  124. snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi);
  125. oled.println(displayBufffer);
  126. oled.setCursor(65, 6);
  127. snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
  128. oled.println(displayBufffer);
  129. }
  130. File data = SD.open("L.csv", FILE_WRITE);
  131. data.print(fix.dateTime.hours + 2);
  132. data.print(":");
  133. data.print(fix.dateTime.minutes);
  134. data.print(" ");
  135. data.print(fix.dateTime.date);
  136. data.print("/");
  137. data.print(fix.dateTime.month);
  138. data.print(" ");
  139. data.print(ore);
  140. data.print(":");
  141. data.print(minuti);
  142. data.print(":");
  143. data.print(secondi);
  144. data.print(" ");
  145. data.print(fix.latitude(), 6);
  146. data.print(" ");
  147. data.print(fix.longitude(), 6);
  148. data.print(" ");
  149. data.print(alt);
  150. data.print(" ");
  151. data.print(Am);
  152. data.print(" ");
  153. data.print(odo);
  154. data.print(" ");
  155. data.print(Dist);
  156. data.print(" ");
  157. data.print(Speed);
  158. data.print(" ");
  159. data.print(head);
  160. data.print(" ");
  161. data.print(Sat);
  162. data.println();
  163. data.close();
  164. }
  165. }
Add Comment
Please, Sign In to add comment