Calculated using the Karvonen Formula for higher accuracy.
Zone
Intensity
BPM Range
BPM Tap Tool
Don't have a heart rate monitor? Click the button in time with your pulse to find your current BPM.
0 BPM
How the Heart Rate Calculator Works
The Heart Rate Calculator Click tool uses two primary methods to help you optimize your fitness training. First, it calculates your Maximum Heart Rate (MHR) using the standard formula (220 – Age). Then, it applies the Karvonen Formula, which incorporates your Resting Heart Rate (RHR) to provide more personalized Heart Rate Reserve (HRR) zones.
Understanding Your Training Zones
Zone 1 (50-60%): Recovery & Warm-up. Ideal for active recovery and beginners. Improves overall health but is low intensity.
Zone 2 (60-70%): Fat Burn & Endurance. This "aerobic" zone is where the body becomes efficient at burning fat as fuel. Great for long-duration exercise.
Zone 3 (70-80%): Aerobic Capacity. Improves cardiovascular strength. You will breathe harder and find it difficult to hold a conversation.
Zone 4 (80-90%): Anaerobic Threshold. Increases your "redline." This intensity improves speed and high-intensity endurance.
Zone 5 (90-100%): Maximum Effort. Reserved for short sprints and interval training. This zone pushes your VO2 Max limits.
How to Use the Tap BPM Tool
If you are currently exercising and want to check your pulse without a digital tracker, find your pulse on your wrist (radial) or neck (carotid). Every time you feel a heartbeat, click or tap the "TAP FOR PULSE" button. Our algorithm calculates the average time between your last few clicks to provide a highly accurate "Click Heart Rate" measurement in real-time.
Medical Disclaimer: This calculator is for informational purposes only and does not replace professional medical advice. Always consult with a doctor before starting a new high-intensity exercise program.
var tapTimes = [];
function calculateHRZones() {
var age = parseFloat(document.getElementById('hrAge').value);
var rhr = parseFloat(document.getElementById('restingHR').value);
if (isNaN(age) || age 110) {
alert("Please enter a valid age.");
return;
}
if (isNaN(rhr) || rhr 200) {
rhr = 0; // Default if not provided, will use simple MHR method
}
var mhr = 220 – age;
var hrr = mhr – rhr;
document.getElementById('maxHRDisplay').innerText = mhr;
var tbody = document.getElementById('zonesTableBody');
tbody.innerHTML = ";
var zones = [
{ name: 'Zone 1: Warm Up', intensity: '50-60%', low: 0.50, high: 0.60, color: '#e0e0e0' },
{ name: 'Zone 2: Fat Burn', intensity: '60-70%', low: 0.60, high: 0.70, color: '#c8e6c9' },
{ name: 'Zone 3: Aerobic', intensity: '70-80%', low: 0.70, high: 0.80, color: '#fff9c4' },
{ name: 'Zone 4: Anaerobic', intensity: '80-90%', low: 0.80, high: 0.90, color: '#ffe0b2' },
{ name: 'Zone 5: Red Line', intensity: '90-100%', low: 0.90, high: 1.00, color: '#ffcdd2' }
];
for (var i = 0; i 0) {
// Karvonen Formula
lowBPM = Math.round((hrr * z.low) + rhr);
highBPM = Math.round((hrr * z.high) + rhr);
} else {
// Standard Formula
lowBPM = Math.round(mhr * z.low);
highBPM = Math.round(mhr * z.high);
}
var row = document.createElement('tr');
row.style.borderBottom = "1px solid #eee";
row.style.backgroundColor = z.color;
row.innerHTML = '
' + z.name + '
' +
'
' + z.intensity + '
' +
'
' + lowBPM + ' – ' + highBPM + ' BPM
';
tbody.appendChild(row);
}
document.getElementById('hrResults').style.display = 'block';
}
function tapHeartRate() {
var now = Date.now();
tapTimes.push(now);
if (tapTimes.length > 1) {
// Keep only last 10 taps for rolling average
if (tapTimes.length > 10) {
tapTimes.shift();
}
var totalInterval = 0;
for (var i = 1; i < tapTimes.length; i++) {
totalInterval += (tapTimes[i] – tapTimes[i-1]);
}
var avgInterval = totalInterval / (tapTimes.length – 1);
var bpm = Math.round(60000 / avgInterval);
document.getElementById('tapBPM').innerText = bpm;
// Visual feedback
var btn = document.getElementById('tapBtn');
btn.style.backgroundColor = '#d32f2f';
btn.style.color = '#fff';
setTimeout(function() {
btn.style.backgroundColor = '#fff';
btn.style.color = '#d32f2f';
}, 100);
} else {
document.getElementById('tapBPM').innerText = "…";
}
}
function resetTap() {
tapTimes = [];
document.getElementById('tapBPM').innerText = "0";
}