Merhaba, bu yazımızda batarya içindeki pillerin (özellikle li-ion pil olmak üzere) gerilimini ve elektrik akımını Arduino ile nasıl ölçülebileceğini anlatacağız. Bu devrede Lipo batarya seviye ölçümü de ayrıca mümkündür.
Pil ve Batarya Aynı Şey mi?
Pil ve Batarya birbirlerini tamamlar niteliktedirler. Pil ve Batarya arasındaki fark ise genellikle merak edilmektedir. Pil dediğimiz şey kimyasallardan oluşan bir hücredir, batarya ise hücrelerin birleştirilmiş halidir. Az sonra nasıl çalıştığını anlatacağımız olan Batarya seviye ölçer veya Pil seviye ölçer olarak adlandırılan devremizi oluşturarak bataryanın durumunu ölçebilecek ve bu sayede kolayca bozuk olan hücreleri (cells) farkedebileceğiz.
Arduino ile Batarya Seviye Testi Nasıl Çalışır?
Batarya içindeki hücreler iyi durumda ise MOSFET üzerinde bulunan SWITCH’e talimat verip MOSFET’i ON yaptıktan sonra pilin pozitif terminali üzerinden akım geçmesi için talimat verir ve değerler OLED Ekranın üzerinde gösterilmeye başlar. MOSFET’in görevi yük direnci ile hücre arasındaki bağlantıyı duruma göre kesip bağlamak. Tabi bu ölçüm bataryayı belli bir süre sonra deşarj eder. Ölçerin gösterdiği voltaj ve akım değerleri tam kesin olmasa bile yakın bir değere sahiptir. Arduino, gerilimi (voltage) yük dirençlerinin üzerinden ölçer ve sonrasında bulunan gerilim değeri direnç (Resistance) değeriyle bölerek akım (Current) değerini bulmuş oluruz. Akım değerini zaman ile çarptıktan sonra ise pilimizin kapasitesini yani mAh’ını (milliampere-hour) bize vermiş olur.
Bu hesaplama işlemleri basitçe OHM Kanunu ile yapılabilir:
- Akım Hesaplaması: Akım (I) = Voltaj (V) – MOSFET üzerindeki voltaj düşüşü / Direnç (R)
- Kapasite Hesaplaması: Depolanan Şarj (Q) = Akım (I) x Zaman (T)
Ölçüm yapıldığında pil yeterli güce sahip ise aşağıdaki şekilde tam ölçümü görebileceksiniz.
Eğer pil yetersiz ise projeyi çalıştırdığınızda aşağıdaki şekilde bile sonuçla karşılacaksınız.
Batarya testi için Gerekli Malzemeler
- 1 Adet Arduino Nano (Tercihe bağlı olarak Arduino Uno ile Batarya Testi de yapılabilir.
- 4 Adet 10kΩ Direnç
- 1 Adet OLED Ekran SSD 1306
- 1 Adet Buzzer
- 1 Adet Breadboard
- 1 Adet Li-ion için Pil Yuvası veya AA Pil Yuvası
- 2 Adet 5W 4.7R Taş Direnç (Load Resistor)
- 1 Adet MOFSET-IRFZ44
- Yetecek Kadar Erkek-Erkek Jumper Kablo
Arduino ile Batarya Seviye Testi Devre Şeması
Batarya testi için Kullanılan Kütüphanelerin Kurulumu
Arduino IDE’yi açın ve kodu çalıştırmadan önce talimatları aynı şekilde yerine getirdiğinize emin olun, aksi takdirde kodunuz çalışmayacaktır.
1.Arduino IDE’yi açın ve üst menüden Sketch’e basın.
2. Include library üzerinden Manage Libraries seçeneğine tıklayın.
3.Arama kutucuğuna U8GLIB yazın ve aşağıdaki resimdeki gözüken kütüphaneyi en son sürümü seçerek indirdikten sonra Arduino IDE’yi kapatıp tekrardan açın. Artık kodumuz Arduino üzerinde çalıştırılmak için hazır, şimdi aşağıdaki Arduino kodunu açmış olduğumuz Sketch’e yapıştırıp Arduino’ya Upload yapabiliriz.
Arduino ile Batarya Testi Proje Kodu
#include "U8glib.h"
#define MOSFET_Pin 2
#define Bat_Pin A0
#define Res_Pin A1
#define Buzzer_Pin 9
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI
float Capacity = 0.0; // Kapasite mAh
float Res_Value = 9.4; // Dirençin Ohm Değeri
float Vcc = 4.64; // Arduino 5V Pin Voltajı (Multimetre ile ölçüldü)
float Current = 0.0; // Akım Amper
float mA=0; // Akım mA
float Bat_Volt = 0.0; // Batarya Gerilimi
float Res_Volt = 0.0; // Dirençin alt ucundaki Voltaj Değeri
float Bat_High = 4.3; // Yüksek Batarya Voltajı
float Bat_Low = 0.9; // Düşük Batarya Voltajı
unsigned long previousMillis = 0; // ms (milli-second) Geçen Zaman
unsigned long millisPassed = 0; // ms (milli-second) Şuanki Zaman
float sample1 =0;
float sample2= 0;
int x = 0;
int row = 0;
//************************ OLED Ekrana Yazdırma İşlevi *******************************************************
void draw(void) {
u8g.setFont(u8g_font_fub14r); // Yazı Tipi Seçme
if ( Bat_Volt < 0.5){
u8g.setPrintPos(10,40); // Pozisyon ayarlama
u8g.println("No Battery!");
}
else if ( Bat_Volt > Bat_High){
u8g.setPrintPos(25,40); // Pozisyon ayarlama
u8g.println("High-V!");
}
else if(Bat_Volt < Bat_Low){
u8g.setPrintPos(25,40); // Pozisyon ayarlama
u8g.println("Low-V!");
}
else if(Bat_Volt >= Bat_Low && Bat_Volt < Bat_High ){
u8g.drawStr(0, 20, "Volt: "); // X ve Y eksenlerinde ekrana string ekleme
u8g.drawStr(0, 40, "Curr: ");
u8g.drawStr(0, 60, "mAh: ");
u8g.setPrintPos(58,20); // Pozisyon ayarla
u8g.print( Bat_Volt,2); // Batarya Voltajını Volt olarak ekranda gösterme
u8g.println("V");
u8g.setPrintPos(58,40); // Pozisyon ayarla
u8g.print( mA,0); // Akımı mA olarak ekranda gösterme
u8g.println("mA");
u8g.setPrintPos(58, 60); // Pozisyon yarlama
u8g.print( Capacity ,1); // Kapasiteyi mAh olarak ekranda gösterme
}
}
//******************************Buzzer Bip Sesi İşlevi*********************************************************
void beep(unsigned char delay_time){
analogWrite(9, 20); // Bip sesi oluşturmak için PWM sinyali
delay(delay_time); // deleayms'i bekle
analogWrite(Buzzer_Pin, 0); // 0 Bip sesini kapatır
delay(delay_time); // delayms'i bekle
}
//*******************************Kurulum İşlevi***************************************************************
void setup() {
Serial.begin(9600);
pinMode(MOSFET_Pin, OUTPUT);
pinMode(Buzzer_Pin, OUTPUT);
digitalWrite(MOSFET_Pin, LOW); // MOSFET Başlama Süresince Kapalı.
Serial.println("CLEARDATA");
Serial.println("LABEL,Time,Bat_Volt,capacity");
//Serial.println("Arduino Battery Capacity Tester v1.0");
//Serial.println("BattVolt Current mAh");
}
//********************************Ana Döngü İşlevi***********************************************************
void loop() {
// Vcc = readVcc()/1000.0; // mV'yi Volt'a dönüştür
// Voltage devider Out = Bat_Volt * R2/(R1+R2 ) // R1 =10K and R2 =10K
//************ Batarya Voltajı Ölçümü ***********
for(int i=0;i< 100;i++)
{
sample1=sample1+analogRead(Bat_Pin); //Bölücü devreden Voltajı okur
delay (2);
}
sample1=sample1/100;
Bat_Volt = 2* sample1 *Vcc/ 1024.0;
// ********* Direnç Voltajı Ölçümü ***********
for(int i=0;i< 100;i++)
{
sample2=sample2+analogRead(Res_Pin); //Bölücü Devre üzerinden voltajı okur
delay (2);
}
sample2=sample2/100;
Res_Volt = 2* sample2 * Vcc/ 1024.0;
//********************* Farklı Koşulları Kontrol Etme *************
if ( Bat_Volt > Bat_High){
digitalWrite(MOSFET_Pin, LOW); // MOSFET kapatıldı // Deşarj Yok
beep(200);
Serial.println( "Warning High-V! ");
delay(1000);
}
else if(Bat_Volt < Bat_Low){
digitalWrite(MOSFET_Pin, LOW);
beep(200);
Serial.println( "Warning Low-V! ");
delay(1000);
}
else if(Bat_Volt > Bat_Low && Bat_Volt < Bat_High ) { // Batarya Voltajının güvenli limit içerisinde olup olmadığını kontrol etme
digitalWrite(MOSFET_Pin, HIGH);
millisPassed = millis() - previousMillis;
Current = (Bat_Volt - Res_Volt) / Res_Value;
mA = Current * 1000.0 ;
Capacity = Capacity + mA * (millisPassed / 3600000.0); // 1 Hour = 3600000ms
previousMillis = millis();
Serial.print("DATA,TIME,"); Serial.print(Bat_Volt); Serial.print(","); Serial.println(Capacity);
row++;
x++;
delay(4000);
}
//**************************************************
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
//*************************************************
}
Arduino ile Batarya Seviye Testi Proje Videosu
Arduino batarya seviye testi projemizin sonuna geldik. Projenin tüm aşamalarını gördüğümüze göre artık siz de kendi Batarya seviye ölçerinizi yapabilirsiniz. Bu projedeki ihtiyacınız olan Arduino Nano, Direnç, OLED Ekran ve batarya testi için gerekli ve diğer gerekli malzemelere web sitemizden ulaşabilirsiniz. Bir sonraki projede görüşmek üzere!