Basic DC Circuit Calculator
Calculate total resistance, current, and individual values for simple DC circuits.
Limitation: Only works for a single voltage source with resistors connected purely in series OR purely in parallel.
Limitation: Only works for a single voltage source with resistors connected purely in series OR purely in parallel.
Circuit Configuration
V
Resistors
No resistors added yet.
Calculation Results
Results will appear here after calculation.
No resistors added yet.
'; return; } resistors.forEach((resistor, index) => { const item = document.createElement('div'); item.className = 'resistor-item'; // Display resistor value nicely (e.g., convert back to kΩ/MΩ if appropriate) let displayValue = resistor; let displayUnit = "Ω"; if (resistor >= 1000000) { displayValue = resistor / 1000000; displayUnit = "MΩ"; } else if (resistor >= 1000) { displayValue = resistor / 1000; displayUnit = "kΩ"; } item.innerHTML = ` Resistor ${index + 1}: ${displayValue.toLocaleString()} ${displayUnit} `; resistorListDiv.appendChild(item); }); } // --- Calculation Logic --- function calculateCircuit() { clearError(); lastCalculationResult = null; // Clear previous result const voltage = parseFloat(voltageSourceInput.value); const connectionType = connectionTypeSelect.value; // Validation if (isNaN(voltage) || voltage <= 0) { showError("Please enter a valid positive voltage source value."); return; } if (resistors.length === 0) { showError("Please add at least one resistor to the circuit."); return; } if (resistors.length === 1 && connectionType === 'parallel') { showError("Parallel connection requires at least two resistors."); return; // Or just treat as series? Let's error for clarity. } let totalResistance = 0; let resultText = `--- Calculation Results ---\n\n`; resultText += `Voltage Source: ${voltage.toLocaleString()} V\n`; resultText += `Connection Type: ${connectionType.charAt(0).toUpperCase() + connectionType.slice(1)}\n`; resultText += `Resistors (${resistors.length}): ${resistors.map((r, i) => `R${i+1}=${formatResistorValue(r)}`).join(', ')}\n\n`; try { if (connectionType === 'series') { // Series Calculation totalResistance = resistors.reduce((sum, r) => sum + r, 0); resultText += `Total Resistance (R_eq): ${formatResistorValue(totalResistance)}\n`; if (totalResistance === 0) { showError("Total resistance is zero. Cannot calculate current (short circuit)."); return; } const totalCurrent = voltage / totalResistance; resultText += `Total Current (I_total): ${formatCurrentValue(totalCurrent)} A\n\n`; resultText += "Individual Resistor Details:\n"; resistors.forEach((r, index) => { const voltageDrop = totalCurrent * r; resultText += ` R${index + 1} (${formatResistorValue(r)}):\n`; resultText += ` Voltage Drop (V${index + 1}): ${formatVoltageValue(voltageDrop)} V\n`; resultText += ` Current (I${index + 1}): ${formatCurrentValue(totalCurrent)} A (same as total in series)\n`; }); } else { // Parallel Calculation const sumOfInverses = resistors.reduce((sum, r) => { if (r === 0) throw new Error("Cannot calculate parallel resistance with a zero Ohm resistor (short circuit)."); return sum + (1 / r); }, 0); if (sumOfInverses === 0) { showError("Cannot calculate parallel resistance (check resistor values)."); return; } totalResistance = 1 / sumOfInverses; resultText += `Total Resistance (R_eq): ${formatResistorValue(totalResistance)}\n`; const totalCurrent = voltage / totalResistance; // Current leaving the source resultText += `Total Current (I_total): ${formatCurrentValue(totalCurrent)} A\n\n`; resultText += "Individual Resistor Details:\n"; resistors.forEach((r, index) => { const currentThrough = voltage / r; // Voltage across each is the same in parallel resultText += ` R${index + 1} (${formatResistorValue(r)}):\n`; resultText += ` Voltage Drop (V${index + 1}): ${formatVoltageValue(voltage)} V (same as source in parallel)\n`; resultText += ` Current (I${index + 1}): ${formatCurrentValue(currentThrough)} A\n`; }); } resultsOutput.textContent = resultText; lastCalculationResult = resultText; // Store for PDF } catch (error) { showError(`Calculation Error: ${error.message}`); resultsOutput.textContent = "Calculation failed. See error message above."; } } // --- Formatting Helpers --- function formatResistorValue(r) { if (r >= 1000000) return `${(r / 1000000).toLocaleString()} MΩ`; if (r >= 1000) return `${(r / 1000).toLocaleString()} kΩ`; return `${r.toLocaleString()} Ω`; } function formatCurrentValue(i) { if (Math.abs(i) < 1e-6) return `${(i * 1e9).toPrecision(4)} nA`; if (Math.abs(i) < 1e-3) return `${(i * 1e6).toPrecision(4)} µA`; if (Math.abs(i) < 1) return `${(i * 1000).toPrecision(4)} mA`; if (Math.abs(i) >= 1e6) return `${(i / 1e6).toPrecision(4)} MA`; if (Math.abs(i) >= 1e3) return `${(i / 1e3).toPrecision(4)} kA`; return `${i.toPrecision(4)} A`; } function formatVoltageValue(v) { if (Math.abs(v) < 1e-6) return `${(v * 1e9).toPrecision(4)} nV`; if (Math.abs(v) < 1e-3) return `${(v * 1e6).toPrecision(4)} µV`; if (Math.abs(v) < 1) return `${(v * 1000).toPrecision(4)} mV`; if (Math.abs(v) >= 1e6) return `${(v / 1e6).toPrecision(4)} MV`; if (Math.abs(v) >= 1e3) return `${(v / 1e3).toPrecision(4)} kV`; return `${v.toPrecision(4)} V`; } // --- Reset Logic --- function resetAll() { voltageSourceInput.value = '9'; connectionTypeSelect.value = 'series'; resistorValueInput.value = ''; resistorUnitSelect.value = '1'; resistors = []; renderResistorList(); resultsOutput.textContent = 'Results will appear here after calculation.'; clearError(); lastCalculationResult = null; } // --- Error Handling --- function showError(message) { errorMessage.textContent = message; } function clearError() { errorMessage.textContent = ''; } // --- PDF Generation --- function generatePDF() { if (!lastCalculationResult) { alert("Please run a calculation successfully before downloading the PDF."); return; } const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'p', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const margin = 40; const contentWidth = pdfWidth - 2 * margin; let currentY = margin; // --- Get Colors --- const primaryColor = getComputedStyle(document.documentElement).getPropertyValue('--primary-color').trim(); const secondaryColor = getComputedStyle(document.documentElement).getPropertyValue('--secondary-color').trim(); const textColor = getComputedStyle(document.documentElement).getPropertyValue('--text-color').trim(); // --- Title --- pdf.setFontSize(16); pdf.setTextColor(primaryColor); pdf.text("Basic DC Circuit Calculation Report", pdfWidth / 2, currentY, { align: 'center' }); currentY += 30; // --- Warning/Limitation --- pdf.setFontSize(9); pdf.setTextColor(secondaryColor); pdf.text("Note: This report is based on calculations for purely series or purely parallel circuits.", margin, currentY, { maxWidth: contentWidth }); currentY += 20; // --- Results Text --- pdf.setFontSize(10); pdf.setTextColor(textColor); pdf.setFont('courier', 'normal'); // Use monospace font for results // Split the result text into lines and add them const lines = pdf.splitTextToSize(lastCalculationResult, contentWidth); pdf.text(lines, margin, currentY); // --- Save PDF --- pdf.save('basic_dc_circuit_calculation.pdf'); } // --- Event Listeners --- addResistorButton.addEventListener('click', addResistor); // Allow adding resistor by pressing Enter in the input field resistorValueInput.addEventListener('keypress', function(event) { if (event.key === 'Enter') { event.preventDefault(); // Prevent potential form submission addResistor(); } }); calculateButton.addEventListener('click', calculateCircuit); resetButton.addEventListener('click', resetAll); pdfButton.addEventListener('click', generatePDF); // Expose removeResistor globally for the inline onclick handler window.removeResistor = removeResistor; // --- Initial Setup --- renderResistorList(); // Show initial empty state })(); // End of IIFE