Knowing your battery’s state of health isn’t just about checking voltage and capacity — Battery Internal Impedance (or internal resistance) is one of the best indicators of how healthy (or worn out) a battery is. If you’re serious about battery packs, DIY solar, UPS, electric vehicles, or just extending your gadgets’ lifespan, you must understand battery impedance.
⚠️Disclaimer:
Working with electricity involves serious risk. Ensure you have the necessary skills and take proper safety precautions before attempting any electrical projects. Proceed at your own risk — the author assumes no responsibility for any damage, injury, or issues resulting from the use or misuse of the information provided.
All content on this website is original and protected by copyright. Please do not copy or reproduce content without permission. While most of the resources shared here are open-source and freely accessible for your learning and benefit, your respect for our intellectual effort is appreciated.
If you find our tutorials helpful, consider supporting us by purchasing related materials or sharing our work — it helps keep the content flowing.
Need help or have questions? Leave a comment below — the author is always happy to assist!
In this practical, beginner-friendly guide, you’ll learn:
- What battery impedance is & why it matters
- A simple DIY circuit you can build at home
- Arduino or ESP32 code to measure it
- Real-world testing tips
- What to do with the results
Table of Contents
📘 What is Battery Impedance?
A battery’s internal impedance is the resistance it offers to the flow of current inside the cell. As batteries age, chemical changes increase this resistance.
Higher impedance = higher voltage drop under load = less usable energy.
Checking impedance is a reliable way to:
✅ Estimate capacity loss
✅ Detect failing cells
✅ Match cells for packs
✅ Diagnose heating issues
⚡️ How Do You Measure It?
Professionals use high-end battery analyzers (like Hioki, Keysight, etc.) that inject a small AC current and measure phase shift. But for DIY, you can use a simple DC load step:
Ohm’s Law:\
R = ΔV / ΔI
- Apply a small load.
- Measure voltage drop.
- Calculate the change in current.
- Divide to get resistance.
🧰 Parts You’ll Need
- Arduino UNO or ESP32
- Known load resistor (e.g., 1Ω 5W or 10W)
- N-channel MOSFET (e.g., IRF540N)
- Gate resistor (220–470Ω)
- Flyback diode (1N5408 or similar for protection)
- Voltage divider resistors
- Breadboard & jumper wires
- Digital multimeter (for calibration)
🔌 How It Works
1️⃣ Measure battery open-circuit voltage (V1)
2️⃣ Switch on the load for a short time (e.g., 1 second)
3️⃣ Measure loaded voltage (V2)
4️⃣ Know your load resistor value (R_Load)
5️⃣ Calculate:
- I_Load = V2 / R_Load
- R_Internal = (V1 – V2) / I_Load
⚙️ Simple Circuit Diagram
Main blocks:
- The battery under test connects to the MOSFET + load resistor.
- Arduino GPIO drives the MOSFET gate.
- Arduino analog inputs read voltages before and during load.
[BATTERY +] ---+-----[MOSFET DRAIN]----+----[LOAD RESISTOR]----[BATTERY -] | | [Voltage Divider] [MOSFET SOURCE to GND] | [A0] Arduino Gate: Arduino D2 → 220Ω → Gate
⚡️ Voltage Divider
Most batteries are above 5V. You need a voltage divider.
Example for 12V battery:\
- R1 = 10kΩ\
- R2 = 3.3kΩ
This scales 12V down to about 3V — safe for Arduino’s ADC.
🧮 How the MOSFET Works
- Gate LOW → MOSFET OFF → Open circuit.
- Gate HIGH → MOSFET ON → Load resistor connected.
🔢 Full Arduino Code Example
Below is a clean, easy-to-read sketch that switches the load, reads voltages, and calculates impedance:
const int mosfetGatePin = 2; const int voltagePin = A0; const float R1 = 10000.0; // Top resistor const float R2 = 3300.0; // Bottom resistor const float R_Load = 1.0; // 1 Ohm resistor void setup() { Serial.begin(9600); pinMode(mosfetGatePin, OUTPUT); digitalWrite(mosfetGatePin, LOW); } float readBatteryVoltage() { int adcValue = analogRead(voltagePin); float v = adcValue * (5.0 / 1023.0); float actualV = v * ((R1 + R2) / R2); return actualV; } void loop() { Serial.println("Measuring open circuit voltage..."); float V1 = readBatteryVoltage(); Serial.print("Open Circuit Voltage: "); Serial.print(V1); Serial.println(" V"); delay(500); Serial.println("Applying load..."); digitalWrite(mosfetGatePin, HIGH); delay(1000); // 1 second load float V2 = readBatteryVoltage(); digitalWrite(mosfetGatePin, LOW); Serial.print("Loaded Voltage: "); Serial.print(V2); Serial.println(" V"); float I_Load = V2 / R_Load; float R_Internal = (V1 - V2) / I_Load; Serial.print("Load Current: "); Serial.print(I_Load); Serial.println(" A"); Serial.print("Internal Resistance: "); Serial.print(R_Internal * 1000.0); Serial.println(" mOhms"); Serial.println("---------------------------"); delay(5000); // Wait before next test }
📌 Tips for Accuracy
✅ Use a precision resistor for your load.
✅ Use short, thick wires to minimize extra resistance.
✅ Run multiple tests and average the results.
✅ Keep the load duration short to avoid heating the cell.
✅ Calibrate your voltage divider with a multimeter.
🗒️ What’s a Good Value of Battery Internal Impedance?
- Healthy new Li-ion: 30–80 mOhm
- Old Li-ion: 150+ mOhm
- SLA (lead-acid): few mOhms for large batteries
- NiMH AA: ~100–200 mOhm
As a battery ages, internal resistance rises → it drops voltage faster under load → more heat, less power.
📚 Advanced: Add an OLED Display
Want to see the impedance live on a tiny screen?
Add an SSD1306 I2C OLED, wire SDA/SCL to Arduino A4/A5 or ESP32 default I2C pins.
Use this in your loop:
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> Adafruit_SSD1306 display(128, 64, &Wire, -1); void setup() { ... display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); } void loop() { ... display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.print("V1: "); display.print(V1,2); display.setCursor(0,10); display.print("V2: "); display.print(V2,2); display.setCursor(0,20); display.print("I: "); display.print(I_Load,2); display.setCursor(0,30); display.print("R_int: "); display.print(R_Internal*1000,1); display.print(" mOhm"); display.display(); }
🔒 Safety Tips
- Never short your battery.
- Start with small loads.
- Use a fuse for large batteries.
- Don’t test damaged or swollen Li-ion packs.
- Never leave the circuit unattended.
🔋 DIY vs Professional Meters
This simple DC load-step method is practical for hobby checks, but for very accurate results, pros use AC impedance spectroscopy. That said, your DIY method is more than enough for comparing healthy vs. worn-out packs!
🚀 Ideas to Expand
✅ Build a dedicated PCB tester
✅ Add Bluetooth to log data to your phone
✅ Test multiple cells automatically
✅ Combine with a capacity tester
✅ Store results to SD card
🎓 What You’ve Learned
👉 How battery impedance works
👉 How to build a simple load test circuit
👉 How to write Arduino code to measure ΔV, I_Load
👉 How to calculate internal resistance
👉 How to make sense of the numbers
✅ Practical Use Cases
- Spot weak cells in a pack BEFORE they fail.
- Match cells when building custom battery packs.
- Test used laptop cells for DIY power banks.
- Check your car or UPS batteries yearly.
Read more:
- Embracing Sustainability: A Comprehensive Guide to Eco-Friendly Living in 2025
- Top Laboratory Trends for 2025: A Deep Dive into the Future of Scientific Research
- Eco-Friendly Science Projects for Students: Inspiring Over 250 Sustainable Ideas
🔑 Conclusion
Checking battery impedance is one of the most overlooked skills for DIYers — but it’s easy, fun, and gives you real insights into whether your cells are safe and effective.
✅ Build this project today.
✅ Stay safe.
✅ Keep your batteries healthy!
If you’d like, I can also create a schematic PDF, PCB Gerber, or KiCAD file for this tester. Just say the word and I’ll prepare it for you! ⚡🔋✨
Liked this article? Subscribe to our newsletter:
or,
Visit LabProjectsBD.com for more inspiring projects and tutorials.
Thank you!
0 Comments