Делаем тестер литий-ионных батарей c помощью Ардуино

Когда речь заходит о создании аккумуляторных батарей, литий-ионные элементы являются, без сомнения, одними из самых лучших. Но если вы используете старые батареи, например, от старого ноутбука, то, возможно, захотите провести тест емкости перед сборкой батарейного блока.

Поэтому сегодня мы покажем вам, как сделать Li-ion измеритель емкости, используя микроконтроллер Ардуино.

Шаг 1. Всё, что нам нужно

Ниже перечислим комплектующие для проекта:

  1. PCB (печатная плата);
  2. Силовой резистор;
  3. Резистор 10К;
  4. OLED (светодиодный дисплей)
  5. Ардуино
  6. Зуммер
  7. Разъемы для подключения винтовых клемм
  8. 40-контактный разъем/коннектор (или меньше)
  9. Транзистор IRFZ44N

Шаг 2. Что такое емкость?

Прежде чем делать наш Ардуино тестер, мы должны немного разобраться в том, что такое емкость. Единица для емкости - мАч или Ач.

Если вы посмотрите на любую литий-ионную емкость (см. фото выше), то на неё будет упомянута ее емкость - на рисунке 2600 мАч.

В основном, это означает, что если мы подключим нагрузку на нее, которая составит 2.6A, эта батарея будет работать в течение часа. Точно так же, если у меня есть аккумулятор емкостью 1000 мАч и нагрузка 2A, то он длительность составит 30 минут. Примерно это означают мАч или Ач.

Шаг 3. Практически невозможно

Но вычисление таким образом практически невозможно, потому что все мы знаем V = IR. Первоначально, напряжение батареи будет 4,2 В, если мы будем поддерживать постоянное сопротивление, будет протекать некоторый ток, протекающий через нагрузку. Но с течением времени напряжение батареи будет уменьшаться, а также наш ток. Это сделает наши вычисления намного сложнее, чем ожидалось, потому что нам нужно будет измерить ток и время для каждого раза.

В таком случае выполнения всех расчетов практически невозможно, поэтому здесь мы будем использовать Ардуино, которая будет измерять текущее время и напряжение, обрабатывать информацию и, в конце концов, давать нам пропускную способность.

Шаг 4. Наша схема

У нас был SPI OLED, который валялся без дела, поэтому мы преобразовали его в I2C и использовали. Если вы хотите узнать, как преобразовать SPI в OLED, то мы обязательно это разберем в ближайших уроках.

Схему проекта смотрите выше. И вот как работает эта схема. Сначала Arduino измеряет падение напряжения, создаваемое резистором 10 Ом, если выше 4,3 В, тогда она отключит высокое напряжение дисплея MOSFET, если оно меньше 2,9 В, оно отображает низкое напряжение и выключает MOSFET, а если находится между 4,3 В и 2,9 В, то она включит MOSFET. Батарея начнет разряжаться через резистор, начнется измерение тока, используя закон Ома. Ардуино также использует функцию Миллиса для измерения времени, а произведение тока и времени дает нам пропускную способность.

Шаг 5. Скетч для Ардуино

Вы можете взять код или скачать его ниже:

#include "U8glib.h"  //Library for display 
#define MOSFET_Pin 2
#define Bat_Pin A0
#define Res_Pin A1

U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);  // I2C interface for OLED  
float Capacity = 0.0; 
float Res_Value = 10.0;  
float Vcc = 4.410; //Measure it and change  
float Current = 0.0; 
float mA=0;         
float Bat_Volt = 0.0;  
float Res_Volt = 0.0;  
unsigned long previousMillis = 0; 
unsigned long millisPassed = 0;  
float sample1 =0.000;
float sample2= 0.000;
int x = 0;
int row = 0;

void draw(void) {
   u8g.setFont(u8g_font_fub14r); 
   if ( Bat_Volt < 1){
    u8g.setPrintPos(10,40);      
    u8g.println("No Battrey"); 
   }
   else if ( Bat_Volt > 4.3){
    u8g.setPrintPos(3,40);       
    u8g.println("High Voltage"); 
   }
   else if(Bat_Volt < 2.9){
    u8g.setPrintPos(3,40);      
    u8g.println("Low Voltage"); 
   }
   else if(Bat_Volt >= 2.9 && Bat_Volt < 4.3  ){
      
   u8g.drawStr(0, 20, "V: ");  
   u8g.drawStr(0, 40, "I: ");
   u8g.drawStr(0, 60, "mAh: ");
   u8g.setPrintPos(58,20);       
   u8g.print( Bat_Volt,2);  
   u8g.println("V"); 
   u8g.setPrintPos(58,40);        
   u8g.print( mA,0);  
   u8g.println("mA"); 
   u8g.setPrintPos(58, 60);       
   u8g.print( Capacity ,1);    
  
}
}
  void buz()
  {
  digitalWrite(9, HIGH);
  delay(100);          
  digitalWrite(9, LOW);  
  delay(10);            

}   
  void setup() {
   Serial.begin(9600);
   pinMode(A4,INPUT_PULLUP);
   pinMode(A5, INPUT_PULLUP);
   pinMode(MOSFET_Pin, OUTPUT);
   pinMode(9, OUTPUT);
   digitalWrite(MOSFET_Pin, LOW); 
  }
  
  void loop() {
  
  for(int i=0;i< 100;i++)
  {
   sample1=sample1+analogRead(Bat_Pin);
   delay (2);
  }
  sample1=sample1/100; 
  Bat_Volt = 2* sample1 *Vcc/ 1024.0; 

   for(int i=0;i< 100;i++)
  {
   sample2=sample2+analogRead(Res_Pin); 
   delay (2);
  }
  sample2=sample2/100;
  Res_Volt = 2* sample2 * Vcc/ 1024.0;
  
  if ( Bat_Volt > 4.3){
    digitalWrite(MOSFET_Pin, LOW); 
    buz();
    Serial.println( "Warning High-V! ");
    delay(1000);
   }
   
   else if(Bat_Volt < 2.9){
      digitalWrite(MOSFET_Pin, LOW);
      buz();
      Serial.println( "Warning Low-V! ");
      delay(1000);
  }
  else if(Bat_Volt > 2.9 && Bat_Volt < 4.3  ) { 
      digitalWrite(MOSFET_Pin, HIGH);
      millisPassed = millis() - previousMillis;
      Current = (Bat_Volt - Res_Volt) / Res_Value;
      mA = Current * 1000.0 ;
      Capacity = Capacity + mA * (millisPassed / 3600000.0);
      previousMillis = millis();
      row++;
      x++;
      delay(100); 
 
     }

  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
 }

Шаг 6. Финальный результат

В итоге после тестирования вы можете начать процесс пайки на печатной плате. Рекомендуем использовать коннекторы, так как позже вам может понадобятся дисплей OLED или Arduino для другого проекта.

После пайки, когда вы подключаете мощность, всё может работать не так, как ожидалось. Возможно, потому что мы забыли добавить, так называемые, Pull Up резисторы на интерфейсе шины I2C, поэтому мы вернулись к коду и использовали встроенные резисторы Ардуино.

Теперь Ардуино тестер литий-ионных батарей работает отлично.

Ардуино+