#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_rom_sys.h"
// 🔌 Pin Definitions
#define TRIG_PIN GPIO_NUM_4
#define ECHO_PIN GPIO_NUM_14
#define RELAY_PIN GPIO_NUM_26
// ⚡ Relay Logic (ACTIVE HIGH for your case)
#define RELAY_ON 1 // LED ON
#define RELAY_OFF 0 // LED OFF
// 🎯 Threshold
#define THRESHOLD 20 // cm
// 📏 Distance Measurement Function
float measure_distance() {
// Trigger pulse
gpio_set_level(TRIG_PIN, 0);
esp_rom_delay_us(2);
gpio_set_level(TRIG_PIN, 1);
esp_rom_delay_us(10);
gpio_set_level(TRIG_PIN, 0);
// Wait for echo HIGH
int timeout = 30000;
while (gpio_get_level(ECHO_PIN) == 0 && timeout--) {
esp_rom_delay_us(1);
}
if (timeout <= 0) return -1;
// Measure HIGH duration
int duration = 0;
timeout = 30000;
while (gpio_get_level(ECHO_PIN) == 1 && timeout--) {
duration++;
esp_rom_delay_us(1);
}
if (timeout <= 0) return -1;
// Convert to distance
float distance = duration * 0.034 / 2;
return distance;
}
void app_main(void) {
// ⚙️ GPIO Setup
gpio_set_direction(TRIG_PIN, GPIO_MODE_OUTPUT);
gpio_set_direction(ECHO_PIN, GPIO_MODE_INPUT);
gpio_set_direction(RELAY_PIN, GPIO_MODE_OUTPUT);
// Initial state → LED OFF
gpio_set_level(RELAY_PIN, RELAY_OFF);
while (1) {
float distance = measure_distance();
if (distance < 0) {
printf("No Echo Signal\n");
vTaskDelay(pdMS_TO_TICKS(1000));
continue;
}
printf("Distance: %.2f cm\n", distance);
// 🎯 CONTROL LOGIC
if (distance < THRESHOLD) {
gpio_set_level(RELAY_PIN, RELAY_OFF); // LED OFF
printf("Distance < 20 cm → LED OFF\n");
}
else {
gpio_set_level(RELAY_PIN, RELAY_ON); // LED ON
printf("Distance >= 20 cm → LED ON\n");
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}