#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>

// lcd的I2C地址
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int trigPin = 9;
const int echoPin = 10;

double duration;
double distance;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.begin(9600);

  // 初始化LCD
  lcd.begin(16, 2); //设置lcd
  lcd.backlight();

  // 显示初始内容
  lcd.setCursor(0, 0); // 第一行,第一列
  lcd.print("Distance: ");
  lcd.setCursor(0, 1); // 第二行,第一列
  lcd.print(" cm");
}

void loop() {

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  // 发送10微秒的高电平脉冲HC-SR04传感器需要一个10微秒的高电平脉冲来触发测距。
  // 当trigPin接收到这个脉冲时,传感器会发出8个40kHz的超声波脉冲
  // 然后等待接收反射回来的超声波信号
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // 等待Echo变高
  while (digitalRead(echoPin) == LOW);

  // 开始计时
  unsigned long startTime = micros();

  // 等待Echo变低
  while (digitalRead(echoPin) == HIGH);

  // 停止计时
  unsigned long endTime = micros();

  // 计算脉冲持续时间
  duration = endTime - startTime;

  // 计算距离(厘米)
  distance = duration * 0.034 / 2;

  // 输出到串口
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
 

  // 清除显示内容
  lcd.clear();

  // 输出距离数据
  lcd.setCursor(0, 0); // 设置光标第一行
  lcd.print("Distance: ");
  lcd.print(distance);
  lcd.setCursor(0, 1);
  lcd.print("cm");

  // 延时500毫秒
  delay(500);
}