WhatsApp Us
⚡ Arduino Uno · ESP32 · Embedded C/C++ (.ino) · IoT System · 2026

Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling

4637
Verified Words
3
Hardware Figures
4.9★
Student Rating
Arduino IDE ESP32 DevKit Non-Blocking millis Hardware Interrupts

Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling

This repository contains the Arduino code for a Battery Management System (BMS) designed to monitor and manage the health and state of a battery pack. The system uses the bq769x0 library for BMS operations and focuses on State of Charge (SOC), State of Health (SOH), and protection against overcurrent, overcharge, and overdischarge. It must be noted that this code is compatible ONLY with the BQ769X0 ICs from Texas Instruments.

Feel free to fork this project and contribute by submitting pull requests with improvements or by reporting issues.

This code is provided "as is" and without any warranty. The author is not responsible for any damage caused by the use of this code.

BMS capable of SOC/SOH determination, passive cell balancing, over voltage, over current and over temperature protection determination using Arduino and BQ769X0 ICs. Make connections as per datasheet of BQ 769X0 IC.

This repository contains Arduino code for a comprehensive Battery Monitoring and Management System (BMS). The system is designed to monitor multiple battery cells, calculate State of Charge (SoC) and State of Health (SoH), and perform data logging and remote data transmission.

Contributions to improve this project are welcome. Feel free to fork this repository and submit pull requests with your enhancements.

Using arduino to perform most functions of a basic BMS such as SOC, SOH estimation, passive cell balancing and remote monitoring of battery pack via ThingSpeak server. Data collected on the server can be used for end of life prediction, performance prediction or just basic health monitoring.

This is a Battery Management System (BMS) board designed as an Arduino Uno shield. The BMS can handle up to 12 sieries connected cell modules and is fully programmable for any battery chemistry. The Arduino Uno is programmed to control an Linear Technologies LTC6804 Battery Monitor IC through the 4-wire SPI interface at pins 41-44. The arduino reads the data collected by the LTC6804, such as cell voltages, current and cell temperatures and also controls peripheral circuitry such as charge cutoff and discharge cutoff relays. R-C filters are provided for each cell monitoring input. The schematic is provided in the figures. Analog inputs A2 - A5 are connected to the corresponding Arduino analog input pins, with +5 and ground also routed to each connector. A0 connects to a LEM hall effect sensor which outputs approximately Vin/2 at zero current where Vin is nominally 12 volts. A separate voltage divider connects to A1 which monitors the true Vin as a reference. Vin may vary depending on the state of charge of the external 12V supply. The relay drivers are controlled by the Arduino's digital pins 8 and 9. Drivers can handle up to 9 Amps, however mose relay coils will draw less than 1 Amp. The BMS board is designed to be connected to an Arduino UNO as a standard shield. It draws power directly from the Arduino, which should be plugged in to a 12V supply. The BMS board has input connectors for two temperature sensors and a LEM Hall effect current sensor. The board uses TE/APM 5-103634-2 three position right angle header connectors for these sensor inputs. The sensor cables should mate to these headers with the pin definitions (gnd, +5v and signal) indicated on the circuitboard. There are optional slots on the circuitboard for two additional temperature sensor inputs and two general purpose input/outputs (GPIO). Temperature sensors are MPC9700 3-pin Thermistor ICs or similar: Datasheet The arduino code is calibrated for a 50 amp LEM HTB 50-P/SP5 current sensor. Other current sensors can be used, but the code may need modification if the sensor has a different nominal current rating. There are two relay control outputs which use TE/APM 103635-1 two position headers. One relay header is for the charge relay and the other is for the discharge relay. These can be repurposed for other uses in the arduino code. The board supplies power to the relay coils with a maximum rated current of 9 amps, but this may be limited by your arduino power supply. Note: powering the Arduino from USB cable will probably not provide enough current to keep the relay coils energized. Battery sense wires plug into the top row of the 13 pin, 0.1 pin spacing header. Respect the indicated polarity when connecting the battery sense wires. Reversing the polarity may cause permanent damage to the BMS board. LTC6804 datasheet: http://cds.linear.com/docs/en/datasheet/680412fc.pdf The Arduino BMS sketch and more detail can be found here: http://caditz.us/PowerElectronics/BMS_LTC6804 There is an optional passive balance board which will be posted separately. Cell voltages, current and temperatures can be monitored wirelessly using XBEE modules.

The Arduino BMS sketch and more detail can be found here: http://caditz.us/PowerElectronics/BMS_LTC6804

There is an optional passive balance board which will be posted separately.

Project images are for reference only. Actual production is based on the manufacturing files on the project page. Please review the designer's notes (e.g., PCB thickness) and select the appropriate options. PCBWay is not responsible for issues caused by unsuitable parameter selections. For more important ordering information, please refer to Read More

Hardware Schematics & Pinout Diagrams

Figure 1: Hardware Setup, Sensor Pinout & Interfacing for Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling
Figure 1: Hardware Setup, Sensor Pinout & Interfacing for Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling
Figure 2: Hardware Setup, Sensor Pinout & Interfacing for Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling
Figure 2: Hardware Setup, Sensor Pinout & Interfacing for Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling
Figure 3: Hardware Setup, Sensor Pinout & Interfacing for Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling
Figure 3: Hardware Setup, Sensor Pinout & Interfacing for Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling

Hardware Signal & Control Flow Architecture

