#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));
}