Arduino Pil Ölçer

Arduino Pil Ölçer (BMS Ölçer)

Arduino Pil Ölçer kendi yapmış olduğum çoğu cihaz da bms devre kullanmam sonucu pil seviyelerini daha pratik takip etmek için yaptım. Bms devrelerin 1s 2s 3s 4s gibi birçok pilden oluşmasından dolayı takip etmek zor oluyor pil seviyelerini…

Arduino Pil Ölçer

BMS Türkçe olarak batarya yönetim sistemi olarak çevirebiliriz. Şimdi bir görsel ile ne yaptığıma bakalım sonra malzeme ve kodlara geçelim.

Arduino Pil Ölçer
bms ölçer

 

 

Arduino Pil Ölçer
pil kapasite ölçüm

 

 

Arduino Pil Ölçer
bms pil seçimi

 

Cihaz açıldıktan sonra kullandığınız bms ya da seri devre yaptğınız pil sayısını seçip enter butonuna basıyoruz.

Çıkan ekranda bize aşağıdaki gibi bir sonuç veriyor.

Arduino Pil Ölçer
bms seçimi

 

 

Arduino Pil Ölçer
sonuç ekranı

Önemli bir noktaya kodlara başlamadan önce değinmek istiyorum. Arduino voltaj sensörü kullandım bunu dilerseniz dirençler arasına voltaj vererek de ölçebilirsiniz bir çok bilgi mevcut bununla ilgili. İlerleyen zamanda bende paylaşabilirim. Mantık olarak maksimum25 volt ölçebilirsiniz daha fazlası arduino zarar verebilir. Biz burada voltajı indirgeyerek analog pinden okuyoruz bu nedenle 5v karşılığı maksimum 25 volt ölçüm yapabiliriz bu da 6s pil yapar.

Bir diğer önemli noktada kodda görüleceği üzere referans değer üzerinden voltaj doğrulaması yapıyoruz. Arduino kaç volt ile beslerseniz kaynağa göre bu referans değeri değişmeniz gerekebilir. Güç kaynağı ya da pil ile besleme yaptığınızda sonuçlar farklı olur. Nihai olarak en son ne ile çalıştıracaksanız referans değeri ona göre beslemeniz önemli. Ölçtüğünüz değer multimetreye göre yüksek çıkıyorsa referans değeri düşürün.  Ben 18650 pil kullandım ve bunu mt3608 ile 5v seviyesine çıkarıp arudino çalıştırdım.

Arduino Pil Ölçer

Referans değeri bende bu şekilde.

// Float for Reference Voltage 
float ref_voltage = 4.2;

 

#include <Wire.h> 
#include <LiquidCrystalTr_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

int upButton = 8;
int downButton = 9;
int selectButton = 10;
int menu = 1;
int deger = 0;
float volt=3.4;
int bekleme=6000;
float toplam=0;




// Define analog input
#define ANALOG_IN_PIN A0
 
// Floats for ADC voltage & Input voltage
float adc_voltage = 0.0;
float in_voltage = 0.0;
 
// Floats for resistor values in divider (in ohms)
float R1 = 30100.0;
float R2 = 7540.0; 
 
// Float for Reference Voltage
float ref_voltage = 4.2;
 
// Integer for ADC value
int adc_value = 0;



void setup() {
  lcd.begin();
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  
    lcd.begin();
    lcd.backlight();
    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.print("Pil Kapasite"); 
    lcd.setCursor(0,1); 
    lcd.print("Ölçüm..");
    delay(500);
    lcd.setCursor(0,1); 
    lcd.print("Ölçüm....");
    delay(500);
    lcd.setCursor(0,1); 
    lcd.print("Ölçüm......");
    delay(500);
    lcd.setCursor(0,1); 
    lcd.print("Ölçüm........"); 
    delay(500);
    lcd.setCursor(0,1); 
    lcd.print("Ölçüm...........");
  updateMenu();
}

