TolentinoCotesta

odometer_Wright

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