Paste Search Dynamic
kdi
  1. //Libraries
  2.  
  3. #include <TM1637Display.h>
  4. #include <TinyGPS++.h>
  5. #include <Chrono.h>
  6. #include <LightChrono.h>
  7. #include <Key.h>
  8. #include <Keypad.h>
  9. #include <Keyboard.h>
  10. #include <LiquidCrystal_I2C.h>
  11.  
  12. //---------------------------------------------------------------
  13. // LED GPS
  14. int LED = 9;
  15. //---------------------------------------------------------------
  16. // RAZ total
  17.  
  18. long portPushButton = 2;
  19. long etatPushButton = LOW;
  20. // RAZ partiel
  21.  
  22. long portPushButton1 = 3;
  23. long etatPushButton1 = LOW;
  24.  
  25. //Total +/-
  26.  
  27. long portPushButton2 = 4;
  28. long etatPushButton2 = LOW;
  29.  
  30. //----------------------------------------------------------------
  31. // Module compteur auxiliaire (Digital Pins)
  32.  
  33. #define CLK 7
  34. #define DIO 6
  35.  
  36.  
  37. TM1637Display display(CLK, DIO);
  38. //---------------------------------------------------------------
  39. //Clavier
  40. const byte Rows= 5; //number of rows on the keypad
  41. const byte Cols= 4; //number of columns on the keypad
  42.  
  43. char keys[Rows][Cols]=
  44. {
  45. {'A', 'B', '#', '*'},
  46. {'1', '2', '3', 'C'},
  47. {'4', '5', '6', 'D'},
  48. {'7', '8', '9', 'E'},
  49. {'F', '0', 'G', 'H'}
  50. };
  51.  
  52. byte rowPins[Rows] = {23,25,27,29,31}; //Rows 0 to 3
  53. byte colPins[Cols]= {39,37,35,33}; //Columns 0 to 3
  54.  
  55.  
  56. Keypad kpd = Keypad(makeKeymap(keys), rowPins, colPins, Rows, Cols);
  57. //---------------------------------------------------------------
  58. // BUZZER
  59.  
  60. long port = 8;
  61. //---------------------------------------------------------------
  62. // The TinyGPS++ object
  63. TinyGPSPlus gps;
  64.  
  65. //---------------------------------------------------------------
  66. //LCD 1&2
  67. LiquidCrystal_I2C lcd(0x3E, 16, 2);
  68. LiquidCrystal_I2C lcd2(0x3F, 16, 2);
  69. //---------------------------------------------------------------
  70. //Chrono
  71. Chrono myChrono1(Chrono::MICROS);
  72. //----------------------------------------------------------------
  73. //Variables
  74. double prevLatitude, prevLongitude = 0;
  75. double totalM = 0;
  76. double trip2 = 0;
  77. int start = 0;
  78. int fastart = 0; //To go to the second menu, without scrolling text (and give accurate start)
  79. int scr = 0; //To avoid blinking screen in fastart menu
  80. int tr2 = 0;
  81. int menu =0;
  82. double cons = 0; //Target speed in KpH
  83. int Nbrsat =0;
  84. //----------------------------------------------------------------
  85.  
  86.  
  87. //SETUP
  88. void setup()
  89. {
  90.  
  91.   Serial2.begin(9600);
  92.  
  93.   myChrono1.start();
  94.  
  95.   lcd.init();                  
  96.   lcd2.init();
  97.   lcd.backlight();                    
  98.   lcd2.backlight();
  99.   lcd.setCursor(0, 0);
  100.   lcd2.setCursor(0, 0);
  101.  
  102.   pinMode(40, OUTPUT);
  103.   pinMode(42, OUTPUT);
  104.   pinMode(44, OUTPUT);
  105.   pinMode(46, OUTPUT);
  106.   pinMode(48, OUTPUT);
  107.   pinMode(50, OUTPUT);
  108.   pinMode(52, OUTPUT);
  109.  
  110.   lcd.print(" # Kdi rallye #");
  111.   lcd.setCursor(0,1);
  112.   lcd.print("  >----------<");
  113.  
  114.   //for (int df = 0; df < 10; df++)
  115.     {
  116.       lcd2.print("*SUBARU IMPREZA*");
  117.       lcd2.setCursor(0,1);
  118.       lcd2.print(" * WRX * STI *  ");
  119.       delay(4000);
  120.     }
  121.  
  122.   lcd.clear();
  123.   lcd2.clear();
  124. //-------------------------------------------------------------------
  125. //buzzer init
  126.   pinMode(port, OUTPUT);
  127. //----------------------------------------------------------------------
  128.  //Led SAT:
  129.  pinMode (LED, OUTPUT);
  130.  
  131. //----------------------------------------------------------------------
  132. //RAZ total
  133.   pinMode (portPushButton,INPUT);
  134. //RAZ Partiel
  135.   pinMode (portPushButton1,INPUT);
  136.  
  137. //---------------------------------------------------------------
  138. //Total +/-
  139.    pinMode (portPushButton2, INPUT);
  140.  
  141. //---------------------------------------------------------------
  142.  }
  143.  
  144.  
  145. //Boucle principale
  146. void loop()
  147. {
  148.  
  149.    int k;
  150.   uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
  151.   uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };
  152.   display.setBrightness(0x0f);
  153.    
  154.    
  155.    
  156.    
  157.    
  158.    double elapsed = myChrono1.elapsed()/1000000;  
  159.    double disthr;
  160.    double delta;
  161.  
  162.  
  163.   char keypressed = kpd.getKey();    
  164.   //--------------------------------------------------------------------
  165.  
  166.      
  167.    //Menu principal
  168.    if (menu == 0)
  169.     {
  170.       lcd.setCursor(0,0);
  171.       lcd2.setCursor(0, 0);
  172.       lcd.print("Moy. : ");
  173.       lcd.print(cons,0);
  174.       lcd.print(" Km/H");
  175.       lcd.setCursor(0,1);
  176.       lcd.print("Start Line ~*");  // le "~" donne une fleche a l'ecran
  177.  
  178.       lcd2.print("|0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |SAT:   ");
  179.       lcd2.print(gps.satellites.value());
  180.       lcd2.setCursor(0,1);
  181.       lcd2.print("|25|40|45|50|55|60|65|70|75|80|---    ");
  182.       lcd2.scrollDisplayLeft();
  183.       delay(500);
  184.  
  185. // Clavier
  186.       if (keypressed == '0')
  187.          {cons=25;
  188.          lcd.clear();}
  189.       if (keypressed == '1')
  190.          {cons=40;
  191.          lcd.clear();}
  192.       else if (keypressed == '2')
  193.          {cons=45;
  194.          lcd.clear();}
  195.       else if (keypressed == '3')
  196.         {cons=50;    
  197.         lcd.clear();}
  198.       else if (keypressed == '4')
  199.         {cons=55;    
  200.         lcd.clear();}
  201.       else if (keypressed == '5')
  202.        {cons=60;    
  203.        lcd.clear();}
  204.       else if (keypressed == '6')
  205.        {cons=65;    
  206.        lcd.clear();}
  207.       else if (keypressed == '7')
  208.        {cons=70;    
  209.        lcd.clear();}
  210.       else if (keypressed == '8')
  211.        {cons=75;    
  212.        lcd.clear();}
  213.       else if (keypressed == '9')
  214.        {cons=80;    
  215.        lcd.clear();}
  216.  
  217.      scr = 0;
  218.     }
  219. //-------------------------------------------------------------------
  220.  
  221.   //Fastart Menu
  222.   if (keypressed =='*' && menu == 0 || fastart == 1)
  223.    {
  224.      menu = 1;
  225.      fastart = 1;
  226.      
  227.       if (scr == 0)   // to avoid blinking screen
  228.          {lcd.clear();
  229.          lcd2.clear();
  230.          scr = 1;}
  231.          
  232.      lcd.setCursor(0, 0);
  233.      lcd2.setCursor(0, 0);
  234.      lcd.print("Chrono : ");
  235.      lcd.print(cons,0);
  236.      lcd.print(" Km/H");
  237.      lcd.setCursor(0,1);
  238.      lcd.print("Ent Go - MENU#");
  239.      
  240.      if (keypressed == '#')
  241.         {fastart = 0;
  242.          menu = 0;
  243.          lcd.clear();
  244.          lcd2.clear();}
  245.     }
  246. //----------------------------------------------------------------------
  247.  
  248.   //Fontionnement
  249.    if (keypressed == 'H' && fastart == 1 || start == 1)
  250.     {
  251.      fastart = 0;
  252.      if (start == 0)
  253.         {myChrono1.restart();
  254.          tr2 = 1;
  255.          lcd.clear();
  256.          lcd2.clear();}
  257.  
  258.      start = 1;
  259.      menu = 1;
  260.  
  261.      //calcul de la distance moyenne
  262.      disthr =(cons/3.6)*elapsed;
  263. //----------------------------------------------------------------------
  264.  
  265.      lcd.setCursor(0, 0);
  266.      lcd2.setCursor(0, 0);
  267.    
  268.      lcd.print("GPS : ");
  269.      lcd.print(gps.satellites.value(),1);
  270.      lcd.print(" sat");
  271.  
  272.   //Travelled distance and delay calculation
  273.  
  274.      double distanceInM = getDistance(gps);
  275.      totalM = totalM + distanceInM;
  276.      
  277.     lcd2.print(" Total : ");
  278.     lcd2.print(totalM/1000,2);
  279.     lcd2.print(" Km");
  280.     display.showNumberDecEx(totalM, 0x80 , true);
  281.  
  282.  
  283.  
  284. //---------------------------------------------------------------
  285.    
  286.   delta = disthr - totalM;
  287. //---------------------------------------------------------------------  
  288. //Trip Partiel
  289.     if (tr2 == 1)
  290.       {trip2 = trip2 + distanceInM;}
  291.  
  292. if (keypressed == 'H')  // partiel Start
  293.       {trip2 = 0;
  294.          tr2 = 1;}
  295.            
  296.     lcd2.setCursor(0,1);
  297.     lcd2.print("Partiel: ");
  298.     lcd2.print(trip2/1000,2);
  299.     lcd2.print (" Km");
  300.    
  301.    
  302. //----------------------------------------------------------------------
  303.    
  304.     if (delta > -15 && delta < 15)
  305.       {digitalWrite(40, LOW);
  306.       digitalWrite(42, LOW);
  307.       digitalWrite(44,LOW);
  308.       digitalWrite(46,HIGH);
  309.       digitalWrite(48,LOW);
  310.       digitalWrite(50,LOW);
  311.       digitalWrite(52,LOW);}
  312.  
  313.     else if (delta < -16 && delta > -40)
  314.       {digitalWrite(40, LOW);
  315.       digitalWrite(42, LOW);
  316.       digitalWrite(44,LOW);
  317.       digitalWrite(46,HIGH);
  318.       digitalWrite(48,HIGH);
  319.       digitalWrite(50,LOW);
  320.       digitalWrite(52,LOW);}
  321.  
  322.     else if (delta > -100 && delta < -41 )
  323.       {digitalWrite(40, LOW);
  324.       digitalWrite(42, LOW);
  325.       digitalWrite(44,LOW);
  326.       digitalWrite(46,HIGH);
  327.       digitalWrite(48,HIGH);
  328.       digitalWrite(50,HIGH);
  329.       digitalWrite(52,LOW);}
  330.  
  331.     else if (delta < -101)
  332.       {digitalWrite(40, LOW);
  333.       digitalWrite(42, LOW);
  334.       digitalWrite(44,LOW);
  335.       digitalWrite(46,HIGH);
  336.       digitalWrite(48,HIGH);
  337.       digitalWrite(50,HIGH);
  338.       digitalWrite(52,HIGH);}
  339.  
  340.  
  341.     else if ( delta > 16 && delta < 40)
  342.       {digitalWrite(40, LOW);
  343.       digitalWrite(42, LOW);
  344.       digitalWrite(44,HIGH);
  345.       digitalWrite(46,HIGH);
  346.       digitalWrite(48,LOW);
  347.       digitalWrite(50,LOW);
  348.       digitalWrite(52,LOW);}
  349.  
  350.     else if ( delta > 41 && delta < 100)
  351.       {digitalWrite(40, LOW);
  352.       digitalWrite(42, HIGH);
  353.       digitalWrite(44,HIGH);
  354.       digitalWrite(46,HIGH);
  355.       digitalWrite(48,LOW);
  356.       digitalWrite(50,LOW);
  357.       digitalWrite(52,LOW);}
  358.  
  359.     else if ( delta > 101)
  360.       {digitalWrite(40, HIGH);
  361.       digitalWrite(42, HIGH);
  362.       digitalWrite(44,HIGH);
  363.       digitalWrite(46,HIGH);
  364.       digitalWrite(48,LOW);
  365.       digitalWrite(50,LOW);
  366.       digitalWrite(52,LOW);}
  367.     //-------------
  368.  
  369.     lcd.setCursor(0, 1);
  370.     lcd.print ("Delay : ");
  371.     lcd.print(delta,0);
  372.     lcd.print(" m  ");
  373.  
  374.     //Retour au menu principal
  375.     if (keypressed == 'E')
  376.       {start = 0;
  377.       totalM=0;
  378.       trip2=0;
  379.       menu=0;
  380.       digitalWrite(40, LOW);
  381.       digitalWrite(42, LOW);
  382.       digitalWrite(44,LOW);
  383.       digitalWrite(46,LOW);
  384.       digitalWrite(48,LOW);
  385.       digitalWrite(50,LOW);
  386.       digitalWrite(52,LOW);
  387.      lcd2.clear();
  388.       lcd.clear();
  389.       prevLongitude = 0;
  390.       prevLatitude = 0;
  391.       digitalWrite(port, HIGH);   // BUZZER
  392.       delay(2000);
  393.       digitalWrite(port, LOW);
  394.       display.clear ();
  395.        }
  396.       }
  397.  
  398. //--------------------------------------------------------------
  399. // Change les Kms sur le total
  400. if (keypressed == 'C')
  401.                 {totalM = totalM + 100 ;        
  402.           }
  403.      if (keypressed == 'G')
  404.                 {totalM = totalM + 1000 ;        
  405.           }
  406.      if (keypressed == 'D')
  407.          {totalM = totalM - 100 ;        
  408.          }
  409.      if (keypressed == 'F')
  410.                 {totalM = totalM - 1000 ;        
  411.           }
  412. //--------------------------------------------------------------
  413. //Compte à rebours
  414.   etatPushButton2 = digitalRead(portPushButton2);
  415.       if (etatPushButton2 == LOW)
  416.          {
  417.           -- totalM ;
  418.          }
  419.      
  420. //---------------------------------------------------------------
  421.      
  422.     smartDelay(10);
  423.  
  424.     }
  425. //---------------------------------------------------------
  426.  
  427.  
  428. //GPS rafraichisement
  429. static void smartDelay(unsigned long ms)
  430.   {
  431.     unsigned long start = millis();
  432.     do
  433.       {   while (Serial2.available())
  434.           gps.encode(Serial2.read());
  435.       }        
  436.     while (millis() - start < ms);
  437.   }
  438. //--------------------------------------------------------
  439.  
  440. // Distance parcourue lors de chaque calcul de boucle
  441. double getDistance(TinyGPSPlus &gps)
  442. {
  443.  
  444.   float latitude, longitude;
  445.   latitude = gps.location.lat(),6; //,X; égal au nombre après la virgule ex Lat: 48,xxxxxx
  446.   longitude = gps.location.lng(),6;
  447.  
  448.   if (prevLongitude == 0)
  449.     {
  450.     prevLatitude = latitude;
  451.     prevLongitude = longitude;
  452.     }
  453.  
  454.   double distanceInM = (double)TinyGPSPlus::distanceBetween(prevLatitude,prevLongitude, latitude, longitude);
  455.    
  456.   prevLatitude = latitude;
  457.   prevLongitude = longitude;
  458.  
  459.   return distanceInM;
  460.  
  461. }
  462. //---------------------------------------------------
  463. //                            FIN
Parsed in 0.053 seconds