void loop() {
  toplam=0;
  volt=0;
  if (!digitalRead(downButton)){
    menu++;
    updateMenu();
    delay(100);
    while (!digitalRead(downButton));
  }
  if (!digitalRead(upButton)){
    menu--;
    updateMenu();
    delay(100);
    while(!digitalRead(upButton));
  }
  if (!digitalRead(selectButton)){
    executeAction();
    updateMenu();
    delay(100);
    while (!digitalRead(selectButton));
  }
}

void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    case 1:
      lcd.clear();
      lcd.print(">1 S");
      lcd.setCursor(0, 1);
      lcd.print(" 2 S");
      break;
    case 2:
      lcd.clear();
      lcd.print(" 1 S");
      lcd.setCursor(0, 1);
      lcd.print(">2 S");
      break;
    case 3:
      lcd.clear();
      lcd.print(">3 S");
      lcd.setCursor(0, 1);
      lcd.print(" 4 S");
      break;
    case 4:
      lcd.clear();
      lcd.print(" 3 S");
      lcd.setCursor(0, 1);
      lcd.print(">4 S");
      break;
      case 5:
      lcd.clear();
      lcd.print(">5 S");
      lcd.setCursor(0, 1);
      lcd.print(" 6 S");
      break;
    case 6:
      lcd.clear();
      lcd.print(" 5 S");
      lcd.setCursor(0, 1);
      lcd.print(">6 S");
      break;

    case 7:
      menu = 6;
      break;
  }
}

void executeAction() {
  switch (menu) {
    case 1:
      action1();
      break;
    case 2:
      action2();
      break;
    case 3:
      action3();
      break;
    case 4:
      action4();
      break;
    case 5:
      action5();
      break;
    case 6:
      action6();
      break;

  }
}

void action1() {
    for (int b = 1; b < 31 ; b++) // dor döngüsü şartı
  {
  delay(10);
  // Read the Analog Input
  adc_value = analogRead(ANALOG_IN_PIN);
  // Determine voltage at ADC input
  adc_voltage  = (adc_value * ref_voltage) / 1024.0;
  // Calculate voltage at divider input
  in_voltage = adc_voltage*(R1+R2)/R2;
  toplam =toplam + in_voltage;
  }

  volt= (toplam)/30;

    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.print("1 S");
    lcd.setCursor(10,0); 
    lcd.print("->");  
    lcd.setCursor(0,1); 
    lcd.print("Volt:");
    lcd.setCursor(11,1); 
    lcd.print("%");
    lcd.setCursor(5,1); 
    lcd.print(volt);

    if (volt < 3.1){
    lcd.setCursor(13,1); 
    lcd.print("0");
    lcd.setCursor(12,0); 
    lcd.print("XXXX");
    
    }

    if (volt < 3.4 && volt >= 3.1){
    lcd.setCursor(13,1); 
    lcd.print("25");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));

    
    }

        if (volt < 3.7 && volt >= 3.4){
    lcd.setCursor(13,1); 
    lcd.print("50");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    
    }
        if (volt < 4.0 && volt>=3.7){
    lcd.setCursor(13,1); 
    lcd.print("75");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    
    }
        if (volt >= 4.0){
    lcd.setCursor(13,1); 
    lcd.print("100");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    lcd.setCursor(15,0); 
    lcd.write(byte(8));
    }
  delay(bekleme);
  toplam=0;
  volt=0;
}


void action2() {
    for (int b = 1; b < 31 ; b++) // dor döngüsü şartı
  {
  delay(10);
  // Read the Analog Input
  adc_value = analogRead(ANALOG_IN_PIN);
  // Determine voltage at ADC input
  adc_voltage  = (adc_value * ref_voltage) / 1024.0;
  // Calculate voltage at divider input
  in_voltage = adc_voltage*(R1+R2)/R2;
  toplam =toplam + in_voltage;
  }

  volt= (toplam)/30;

    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.print("2 S");
    lcd.setCursor(10,0); 
    lcd.print("->");  
    lcd.setCursor(0,1); 
    lcd.print("Volt:");
    lcd.setCursor(11,1); 
    lcd.print("%");
    lcd.setCursor(5,1); 
    lcd.print(volt);

    if (volt < 6.9){
    lcd.setCursor(13,1); 
    lcd.print("0");
    lcd.setCursor(12,0); 
    lcd.print("XXXX");
    
    }

    if (volt < 7.2 && volt >= 6.9){
    lcd.setCursor(13,1); 
    lcd.print("25");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));

    
    }

        if (volt < 7.5 && volt >= 7.2){
    lcd.setCursor(13,1); 
    lcd.print("50");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    
    }
        if (volt < 8 && volt>=7.5){
    lcd.setCursor(13,1); 
    lcd.print("75");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    
    }
        if (volt >= 8.0){
    lcd.setCursor(13,1); 
    lcd.print("100");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    lcd.setCursor(15,0); 
    lcd.write(byte(8));
    }
  delay(bekleme);
  toplam=0;
  volt=0;
}


