============================================================ */ (function(){ 'use strict'; function init(){ var root = document.getElementById('zssb'); if(!root) return; /* ── State ──────────────────────────────────────── */ var s1Type = 'sleeper'; // 'sleeper' or 'offduty' var s2Type = 'sleeper'; /* ── Toggle button setup ────────────────────────── */ function setupToggle(slpId, offId, callback){ var slpBtn = document.getElementById(slpId); var offBtn = document.getElementById(offId); if(!slpBtn || !offBtn) return; slpBtn.addEventListener('click', function(){ slpBtn.classList.add('active'); offBtn.classList.remove('active'); callback('sleeper'); }); offBtn.addEventListener('click', function(){ offBtn.classList.add('active'); slpBtn.classList.remove('active'); callback('offduty'); }); } setupToggle('zssb-s1-sleeper', 'zssb-s1-offduty', function(t){ s1Type = t; }); setupToggle('zssb-s2-sleeper', 'zssb-s2-offduty', function(t){ s2Type = t; }); /* ── Format decimal hours → "Xh Ym" ─────────────── */ function fmtHrs(h){ if(isNaN(h) || h < 0) return '0h 0m'; var hh = Math.floor(h); var mm = Math.round((h - hh) * 60); if(mm === 60){ hh++; mm = 0; } if(hh === 0 && mm === 0) return '0h 0m'; if(hh === 0) return mm + 'm'; if(mm === 0) return hh + 'h'; return hh + 'h ' + mm + 'm'; } /* ── Add decimal hours to a time string ─────────── */ function addHrs(timeStr, hrs){ if(!timeStr || timeStr === '') return null; var parts = timeStr.split(':'); if(parts.length < 2) return null; var totalMins = parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10) + Math.round(hrs * 60); totalMins = ((totalMins % 1440) + 1440) % 1440; var h = Math.floor(totalMins / 60); var m = totalMins % 60; return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m; } /* ── Convert 24hr "HH:MM" → 12hr "H:MM AM/PM" ─── */ function to12hr(t24){ if(!t24) return null; var p = t24.split(':'); var h = parseInt(p[0], 10); var m = p[1]; var ampm = h >= 12 ? 'PM' : 'AM'; h = h % 12; if(h === 0) h = 12; return h + ':' + m + ' ' + ampm; } /* ── Warning helpers ─────────────────────────────── */ function showWarn(msg){ var w = document.getElementById('zssb-warn'); var wm = document.getElementById('zssb-wmsg'); if(w && wm){ wm.textContent = msg; w.classList.add('show'); } } function hideWarn(){ var w = document.getElementById('zssb-warn'); if(w) w.classList.remove('show'); } /* ── Status bar progress ─────────────────────────── */ function setStatus(step){ var pills = ['zssb-pill-1', 'zssb-pill-2', 'zssb-pill-3']; for(var i = 0; i < pills.length; i++){ var el = document.getElementById(pills[i]); if(el){ el.classList[i < step ? 'add' : 'remove']('active'); } } } /* ════════════════════════════════════════════════ MAIN CALCULATION — FMCSA 49 CFR §395.1(g) ════════════════════════════════════════════════ */ function calc(){ hideWarn(); setStatus(2); /* Read inputs */ var drivenBefore = parseFloat(document.getElementById('zssb-driven').value) || 0; var drivenBetween = parseFloat(document.getElementById('zssb-driven-between').value) || 0; var s1h = parseFloat(document.getElementById('zssb-s1-hrs').value) || 0; var s1m = parseFloat(document.getElementById('zssb-s1-min').value) || 0; var s2h = parseFloat(document.getElementById('zssb-s2-hrs').value) || 0; var s2m = parseFloat(document.getElementById('zssb-s2-min').value) || 0; var s1Start = document.getElementById('zssb-s1-start').value; var s2Start = document.getElementById('zssb-s2-start').value; /* Convert to decimal hours */ var split1 = s1h + (s1m / 60); var split2 = s2h + (s2m / 60); /* ── Validation ────────────────────────────────── */ if(split1 <= 0 && split2 <= 0){ showWarn('Please enter the duration for at least one split rest period.'); return; } if(split1 < 0 || split2 < 0){ showWarn('Rest period durations cannot be negative.'); return; } if(drivenBefore < 0 || drivenBetween < 0){ showWarn('Driving hours cannot be negative.'); return; } var totalDriven = drivenBefore + drivenBetween; if(totalDriven > 11){ showWarn('Total hours driven (' + totalDriven.toFixed(2) + ' hrs) exceeds the 11-hour driving limit.'); return; } /* ── FMCSA Split Sleeper Berth Logic ───────────── RULE 1: Combined rest >= 10 hours RULE 2: The longer period must be >= 7 hrs AND in sleeper berth RULE 3: The shorter period must be >= 2 hrs (sleeper or off-duty) ─────────────────────────────────────────────────── */ var totalRest = split1 + split2; var combinedOk = totalRest >= 10; var longSplit = Math.max(split1, split2); var shortSplit = Math.min(split1, split2); var longIsS1 = split1 >= split2; var longType = longIsS1 ? s1Type : s2Type; /* Long split: must be >= 7 hrs AND sleeper berth */ var longOk = (longSplit >= 7) && (longType === 'sleeper'); /* Short split: must be >= 2 hrs (any type) */ var shortOk = (shortSplit >= 2); /* Single-split detection (only one period entered) */ var oneSplit = (split1 > 0 && split2 === 0) || (split1 === 0 && split2 > 0); var isCompliant = false; var reason = ''; if(oneSplit){ isCompliant = false; reason = 'Only one split period entered. Please enter both Split 1 and Split 2 durations to check full FMCSA compliance.'; } else { var failReasons = []; if(!longOk){ if(longSplit < 7){ failReasons.push('Longer split (' + fmtHrs(longSplit) + ') is under the required 7-hour minimum.'); } else { failReasons.push('Longer split (' + fmtHrs(longSplit) + ') must be in the sleeper berth, not off-duty.'); } } if(!shortOk){ failReasons.push('Shorter split (' + fmtHrs(shortSplit) + ') is under the required 2-hour minimum.'); } if(!combinedOk){ failReasons.push('Combined rest (' + fmtHrs(totalRest) + ') is under the 10-hour minimum required.'); } isCompliant = longOk && shortOk && combinedOk; if(isCompliant){ reason = 'Both splits meet FMCSA requirements. Your 14-hour clock is paused during both rest periods and restarts at the end of Split 2.'; } else { reason = failReasons.join(' '); } } /* ── Remaining drive time ───────────────────────── */ var driveRemaining = Math.max(0, 11 - totalDriven); /* ── Timeline data (if start times provided) ──── */ var timelineData = null; if(s1Start && s1Start !== ''){ var s1End = addHrs(s1Start, split1); var midDrive = s2Start && s2Start !== '' ? s2Start : (s1End ? addHrs(s1End, drivenBetween) : null); var s2End = midDrive ? addHrs(midDrive, split2) : null; timelineData = { s1Start: to12hr(s1Start), s1End: to12hr(s1End), s2Start: s2Start && s2Start !== '' ? to12hr(s2Start) : (midDrive ? to12hr(midDrive) : null), s2End: to12hr(s2End), resumeTime: s2End ? to12hr(s2End) : null }; } /* ── Render results ──────────────────────────────── */ renderResults(isCompliant, reason, { split1: split1, split2: split2, totalRest: totalRest, longSplit: longSplit, shortSplit: shortSplit, longOk: longOk, shortOk: shortOk, combinedOk: combinedOk, longType: longType, drivenBefore: drivenBefore, drivenBetween: drivenBetween, totalDriven: totalDriven, driveRemaining:driveRemaining, s1Type: s1Type, s2Type: s2Type, oneSplit: oneSplit }, timelineData); setStatus(3); } /* ════════════════════════════════════════════════ RENDER RESULTS ════════════════════════════════════════════════ */ function renderResults(isCompliant, reason, d, tl){ /* Element refs */ var resEl = document.getElementById('zssb-res'); var banner = document.getElementById('zssb-banner'); var bannerStatus= document.getElementById('zssb-banner-status'); var bannerReason= document.getElementById('zssb-banner-reason'); var bannerSvg = document.getElementById('zssb-banner-svg'); var cardsEl = document.getElementById('zssb-cards'); var breakdownEl = document.getElementById('zssb-breakdown'); var timelineEl = document.getElementById('zssb-timeline'); var tlWrap = document.getElementById('zssb-timeline-wrap'); /* ── Compliance Banner ──────────────────────────── */ if(d.oneSplit){ banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = 'Incomplete — Enter Both Splits'; bannerSvg.innerHTML = ''; } else if(isCompliant){ banner.className = 'compliance-banner compliant'; bannerStatus.textContent = '✅ FMCSA Compliant — Valid Split'; bannerSvg.innerHTML = ''; } else { banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = '❌ Non-Compliant — Invalid Split'; bannerSvg.innerHTML = ''; } bannerReason.textContent = reason; /* ── Summary Cards ──────────────────────────────── */ var cards = []; if(!d.oneSplit){ cards.push({ v: fmtHrs(d.split1), u: d.s1Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 1 Duration', cls: d.s1Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.split2), u: d.s2Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 2 Duration', cls: d.s2Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.totalRest), u: 'TOTAL REST', n: 'Combined Off-Duty', cls: d.combinedOk ? 'green' : 'red' }); cards.push({ v: fmtHrs(d.driveRemaining), u: 'REMAINING', n: 'Drive Time Left', cls: d.driveRemaining > 4 ? 'green' : (d.driveRemaining > 2 ? 'orange' : 'red') }); } cardsEl.innerHTML = cards.map(function(c){ return '
' + '
' + c.v + '
' + '
' + c.u + '
' + '
' + c.n + '
' + '
'; }).join(''); /* ── Breakdown Table ────────────────────────────── */ var rows = []; if(!d.oneSplit){ rows.push({lbl: 'Split 1 (' + (d.s1Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split1), cls: ''}); rows.push({lbl: 'Split 2 (' + (d.s2Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split2), cls: ''}); rows.push({lbl: 'Combined Rest Total', val: fmtHrs(d.totalRest) + (d.totalRest >= 10 ? ' ✓' : ' ✗ (Need ≥10h)'), cls: d.combinedOk ? 'ok' : 'fail'}); rows.push({lbl: 'Longer Split ≥7 hrs in Sleeper Berth', val: d.longOk ? '✓ Pass' : '✗ Fail', cls: d.longOk ? 'ok' : 'fail'}); rows.push({lbl: 'Shorter Split ≥2 hrs (any type)', val: d.shortOk ? '✓ Pass' : '✗ Fail', cls: d.shortOk ? 'ok' : 'fail'}); rows.push({lbl: 'Hours Driven Before Split 1', val: fmtHrs(d.drivenBefore), cls: 'info'}); rows.push({lbl: 'Hours Driven Between Splits', val: fmtHrs(d.drivenBetween), cls: 'info'}); rows.push({lbl: 'Total Hours Driven', val: fmtHrs(d.totalDriven) + ' / 11 hrs max', cls: d.totalDriven < 11 ? 'ok' : 'fail'}); rows.push({lbl: 'Drive Time Remaining After Splits', val: fmtHrs(d.driveRemaining), cls: d.driveRemaining > 0 ? 'ok' : 'fail'}); rows.push({lbl: '14-Hour Clock Paused During Splits', val: isCompliant ? 'Yes — Both periods excluded' : 'Not applicable (fix issues above)', cls: isCompliant ? 'ok' : 'fail'}); } breakdownEl.innerHTML = rows.map(function(r){ return '
' + '' + r.lbl + '' + '' + r.val + '' + '
'; }).join(''); /* ── Timeline ───────────────────────────────────── */ if(!d.oneSplit){ tlWrap.style.display = 'block'; var items = []; items.push({ dot: 'drive', label: 'Started Driving', desc: 'Drove ' + fmtHrs(d.drivenBefore) + ' before first rest period.' }); items.push({ dot: 'sleep', label: 'Split 1 Begins' + (tl && tl.s1Start ? ' at ' + tl.s1Start : ''), desc: fmtHrs(d.split1) + ' ' + (d.s1Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s1End ? ' → Ends: ' + tl.s1End : '') }); if(d.drivenBetween > 0){ items.push({ dot: 'drive', label: 'Resumed Driving Between Splits', desc: 'Drove ' + fmtHrs(d.drivenBetween) + ' between the two rest periods.' }); } items.push({ dot: 'sleep', label: 'Split 2 Begins' + (tl && tl.s2Start ? ' at ' + tl.s2Start : ''), desc: fmtHrs(d.split2) + ' ' + (d.s2Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s2End ? ' → Ends: ' + tl.s2End : '') }); if(isCompliant){ items.push({ dot: 'done', label: '14-Hour Clock Restarts' + (tl && tl.resumeTime ? ' at ' + tl.resumeTime : ''), desc: 'Both splits complete. ' + fmtHrs(d.driveRemaining) + ' drive time remaining.' }); } else { items.push({ dot: 'off', label: 'Non-Compliant — Cannot Resume', desc: 'Fix the split issues above before resuming driving.' }); } timelineEl.innerHTML = items.map(function(it){ return '
' + '
' + '
' + '
' + it.label + '
' + '
' + it.desc + '
' + '
'; }).join(''); } else { tlWrap.style.display = 'none'; } /* ── Show results panel ─────────────────────────── */ resEl.classList.add('show'); setTimeout(function(){ resEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }, 100); } /* ════════════════════════════════════════════════ RESET ════════════════════════════════════════════════ */ function resetAll(){ /* Clear number inputs */ var numIds = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numIds.forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Clear time inputs */ ['zssb-s1-start', 'zssb-s2-start'].forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Reset toggle states */ s1Type = 'sleeper'; s2Type = 'sleeper'; ['zssb-s1-sleeper', 'zssb-s2-sleeper'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.add('active'); }); ['zssb-s1-offduty', 'zssb-s2-offduty'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.remove('active'); }); /* Hide warning and results */ hideWarn(); var resEl = document.getElementById('zssb-res'); if(resEl) resEl.classList.remove('show'); setStatus(1); } /* ── Event Listeners ──────────────────────────────── */ var calcBtn = document.getElementById('zssb-btn'); if(calcBtn) calcBtn.addEventListener('click', calc); var rstBtn = document.getElementById('zssb-reset'); if(rstBtn) rstBtn.addEventListener('click', resetAll); /* Enter key triggers calculation */ var numFields = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numFields.forEach(function(id){ var el = document.getElementById(id); if(el) el.addEventListener('keydown', function(e){ if(e.key === 'Enter') calc(); }); }); } /* end init() */ /* ── Safe DOM-ready execution ───────────────────────── */ if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); } else { init(); } })();
Ideal Gas Law Calculator
Solve PV = nRT instantly for Pressure, Volume, Moles, or Temperature.
Solve For
Known Values
Pressure (P)
Volume (V)
Moles (n)
Temperature (T)
!
Please enter valid values for all three known fields.
Result
References & Notes
  • Formula: PV = nRT — rearranged automatically for whichever variable you select.
  • Gas constant used: R = 0.0821 L·atm/(mol·K)
  • Temperature is always converted internally to Kelvin before calculating.
  • Assumes ideal gas behavior — accuracy decreases at very high pressure or very low temperature.
  • For real-gas precision, consult the Van der Waals equation or a licensed engineer.

Ideal Gas Law Calculator: Find Pressure, Volume, Moles & Temperature Instantly

Trying to solve a PV=nRT problem without doing the algebra by hand? The Zo Calculator ideal gas law calculator instantly solves for pressure, volume, moles, or temperature the moment you enter the other three values. It’s built for students, chemistry teachers, and engineers who need quick, accurate answers without reaching for a calculator app or textbook.


What This Calculator Tells You

This tool is a complete calculator for ideal gas law problems, and it returns:

  • Pressure (P) — in atm, kPa, or Pascals, depending on your input units
  • Volume (V) — in liters or cubic meters
  • Number of Moles (n) — the amount of gas present
  • Temperature (T) — in Kelvin, with automatic conversion from Celsius or Fahrenheit
  • A clean breakdown of which variable you solved for and the formula path used
  • Unit-consistent results, so you never mix atm with kPa by mistake

How the Calculator Works (The Formula & Logic)

At its core, this gas law calculator uses one classic equation from physical chemistry:

PV = nRT

Where:

  • P = Pressure of the gas
  • V = Volume the gas occupies
  • n = Number of moles of gas
  • R = Universal gas constant (0.0821 L·atm/mol·K, or 8.314 J/mol·K depending on units)
  • T = Temperature in Kelvin

To solve for any single unknown, the calculator simply rearranges the equation. For example, solving for volume looks like this:

Volume = (n × R × T) ÷ P

If you’re working with a fixed amount of gas changing pressure, volume, and temperature together (no moles involved), the tool can also switch to combined gas law calculator mode, which uses:

(P₁ × V₁) ÷ T₁ = (P₂ × V₂) ÷ T₂

This second formula is especially useful when you’re comparing a gas’s initial state to its final state, like when a balloon is heated or compressed.


Standard Ratings & Classifications (Comparison Chart)

While the ideal gas law doesn’t have “good vs. bad” categories like a BMI calculator, it’s helpful to know when the model applies well versus when it starts to break down:

ConditionGas BehaviorIdeal Gas Law Accuracy
Low pressure, high temperatureMolecules spread out, minimal interactionExcellent (near-perfect fit)
Standard conditions (1 atm, 273K)Typical lab/classroom conditionsVery good
High pressureMolecules forced close togetherLess accurate (use Van der Waals)
Very low temperature (near boiling point)Gas starts behaving like a liquidPoor (ideal model breaks down)
Noble/inert gases (He, Ne, Ar)Minimal intermolecular forcesExcellent fit
Polar gases (H₂O vapor, NH₃)Stronger molecular attractionModerate accuracy

Step-by-Step Practical Example

Let’s solve a real problem using a freon-12 ideal gas law calculation example, since this is a common scenario in HVAC and refrigeration coursework.

Problem: You have 2 moles of Freon-12 gas in a sealed container at a temperature of 300 K. The container has a volume of 10 liters. What is the pressure?

Step 1 — Identify your knowns:

  • n = 2 moles
  • T = 300 K
  • V = 10 L
  • R = 0.0821 L·atm/mol·K

Step 2 — Plug into the rearranged formula:

P = (n × R × T) ÷ V
P = (2 × 0.0821 × 300) ÷ 10

Step 3 — Calculate:

P = 49.26 ÷ 10 = 4.926 atm

So the pressure inside the container is approximately 4.93 atm. This same three-step process applies to any freon-12 ideal gas law calculation example with solution — just identify your three knowns, rearrange the formula, and solve for the missing variable.


How to Use Zo Calculator’s Ideal Gas Law Calculator Tool

  1. Select the variable you want to solve for — pressure, volume, moles, or temperature.
  2. Enter your known values into the remaining three fields (the calculator will gray out the one you’re solving for).
  3. Choose your units — atm, kPa, or Pa for pressure; L or m³ for volume; K, °C, or °F for temperature.
  4. Click Calculate to instantly see your result on ZoCalculator.com.
  5. Review the formula breakdown shown below the result so you understand exactly how the answer was derived — useful for homework or exam prep.

Practical Applications and Real-World Uses

  • Chemistry & physics students solving homework problems or studying for exams involving gas behavior
  • HVAC and refrigeration technicians calculating pressure changes in refrigerant gases like Freon
  • Engineers designing pressure vessels, pipelines, or compressed gas storage systems
  • Lab researchers verifying experimental gas measurements against theoretical predictions
  • Scuba diving instructors explaining how tank pressure and volume change with depth and temperature
  • Teachers generating quick example problems and answer keys for classroom use

Important Notes & Technical Limitations

  • This calculator assumes the gas behaves ideally — meaning negligible molecular volume and no intermolecular attraction. Real gases deviate from this at high pressure or low temperature.
  • All temperature values are internally converted to Kelvin, since this is the unit of temperature used in gas law calculations to keep the math accurate — using Celsius or Fahrenheit directly in the formula will produce wrong results.
  • The tool is intended for educational and planning purposes and shouldn’t replace certified engineering calculations for safety-critical systems.
  • Results assume a closed system with no gas leaking in or out during the process.

Helpful References & Sources

  • Wikipedia.org — general overview of the Ideal Gas Law and its derivation
  • NIST.gov — National Institute of Standards and Technology reference data on gas constants and thermodynamic properties
  • Khan Academy (khanacademy.org) — free educational walkthroughs of gas law problems

🙋 Frequently Asked Questions (FAQs)

What is the ideal gas law formula?

The ideal gas law formula is PV = nRT, where P is pressure, V is volume, n is moles, R is the gas constant, and T is temperature in Kelvin. It describes how these four properties relate to each other for an idealized gas.

What unit of temperature is used in gas law calculations?

Kelvin is the unit of temperature used in gas law calculations because it starts at absolute zero, avoiding negative values that would break the math. Celsius or Fahrenheit must always be converted to Kelvin before plugging into PV=nRT.

What’s the difference between the ideal gas law and the combined gas law?

The ideal gas law (PV=nRT) requires knowing the number of moles and works for any single state of a gas. The combined gas law compares two different states of the same fixed amount of gas without needing to know the moles at all.

Is the perfect gas law the same as the ideal gas law?

Yes, the perfect gas law calculator and ideal gas law calculator refer to the exact same equation, PV=nRT. “Perfect gas” and “ideal gas” are interchangeable terms used in physics and chemistry textbooks.

What value of R should I use in the gas constant?

Use R = 0.0821 L·atm/(mol·K) when working in atmospheres and liters, or R = 8.314 J/(mol·K) when working in Pascals and cubic meters. Always match R’s units to your other variables’ units.

Can this calculator solve for moles or temperature too?

Yes, this calculator can rearrange PV=nRT to solve for any one of the four variables — pressure, volume, moles, or temperature — as long as you provide the other three. Just select which value you need and fill in the rest.

Why does my answer look different from my textbook?

This usually happens due to mismatched units, especially temperature not being converted to Kelvin first. Double-check that pressure, volume, and the gas constant R all use consistent unit systems.

Does the ideal gas law work for all gases?

It works very well for gases at low pressure and high temperature, like helium or nitrogen under normal conditions. It becomes less accurate for gases under high pressure or near their condensation point, where real gas behavior takes over.

What is a real-world example of using the ideal gas law?

A common example is calculating refrigerant pressure in an air conditioning system, like a freon-12 ideal gas law calculation, to ensure the system operates safely. Engineers also use it to size compressed air tanks and predict weather balloon expansion at altitude.

Is there a difference between “ideal gas laws calculator” and “ideal gas law calculator”?

No, these are simply singular and plural phrasings of the same search intent. Both refer to a tool that solves the PV=nRT equation for pressure, volume, moles, or temperature.


Explore Related Calculators on Zo Calculator