// manual slider override (user intervention) function handleManualFanChange(value) let percent = parseInt(value, 10); setFanSpeed(percent); // deactivate auto-mode? but we keep mode, but user overrides -> we temporarily log addLogEntry(`✋ manual register override · fan set to $percent% ($currentRPM RPM)`); // after manual, we don't change mode highlight, but we can still auto adjust later? // we will keep but next thermal cycle may adjust again if mode active - we keep consistent. // BUT to respect user, we will NOT override immediately. next control cycle will re-apply mode curve. // That's okay: shows dynamic interaction.
/* REGISTER / LOG */ .register-log background: #03061760; border-radius: 28px; padding: 14px 20px; margin-top: 20px; font-family: monospace; font-size: 0.75rem; color: #88aadd; border-left: 4px solid #2dd4bf;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> <title>CPU Cooling Master Register | Thermal Monitor & Fan Control</title> <style> * box-sizing: border-box; user-select: none; body background: linear-gradient(145deg, #0a0f1e 0%, #0c1222 100%); font-family: 'Segoe UI', 'Poppins', 'Inter', system-ui, -apple-system, 'Roboto', sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; padding: 20px; cpu cooling master register code free
// auto-adjust fan based on active mode (dynamic control) function applySmartFanControl() let targetPercent = currentFanPercent; if (activeMode === "silent") // silent: keep low, but still respond above 70C if (currentTemp < 62) targetPercent = 28; else if (currentTemp < 78) targetPercent = 42 + (currentTemp-62)*1.2; else targetPercent = 68; targetPercent = Math.min(75, targetPercent); else if (activeMode === "balanced") if (currentTemp < 55) targetPercent = 38; else if (currentTemp < 75) targetPercent = 45 + (currentTemp-55)*1.5; else targetPercent = 82; targetPercent = Math.min(92, targetPercent); else if (activeMode === "performance") if (currentTemp < 58) targetPercent = 55; else if (currentTemp < 80) targetPercent = 65 + (currentTemp-58)*1.2; else targetPercent = 94; targetPercent = Math.min(99, targetPercent); else if (activeMode === "full") targetPercent = 100; targetPercent = Math.min(100, Math.max(0, Math.floor(targetPercent))); if (Math.abs(targetPercent - currentFanPercent) > 2) setFanSpeed(targetPercent); // register cooling adjustment event (important for master log) addLogEntry(`🌀 fan profile [$activeMode.toUpperCase()] → $targetPercent% PWM · $currentRPM RPM`); else // just sync slider just in case if(fanSlider.value != currentFanPercent) fanSlider.value = currentFanPercent;
<!-- TEMP & LOAD METRICS --> <div class="sensor-grid"> <div class="metric-card"> <div class="metric-label">🌡️ CPU TEMP</div> <div class="metric-value" id="cpuTempValue">45<span>°C</span></div> </div> <div class="metric-card"> <div class="metric-label">⚡ THERMAL LOAD</div> <div class="metric-value" id="thermalLoadValue">32<span>%</span></div> </div> </div> // BUT to respect user, we will NOT override immediately
.log-entry border-bottom: 1px solid #2dd4bf20; padding: 4px 0; font-size: 0.7rem;
// mode selection handler function setActiveMode(mode) activeMode = mode; modeBtns.forEach(btn => if (btn.getAttribute('data-mode') === mode) btn.classList.add('active'); else btn.classList.remove('active'); ); addLogEntry(`🎛️ cooling profile changed → $mode.toUpperCase() mode`); // immediately apply new fan target based on current temp applySmartFanControl(); /* REGISTER / LOG */
.reset-btn background: #1e2a46; padding: 5px 12px; border-radius: 40px; font-size: 0.7rem; color: #b9e2ff; cursor: pointer;
.metric-value font-size: 3rem; font-weight: 800; font-family: 'JetBrains Mono', monospace; display: inline-flex; align-items: baseline; gap: 4px; color: #f0f9ff;
input[type="range"] width: 100%; height: 6px; -webkit-appearance: none; background: linear-gradient(90deg, #0b3b3f, #2dd4bf); border-radius: 10px; outline: none; margin: 14px 0;