void action3() {
   for (int b = 1; b < 31 ; b++) // dor döngüsü şartı
  {
  delay(10);
  // Read the Analog Input
  adc_value = analogRead(ANALOG_IN_PIN);
  // Determine voltage at ADC input
  adc_voltage  = (adc_value * ref_voltage) / 1024.0;
  // Calculate voltage at divider input
  in_voltage = adc_voltage*(R1+R2)/R2;
  toplam =toplam + in_voltage;
  }

  volt= (toplam)/30;

    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.print("3 S");
    lcd.setCursor(10,0); 
    lcd.print("->");  
    lcd.setCursor(0,1); 
    lcd.print("Volt:");
    lcd.setCursor(11,1); 
    lcd.print("%");
    lcd.setCursor(5,1); 
    lcd.print(volt);

    if (volt < 10.3){
    lcd.setCursor(13,1); 
    lcd.print("0");
    lcd.setCursor(12,0); 
    lcd.print("XXXX");
    
    }

    if (volt < 10.8 && volt >= 10.3){
    lcd.setCursor(13,1); 
    lcd.print("25");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));

    
    }

        if (volt < 11.25 && volt >= 10.8){
    lcd.setCursor(13,1); 
    lcd.print("50");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    
    }
        if (volt < 12.2 && volt>=11.25){
    lcd.setCursor(13,1); 
    lcd.print("75");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    
    }
        if (volt >= 12.2){
    lcd.setCursor(13,1); 
    lcd.print("100");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    lcd.setCursor(15,0); 
    lcd.write(byte(8));
    }
  delay(bekleme);
  toplam=0;
  volt=0;
}


void action4() {
   for (int b = 1; b < 31 ; b++) // dor döngüsü şartı
  {
  delay(10);
  // Read the Analog Input
  adc_value = analogRead(ANALOG_IN_PIN);
  // Determine voltage at ADC input
  adc_voltage  = (adc_value * ref_voltage) / 1024.0;
  // Calculate voltage at divider input
  in_voltage = adc_voltage*(R1+R2)/R2;
  toplam =toplam + in_voltage;
  }

  volt= (toplam)/30;

    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.print("4 S");
    lcd.setCursor(10,0); 
    lcd.print("->");  
    lcd.setCursor(0,1); 
    lcd.print("Volt:");
    lcd.setCursor(11,1); 
    lcd.print("%");
    lcd.setCursor(5,1); 
    lcd.print(volt);

    if (volt < 13.8){
    lcd.setCursor(13,1); 
    lcd.print("0");
    lcd.setCursor(12,0); 
    lcd.print("XXXX");
    
    }

    if (volt < 14.4 && volt >= 13.8){
    lcd.setCursor(13,1); 
    lcd.print("25");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));

    
    }

        if (volt < 15 && volt >= 14.4){
    lcd.setCursor(13,1); 
    lcd.print("50");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    
    }
        if (volt < 16.3 && volt>=15){
    lcd.setCursor(13,1); 
    lcd.print("75");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    
    }
        if (volt >= 16.3){
    lcd.setCursor(13,1); 
    lcd.print("100");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    lcd.setCursor(15,0); 
    lcd.write(byte(8));
    }
  delay(bekleme);
  toplam=0;
  volt=0;
}


