РАДИОСХЕМЫ



СТАРЫЙ ФОРУМ

Форум на ЭЛВО


РАДИОФОРУМЫ


СХЕМЫ И СТАТЬИ



Архив - только для чтения
Тестер литиевых и железофосфатных аккумуляторов
Сообщение # 111        
alyns85
аватар
  Постов: 139   Друзья 
Я уже ни один вариант этого тестера перепробовал (все на ардуино), и все они чем-то меня ни устраивают, этот будет наверное уже пятым.
В одном из опробованных есть удобная функция перед началом теста можно задать напряжение до которого желаем разрядить аккумулятор, вместо мосфета используется реле.
В другом понравилось, что контрастом дисплея управляет сам контролер (не нужно городить лишний переменник на плату, лично мне показалось очень удобно), если кому интересно вот скетч

Код
#define MOSFET_Pin 2
#define Bat_Pin A0
#define Res_Pin A1
#define Buzzer_Pin 9
#include <LiquidCrystal.h> // Incluye la Libreria LiquidCrystal

LiquidCrystal lcd(4, 5, 10, 8, 7, 6); // Crea un Objeto LC. Parametros: (rs, enable, d4, d5, d6, d7)
float Capacity = 0.0; // Capacity in mAh
float Res_Value = 3.7; // Resistor Value in Ohm
float Vcc = 4.87; // 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.2; // Battery High Voltage
float Bat_Low = 3.0; // 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;
int contraste =80;
unsigned long inicio, finalizado, Ttranscurrido;
float h, m, s;
unsigned long terminado;

//************************ OLED Display Draw Function *******************************************************

void draw(void) {

analogWrite(3,contraste);
if ( Bat_Volt < 1){
lcd.setCursor(0,0); // set position
lcd.print(" Sin Bateria ");
}
else if ( Bat_Volt > Bat_High){
lcd.setCursor(0,0); // set position
lcd.print(" Sobrecarga ");
}
else if(Bat_Volt < Bat_Low){
lcd.setCursor (0,0); // set position
lcd.print(" Bateria Baja ");
}
else if(Bat_Volt >= Bat_Low && Bat_Volt < Bat_High ){

lcd.clear();
lcd.setCursor (0, 0);
lcd.print ("V:"); // put string of display at position X, Y
lcd.setCursor (3, 0);
lcd.print(Bat_Volt,2); // display Battery Voltage in Volt
lcd.setCursor (9, 0);
lcd.print(h,0);
lcd.print(":");
lcd.print(m,0);
lcd.print(":");
lcd.print(s,0);
lcd.setCursor (0, 1);
lcd.print("C:");
lcd.setCursor (2,1);
lcd.print(mA,0); // display current in mA

lcd.setCursor(7,1);
lcd.print("mAh:");
lcd.setCursor(11,1);
lcd.print(Capacity,0); // 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, HIGH); // 0 turns it off
delay(delay_time); // wait for a delayms ms

}

//*******************************Setup Function ***************************************************************
void bienvenida()
{
lcd.setCursor (1,0);
lcd.print ("Comprobador de");
lcd.setCursor (1,1);
lcd.print ("Baterias 18650");
delay (2000);
lcd.clear();
}

void setup() {

lcd.begin(16,2);
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");
bienvenida();

}
//********************************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;//1024

//********************* 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(500);
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
inicio = millis();
Ttranscurrido = inicio;
h = int(Ttranscurrido / 3600000);
terminado = Ttranscurrido % 3600000;
m = int(terminado / 60000);
terminado = terminado % 60000;
s = int(terminado / 1000);

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(500);

}

draw();
delay (100);
}


В третьем можно за раз три банки пытать.
В четвёртом можно 12В аккумуляторы пытать
Один сам пытался русифицировать, не очень удачно конечно но вроде получилось
Сообщение # 112        
булат
аватар
  Постов: 554   Друзья 
