|
Тестер литиевых и железофосфатных аккумуляторов
| |
| Пт, 13.03.2020, 17:14 | Сообщение # 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В аккумуляторы пытать Один сам пытался русифицировать, не очень удачно конечно но вроде получилось
|
|
| Пт, 13.03.2020, 17:17 | Сообщение # 112
|
булат
Постов: 554
Друзья |
Если оптимизировать программу то и в атмега8 должно влезть (много повторяющихся моментов завернуть в подпрограммы),у меня только ли-ион аккумуляторы сотовых,так что многое выкинул из кода Лекс59, я пока не сталкивался с тем что от долгого хранения заряженных аккумуляторов им становилось хуже,но в том же ГОСТ-те вроде написано что долгое хранение желательно при заряде на 50%Добавлено (13.03.2020, 18:24) ---------------------------------------------
Цитата alyns85 ( ) можно задать напряжение до которого желаем разрядить аккумулятор, вместо мосфета используется реле А разница-мосфет,реле,транзистор как здесь? Ток разряда измеряется довольно точно,по крайней мере у меня
Цитата alyns85 ( ) контрастом дисплея управляет сам контролер Можно припаять временно переменный резистор,выставить нормальную контрастность,измерить сопротивление резистора и впаять постоянный резистор того же номинала (ну +-10%)
|
|
| Пт, 13.03.2020, 17:33 | Сообщение # 113
|
alyns85
Постов: 139
Друзья |
Цитата булат ( ) Можно припаять временно переменный резистор,выставить нормальную контрастность,измерить сопротивление резистора и впаять постоянный резистор того же номинала да оно понятно это, но просто я ни в одном проекте на 1602 такого не встречал, везде резисторы, я бы обязательно это добавил, если бы шарил в коде
|
|
| Пт, 13.03.2020, 17:42 | Сообщение # 114
|
iharl
Постов: 119
Друзья |
Цитата alyns85 ( ) я ни в одном проекте на 1602 такого не встречал Да потому что пока не выставишь контрастность на 1602 картинки нет от слова совсем. Вот не кто и не мается ......
|
|
| Пт, 13.03.2020, 17:46 | Сообщение # 115
|
булат
Постов: 554
Друзья |
Причем здесь код? Контрастность дисплея зависит только от напряжения на выводе 3 дисплея,которое устанавливается резисторами Можно конечно усложнить-сделать шим и им регулировать контраст,но зачем такие жертвы...Установил резистор и забыл пока дисплей живой
|
|
| Пт, 13.03.2020, 17:49 | Сообщение # 116
|
alyns85
Постов: 139
Друзья |
Ну всё-всё убедили, что это ни есть хорошо!
Добавлено (13.03.2020, 19:08) --------------------------------------------- вот проба моей русификации
|
|
| Пт, 13.03.2020, 18:21 | Сообщение # 117
|
iharl
Постов: 119
Друзья |
Цитата alyns85 ( ) Вот к примеру у меня китайские дисплеи русского не знают. Только латиницу.
|
|
| Пт, 13.03.2020, 18:23 | Сообщение # 118
|
булат
Постов: 554
Друзья |
Русификация-это когда сам рисуешь буквы и зашиваешь в память дисплея,там всего 8 вариантов
|
|
| Пт, 13.03.2020, 18:28 | Сообщение # 119
|
alyns85
Постов: 139
Друзья |
Цитата iharl ( ) Вот к примеру у меня китайские дисплеи русского не знают. Только латиницу Я тоже раньше думал, что ни знают но оказывается, что их можно этому научить русскому с помощью специальной библиотеки
|
|
| Пт, 13.03.2020, 18:47 | Сообщение # 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 символов,это "юяйгжлфц",остальные игнорируются
|
|
Внимание! Форум переехал на Tehnodium.ru
|
|