ashkan hoseinpoorBuild a Single-Phase and Three-Phase Heater Current Calculator with JavaScript Industrial electric...
Build a Single-Phase and Three-Phase Heater Current Calculator with JavaScript
Industrial electric heaters are commonly designed for either single-phase or three-phase electrical systems.
Before choosing a circuit breaker, contactor, cable, or control panel, engineers need an initial estimate of the heater's operating current.
In this tutorial, we will build a responsive electrical current calculator using HTML, CSS, and JavaScript.
The calculator will support:
«This calculator provides an initial engineering estimate. Final electrical protection and cable sizing must follow applicable standards and actual installation conditions.»
Electrical Formulas
For a single-phase electrical load:
P = V × I × PF
Therefore:
I = P ÷ (V × PF)
For a balanced three-phase electrical load:
P = √3 × V × I × PF
Therefore:
I = P ÷ (√3 × V × PF)
Where:
Industrial resistance heaters are almost purely resistive loads, so their power factor is typically close to "1".
What We Are Building
The user will select:
The calculator will display:
Project Structure
Create the following files:
heater-current-calculator/
├── index.html
├── style.css
└── script.js
Step 1: Create the HTML
Add the following code to "index.html":
<!DOCTYPE html>
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
<meta
name="description"
content="Calculate the operating current of single-phase and three-phase industrial electric heaters."
<h1>Industrial Heater Current Calculator</h1>
<p>
Estimate the operating current and electrical resistance
of a single-phase or three-phase electric heater.
</p>
</header>
<form id="calculator-form">
<div class="field">
<label for="phase">Electrical system</label>
<select id="phase">
<option value="single">Single phase</option>
<option value="three">Three phase</option>
</select>
</div>
<div class="power-row">
<div class="field">
<label for="power">Heater power</label>
<input
type="number"
id="power"
min="0.01"
step="0.01"
placeholder="Example: 18"
required
>
</div>
<div class="field unit-field">
<label for="power-unit">Unit</label>
<select id="power-unit">
<option value="kw">kW</option>
<option value="w">W</option>
</select>
</div>
</div>
<div class="field">
<label for="voltage">Supply voltage</label>
<input
type="number"
id="voltage"
min="1"
step="1"
value="220"
required
>
</div>
<div class="voltage-buttons">
<button type="button" data-voltage="220">
220 V
</button>
<button type="button" data-voltage="230">
230 V
</button>
<button type="button" data-voltage="380">
380 V
</button>
<button type="button" data-voltage="400">
400 V
</button>
</div>
<div class="field">
<label for="power-factor">Power factor</label>
<input
type="number"
id="power-factor"
min="0.01"
max="1"
step="0.01"
value="1"
required
>
<small>
For a standard resistance heater, use a value close to 1.
</small>
</div>
<button class="calculate-button" type="submit">
Calculate Current
</button>
</form>
<section
id="result"
class="result"
aria-live="polite"
></section>
Step 2: Style the Calculator
Add the following code to "style.css":
:root {
font-family: Arial, Helvetica, sans-serif;
color: #1f2937;
background: #eef1f5;
}
body {
min-height: 100vh;
margin: 0;
padding: 24px;
display: flex;
align-items: center;
justify-content: center;
}
.calculator-card {
width: 100%;
max-width: 620px;
padding: 36px;
background: #ffffff;
border-radius: 20px;
box-shadow: 0 16px 45px rgba(15, 23, 42, 0.1);
}
header {
margin-bottom: 28px;
}
.label {
display: inline-block;
margin-bottom: 10px;
color: #d97706;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.05em;
text-transform: uppercase;
}
h1 {
margin: 0 0 12px;
font-size: clamp(28px, 5vw, 40px);
line-height: 1.15;
}
header p {
margin: 0;
color: #64748b;
line-height: 1.7;
}
.field {
margin-bottom: 20px;
}
.power-row {
display: grid;
grid-template-columns: 1fr 120px;
gap: 14px;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 700;
}
input,
select {
width: 100%;
min-height: 50px;
padding: 10px 14px;
border: 1px solid #cbd5e1;
border-radius: 10px;
background: #ffffff;
color: #1f2937;
font-size: 16px;
}
input:focus,
select:focus {
outline: 3px solid rgba(245, 158, 11, 0.2);
border-color: #f59e0b;
}
small {
display: block;
margin-top: 8px;
color: #64748b;
line-height: 1.5;
}
.voltage-buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 8px;
margin-top: -8px;
margin-bottom: 22px;
}
.voltage-buttons button {
min-height: 40px;
border: 1px solid #dbe2ea;
border-radius: 8px;
background: #f8fafc;
color: #334155;
cursor: pointer;
}
.voltage-buttons button:hover {
border-color: #f59e0b;
background: #fff7ed;
}
.calculate-button {
width: 100%;
min-height: 54px;
padding: 12px 20px;
border: 0;
border-radius: 10px;
background: #f59e0b;
color: #ffffff;
font-size: 17px;
font-weight: 700;
cursor: pointer;
}
.calculate-button:hover {
background: #d97706;
}
.result {
display: none;
margin-top: 26px;
padding: 22px;
border: 1px solid #fed7aa;
border-radius: 12px;
background: #fff7ed;
}
.result.visible {
display: block;
}
.result.error {
border-color: #fecaca;
background: #fef2f2;
color: #b91c1c;
}
.result h2 {
margin-top: 0;
font-size: 20px;
}
.result-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12px;
}
.result-item {
padding: 14px;
border-radius: 10px;
background: #ffffff;
}
.result-item span {
display: block;
margin-bottom: 6px;
color: #64748b;
font-size: 14px;
}
.result-item strong {
font-size: 22px;
}
.formula {
margin-bottom: 0;
padding-top: 14px;
border-top: 1px solid #fed7aa;
font-family: monospace;
line-height: 1.7;
}
@media (max-width: 520px) {
body {
padding: 14px;
}
.calculator-card {
padding: 24px 18px;
}
.power-row {
grid-template-columns: 1fr 90px;
}
.voltage-buttons {
grid-template-columns: repeat(2, 1fr);
}
.result-grid {
grid-template-columns: 1fr;
}
}
The interface is responsive, so it can be used on both desktop and mobile devices.
Step 3: Add the JavaScript Logic
Add the following code to "script.js":
const form = document.getElementById("calculator-form");
const phaseInput = document.getElementById("phase");
const powerInput = document.getElementById("power");
const powerUnitInput = document.getElementById("power-unit");
const voltageInput = document.getElementById("voltage");
const powerFactorInput = document.getElementById("power-factor");
const result = document.getElementById("result");
const voltageButtons = document.querySelectorAll(
"[data-voltage]"
);
const SQRT_THREE = Math.sqrt(3);
voltageButtons.forEach((button) => {
button.addEventListener("click", () => {
voltageInput.value = button.dataset.voltage;
});
});
phaseInput.addEventListener("change", () => {
if (phaseInput.value === "single") {
voltageInput.value = 220;
} else {
voltageInput.value = 380;
}
});
form.addEventListener("submit", (event) => {
event.preventDefault();
const phase = phaseInput.value;
const enteredPower = Number(powerInput.value);
const powerUnit = powerUnitInput.value;
const voltage = Number(voltageInput.value);
const powerFactor = Number(powerFactorInput.value);
clearResult();
if (
!Number.isFinite(enteredPower) ||
!Number.isFinite(voltage) ||
!Number.isFinite(powerFactor)
) {
showError("Please enter valid numeric values.");
return;
}
if (enteredPower <= 0) {
showError("Heater power must be greater than zero.");
return;
}
if (voltage <= 0) {
showError("Supply voltage must be greater than zero.");
return;
}
if (powerFactor <= 0 || powerFactor > 1) {
showError("Power factor must be between 0 and 1.");
return;
}
const powerInWatts =
powerUnit === "kw"
? enteredPower * 1000
: enteredPower;
const current =
phase === "single"
? calculateSinglePhaseCurrent(
powerInWatts,
voltage,
powerFactor
)
: calculateThreePhaseCurrent(
powerInWatts,
voltage,
powerFactor
);
const resistance =
phase === "single"
? calculateSinglePhaseResistance(
voltage,
powerInWatts
)
: calculateThreePhaseEquivalentResistance(
voltage,
powerInWatts
);
showResult({
phase,
powerInWatts,
voltage,
powerFactor,
current,
resistance
});
});
function calculateSinglePhaseCurrent(
power,
voltage,
powerFactor
) {
return power / (voltage * powerFactor);
}
function calculateThreePhaseCurrent(
power,
voltage,
powerFactor
) {
return power / (
SQRT_THREE *
voltage *
powerFactor
);
}
function calculateSinglePhaseResistance(
voltage,
power
) {
return Math.pow(voltage, 2) / power;
}
function calculateThreePhaseEquivalentResistance(
voltage,
power
) {
return Math.pow(voltage, 2) / power;
}
function showResult({
phase,
powerInWatts,
voltage,
powerFactor,
current,
resistance
}) {
const phaseLabel =
phase === "single"
? "Single phase"
: "Three phase";
const formula =
phase === "single"
? "I = P ÷ (V × PF)"
: "I = P ÷ (√3 × V × PF)";
result.innerHTML = `
<div class="result-grid">
<div class="result-item">
<span>Operating current</span>
<strong>${current.toFixed(2)} A</strong>
</div>
<div class="result-item">
<span>Equivalent resistance</span>
<strong>${resistance.toFixed(2)} Ω</strong>
</div>
<div class="result-item">
<span>Heater power</span>
<strong>
${(powerInWatts / 1000).toFixed(2)} kW
</strong>
</div>
<div class="result-item">
<span>Supply voltage</span>
<strong>${voltage.toFixed(0)} V</strong>
</div>
</div>
<p class="formula">
${formula}<br>
Power factor: ${powerFactor.toFixed(2)}
</p>
`;
result.classList.add("visible");
}
function showError(message) {
result.textContent = message;
result.classList.add("visible", "error");
}
function clearResult() {
result.className = "result";
result.innerHTML = "";
}
How the Calculation Works
The calculator first converts kilowatts into watts:
const powerInWatts =
powerUnit === "kw"
? enteredPower * 1000
: enteredPower;
It then checks whether the user selected a single-phase or three-phase system.
For single-phase loads:
return power / (voltage * powerFactor);
For three-phase loads:
return power / (
Math.sqrt(3) *
voltage *
powerFactor
);
The application also performs validation to prevent calculations with invalid values.
Example 1: Single-Phase Heater
Suppose we have the following heater:
Power: 3,000 W
Voltage: 220 V
Power factor: 1
The current is:
I = 3000 ÷ 220
I = 13.64 A
Therefore, the heater has an estimated operating current of approximately:
13.64 A
The calculated value is the heater operating current, not necessarily the final circuit breaker rating.
Example 2: Three-Phase Heater
Consider an industrial three-phase heater with the following specifications:
Power: 18 kW
Voltage: 380 V
Power factor: 1
The current is:
I = 18000 ÷ (1.732 × 380)
I = 27.35 A
Each line conductor carries approximately:
27.35 A
This is one reason why three-phase power is commonly used for high-power industrial heaters.
Why Three-Phase Power Is Used
Three-phase electrical systems offer several advantages for industrial heating applications:
For example, an 18 kW heater connected to a 220 V single-phase supply would draw approximately:
18000 ÷ 220 = 81.82 A
The same power connected to a 380 V three-phase supply draws approximately:
18000 ÷ (1.732 × 380) = 27.35 A
The comparison demonstrates why high-capacity industrial heaters are frequently designed for three-phase operation.
Star and Delta Connections
Three-phase heating elements may be connected in star or delta configurations.
Star Connection
In a star connection:
Vphase = Vline ÷ √3
At a line voltage of 380 V:
Vphase = 380 ÷ 1.732
Vphase ≈ 219.4 V
This means each heating element receives approximately 220 V.
A star connection is therefore useful when the individual heater elements are rated for approximately 220 V but the available three-phase line voltage is 380 V.
Delta Connection
In a delta connection:
Vphase = Vline
With a 380 V supply, each heating element receives the full 380 V.
The selected connection must match the voltage and resistance rating of each heating element.
Connecting a heating element to the wrong voltage can dramatically increase its power and may cause rapid failure.
Power and Resistance Relationship
For a resistive heater:
P = V² ÷ R
Therefore:
R = V² ÷ P
For a 3 kW single-phase heater operating at 220 V:
R = 220² ÷ 3000
R = 16.13 Ω
The approximate heater resistance is:
16.13 Ω
Actual measured resistance may differ slightly due to manufacturing tolerance and temperature.
The electrical resistance of many heating alloys changes as the element temperature increases.
Important Safety Considerations
A current calculator is only the first step in designing an industrial heater circuit.
A complete design may also require:
The selected circuit breaker should not be based only on the displayed operating current.
The complete installation conditions must be reviewed by a qualified electrical professional.
Possible Improvements
This calculator can be expanded with additional features:
You could also rebuild the application using React, Vue, TypeScript, or another frontend framework.
Final Thoughts
This project shows how basic electrical engineering formulas can be transformed into a practical browser-based tool.
JavaScript is not limited to traditional web applications. It can also help engineers, technicians, manufacturers, and customers perform fast initial calculations.
I work on the design and manufacturing of industrial electric heaters, including flanged heaters, tubular heating elements, cartridge heaters, immersion heaters, and electric fan heaters at Techno Design.
More information about industrial heating systems is available at:
Suggested DEV Community tags:
Suggested article description:
Build a responsive JavaScript calculator for estimating the operating current and resistance of single-phase and three-phase industrial electric heaters.