#include <ESP32Servo.h> 
#define led_vermelho 32
#define led_azul 14
#define led_verde 27
#define pir 22
#define trigger 18
#define echo 19
#define bottom 13
float distancia;
String senha;
String senhaCadastrada = "";
char leituraSerial;
Servo servo;
int pinServo=2;
int angulo = 0;
const int buzzer = 23;
bool mensagem = false;

void setup() {
  Serial.begin(115200);
  pinMode(trigger, OUTPUT); // trigger
  pinMode(echo, INPUT); //echo
  pinMode(led_vermelho, OUTPUT);// led vermelho
  pinMode(led_azul, OUTPUT);// led azul
  pinMode (led_verde, OUTPUT);// led verde
  pinMode (pir, INPUT);
  pinMode (buzzer, OUTPUT);
  pinMode (pinServo, OUTPUT);
  servo.attach(pinServo);

}

void loop() {
  delay(10);
  distancia = Ultrasonic(trigger,echo);
  delay(10);
      if (distancia < 30){
        digitalWrite(led_vermelho,1);
        digitalWrite(led_verde,0);
        digitalWrite(led_azul,0);
        Serial.print("DISTANCIA: ");
        Serial.println(distancia);
        Serial.println("cm");
        delay(1000);
        digitalWrite(led_vermelho,0);
        cofre();
      }
      else {
        digitalWrite (led_azul,0);
        digitalWrite (led_vermelho, 0);
        digitalWrite(led_verde,0);
      }
    
    int leitura = digitalRead(pir);

  if(leitura == 1 && distancia < 30){
    digitalWrite(led_azul,1);
    Serial.println("LED AZUL LIGADO");
    delay(1000);
    digitalWrite(led_azul,0);
  }   
   cofre();
   
}

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 cofre(){

  if(!mensagem){
  Serial. println ("Cadastre uma senha de 4 caracteres: ");
  mensagem = true;
  }
  delay(250);
  if (Serial.available() > 0) {
    char leituraSerial = Serial.read();
    if (leituraSerial != '\n') {
      senha += leituraSerial;
      Serial.print(leituraSerial); 
      Serial.print('\n'); 
      Serial.println(senha);
      
      if (senha.length() == 4) {
        if (senhaCadastrada.length() == 0) {
          senhaCadastrada = senha;
          Serial.println("Senha cadastrada!");
          senha = "";
          inicio();
        } else if (senha==senhaCadastrada) {
          Serial.println("Senha correta");
          delay (100);
          abrir();
          senha = "";
          delay(3000);
          inicio();
        } else {
          Serial.println("Senha incorreta.");
          Serial.println("Tente novamente.");
          delay(3000);
          senha = "";
          inicio();
        }
      }
    }
  }
}

void inicio (){
  delay(10);
  servo.write (0);
  delay (1000);
  Serial.println("Cofre Fechado.");
  Serial.println("Insira a senha:");
  delay(100);
  senha = "";
}
void abrir (){
  servo.write (90);
  delay (1000);
  Serial. println ("Cofre aberto!");
  digitalWrite(buzzer, 1);
  digitalWrite(led_verde,1);
  delay (1000);
  digitalWrite(buzzer, 0);
  digitalWrite(led_verde,0);
  }