2-3 / index.html
Aragoorn's picture
Radar code for detecting objects with ultrasonics - Follow Up Deployment
54bf3de verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ultrasonic Radar Detection System</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
.radar {
position: relative;
width: 300px;
height: 300px;
border-radius: 50%;
background: linear-gradient(to bottom, #0a2e38 0%, #1b1b2f 100%);
box-shadow: 0 0 20px rgba(0, 255, 255, 0.3);
overflow: hidden;
}
.radar::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 10px;
height: 10px;
background: #00ff00;
border-radius: 50%;
z-index: 10;
}
.radar::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 5px;
height: 5px;
background: #00ff00;
border-radius: 50%;
box-shadow: 0 0 5px #00ff00;
z-index: 10;
}
.radar-scan {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 100%;
height: 100%;
border-radius: 50%;
background: linear-gradient(45deg, transparent 49%, rgba(0, 255, 0, 0.2) 50%, transparent 51%);
animation: rotate 4s linear infinite;
}
.radar-circle {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 1px solid rgba(0, 255, 0, 0.3);
border-radius: 50%;
}
.radar-line {
position: absolute;
top: 50%;
left: 50%;
transform-origin: left center;
width: 50%;
height: 1px;
background: rgba(0, 255, 0, 0.5);
}
.object {
position: absolute;
width: 8px;
height: 8px;
background: #00ff00;
border-radius: 50%;
transform: translate(-50%, -50%);
box-shadow: 0 0 10px #00ff00;
z-index: 5;
}
@keyframes rotate {
0% { transform: translate(-50%, -50%) rotate(0deg); }
100% { transform: translate(-50%, -50%) rotate(360deg); }
}
@keyframes pulse {
0% { opacity: 0.3; }
50% { opacity: 1; }
100% { opacity: 0.3; }
}
.distance-indicator {
animation: pulse 2s infinite;
}
</style>
</head>
<body class="bg-gray-900 text-gray-100 min-h-screen flex flex-col items-center justify-center p-4">
<div class="max-w-4xl w-full">
<h1 class="text-3xl font-bold text-center mb-6 text-cyan-400">
<i class="fas fa-radar mr-2"></i> Ultrasonic Radar Detection System
</h1>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
<div class="flex flex-col items-center">
<div class="radar mb-6">
<div class="radar-circle" style="width: 80%; height: 80%;"></div>
<div class="radar-circle" style="width: 60%; height: 60%;"></div>
<div class="radar-circle" style="width: 40%; height: 40%;"></div>
<div class="radar-circle" style="width: 20%; height: 20%;"></div>
<div class="radar-line" style="transform: translate(-50%, -50%) rotate(0deg);"></div>
<div class="radar-line" style="transform: translate(-50%, -50%) rotate(90deg);"></div>
<div class="radar-line" style="transform: translate(-50%, -50%) rotate(45deg);"></div>
<div class="radar-line" style="transform: translate(-50%, -50%) rotate(135deg);"></div>
<div class="radar-scan"></div>
<!-- Objects will be added here by JavaScript -->
</div>
<div class="flex space-x-4 mb-6">
<button id="startBtn" class="px-6 py-2 bg-green-600 hover:bg-green-700 rounded-lg font-medium transition">
<i class="fas fa-play mr-2"></i> Start
</button>
<button id="stopBtn" class="px-6 py-2 bg-red-600 hover:bg-red-700 rounded-lg font-medium transition">
<i class="fas fa-stop mr-2"></i> Stop
</button>
</div>
</div>
<div class="bg-gray-800 rounded-xl p-6 shadow-lg">
<h2 class="text-xl font-semibold mb-4 text-cyan-300">
<i class="fas fa-info-circle mr-2"></i> Detection Information
</h2>
<div class="grid grid-cols-2 gap-4 mb-6">
<div class="bg-gray-700 p-4 rounded-lg">
<h3 class="text-sm font-medium text-gray-400">Objects Detected</h3>
<p id="objectCount" class="text-2xl font-bold text-green-400">0</p>
</div>
<div class="bg-gray-700 p-4 rounded-lg">
<h3 class="text-sm font-medium text-gray-400">Max Distance</h3>
<p class="text-2xl font-bold text-cyan-400">400 cm</p>
</div>
</div>
<div class="mb-6">
<h3 class="text-lg font-medium mb-2 text-gray-300">
<i class="fas fa-ruler mr-2"></i> Distance Indicators
</h3>
<div class="flex items-center justify-between mb-1">
<span class="text-xs">0 cm</span>
<span class="text-xs">100 cm</span>
<span class="text-xs">200 cm</span>
<span class="text-xs">300 cm</span>
<span class="text-xs">400 cm</span>
</div>
<div class="w-full bg-gray-700 h-4 rounded-full overflow-hidden">
<div id="distanceBar" class="h-full bg-gradient-to-r from-green-500 via-yellow-500 to-red-500" style="width: 0%"></div>
</div>
</div>
<div>
<h3 class="text-lg font-medium mb-2 text-gray-300">
<i class="fas fa-bell mr-2"></i> Detection Log
</h3>
<div id="detectionLog" class="bg-gray-700 p-3 rounded-lg h-40 overflow-y-auto text-sm">
<div class="text-gray-400 italic">No objects detected yet...</div>
</div>
</div>
</div>
</div>
<div class="mt-8 bg-gray-800 rounded-xl p-6">
<h2 class="text-xl font-semibold mb-4 text-cyan-300">
<i class="fas fa-cogs mr-2"></i> System Configuration
</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div>
<label class="block text-sm font-medium mb-1">Scan Speed</label>
<select class="w-full bg-gray-700 border border-gray-600 rounded-md px-3 py-2">
<option>Slow</option>
<option selected>Normal</option>
<option>Fast</option>
</select>
</div>
<div>
<label class="block text-sm font-medium mb-1">Sensitivity</label>
<input type="range" min="1" max="10" value="7" class="w-full">
</div>
<div>
<label class="block text-sm font-medium mb-1">Detection Range</label>
<div class="flex items-center space-x-2">
<input type="number" value="400" class="w-20 bg-gray-700 border border-gray-600 rounded-md px-3 py-2">
<span class="text-sm">cm</span>
</div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const radar = document.querySelector('.radar');
const startBtn = document.getElementById('startBtn');
const stopBtn = document.getElementById('stopBtn');
const objectCount = document.getElementById('objectCount');
const distanceBar = document.getElementById('distanceBar');
const detectionLog = document.getElementById('detectionLog');
let scanInterval;
let objectInterval;
let isScanning = false;
let objects = [];
// Create radar circles and lines
for (let i = 0; i < 4; i++) {
const angle = i * 22.5;
const line = document.createElement('div');
line.className = 'radar-line';
line.style.transform = `translate(-50%, -50%) rotate(${angle}deg)`;
radar.appendChild(line);
}
// Start scanning
startBtn.addEventListener('click', function() {
if (isScanning) return;
isScanning = true;
detectionLog.innerHTML = '';
updateLog('System started. Scanning for objects...', 'system');
// Simulate radar scanning
scanInterval = setInterval(() => {
// This is just for visualization - in a real system, this would come from sensor data
}, 100);
// Simulate object detection
objectInterval = setInterval(() => {
// Clear previous objects
document.querySelectorAll('.object').forEach(obj => obj.remove());
objects = [];
// Generate random objects (1-5 objects)
const numObjects = Math.floor(Math.random() * 5) + 1;
objectCount.textContent = numObjects;
for (let i = 0; i < numObjects; i++) {
const distance = Math.random() * 0.9 + 0.1; // 10%-100% of radar
const angle = Math.random() * 360;
const x = 50 + Math.cos(angle * Math.PI / 180) * distance * 50;
const y = 50 + Math.sin(angle * Math.PI / 180) * distance * 50;
const object = document.createElement('div');
object.className = 'object';
object.style.left = `${x}%`;
object.style.top = `${y}%`;
// Add distance indicator
const indicator = document.createElement('div');
indicator.className = 'distance-indicator absolute w-2 h-2 bg-green-500 rounded-full';
indicator.style.left = `${x}%`;
indicator.style.top = `${y}%`;
indicator.style.transform = 'translate(-50%, -50%)';
radar.appendChild(object);
objects.push({distance, angle});
// Update distance bar
const realDistance = Math.round(distance * 400);
distanceBar.style.width = `${distance * 100}%`;
// Add to log
updateLog(`Object detected at ${realDistance} cm, ${Math.round(angle)}°`, 'detection');
}
}, 2000);
});
// Stop scanning
stopBtn.addEventListener('click', function() {
if (!isScanning) return;
isScanning = false;
clearInterval(scanInterval);
clearInterval(objectInterval);
// Clear objects
document.querySelectorAll('.object').forEach(obj => obj.remove());
objectCount.textContent = '0';
distanceBar.style.width = '0%';
updateLog('System stopped.', 'system');
});
// Update detection log
function updateLog(message, type) {
const now = new Date();
const timeString = now.toLocaleTimeString();
const logEntry = document.createElement('div');
logEntry.className = `mb-1 ${type === 'system' ? 'text-cyan-400' : 'text-green-400'}`;
logEntry.innerHTML = `<span class="text-gray-500 text-xs">[${timeString}]</span> ${message}`;
detectionLog.prepend(logEntry);
// Limit log entries
if (detectionLog.children.length > 10) {
detectionLog.removeChild(detectionLog.lastChild);
}
}
// Simulate initial system status
setTimeout(() => {
updateLog('Ultrasonic radar system initialized.', 'system');
updateLog('Ready to start scanning.', 'system');
}, 500);
});
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Aragoorn/2-3" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>