Если оптимизировать программу то и в атмега8 должно влезть
(много повторяющихся моментов завернуть в подпрограммы),у меня только ли-ион аккумуляторы сотовых,так что многое выкинул из кода
Лекс59, я пока не сталкивался с тем что от долгого хранения заряженных аккумуляторов им становилось хуже,но в том же ГОСТ-те вроде написано что долгое хранение желательно при заряде на 50%

Добавлено (13.03.2020, 18:24)
---------------------------------------------

Цитата alyns85 ()
можно задать напряжение до которого желаем разрядить аккумулятор, вместо мосфета используется реле

А разница-мосфет,реле,транзистор как здесь?
Ток разряда измеряется довольно точно,по крайней мере у меня
Цитата alyns85 ()
контрастом дисплея управляет сам контролер

Можно припаять временно переменный резистор,выставить нормальную контрастность,измерить сопротивление резистора и впаять постоянный резистор того же номинала (ну +-10%)
Сообщение # 113        
alyns85
аватар
  Постов: 139   Друзья 
Цитата булат ()
Можно припаять временно переменный резистор,выставить нормальную контрастность,измерить сопротивление резистора и впаять постоянный резистор того же номинала

да оно понятно это, но просто я ни в одном проекте на 1602 такого не встречал, везде резисторы, я бы обязательно это добавил, если бы шарил в коде
Сообщение # 114        
iharl
аватар
  Постов: 119   Друзья 
Цитата alyns85 ()
я ни в одном проекте на 1602 такого не встречал

Да потому что пока не выставишь контрастность на 1602 картинки нет от слова совсем.
Вот не кто и не мается ......
Сообщение # 115        
булат
аватар
  Постов: 554   Друзья 
Причем здесь код?
Контрастность дисплея зависит только от напряжения на выводе 3 дисплея,которое устанавливается резисторами
Можно конечно усложнить-сделать шим и им регулировать контраст,но зачем такие жертвы...Установил резистор и забыл пока дисплей живой
Сообщение # 116        
alyns85
аватар
  Постов: 139   Друзья 
Ну всё-всё убедили, что это ни есть хорошо!

Добавлено (13.03.2020, 19:08)
---------------------------------------------
вот проба моей русификации

Сообщение # 117        
iharl
аватар
  Постов: 119   Друзья 
Цитата alyns85 ()
вот проба моей руссификации
https://youtu.be/_7LfnKm3Xxc

Вот к примеру у меня китайские дисплеи русского не знают. Только латиницу.
Сообщение # 118        
булат
аватар
  Постов: 554   Друзья 
Русификация-это когда сам рисуешь буквы и зашиваешь в память дисплея,там всего 8 вариантов
Сообщение # 119        
alyns85
аватар
  Постов: 139   Друзья 
Цитата iharl ()
Вот к примеру у меня китайские дисплеи русского не знают. Только латиницу

Я тоже раньше думал, что ни знают но оказывается, что их можно этому научить русскому с помощью специальной библиотеки
Файлы: 16x2.rar (44.1 Kb)
Сообщение # 120        
булат
аватар
  Постов: 554   Друзья 
Результат на лицо!

исходник-

Код
#include <LiquidCrystal_1602_RUS.h>

//LiquidCrystal_1602_RUS lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal_1602_RUS lcd(3, 4, 5, 6, 7, 8);//For LCD Keypad Shield

void setup()
{
pinMode(9, OUTPUT);
digitalWrite(9, HIGH);
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.setCursor(1, 0);
lcd.print(L"Можно печатать");
lcd.setCursor(3, 1);
lcd.print(L"эюяйгжлфц");
}

void loop()
{
}

все правильно-рисуется только 8 символов,это "юяйгжлфц",остальные игнорируются
Файлы: 7628663.jpg (33.5 Kb)
Поиск:

Внимание! Форум переехал на Tehnodium.ru



© 2010-2022 "Форум Радиосхемы". All Rights Reserved  Почта  PDA