• Stars
    star
    127
  • Rank 282,790 (Top 6 %)
  • Language
    C++
  • License
    Other
  • Created almost 5 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Software for diyBMS v4

diyBMS v4

Version 4 of the diyBMS. Do-it-yourself battery management system for Lithium ion battery packs and cells

If you are looking for version 3 of this project take a look here https://github.com/stuartpittaway/diyBMS

THIS REPOSITORY IS FOR THE ESP8266 BASED CONTROLLER BOARD (ORIGINAL/LEGACY)

The newest ESP32 based code can be found here https://github.com/stuartpittaway/diyBMSv4ESP32

Support the project

If you find the BMS useful, please consider buying me a beer, check out Patreon for more information.

You can also send beer tokens via Paypal - paypal.me/stuart2222

Any donations go towards the on going development and prototype costs of the project.

Videos on how to use and build

https://www.youtube.com/stuartpittaway

Video on how to program the devices

https://youtu.be/wTqDMg_Ql98

Video on how to order from JLCPCB

https://youtu.be/E1OS0ZOmOT8

Help

If you need help, ask over at the forum

If you discover a bug or want to make a feature suggestion, open a Github issue

How to use the code

Master Branch

This release removes the need to manually compile the code yourself, instead GITHUB Actions are now used to build the code for you automatically.

The files you will need are held as a ZIP file in Releases

Download the ZIP file named "Compiled_Firmware_YYYY-MM-DD-HH-MM.zip" and extract its contents and inside the folder you should find:

Files for the controller (ESP8266)

  • diybms_controller_firmware_espressif8266_esp8266_d1mini.bin
  • diybms_controller_filesystemimage_espressif8266_esp8266_d1mini.bin

Files for the modules (ATTINY841)

  • module_fw_V400_attiny841_400_eF4_hD6_l62.hex
  • module_fw_V410_attiny841_410_eF4_hD6_l62.hex
  • module_fw_V420_attiny841_420_eF4_hD6_l62.hex
  • module_fw_V420_SWAPR19R20_attiny841_420_SWAPR19R20_eF4_hD6_l62.hex
  • module_fw_V421_attiny841_421_eF4_hD6_l62.hex
  • module_fw_V421_LTO_attiny841_421_eF4_hD6_l62.hex
  • module_fw_V440_attiny841_440_eF4_hD6_l6C.hex

You can ignore the "filesystemimage" for the esp8266, this is no longer required.

You will need to determine which module HEX file to use (see "Identify which module/board you have" below for help). Most people will have a V4.00 or V4.21 board.

Programming the controller

Both Wemos D1 Mini and Wemos D1 Mini & Pro are supported - minimum of 4MB flash memory.

  1. Connect the WEMOS D1 to the computer using a USB cable
  2. Download the esphome-flasher tool for your operating system
  3. Run the program once downloaded
  4. Select the correct serial port from the list for the Wemos D1
  5. Click Browse and select the file "diybms_controller_firmware_espressif8266_esp8266_d1mini.bin"
  6. Click "Flash ESP" and wait

You should see output similar to below, this is a WeMos D1 Mini Pro (16MB Flash)

Using 'COM3' as serial port.
Connecting....
Detecting chip type... ESP8266
Connecting....

Chip Info:
 - Chip Family: ESP8266
 - Chip Model: ESP8266EX
 - Chip ID: 00123456
 - MAC Address: AA:BB:CC:DD:EE:FF
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
 - Flash Size: 16MB
 - Flash Mode: dout
 - Flash Frequency: 40MHz
Erasing flash (this may take a while)...

Writing at 0x000b0000... (100 %)
Wrote 872784 bytes (728955 compressed) at 0x00000000 in 17.2 seconds...
Hash of data verified.
Leaving...
Hard Resetting...
Done! Flashing is complete!

Programming the modules

Module code runs on the ATTINY841 micro controller, it is important to program the chip with the correct version of code depending on your PCB version.

You will need a programming device capable of programming ATMEL AVR chips - like the USBASP programmer

Setup the programmer

  1. Connect the USBASP programmer to the computer
  2. On the programmer, move the jumper pin (normally marked JP1) to use 3.3 volt programming settings (instead of 5 volt)
  3. Completely disconnect the module from any battery/cell and the TX/RX connectors should also be unconnected.
  4. Connect the programmer to the module using the 6 pin ISP connector on the module - take great care to ensure PIN 1 is aligned to PIN 1 of the programmer. PIN 1 is marked on the PCB.
  5. Download AVRDUDE 6.3 or newer, for Windows other versions are here
  6. Extract the AVRDUDE zip file
  7. Open a console/command window and change to the folder where you extracted the AVRDUDE program, on Windows this looks similar to this
cd C:\temp\avrdude-6.3-mingw32
  1. The standard avrdude tool doesn't include support for ATTINY841 chips. So download and overwrite the file avrdude.conf using the file from here
  2. Lets test connectivity to the programmer and module. Back in the console window, run the command below. On Linux and Mac operating systems, you may need to use a different port insteoad of "usb" - for example /dev/tty1 but this will vary depending on the computer. Note that the parameters ARE case sensitive.
avrdude -C avrdude.conf -P usb -c usbasp -p t841
  1. All being well, it should report something similar to the below. If not, check the wiring and ensure you are using the correct COM port.
avrdude: set SCK frequency to 187500 Hz
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
avrdude: Device signature = 0x1e9315 (probably t841)
avrdude: safemode: Fuses OK (E:F4, H:D6, L:E2)
avrdude done.  Thank you.

Programming the module

Programming the module takes around 12 seconds.

  1. Identify which module/board you have using the details found at the end of this document.
  2. Copy the required ".hex" file to the same folder where you extracted the avrdude tool to.
  3. Now we shall program the module, run the command line similar to below, replacing the "diybms_module_firmware_400" filename where applicable.
  4. The fuse settings are important, and are in the filename for example "eF4_hD6_l62" - means efuse=0xF4, hfuse=0xD6, lfuse=0x62
avrdude -C avrdude.conf -P usb -c usbasp -p t841 -e -B 8 -U efuse:w:0xF4:m -U hfuse:w:0xD6:m -U lfuse:w:0x62:m -U flash:w:diybms_module_firmware_400.hex:i

it should output

avrdude: set SCK frequency to 187500 Hz
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x1e9315 (probably t841)
avrdude: erasing chip
avrdude: set SCK frequency to 187500 Hz
avrdude: reading input file "0xF4"
avrdude: writing efuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0xF4:
avrdude: load data efuse data from input file 0xF4:
avrdude: input file 0xF4 contains 1 bytes
avrdude: reading on-chip efuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of hfuse written
avrdude: reading on-chip hfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: writing lfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xE2:
avrdude: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: writing flash (7718 bytes):
Writing | ################################################## | 100% 6.74s
avrdude: 7718 bytes of flash written
avrdude: verifying flash memory against diybms_module_firmware_XXX.hex:
Reading | ################################################## | 100% 3.43s
avrdude: verifying ...
avrdude: 7718 bytes of flash verified
avrdude: safemode: Fuses OK (E:F4, H:D6, L:E2)
avrdude done.  Thank you.
  1. If programming fails, but the programmer appears to be communicating, try increasing the value of the "B" setting from 8 to 16 to slow down the USBASP device.
  2. Check that the fuses report as "OK" and read E:F4, H:D6, L:E2
  3. That module can now be disconnected from the USBASP programmer, connect the next module and repeat the avrdude command to program the next one.

Hardware

Hardware for this code is in a seperate repository, and consists of a controller (you need 1 of these) and modules (one per series cell in your battery)

https://github.com/stuartpittaway/diyBMSv4

Identify which module/board you have

  • V400 = Original board (marked DIYBMS v4 on silkscreen) - has 8 large resistors (marked 2R20) and likely handsoldered using 0805 sized parts [4.0 boards do have TP2 near the ATTINY841 chip]

  • V410 = JLCPCB built board (marked DIYBMS v4 on silkscreen) - has 8 large resistors (marked 2R00) and machine soldered using 0603 sized parts [4.1 boards do not have TP2 near the ATTINY841 chip]

  • V420 = JLCPCB built board (marked DIYBMS v4.2 on silkscreen) - has 20 small resistors (marked 6R20) and machine soldered using 0603 sized parts (R20 is in middle of resistor array)

  • V420_SWAPR19R20 = JLCPCB built board (marked DIYBMS v4.2 on silkscreen) - has 20 small resistors (marked 6R20) and machine soldered using 0603 sized parts [you have manually resoldered R19 and R20 to swap the positions on PCB to move the thermistor inside the resistor array]

  • V421 = JLCPCB built board (marked DIYBMS v4.21 on silkscreen) - has 20 small resistors (marked 6R20) and machine soldered using 0603 sized parts (R19 is in middle of resistor array)

  • V440 = Marked DIYBMS v4.4 on silkscreen, released Feb 2021 - DO NOT USE THIS CODE WITH OLDER VERSION BOARDS

Open the module code, navigate to platformio environment "env:attiny841_VXXX", (where XXX is the version from above). Connect your USBASP programmer to the module and select "Upload"

WARNING

This is a DIY product/solution so donโ€™t use this for safety critical systems or in any situation where there could be a risk to life.

There is no warranty, it may not work as expected or at all.

The use of this project is done so entirely at your own risk. It may involve electrical voltages which could kill - if in doubt, seek help.

The use of this project may not be compliant with local laws or regulations - if in doubt, seek help.

How to compile the code yourself

The code uses PlatformIO to build the code. There isn't any need to compile the code if you simply want to use it, see "How to use the code" above.

If you want to make changes, fix bugs or poke around, use platformio editor to open the workspace named "diybms_workspace.code-workspace"

License

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales License.

https://creativecommons.org/licenses/by-nc-sa/2.0/uk/

You are free to:

  • Share โ€” copy and redistribute the material in any medium or format
  • Adapt โ€” remix, transform, and build upon the material The licensor cannot revoke these freedoms as long as you follow the license terms.

Under the following terms:

  • Attribution โ€” You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
  • Non-Commercial โ€” You may not use the material for commercial purposes.
  • ShareAlike โ€” If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
  • No additional restrictions โ€” You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.

Notices: You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation.

No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material.

More Repositories

1

diyBMSv4

Version 4 of the diyBMS
HTML
737
star
2

diyBMS

Do it yourself battery management system for Lithium ion battery packs/cells
C++
486
star
3

diyBMSv4ESP32

diyBMS v4 code for the ESP32 and new controller hardware
C++
112
star
4

nanodesmapvmonitor

Nanode to monitor a SMA PV Inverter over Bluetooth
Arduino
52
star
5

diyBMS-CurrentShunt

Isolated current, voltage and SOC monitor for battery banks up to 85V
HTML
34
star
6

WebastoHeaterWBusArduinoInterface

Arduino software for controlling Webasto ThermoTop heaters over its custom WBUS protocol
C
23
star
7

WebastoWBUSInterface

Hardware circuit diagram for interfacing to the Webasto WBUS interface from a PC/Arduino
HTML
18
star
8

Super8FilmScanner

Super 8 film scanner, 3d printed and uses OpenCV
Python
16
star
9

diyBMSv4Leaf

diy BMS version 4 for Nissan Leaf cells
15
star
10

SMASolarMQTT

Python
9
star
11

emoncmsOctopusSmartMeter

SmartMeter API integration with Octopus Energy (UK) and emoncms
Python
8
star
12

ArduinoSolarPowerController

Arduino
5
star
13

VariableTimeBaseSSR

Variable Time Base SSR controller for Arduino designed for using excess Solar PV energy
Arduino
4
star
14

glcd

Port of GLCD library by bperrybap with changes to make it run with fewer LCD pins
C
2
star
15

smasolarbluetoothdebugtool

Debug tool for comms with SMA Solar inverters
Python
2
star
16

ESP8266-DS18B20-EMONCMS

ESP8266 based temperature monitor for emonCMS
C++
2
star
17

OEMAESSensorLib

Open Energy Monitor RFM69Pi Adapter Board firmware for receiving encrypted sensor data packets
C++
1
star
18

ArduinoAESReceiver

Open Energy Monitor RFM69Pi Adapter Board firmware for receiving encrypted sensor data packets
Arduino
1
star
19

SerialEncoder

Simple fixed length serial packet encoding library for micro controllers
C++
1
star
20

u8glib

Automatically exported from code.google.com/p/u8glib
C
1
star
21

vdo-lcd-replacement

Replacement LCD screen for VDO marine tachometers with hour counters
Arduino
1
star
22

emonNotify

Arduino/emonCMS based visual display
Arduino
1
star
23

SolarPowerControllerNoVoltage

Arduino
1
star