#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6Y_nCuBKe"
#define BLYNK_TEMPLATE_NAME "UASRIFKI"
#define BLYNK_AUTH_TOKEN "pU61Z0DgP_whB9S7PS56kyBMxYALKn9Y"

#include <ESP32Servo.h>
#include <Keypad.h>
#include <DHT.h>
#include <BlynkSimpleEsp32.h>


char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";

#define DHTPIN 4
#define DHTTYPE DHT22

const int trigPin = 2;
const int echoPin = 3;
const int servoPin = 5;
const int buzzerPin = 4;

Servo portalServo;

const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {34, 35, 32, 33};
byte colPins[COLS] = {16, 17, 18, 19};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  portalServo.attach(servoPin);
  portalServo.write(90);

  // Koneksi ke WiFi
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("WiFi connected");

  // Koneksi ke Blynk
  Blynk.begin(auth, ssid, pass);
}

void loop() {
  long duration, distance;

  // Mengirim sinyal ultrasonik
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Menerima waktu pantulan
  duration = pulseIn(echoPin, HIGH);

  // Menghitung jarak dalam cm
  distance = duration * 0.034 / 2;

  Serial.print("Jarak: ");
  Serial.print(distance);
  Serial.println(" cm");

  // Jika mobil mendekati portal, buka dan tutup otomatis
  if (distance < 50) {
    Serial.println("Mobil mendekati, membuka portal.");
    openPortal();
    delay(5000); // Tunggu 5 detik sebelum menutup portal
    closePortal();
  }

  // Cek input dari keypad
  char key = keypad.getKey();
  if (key != NO_KEY) {
    checkPassword(key);
  }

  // Baca suhu dan kelembaban dari sensor DHT22
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  // Print data suhu dan kelembaban pada Serial Monitor
  Serial.print("Suhu: ");
  Serial.print(temperature);
  Serial.print(" C, Kelembaban: ");
  Serial.print(humidity);
  Serial.println(" %");

  // Kirim data suhu dan kelembaban ke Blynk
  Blynk.virtualWrite(V1, temperature);
  Blynk.virtualWrite(V2, humidity);

  Blynk.run();
  delay(1000); // Tunggu 1 detik sebelum membaca sensor lagi
}

void openPortal() {
  portalServo.write(0);
}

void closePortal() {
  portalServo.write(90);
}

void checkPassword(char key) {
  static char password[] = "1234";
  static byte index = 0;

  if (key == password[index]) {
    index++;

    if (index == strlen(password)) {
      Serial.println("Password Benar.");
      index = 0;
    }
  } else {
    Serial.println("Password Salah.");
    index = 0;
    activateBuzzer();
  }
}

void activateBuzzer() {
  tone(buzzerPin, 1000, 500);
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND
servo1:GND
servo1:V+
servo1:PWM
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
bz1:1
bz1:2
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND