Перейти к содержанию

Нужна помощь - разобраться с кодом скетча


Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

приветствую откликнувшихся на просьбу)

просто когда начал постить тему, то форум глючил до невозможности, по этому не дописал.

теперь, собственно, вопрос - скетч работает только на первом кейсе, а дальше ну никак не переходит. я уже максимально все упростил чтобы буквально по шагам все разобрать. осталось только функцию "выкинуть", а так всё - идеи закончились. почему не срабатывает условие перехода на второй кейс я не знаю.

может кто глянет свежим взглядом - где косяк?

П. С. этот идусский код я сам сочинял, это не в чужом колупаюсь - коменты мои

Спойлер
#include <LiquidCrystal_I2C.h>
int analogPin = 0;                //пин, который "меряет" напряжение аккума
//float val = 0;
//uint32_t tmr1;
//float valkoef = 0;
float volt_limit_min = 10.5;      //минимальное напряжения аккума
float volt_limit_max = 14.4;      //макс напряжения аккума
int counter = 1;                  //иниц. счетчика этапов работы
const int rele = 2;               //задаем номер пина который управляет реле перек. ЗАРЯД-РАЗРЯД
LiquidCrystal_I2C lcd(0x27,16,2); //объявление дисплея

void setup() {
      lcd.init();
      lcd.backlight();
      pinMode (rele, OUTPUT);
}

void loop() {
  switch (counter) {
    case 1:                       // разряжаем до значения 10,5 вольт
      digitalWrite (rele, LOW);
      lcd.clear();
      lcd.setCursor (0,0);
      lcd.print ("Razryad");
      if (voltFunc() <= volt_limit_min)
        counter == 2;
      delay(3000);
      break;
      
      /*
       if (millis() - tmr1 >= 3000){    //режим разрядки на millis()
        tmr1 = millis();
        digitalWrite (rele, LOW);
        lcd.clear();
        lcd.setCursor (0,0);
        lcd.print ("Razryad");
          if (voltFunc() <= volt_limit_min)
            counter == 2;
       }
       break;
       */
    case 2:                        // начинаем зарядку до 14,4 после разряда
      digitalWrite (rele, HIGH);
      lcd.clear();
      lcd.setCursor (0,0);
      lcd.print ("Zaryad");
      if (voltFunc() >= volt_limit_max)
        counter == 3;
      delay(3000);
      break;
    case 3:                        // просто качели для поддержания аккума
      digitalWrite (rele, LOW);
      lcd.clear();
      lcd.setCursor (0,0);
      lcd.print ("Razryad");
      delay(3000);
      digitalWrite (rele, HIGH);
      lcd.clear();
      lcd.setCursor (0,0);
      lcd.print ("Zaryad");
      delay(3000);
      break;
    default:                      //режим КАЧЕЛИ если что-то пошло не так
      digitalWrite (rele, LOW);
      lcd.clear();
      lcd.setCursor (0,0);
      lcd.print ("Razryad");
      voltFunc();
      delay(3000);
      digitalWrite (rele, HIGH);
      lcd.clear();
      lcd.setCursor (0,0);
      lcd.print ("Zaryad");
      voltFunc();
      delay(3000);
      break;
  }
}
  
float  voltFunc() {               // функция вычисляет напряжение - возвращает напряжение
  float sum = 0;
  float val = 0;
  float valkoef = 0;
  for (int i = 0; i < 10; i++){
    valkoef = analogRead(analogPin);  // считываем значение напряжения с аналогового порта
    sum += valkoef;                   //суммируем 10 значений для расчета среднего
  }
    sum /= 10;                        //рассчитываем среднее значение
    val = sum / 68;               //рассчитываем, непосредственно, напряжение
      lcd.setCursor (0,1);            //выводим
      lcd.print ("Vbat - ");          //        напряжение
      lcd.print (val);                //                  на экран
      lcd.setCursor (13,1);           //выводим  изначальное значение с "вольтметра"
      lcd.print (valkoef);                //в правом нижнем углу
      delay(1000);
      return val;
}      

 

 

Изменено пользователем SHUSTER
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В паре мест:

counter ==2; как написал Yurkin2015  заменить на counter=2; 

И в одном месте counter==3 заменить на counter=3;

 И ещё в этом месте лучше вот так написать

sum /= 10.0; //рассчитываем среднее значение

val = sum / 68.0;

Ссылка на комментарий
Поделиться на другие сайты

а-а, ну теперь понятно. т. е. я перепутал "равенство" с "присвоить", поэтому counter и не растет.

спасибо, люди добрые, впредь буду внимательнее

22 часа назад, leshasoft сказал:

sum /= 10.0; //рассчитываем среднее значение

val = sum / 68.0;

это при работе с типом float всегда так нужно?

Ссылка на комментарий
Поделиться на другие сайты

@SHUSTER Необязательно. Если в арифметической операции одна из переменных типа float, то все остальные участники сначала тоже преобразуются во float, а потом уже производится вычисление. Здесь переменная sum типа float, поэтому sum/=10 и sum/=10.0 дадут одинаковый результат. 

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • У тебя хотя бы питальник мощностью в 50-70 Ватт есть, чтобы это утверждать, или опять по клаве PC-ка в своём Микрокапе настучал? @VIT13, мальчик, ты гонор-то свой  лучше засунул бы себе меж полужопиц! "Мой худ...".(с) При чём здесь твоя кривая поделка в фанерной коробке? Ты хоть первоисточник по JLH-69 видел? Я, если что, этих "худов", начиная с такого же, как ты сейчас, возраста и позже, уже учась в ВУЗ-е, сделал с десяток штук. При чём всегда собирал их на тех транзисторах и по той схеме, что указал в своей статье John Linsley Hood. Если ты считаешь, что он был безмозглым маразматиком, не умеющим ни считать, ни измерять, то... мне жаль тебя - ты безнадёжен. 
    • @dimanaviator где вы тут делитель увидели? Срисуйте правильно.
    • А лучший вариант предложил Огонек:
    • PS Я слепой определенно. Проглядел что было на графике в стартовом посте - температура Но тем не менее, симуляции микрокапа у меня доверия в этом плане ноль. Я про реальные испытания  
    • И в чем же хрень? Вполне соответствует предложенному ТЗ - от насоса поступает постоянное напряжение 10 вольт. Видимо, это не напряжение питания мотора насоса, а от какой-то управляющей схемы. Или это насос от аквариума, маломощный, или еще что-то. "Есть в мире многое такое, друг Горацио, что и не снилось нашим мудрецам!" 
    • @beggar Учитывая, что Вам влом читать статьи, ща я вкратце поясню (но было бы лучше, Вам прочитать учебники). DCA режим мультиметра - это измерение среднего значения тока. в этом режиме, мультиметр измеряет - какой заряд, протёк за одну секунду, через поперечное сечение проводника. ЗЫ имеет значение, какое число электронов, прошло через поперечное сечение, за одну секунду, и не важно: с какой скоростью они двигались, быстро, медленно, толпами или строем,  главное - сколько. Это среднее значение тока. Действующее значение тока - это вовсе не ток, а его мощностной эквивалент. Здесь важна и скорость электронов, чем быстрее движутся электроны, тем больше потери энергии. Когда по проводнику протекает какой-то ток, на проводнике выделяется тепловая энергия, мощностью P=I*I*R. Рассмотрим случай, когда ток в 1 А протекает в течении 1 секунды, через проводник сопротивлением 1 Ом, тогда мощность равна P=I*I*R=1*1*1=1 Вт. Теперь рассмотрим другой случай, когда тот же ток в 1 ампер (среднее значение), протекает импульсом тока величиной 10 А, продолжительностью 0.1 секунды и паузой продолжительностью 0.9 секунды. тогда мощность выделяющаяся в течении 0.1 секунды P=I*I*R=10*10*1=100 Вт, а в течении 0,9 секунды, т.е. ещё 9 раз по 0,1 секунды 0 Вт, таким образом, мощность выделяющаяся в течении секунды 100/10=10 Вт. Получается, что ток, который покажет амперметр среднего значения - одинаковый, а теплота, выделяющаяся на проводнике, во втором случае, в 10 раз больше. Это какой же ток должен протекать через проводник, чтоб выделялась такая же мощность на проводнике? - получается 3.16 А, P=I*I*R=3.16*3.16*1=10 Вт. Вот амперметр среднеквадратичного значения, в первом случае, показал бы 1 А, а во втором 3.16 А. Получается, что заряд таким током (второй вариант - с импульсным током), заряжал бы аккумулятор током 1 А, а: проводники трансформатора, провода, предохранители, шунты амперметров... грелись бы, как будто по ним проходил бы постоянный ток 3.16 А. при этом, амперметр среднего значения, показывал бы ток 1 А, а амперметр действующего значения 3.16 А. ЗЗЫ хочется верить, что Вам не придётся объяснять, чем отличается - емкость конденсатора, от емкости аккумулятора…
    • что нужно изменить и в какую сторону чтобы повысить напряжение? сейчас 12В хочу попробовать сделать 18-20В, что изменить в делителе?  
×
×
  • Создать...