#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>
const char *ssid = "QUEEN";
const char *password = "12345678";
WebServer server(80);
#define TRIG_PIN 23
#define ECHO_PIN 22
#define LED1_PIN 25
#define LED2_PIN 26
#define LED3_PIN 27
#define BUZZER_PIN 32
volatile int distance = 0;
unsigned long lastMeasurementTime = 0;
TaskHandle_t SensorTaskHandle;
void measureDistanceTask(void *parameter) {
  while (true) {
    // Trigger the ultrasonic sensor
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    // Read pulse duration
    long duration = pulseIn(ECHO_PIN, HIGH);
    distance = duration * 0.0344 / 2;
    // Control LEDs
    digitalWrite(LED1_PIN, distance <= 5);
    digitalWrite(LED2_PIN, distance <= 10);
    digitalWrite(LED3_PIN, distance <= 15);
    // Control buzzer
    digitalWrite(BUZZER_PIN, distance <= 20);
    // Task delay to reduce CPU usage
    vTaskDelay(100 / portTICK_PERIOD_MS);
  }
}
void sendDistanceData() {
  String jsonResponse = "{\"distance\": " + String(distance) + "}";
  server.send(200, "application/json", jsonResponse);
}
void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }
  // Set up server routes
  server.on("/", sendDistanceData);
  server.onNotFound([]() {
    server.send(404, "text/plain", "404: Not Found");
  });
  server.begin();
  Serial.println("HTTP server started");
  // Initialize pins
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(LED1_PIN, OUTPUT);
  pinMode(LED2_PIN, OUTPUT);
  pinMode(LED3_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  // Start sensor task on Core 1
  xTaskCreatePinnedToCore(
    measureDistanceTask, // Task function
    "SensorTask",        // Name of the task
    2048,                // Stack size
    NULL,                // Parameter
    1,                   // Priority
    &SensorTaskHandle,   // Task handle
    1                    // Core 1
  );
}
void loop() {
  server.handleClient();
}