This is an old revision of the document!
The “ESP32 Customizable Parking Sensor” project integrates an ESP32 microcontroller with a distance sensor, a buzzer, and an SDCard module to create a versatile parking assistance system. The core functionality involves storing music tracks on the SDCard and playing them through the buzzer. However, what sets this project apart is its user-friendly Web UI, which enables users to select their preferred music track. Additionally, a distance sensor enhances the functionality by adjusting the melody's playback speed based on the proximity of obstacles. As the distance to an obstacle decreases, the melody plays at a faster pace, providing real-time feedback to the user. This project not only offers practical assistance in parking situations but also showcases the capabilities of the ESP32 microcontroller in creating customizable and interactive solutions.
// Load Wi-Fi library #include <WiFi.h> #include "FS.h" #include "SD.h" #include "SPI.h" char *current_durations; short *current_melody; int current_size, current_note; const char *network_ssid = "<MY-SSID>"; const char *network_password = "<MY-PASS>"; WiFiServer web_server(80); String http_header; unsigned long current_time_ms = millis(); unsigned long previous_time_ms = 0; const long timeout_ms = 2000; const int trigger_pin = 33; const int echo_pin = 32; const int buzzer_pin = 17; #define SOUND_SPEED_CM_PER_US 0.034 #define CM_TO_INCH_CONVERSION 0.393701 long pulse_duration_us; float distance_cm; float distance_inch; char file_names[32][32]; short file_melody[32][32]; char file_duration[32][32]; char file_mdsize[32]; int file_count; void setup() { Serial.begin(115200); if(!SD.begin(5)){ Serial.println("Card Mount Failed"); return; } File root = SD.open("/"); if(!root){ return; } if(!root.isDirectory()){ return; } File file = root.openNextFile(); while(file) { int idx = 0; while(file.available()){ file_duration[file_count][idx] = file.read(); idx++; } file_mdsize[file_count] = idx; strcpy(file_names[file_count++], file.name()); char *dot = strchr(file_names[file_count], '.'); *dot = '\0'; file.close(); file = root.openNextFile(); idx = 0; while(file.available()){ file_melody[file_count][idx] = file.read(); idx++; } file_count++; file.close(); file = root.openNextFile(); } pinMode(buzzer_pin, OUTPUT); pinMode(trigger_pin, OUTPUT); pinMode(echo_pin, INPUT); WiFi.begin(network_ssid, network_password); while (WiFi.status() != WL_CONNECTED) { delay(500); } web_server.begin(); current_melody = file_melody[0]; current_durations = file_duration[0]; current_size = file_mdsize[0]; } #define MIN_VALUE(a, b) (a > b ? b : a) void play_note(int note) { long note_duration = 1000 / (int)current_durations[note] - (int)(50 - MIN_VALUE((int)distance_cm, 50)); tone(buzzer_pin, (int)current_melody[note], note_duration); int pause_between_notes = note_duration * 1.30; Serial.println(pause_between_notes); delay(pause_between_notes); noTone(buzzer_pin); } unsigned long distance_probe_interval; void update_distance(void) { digitalWrite(trigger_pin, LOW); delayMicroseconds(2); digitalWrite(trigger_pin, HIGH); delayMicroseconds(10); digitalWrite(trigger_pin, LOW); pulse_duration_us = pulseIn(echo_pin, HIGH); distance_cm = pulse_duration_us * SOUND_SPEED_CM_PER_US / 2; } void loop() { WiFiClient client = web_server.available(); int curr_file; if (client) { current_time_ms = millis(); previous_time_ms = current_time_ms; String current_line = ""; while (client.connected() && current_time_ms - previous_time_ms <= timeout_ms) { current_time_ms = millis(); if (client.available()) { char c = client.read(); http_header += c; if (c == '\n') { if (current_line.length() == 0) { client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); char req[100]; int i; for (i = 0; i < file_count; i++) { sprintf(req, "GET /%s/on", file_names[i]); if (http_header.indexOf(req) >= 0) { current_melody = file_melody[i]; current_durations = file_duration[i]; current_size = file_mdsize[i]; current_note = 0; curr_file = i; break; } } client.println("<!DOCTYPE html><html><head><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><link rel=\"icon\" href=\"data:,\"><link href=\"https://fonts.googleapis.com/css2?family=Patrick+Hand&display=swap\" rel=\"stylesheet\"><style>html{font-family:'Patrick Hand',cursive;display:inline-block;margin:0px auto;text-align:center;background-color:#f0f8ff;color:#333;}h1{color:#4682b4;}ol{list-style-type:decimal;padding:0;margin:20px 0;}li{margin:10px 0;font-size:24px;transition:transform 0.3s ease,color 0.3s ease;transform-style:preserve-3d;}li:hover{transform:perspective(1000px) rotateX(10deg) scale(1.05);color:#4682b4;}.button{background-color:#1e90ff;border:none;color:white;padding:30px 70px;text-decoration:none;font-size:32px;cursor:pointer;border-radius:15px;transition:background-color 0.3s ease,transform 0.3s ease;display:block;width:90%;margin:0 auto;font-family:'Patrick Hand',cursive;transform-style:preserve-3d;}.button2{background-color:#555555;padding:24px 60px;font-size:28px;}.button:hover,.button2:hover{background-color:#4682b4;}</style></head><body><h1>ESP32 Alarm Music Player</h1>"); client.println(" <ol>"); for (i = 0; i < file_count; i++) { if (i == curr_file) { sprintf(req, "<li><a href=\"/%s/off\"><button class=\"button\">%s</button></a></li>", file_names[i], file_names[i]); } else { sprintf(req, "<li><a href=\"/%s/on\"><button class=\"button button2\">%s</button></a></li>", file_names[i], file_names[i]); } client.println(req); } client.println(" </ol>"); client.println("</body></html>"); client.println(); break; } else { current_line = ""; } } else if (c != '\r') { current_line += c; } } else { play_note(current_note++); if (current_note >= current_size) current_note = 0; update_distance(); } } http_header = ""; client.stop(); } play_note(current_note++); if (current_note >= current_size) current_note = 0; update_distance(); }