//-----------------------
//Stopwatch with Lap Time
//-----------------------
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//---------------------------------
LiquidCrystal_I2C lcd(0x27, 16, 2); //0x3F
//---------------------------------
String milliSec; boolean debounce1, debounce2;
unsigned long btn1PressStart=0, btn2PressStart=0;
unsigned long Sec, Min, startMillis; int lapNum = 1;
//============================================================
void setup()
{
  pinMode(3,INPUT); pinMode(7,INPUT);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("---STOPWATCH----");
  lcd.setCursor(0,1);
  lcd.print(" Press to start");
}
//============================================================
void loop()
{
  if(millis()-btn1PressStart > 500) debounce1 = true;
  if(digitalRead(3) == HIGH && debounce1 == true)
  {
    btn1PressStart = millis();
    debounce1 = false;
    stopWatch();
  }
}
//=============================================================
void stopWatch()
{
  lcd.clear();
  startMillis = millis();
  while(1)
  {   
    if(millis()-btn1PressStart > 500) debounce1 = true;
    if(digitalRead(3) == HIGH && debounce1 == true)
    {
      btn1PressStart = millis();
      debounce1 = false;
      lcd.setCursor(0,0); lcd.print("   ");
      lcd.setCursor(13,0); lcd.print("END");
      lapNum = 1;
      btn2PressStart = 0;
      break;
    }
    //-------------------------------------------------
    if(millis()-btn2PressStart > 500) debounce2 = true;
    if(digitalRead(7) == HIGH && debounce2 == true) 
    {
      btn2PressStart = millis();
      debounce2 = false;
      lapTime();
    }
    //-------------------------------------------------
    milliSec = String((millis()-startMillis)%1000);
    Sec = ((millis()-startMillis)/1000)%60;
    Min = ((millis()-startMillis)/60000)%60;
    //-------------------------------------------------
    lcd.setCursor(0,0); lcd.print("BGN ");
    if(Min < 10)
    {
      lcd.print("0"); lcd.print(Min);
    }
    else lcd.print(Min);
    lcd.print(":");
    if(Sec < 10)
    {
      lcd.print("0"); lcd.print(Sec);
    }
    else lcd.print(Sec);
    lcd.print(".");
    lcd.print(milliSec[0]); lcd.print(milliSec[1]);
  }
}
//============================================================
void lapTime()
{
  String lapMilliSec = milliSec;
  int lapSec = Sec, lapMin = Min;
  //---------------------------------------------
  lcd.setCursor(0,1);
  lcd.print("LP"); lcd.print(lapNum); lapNum++;
  lcd.setCursor(4,1);
  if(Min < 10)
  {
    lcd.print("0"); lcd.print(lapMin);
  }
  else lcd.print(lapMin);
  lcd.print(":");
  if(Sec < 10)
  {
    lcd.print("0"); lcd.print(lapSec);
  }
  else lcd.print(lapSec);
  lcd.print(".");
  lcd.print(lapMilliSec[0]); lcd.print(lapMilliSec[1]);
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
r1:1
r1:2
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
r2:1
r2:2
gnd1:GND
D0D1D2D3D4D5D6D7GNDLOGIC
logic1:D0
logic1:D1
logic1:D2
logic1:D3
logic1:D4
logic1:D5
logic1:D6
logic1:D7
logic1:GND