void action5() {
   for (int b = 1; b < 31 ; b++) // dor döngüsü şartı
  {
  delay(10);
  // Read the Analog Input
  adc_value = analogRead(ANALOG_IN_PIN);
  // Determine voltage at ADC input
  adc_voltage  = (adc_value * ref_voltage) / 1024.0;
  // Calculate voltage at divider input
  in_voltage = adc_voltage*(R1+R2)/R2;
  toplam =toplam + in_voltage;
  }

  volt= (toplam)/30;

    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.print("5 S");
    lcd.setCursor(10,0); 
    lcd.print("->");  
    lcd.setCursor(0,1); 
    lcd.print("Volt:");
    lcd.setCursor(11,1); 
    lcd.print("%");
    lcd.setCursor(5,1); 
    lcd.print(volt);

    if (volt < 18.3){
    lcd.setCursor(13,1); 
    lcd.print("0");
    lcd.setCursor(12,0); 
    lcd.print("XXXX");
    
    }

    if (volt < 18.7 && volt >= 18.3){
    lcd.setCursor(13,1); 
    lcd.print("25");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));

    
    }

        if (volt < 19.1 && volt >= 18.7){
    lcd.setCursor(13,1); 
    lcd.print("50");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    
    }
        if (volt < 20 && volt>=19.1){
    lcd.setCursor(13,1); 
    lcd.print("75");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    
    }
        if (volt >= 20){
    lcd.setCursor(13,1); 
    lcd.print("100");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    lcd.setCursor(15,0); 
    lcd.write(byte(8));
    }
  delay(bekleme);
  toplam=0;
  volt=0;
}


void action6() {
   for (int b = 1; b < 31 ; b++) // dor döngüsü şartı
  {
  delay(10);
  // Read the Analog Input
  adc_value = analogRead(ANALOG_IN_PIN);
  // Determine voltage at ADC input
  adc_voltage  = (adc_value * ref_voltage) / 1024.0;
  // Calculate voltage at divider input
  in_voltage = adc_voltage*(R1+R2)/R2;
  toplam =toplam + in_voltage;
  }

  volt= (toplam)/30;

    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.print("6 S");
    lcd.setCursor(10,0); 
    lcd.print("->");  
    lcd.setCursor(0,1); 
    lcd.print("Volt:");
    lcd.setCursor(11,1); 
    lcd.print("%");
    lcd.setCursor(5,1); 
    lcd.print(volt);

    if (volt < 22.4){
    lcd.setCursor(13,1); 
    lcd.print("0");
    lcd.setCursor(12,0); 
    lcd.print("XXXX");
    
    }

    if (volt < 23.1 && volt >= 22.4){
    lcd.setCursor(13,1); 
    lcd.print("25");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));

    
    }

        if (volt < 23.9 && volt >= 23.1){
    lcd.setCursor(13,1); 
    lcd.print("50");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    
    }
        if (volt < 24.4 && volt>=23.9){
    lcd.setCursor(13,1); 
    lcd.print("75");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    
    }
        if (volt >= 24.4){
    lcd.setCursor(13,1); 
    lcd.print("100");
    lcd.setCursor(12,0); 
    lcd.write(byte(6));
    lcd.setCursor(13,0); 
    lcd.write(byte(4));
    lcd.setCursor(14,0); 
    lcd.write(byte(5));
    lcd.setCursor(15,0); 
    lcd.write(byte(8));
    }
  delay(bekleme);
  toplam=0;
  volt=0;
}

 

 

Arduino Pil Ölçer Malzemeler;

  • Arduino nano
  • 16×2 lcd ekran i2c bağlantı modülü
  • Voltaj sensörü
  • mt3608 voltaj yükseltici
  • 18650 pil
  • 3 adet buton
  • on off anahtar
  • 2 adet banana soket yuvası dişi
  • tp4056 pil şarj modülü
Arduino Pil Ölçer
Bağlantı şeması

Aklınıza takılan kısımlar olursa yorumlar kısmından yazarak sorabilirsiniz.

 

SENDE YORUM EKLE..

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Maksimum dosya boyutu: 5 MB. Yüklenebilecek dosya tipi: image. Yorum metnine eklenen YouTube, Facebook, Twitter ve diğer servislerin bağlantıları otomatik olarak eklenecektir. Drop file here