#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h>

const char *ssid = "Wokwi-GUEST";
const char *password = "";
const char *mqttServer = "maqiatto.com";
const int mqttPort = 1883;
const char *mqttUser = "[email protected]";
const char *mqttPassword = "dickybayu";

WiFiClient espClient;
PubSubClient client(espClient);

const int trigPin1 = 4;
const int echoPin1 = 2;

const int trigPin2 = 18;
const int echoPin2 = 5;

const int trigPin3 = 21;
const int echoPin3 = 19;

const int trigPin4 = 13;
const int echoPin4 = 12;

const int trigPin5 = 14;
const int echoPin5 = 27;

const int trigPin6 = 26;
const int echoPin6 = 25;

const int pirPin1 = 33;
const int pirPin2 = 15;

const int servoPin1 = 23;
const int servoPin2 = 22;
Servo gerbang_masuk;
Servo gerbang_keluar;

int pirStatus1 = 0;
int pirStatus2 = 0;

void Parkir(int trigPin, int echoPin, const char *namaAreaParkir) {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long durasi = pulseIn(echoPin, HIGH);
  int jarak = durasi * 0.034 / 2;

  String payload = String(namaAreaParkir);

  if (jarak < 30) {
    payload += " Terisi";
  } else {
    payload += " Kosong";
  }
  client.publish((mqttUser + String("/Lantai_1")).c_str(), payload.c_str());
}

void aturWiFi() {
  delay(10);
  Serial.println();
  Serial.print("Menghubungkan ke ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi terhubung");
  Serial.println("Alamat IP: ");
  Serial.println(WiFi.localIP());
}

void mulaiUlang() {
  while (!client.connected()) {
    Serial.print("Mencoba koneksi MQTT...");
    if (client.connect("esp32Client", mqttUser, mqttPassword)) {
      Serial.println("terhubung");
    } else {
      Serial.print("gagal, rc=");
      Serial.print(client.state());
      Serial.println(" coba lagi dalam 5 detik");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(9600);
  aturWiFi();
  client.setServer(mqttServer, mqttPort);

  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);

  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);

  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);

  pinMode(trigPin4, OUTPUT);
  pinMode(echoPin4, INPUT);

  pinMode(trigPin5, OUTPUT);
  pinMode(echoPin5, INPUT);

  pinMode(trigPin6, OUTPUT);
  pinMode(echoPin6, INPUT);

  gerbang_masuk.attach(servoPin1);
  gerbang_masuk.write(0);

  gerbang_keluar.attach(servoPin2);
  gerbang_keluar.write(0);

  pinMode(pirPin1, INPUT);
  pinMode(pirPin2, INPUT);
}

void loop() {
  if (!client.connected()) {
    mulaiUlang();
  }
  client.loop();

  pirStatus1 = digitalRead(pirPin1);
  pirStatus2 = digitalRead(pirPin2);

  if (pirStatus1 == HIGH) {
    gerbang_masuk.write(90);
    delay(1000);
    Serial.println("111");
  } else {
    gerbang_masuk.write(0);
    delay(1000);
  }
  if (pirStatus2 == HIGH) {
    gerbang_keluar.write(90);
    delay(1000);
  } else {
    gerbang_keluar.write(0);
    delay(1000);
  }

Parkir(trigPin1, echoPin1, "A1");
Parkir(trigPin2, echoPin2, "A2");
Parkir(trigPin3, echoPin3, "A3");
Parkir(trigPin4, echoPin4, "B1");
Parkir(trigPin5, echoPin5, "B2");
Parkir(trigPin6, echoPin6, "B3");
}