#define red 33
#define purple 25
#define white 32
#define pinoPIR 4
#define trigger 18
#define echo 19
int distancia;
int senha;
const int buzzer = 13;
int senhaCorreta = 1234;

void setup() {
  Serial.begin(115200);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);    
  pinMode(red, OUTPUT);
  pinMode(purple, OUTPUT);
  pinMode(white, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(pinoPIR, INPUT);

  ledcSetup(0, 5000, 8);
  ledcAttachPin(buzzer, 0);
}

void loop() {
  Serial.println("Digite a senha: ");
  while (true) {
    if (Serial.available()) {
      senha = Serial.parseInt();
      break;
    }
  }
  Serial.read();
  if (senha == senhaCorreta) {
    digitalWrite(white, HIGH);
    delay(2000);
    digitalWrite(white, LOW);
    Serial.println("Senha correta! Cofre aberto");
    Serial.print("Objeto localizado a distancia de: ");
    distancia = Ultrasonic(trigger, echo);
    delay(10);
    Serial.print(distancia);
    Serial.println(" cm");
    delay(1000);

    if(distancia < 10){

      Serial.println("Nível 1 violado.");
      digitalWrite(red,HIGH);
      delay(2000);
      digitalWrite(red,LOW);
    }
    if (distancia < 10 && digitalRead(pinoPIR) == HIGH) {

      digitalWrite(purple, HIGH);
      delay(2000);
      digitalWrite(purple, LOW);
      Serial.println("Nível 2 violado");
      delay(2000);
      digitalWrite(red, LOW);
      digitalWrite(white, LOW);
    } else if (distancia > 10) {
      digitalWrite(red, LOW);
      digitalWrite(purple, LOW);
      digitalWrite(white, LOW);
      Serial.println("Nenhum nível foi obstruído.");
      delay(5000);
    }
  } else {
    Serial.println("Senha errada! Nível 3 violado.");
    tocarSirene(buzzer);
    for (int i = 0; i < 5; i++) {
      digitalWrite(white, HIGH);
      delay(500);
      digitalWrite(white, LOW);
      delay(500);
    }

    delay(2000);
  }
}

float Ultrasonic(int pintrigger, int pinecho) {
  int distancia = 0;
  while (distancia == 0) {
    digitalWrite(pintrigger, 0);
    delayMicroseconds(5);
    digitalWrite(pintrigger, 1);
    delayMicroseconds(5);
    float tempo = pulseIn(pinecho, 1);
    distancia = (tempo / 2 / 29.15);
  }
  return distancia;
}

void tocarSirene(int buzzer) {
  int freq = 1000;
  int amplitude = 255;
  for (int i = 0; i < 3; i++) {
    while (freq <= 5000) {
      ledcWriteTone(0, freq);
      ledcWrite(0, amplitude);
      delay(20);
      freq += 200;
    }
    while (freq >= 1000) {
      ledcWriteTone(0, freq);
      ledcWrite(0, amplitude);
      delay(20);
      freq -= 200;
    }
  }
  ledcWrite(0, 0);
}