{"id":2654,"date":"2026-03-03T23:29:34","date_gmt":"2026-03-03T21:29:34","guid":{"rendered":"https:\/\/nature-o.net\/?page_id=2654"},"modified":"2026-03-06T19:39:28","modified_gmt":"2026-03-06T17:39:28","slug":"indoor-co%e2%82%82-ventilation-calculator","status":"publish","type":"page","link":"https:\/\/nature-o.net\/?page_id=2654","title":{"rendered":"Indoor CO\u2082 Ventilation Calculator"},"content":{"rendered":"\n<div class=\"eco-tool wp-block-group\" id=\"eco-tool-co2vent-1a9f4\">\n  <div class=\"eco-tool__header\">\n    <h2 class=\"eco-tool__title\">Indoor CO\u2082 Ventilation Calculator<\/h2>\n    <p class=\"eco-tool__lead\">\n      Estimate the ventilation needed to maintain a target indoor CO\u2082 level (simplified steady-state model).\n    <\/p>\n  <\/div>\n\n  <form class=\"eco-tool__form\" id=\"eco-co2-form-1a9f4\" novalidate>\n    <div class=\"eco-tool__grid3\">\n\n      <div class=\"eco-tool__field\">\n        <label class=\"eco-tool__label\" for=\"eco-co2-people-1a9f4\">People in the room<\/label>\n        <input class=\"eco-tool__input\" id=\"eco-co2-people-1a9f4\" type=\"number\" min=\"1\" step=\"1\" value=\"2\" inputmode=\"numeric\" \/>\n        <div class=\"eco-tool__hint\">How many people are in the room most of the time.<\/div>\n      <\/div>\n\n      <div class=\"eco-tool__field\">\n        <label class=\"eco-tool__label\" for=\"eco-co2-activity-1a9f4\">Activity level<\/label>\n        <select class=\"eco-tool__input\" id=\"eco-co2-activity-1a9f4\">\n          <option value=\"low\" selected>Seated \/ light activity<\/option>\n          <option value=\"medium\">Standing \/ light work<\/option>\n          <option value=\"high\">Exercise \/ active<\/option>\n        <\/select>\n        <div class=\"eco-tool__hint\">Higher activity \u2192 more CO\u2082 generated.<\/div>\n      <\/div>\n\n      <div class=\"eco-tool__field\">\n        <label class=\"eco-tool__label\" for=\"eco-co2-room-1a9f4\">Room volume (m\u00b3)<\/label>\n        <input class=\"eco-tool__input\" id=\"eco-co2-room-1a9f4\" type=\"number\" min=\"5\" step=\"0.1\" value=\"50\" inputmode=\"decimal\" \/>\n        <div class=\"eco-tool__hint\">Example: 20 m\u00b2 \u00d7 2.5 m = 50 m\u00b3.<\/div>\n      <\/div>\n\n      <div class=\"eco-tool__field\">\n        <label class=\"eco-tool__label\" for=\"eco-co2-outdoor-1a9f4\">Outdoor CO\u2082 (ppm)<\/label>\n        <input class=\"eco-tool__input\" id=\"eco-co2-outdoor-1a9f4\" type=\"number\" min=\"350\" step=\"1\" value=\"420\" inputmode=\"numeric\" \/>\n        <div class=\"eco-tool__hint\">Typical outdoor CO\u2082 is ~400\u2013450 ppm.<\/div>\n      <\/div>\n\n      <div class=\"eco-tool__field\">\n        <label class=\"eco-tool__label\" for=\"eco-co2-target-1a9f4\">Target indoor CO\u2082 (ppm)<\/label>\n        <select class=\"eco-tool__input\" id=\"eco-co2-target-1a9f4\">\n          <option value=\"800\" selected>800 (very good)<\/option>\n          <option value=\"1000\">1000 (good)<\/option>\n          <option value=\"1200\">1200 (ok)<\/option>\n          <option value=\"1500\">1500 (poor)<\/option>\n        <\/select>\n        <div class=\"eco-tool__hint\">Lower target requires more ventilation.<\/div>\n      <\/div>\n\n      <div class=\"eco-tool__field\">\n        <label class=\"eco-tool__label\" for=\"eco-co2-round-1a9f4\">Precision<\/label>\n        <select class=\"eco-tool__input\" id=\"eco-co2-round-1a9f4\">\n          <option value=\"0\" selected>Whole numbers<\/option>\n          <option value=\"1\">1 decimal<\/option>\n        <\/select>\n        <div class=\"eco-tool__hint\">Rounding for display.<\/div>\n      <\/div>\n\n    <\/div>\n\n    <div class=\"eco-tool__actions\">\n      <button type=\"button\" class=\"wp-element-button eco-tool__btn\" id=\"eco-co2-calc-1a9f4\">Calculate<\/button>\n      <button type=\"button\" class=\"wp-element-button eco-tool__btn eco-tool__btn--ghost\" id=\"eco-co2-reset-1a9f4\">Reset<\/button>\n      <div class=\"eco-tool__error\" id=\"eco-co2-error-1a9f4\" aria-live=\"polite\"><\/div>\n    <\/div>\n  <\/form>\n\n  <div class=\"eco-tool__result\" id=\"eco-co2-result-1a9f4\" hidden>\n    <h3 class=\"eco-tool__subtitle\">Result<\/h3>\n\n    <div class=\"eco-tool__cards\">\n      <div class=\"eco-tool__card\">\n        <div class=\"eco-tool__metric-label\">Required fresh air<\/div>\n        <div class=\"eco-tool__metric-value\" id=\"eco-co2-flow-1a9f4\">\u2014<\/div>\n        <div class=\"eco-tool__metric-sub\" id=\"eco-co2-flow-sub-1a9f4\"><\/div>\n      <\/div>\n\n      <div class=\"eco-tool__card\">\n        <div class=\"eco-tool__metric-label\">Estimated ACH<\/div>\n        <div class=\"eco-tool__metric-value\" id=\"eco-co2-ach-1a9f4\">\u2014<\/div>\n        <div class=\"eco-tool__metric-sub\" id=\"eco-co2-ach-sub-1a9f4\"><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"eco-tool__card eco-tool__card--wide\">\n      <div class=\"eco-tool__metric-label\">Notes<\/div>\n      <div class=\"eco-tool__metric-sub\" id=\"eco-co2-note-1a9f4\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n.eco-tool{border:1px solid rgba(0,0,0,.12);border-radius:12px;padding:16px}\n.eco-tool__header{margin-bottom:12px}\n.eco-tool__title{margin:0 0 8px}\n.eco-tool__lead{margin:0;opacity:.9}\n.eco-tool__form{margin-top:12px}\n.eco-tool__grid3{display:grid;grid-template-columns:1fr;gap:16px}\n@media(min-width:860px){.eco-tool__grid3{grid-template-columns:1fr 1fr 1fr}}\n.eco-tool__field{display:flex;flex-direction:column;gap:6px}\n.eco-tool__label{font-weight:600}\n.eco-tool__input{width:100%;height:44px;padding:0 12px;border:1px solid rgba(0,0,0,.2);border-radius:10px;background:#fff;box-sizing:border-box;font:inherit}\n.eco-tool select.eco-tool__input{appearance:none;-webkit-appearance:none;line-height:44px;padding-right:40px;background-image:linear-gradient(45deg, transparent 50%, rgba(0,0,0,.60) 50%),linear-gradient(135deg, rgba(0,0,0,.60) 50%, transparent 50%);background-position:calc(100% - 18px) 50%,calc(100% - 12px) 50%;background-size:6px 6px;background-repeat:no-repeat}\n.eco-tool__hint{font-size:.92em;opacity:.78;min-height:38px}\n.eco-tool__actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:16px}\n.eco-tool__btn{padding:10px 22px}\n.eco-tool__btn--ghost{background:transparent!important;border:1px solid rgba(0,0,0,.2)!important}\n.eco-tool__btn--ghost:hover,.eco-tool__btn--ghost:focus{background:rgba(0,0,0,.06)!important;border-color:rgba(0,0,0,.35)!important}\n.eco-tool__error{min-height:1.2em;font-weight:600;flex:1 1 240px}\n.eco-tool__result{margin-top:16px}\n.eco-tool__subtitle{margin:0 0 10px}\n.eco-tool__cards{display:grid;gap:10px;margin-top:16px;grid-template-columns:1fr}\n@media(min-width:860px){.eco-tool__cards{grid-template-columns:1fr 1fr}}\n.eco-tool__card{border:1px solid rgba(0,0,0,.12);border-radius:12px;padding:12px}\n.eco-tool__card--wide{margin-top:10px}\n.eco-tool__metric-label{opacity:.85;font-weight:600}\n.eco-tool__metric-value{font-size:1.6em;font-weight:800;margin-top:6px;line-height:1.1}\n.eco-tool__metric-sub{opacity:.85;margin-top:6px}\n<\/style>\n\n<script>\n(function(){\n  const S=\"1a9f4\";\n  const el=id=>document.getElementById(id+\"-\"+S);\n\n  const peopleEl = el(\"eco-co2-people\");\n  const activityEl = el(\"eco-co2-activity\");\n  const roomEl = el(\"eco-co2-room\");\n  const outdoorEl = el(\"eco-co2-outdoor\");\n  const targetEl = el(\"eco-co2-target\");\n  const roundEl = el(\"eco-co2-round\");\n\n  const calcBtn = el(\"eco-co2-calc\");\n  const resetBtn = el(\"eco-co2-reset\");\n  const errEl = el(\"eco-co2-error\");\n\n  const resEl = el(\"eco-co2-result\");\n  const flowEl = el(\"eco-co2-flow\");\n  const flowSubEl = el(\"eco-co2-flow-sub\");\n  const achEl = el(\"eco-co2-ach\");\n  const achSubEl = el(\"eco-co2-ach-sub\");\n  const noteEl = el(\"eco-co2-note\");\n\n  function setError(m){ errEl.textContent = m || \"\"; }\n  function r(x,d){\n    if(d===0) return Math.round(x);\n    const p=Math.pow(10,d);\n    return Math.round(x*p)\/p;\n  }\n\n  \/\/ Approx CO2 generation per person (liters of CO2 per minute), simplified:\n  \/\/ seated ~0.30 L\/min, light work ~0.45 L\/min, active ~0.90 L\/min\n  function genRateLpm(level){\n    if(level===\"medium\") return 0.45;\n    if(level===\"high\") return 0.90;\n    return 0.30;\n  }\n\n  calcBtn.addEventListener(\"click\", function(){\n    setError(\"\");\n\n    const people = Number(peopleEl.value);\n    const V = Number(roomEl.value);            \/\/ m3\n    const Cout = Number(outdoorEl.value);      \/\/ ppm\n    const Ctarget = Number(targetEl.value);    \/\/ ppm\n    const d = Number(roundEl.value);\n\n    if(!Number.isFinite(people) || people < 1){\n      setError(\"Please enter a valid number of people (\u2265 1).\");\n      resEl.hidden = true; return;\n    }\n    if(!Number.isFinite(V) || V <= 0){\n      setError(\"Please enter a valid room volume (> 0).\");\n      resEl.hidden = true; return;\n    }\n    if(!Number.isFinite(Cout) || Cout < 300 || Cout > 1000){\n      setError(\"Please enter a realistic outdoor CO\u2082 value (300\u20131000 ppm).\");\n      resEl.hidden = true; return;\n    }\n    if(!Number.isFinite(Ctarget) || Ctarget <= Cout){\n      setError(\"Target indoor CO\u2082 must be higher than outdoor CO\u2082.\");\n      resEl.hidden = true; return;\n    }\n\n    \/\/ Steady-state box model:\n    \/\/ Required fresh air flow Q \u2248 G \/ (C_in - C_out)\n    \/\/ Where:\n    \/\/ G = CO2 generation (m3\/s of CO2)\n    \/\/ C terms as fractions (ppm -> 1e-6)\n    const G_Lpm_total = genRateLpm(activityEl.value) * people; \/\/ L\/min\n    const G_m3s = (G_Lpm_total \/ 1000) \/ 60; \/\/ L\/min -> m3\/min -> m3\/s\n\n    const delta = (Ctarget - Cout) * 1e-6; \/\/ fraction\n    const Q_m3s = G_m3s \/ delta;           \/\/ m3\/s fresh air\n\n    \/\/ Outputs:\n    const Q_Ls = Q_m3s * 1000;             \/\/ L\/s\n    const Q_m3h = Q_m3s * 3600;            \/\/ m3\/h\n    const ach = Q_m3h \/ V;                 \/\/ 1\/h\n\n    flowEl.textContent = `${r(Q_Ls,d).toLocaleString()} L\/s (${r(Q_m3h,d).toLocaleString()} m\u00b3\/h)`;\n    flowSubEl.textContent = `People: ${people.toLocaleString()} \u2022 Target: ${Ctarget.toLocaleString()} ppm \u2022 Outdoor: ${Cout.toLocaleString()} ppm`;\n\n    achEl.textContent = `${r(ach,d).toLocaleString()} ACH`;\n    achSubEl.textContent = `Room volume: ${r(V,1).toLocaleString()} m\u00b3`;\n\n    noteEl.textContent =\n      \"This is a simplified steady-state estimate. Real CO\u2082 levels depend on air mixing, door\/window leaks, changing occupancy, and ventilation distribution.\";\n\n    resEl.hidden = false;\n  });\n\n  resetBtn.addEventListener(\"click\", function(){\n    setError(\"\");\n    peopleEl.value=\"2\";\n    activityEl.value=\"low\";\n    roomEl.value=\"50\";\n    outdoorEl.value=\"420\";\n    targetEl.value=\"800\";\n    roundEl.value=\"0\";\n    resEl.hidden = true;\n  });\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Indoor CO\u2082 Ventilation Calculator Estimate the ventilation needed to maintain a target indoor CO\u2082 level (simplified steady-state model). People in the room How many people are in the room most&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":2452,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","footnotes":""},"_links":{"self":[{"href":"https:\/\/nature-o.net\/index.php?rest_route=\/wp\/v2\/pages\/2654"}],"collection":[{"href":"https:\/\/nature-o.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nature-o.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nature-o.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nature-o.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2654"}],"version-history":[{"count":1,"href":"https:\/\/nature-o.net\/index.php?rest_route=\/wp\/v2\/pages\/2654\/revisions"}],"predecessor-version":[{"id":2655,"href":"https:\/\/nature-o.net\/index.php?rest_route=\/wp\/v2\/pages\/2654\/revisions\/2655"}],"up":[{"embeddable":true,"href":"https:\/\/nature-o.net\/index.php?rest_route=\/wp\/v2\/pages\/2452"}],"wp:attachment":[{"href":"https:\/\/nature-o.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}