#include <LiquidCrystal.h>
#define PIN_TRIG 5
#define PIN_ECHO 6
#define  triggerPin 2
#define btnPin 3
long int travelTime = 0;
long duration;
bool refresh = false;
float distance;
#define mesurementType(MESUREMENTS) mesurementType
enum MESUREMENTS 
{
mm,
cm,
inch,
};

MESUREMENTS mes = inch;

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
void setup() {
  Serial.begin(115200);
  lcd.begin(16, 2);
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);
  pinMode(btnPin, INPUT_PULLUP);
  pinMode(triggerPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(btnPin), changeUnit, RISING);
}

void changeUnit()
{
  switch(mes)
  {
    case MESUREMENTS::mm:
      mes = cm;
      break;
    case MESUREMENTS::cm:
      mes = inch;
      break;
    case MESUREMENTS::inch:
      mes = mm;
      break;
  }
  trigger();
  return mes;
}

void trigger()
{
  // Clears the PIN_TRIG
  digitalWrite(PIN_TRIG, LOW);
  delayMicroseconds(2);
  // Sets the PIN_TRIG on HIGH state for 10 micro seconds
  digitalWrite(PIN_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_TRIG, LOW);
  // Reads the PIN_ECHO, returns the sound wave travel time in microseconds
  duration = pulseIn(PIN_ECHO, HIGH);
  
  delayMicroseconds(10);

  distance = (duration*0.0343) / 2;
  Serial.println(distance);
  //Serial.println(travelTime);
  
  switch(mes)
  {
    case MESUREMENTS::mm:
      distance *= 10;
      break;
    case MESUREMENTS::inch:
      distance/=2.54;
      break;
  }
  
  refresh = true;
  return distance;
} 

void loop() {
// Start a new measurement:
  lcd.setCursor(0,0);
  lcd.print("distance in ");
  switch(mes)
  {
    case MESUREMENTS::mm:
      lcd.print("mm");
      break;
    case MESUREMENTS::cm:
      lcd.print("cm");
      break;
    case MESUREMENTS::inch:
      lcd.print("In\"");
      break;
  }
  lcd.print(":");
  lcd.setCursor(0,1);
  lcd.print(distance);
  
  if (refresh)
  {
    lcd.clear();
    refresh = false;
  }

    if(digitalRead(triggerPin) == LOW)
  {
    trigger();
    refresh = false;
  }
  Serial.println(digitalRead(triggerPin));
}