Projelerimiz

Arduino İle Batarya Seviye Testi

Bu projemizde şarjlı pillerin ne kadar yüksek verimli olup olmadığını ölçmek için bir devre oluşturacağız. Yurtdışından satın aldığınız şarjlı piller genellikle sahte çıkmaktadır.2000 mAh diye satın aldığımız bir şarjlı pilin içerisinden bildiğimiz çinko karbon pil çıktı.Dış kısmına kaplama yapmışlar.

Bu proje ile pillerinizi gerçekte ne kadarlık kapasiteye sahip olup olmadığı ölçebileceksiniz.Normal ölçü aletleri ile pillerinizin gerilimini kolayca ölçebilmektesiniz.Ancak akım değerini ölçmek biraz zahmetli bir iş.Bu devreyi kurduktan sonra bu zahmehmetten tamamen kurtulacaksınız.

Malzemelerimiz

  • Arduino Nano
  • 0.96″ OLED Ekran
  • MOSFET – IRLZ44
  • 4 tane 10K (1/4W) direnç
  • Güç direnci ( 10R, 10W )
  • Klemens 2 lilerden 3 adet
  • Buzzer
  • Pertinaks

Aşağıdaki devre şemasına göre devrenizi pertinak üzerine kurun , gerekli lehimlemeleri ve kablolamaları yapın.

#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; // Capacity in mAh
float Res_Value = 10.0; // Resistor Value in Ohm
float Vcc = 4.64; // Voltage of Arduino 5V pin ( Mesured by Multimeter )
float Current = 0.0; // Current in Amp
float mA=0; // Current in mA
float Bat_Volt = 0.0; // Battery Voltage 
float Res_Volt = 0.0; // Voltage at lower end of the Resistor 
float Bat_High = 4.3; // Battery High Voltage
float Bat_Low = 2.9; // Discharge Cut Off Voltage
unsigned long previousMillis = 0; // Previous time in ms
unsigned long millisPassed = 0; // Current time in ms
float sample1 =0;
float sample2= 0;
int x = 0;
int row = 0;
 
//************************ OLED Display Draw Function *******************************************************
void draw(void) {
 u8g.setFont(u8g_font_fub14r); // select font
 if ( Bat_Volt < 1){
 u8g.setPrintPos(10,40); // set position
 u8g.println("No Battery!"); 
 }
 else if ( Bat_Volt > Bat_High){
 u8g.setPrintPos(25,40); // set position
 u8g.println("High-V!"); 
 }
 else if(Bat_Volt < Bat_Low){
 u8g.setPrintPos(25,40); // set position
 u8g.println("Low-V!"); 
 }
 else if(Bat_Volt >= Bat_Low && Bat_Volt < Bat_High ){
  
 u8g.drawStr(0, 20, "Volt: "); // put string of display at position X, Y
 u8g.drawStr(0, 40, "Curr: ");
 u8g.drawStr(0, 60, "mAh: ");
 u8g.setPrintPos(58,20); // set position
 u8g.print( Bat_Volt,2); // display Battery Voltage in Volt
 u8g.println("V"); 
 u8g.setPrintPos(58,40); // set position
 u8g.print( mA,0); // display current in mA
 u8g.println("mA"); 
 u8g.setPrintPos(58, 60); // set position
 u8g.print( Capacity ,1); // display capacity in mAh
  
}
}
//******************************Buzzer Beep Function *********************************************************
 
void beep(unsigned char delay_time){
 analogWrite(9, 20); // PWM signal to generate beep tone
 delay(delay_time); // wait for a delayms ms
 analogWrite(Buzzer_Pin, 0); // 0 turns it off
 delay(delay_time); // wait for a delayms ms
 
}
 
//*******************************Setup Function ***************************************************************
  
 void setup() {
 Serial.begin(9600);
 pinMode(MOSFET_Pin, OUTPUT);
 pinMode(Buzzer_Pin, OUTPUT);
 digitalWrite(MOSFET_Pin, LOW); // MOSFET is off during the start
 Serial.println("CLEARDATA");
 Serial.println("LABEL,Time,Bat_Volt,capacity");
  
 //Serial.println("Arduino Battery Capacity Tester v1.0");
 //Serial.println("BattVolt Current mAh");
 }
 //********************************Main Loop Function***********************************************************
 void loop() {
 // Vcc = readVcc()/1000.0; // Conevrrt mV to Volt
 
 // Voltage devider Out = Bat_Volt * R2/(R1+R2 ) // R1 =10K and R2 =10K 
  
 //************ Measuring Battery Voltage ***********
  
 for(int i=0;i< 100;i++)
 {
 sample1=sample1+analogRead(Bat_Pin); //read the voltage from the divider circuit
 delay (2);
 }
 sample1=sample1/100; 
 Bat_Volt = 2* sample1 *Vcc/ 1024.0;
 
// ********* Measuring Resistor Voltage ***********
 
for(int i=0;i< 100;i++)
 {
 sample2=sample2+analogRead(Res_Pin); //read the voltage from the divider circuit
 delay (2);
 }
 sample2=sample2/100;
 Res_Volt = 2* sample2 * Vcc/ 1024.0;
 
//********************* Checking the different conditions *************
  
 if ( Bat_Volt > Bat_High){
 digitalWrite(MOSFET_Pin, LOW); // Turned Off the MOSFET // No discharge 
 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 ) { // Check if the battery voltage is within the safe limit
 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() );
  
 //*************************************************
 }

İlgili Mesajlar

3 üzerinden “Arduino İle Batarya Seviye Testi” düşünenler;

  1. Denizhan dedi ki:

    KODUN İLK SATIRI HATA VERİYOR ACİL YARDİM İHTİYACIM VAR

    1. Rafet Ege dedi ki:

      Kütüphane için o U8glib.h kütüphanesini kurarsanız sorun çözülür

  2. çağan dedi ki:

    kodlarda hata veriyor yardımcı olurmusunuz

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir