#include <Arduino.h>
#include <ESP32Servo.h>
const int trigPin = 4;
const int echoPin = 16;
Servo servo1;
int pos = 0;
bool bl;
int minUs = 500;   //0度是脉宽,单位us
int maxUs = 2500;  //180度脉宽,单位us
int servo1Pin = 15;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(200);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  ESP32PWM::allocateTimer(0);  //指定使用的硬件定时器 esp32有4个
  ESP32PWM::allocateTimer(1);
  ESP32PWM::allocateTimer(2);
  ESP32PWM::allocateTimer(3);
  servo1.setPeriodHertz(50);  //指定PWM频率
  servo1.attach(servo1Pin, minUs, maxUs);
 // servo1.write(0);  //转到指定角度(0-180);
  //servo1.detach();  //不需要的时候将引脚和ledc分离
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);  //us 间隔15微秒的脉冲信号供应给超声波HC-SR04
  digitalWrite(trigPin, LOW);

  auto t = pulseIn(echoPin, HIGH);
  double dis = t * 0.01715;  //cm 通过接收超声波返回的时间差计算距离 单位厘米
  Serial.println(dis);
  if (dis < 27) {
    bl = true;
  } else {
    if (bl == true) {  //离开垃圾桶后触发 如果一直在感应区 bl 一直是true,首次是true得下次false触发
      Serial.println("打开盖子到特定角度..........例如140度后停止............5秒后关闭盖子........................");
      servo1.write(140);  //转到指定角度(0-180);
      //servo1.detach();    //不需要的时候将引脚和ledc分离
      delay(5000);
      servo1.write(0);  //转到指定角度(0-180);
     // servo1.detach();  //不需要的时候将引脚和ledc分离
      Serial.println("5秒了关闭盖子中.....................舵机恢复到0角度后停止...................................");
    }
    bl = false;
  }
  delay(200);
}
