РАДИОСХЕМЫ



СТАРЫЙ ФОРУМ

ФОРУМ НА ЭЛВО

РАДИОФОРУМЫ


СХЕМЫ И СТАТЬИ
  • БЛОГИ
  • НОВОЕ
  • СХЕМЫ
  • РАЗНОЕ
  • ТЕОРИЯ
  • ТЕЛЕВИДЕО
  • СВЕТОДИОД
  • МЕДТЕХНИКА
  • БЫТТЕХНИКА
  • ИЗМЕРИТЕЛИ
  • СПРАВОЧНИК
  • ТЕХНОЛОГИИ
  • РЕМОНТ СХЕМ
  • МОБИЛЬНИКИ
  • КОМПЬЮТЕРЫ
  • НАЧИНАЮЩИМ
  • ЗАРЯДКИ И АКБ
  • СИГНАЛИЗАЦИИ
  • АУДИОТЕХНИКА
  • АВТОВЕЛОМОТО
  • БЛОКИ ПИТАНИЯ
  • РАДИОПРИЁМНИКИ
  • МЕТАЛЛОИСКАТЕЛИ
  • МИКРОКОНТРОЛЛЕР
  • РАДИОПЕРЕДАТЧИКИ


  • Архив - только для чтения
    Тестер литиевых и железофосфатных аккумуляторов
    Пт, 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 ()
    вот проба моей руссификации
    https://youtu.be/_7LfnKm3Xxc

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

    Я тоже раньше думал, что ни знают но оказывается, что их можно этому научить русскому с помощью специальной библиотеки
    Файлы: 16x2.rar (44.1 Kb)
    Пт, 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 символов,это "юяйгжлфц",остальные игнорируются
    Файлы: 7628663.jpg (33.5 Kb)
    Поиск:

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



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