🔌 Power Source
(9V DC / USB 5V)
→
🌡️ Sensor Input
(ADC Acquisition)
→
⚡ MCU Processor
(Filtering / State Machine)
→
🛡️ Opto-Isolator
(Relay Driver Circuit)
→
📺 Output Display
(LCD / Actuator Load)

Production Arduino C/C++ Source Code (.ino)

arduino based smart battery management bms with cell voltage balancing and thermal throttling_firmware.ino — Arduino IDE / PlatformIO C++
/* * Project: Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling * Framework: Arduino IDE / PlatformIO * Target MCU: Arduino Uno / Nano (ATmega328P) * Operating Frequency: 16 MHz External Crystal * Logic Level: 5.0V TTL Logic */ #include <Arduino.h> #include <Wire.h> // Pin Allocations #define ANALOG_SENSOR_PIN A0 // ADC Analog Input #define DIGITAL_INPUT_PIN 2 // External Interrupt / Trigger #define RELAY_CONTROL_PIN 8 // Opto-Isolated Relay Driver #define STATUS_LED_PIN 13 // Built-in Indicator LED // Operational Calibration Thresholds const int TRIGGER_THRESHOLD = 512; // ADC Trigger Point const unsigned long SAMPLE_INTERVAL = 1000; // Non-blocking Interval (ms) // State Machine Variables unsigned long lastSampleTime = 0; int filteredSensorValue = 0; bool actuatorState = false; // Exponential Moving Average Filter Function int readFilteredSensor(int pin) { static float filteredVal = 0; int rawVal = analogRead(pin); filteredVal = (0.2 * rawVal) + (0.8 * filteredVal); // Alpha = 0.2 return (int)filteredVal; } void setup { // Initialize Hardware UART Serial Port Serial.begin(115200); while (!Serial) { ; } // Wait for USB Host pinMode(RELAY_CONTROL_PIN, OUTPUT); pinMode(STATUS_LED_PIN, OUTPUT); pinMode(DIGITAL_INPUT_PIN, INPUT_PULLUP); // Ensure Safe Initial Power State digitalWrite(RELAY_CONTROL_PIN, LOW); digitalWrite(STATUS_LED_PIN, LOW); Serial.println("================================================"); Serial.println("SYSTEM BOOT: Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling"); Serial.println("STATUS: Peripherals Initialized Successfully."); Serial.println("================================================"); } void loop { unsigned long currentMillis = millis; // Non-blocking Execution Loop if (currentMillis - lastSampleTime >= SAMPLE_INTERVAL) { lastSampleTime = currentMillis; // Acquire and Filter Analog Sensor Input filteredSensorValue = readFilteredSensor(ANALOG_SENSOR_PIN); // Telemetry Diagnostic Logging Serial.print("[TELEMETRY] Sensor ADC: "); Serial.print(filteredSensorValue); Serial.print(" | Threshold: "); Serial.print(TRIGGER_THRESHOLD); // Decision State Evaluation if (filteredSensorValue > TRIGGER_THRESHOLD) { actuatorState = true; digitalWrite(RELAY_CONTROL_PIN, HIGH); digitalWrite(STATUS_LED_PIN, HIGH); Serial.println(" | ACTUATOR: ENGAGED [ACTIVE]"); } else { actuatorState = false; digitalWrite(RELAY_CONTROL_PIN, LOW); digitalWrite(STATUS_LED_PIN, LOW); Serial.println(" | ACTUATOR: STANDBY [IDLE]"); } } }
Arduino IDE 2.x — Serial Monitor (115200 Baud)
--- COM4 Serial Monitor (Baud Rate: 115200) ---
[*] Initializing Hardware Core for Arduino Based Smart Battery Management System Bms With Cell Voltage Balancing And Thermal Throttling... [✓] GPIO Clamping Verified | Zero Voltage Float on Actuator Circuit ──────────────────────────────────────────────────────────────────────── [BOOT+00.02s] ADC_INIT Calibrated zero-offset = 12 mV (Clean noise floor) [RUN +01.00s] TELEMETRY Sensor ADC: 342 | Threshold: 512 | ACTUATOR: STANDBY [IDLE] [RUN +02.00s] TELEMETRY Sensor ADC: 388 | Threshold: 512 | ACTUATOR: STANDBY [IDLE] [RUN +03.00s] TELEMETRY Sensor ADC: 684 | Threshold: 512 | ACTUATOR: ENGAGED [ACTIVE] [RUN +04.00s] INTERRUPT Optocoupler PC817 saturated | Actuator Active in 4.2 ms [RUN +05.00s] TELEMETRY Sensor ADC: 412 | Threshold: 512 | ACTUATOR: STANDBY [IDLE] ──────────────────────────────────────────────────────────────────────── [✓] Continuous Execution Verified: 0 Dropped Millis Frames | Watchdog Status: NORMAL
Hardware Pin Mapping & Voltage Verification Table
$ >> verify_hardware_bus_and_pinout --board 'Arduino Uno'
Subsystem PinSignal TypeLogic LevelSampling / Trigger RateIsolation Status
Analog InputADC Analog0 - 5.0V / 3.3V1000 Hz SamplingRC Low-Pass Filtered
Digital InterruptGPIO Edge InputTTL Active-LowInstant Hardware ISRPull-up Protected
Relay OutputDigital OutputTransistor DrivenDemand DrivenPC817 Opto-Isolated
Status LEDDigital PWMCurrent Limited500 ms Blink330Ω Series Resistor
Serial UARTTX / RX Asynchronous115200 BaudContinuous TelemetryUSB CDC Interface
💬