avatar_UriBas

Продвинутое самодельное универсальное ЗУ на МК

Автор UriBas, 02 Апр. 2018 в 22:43

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Alex_Soroka

Цитата: Alex_N от 01 Нояб. 2018 в 07:35
Нужды в БД пока не увидел. Просто текстовый файл с протоколом.
вот именно  :wow:

Кass

#649
Цитата: Alex_Soroka от 31 Окт. 2018 в 17:20а не подскажете как БД запихнуть в маааленький проц Ардуины нано?   
:facepalm:  Ну что вы несете. Можно только ответить:
Цитата: Alex_Soroka от 31 Окт. 2018 в 17:20
походу вы вообще не понимаете о чем речь...

Вот именно, что вы вообще ничего не понимаете.

1. Вы явно ошиблись темой. Вы мыслите категориями для Ардуино, а тут тема про продвинутые ЗУ.
2. Вы мыслите категориями для Ардуино, и потому все пытаетесь засунуть в один кристалл. Для вас отсутствуют такие понятия как протоколы обмена данными.
3. То, о чем пишу я используется повсеместно в мире в системах автоматизации. То есть это как колесо атрибут любого автомобиля. Погуглите что такое SCADA.

Цитата: Cyberpapa от 31 Окт. 2018 в 17:36Разве  Кass предлагал пихать в проц Ардуины нано ?

Конечно. Любой грамотный человек сразу понимает о чем я пишу. Я не вижу проблем передавать через любой из интерфейсов в компьютер данные, миную беспроводные сети, если с ними проблема. Так же не вижу проблем установить на компьютер СУБД и передавать ей данные. Абсолютно любая СУБД имеет встроенные механизмы приема сторонних данных. :)

Цитата: Magic David от 01 Нояб. 2018 в 00:52мне кажется, что для данной задачи правильнее использовать что-то полегче, чем этот монстр, не такое прожорливое и работающее на разных платформах

Дело в том, что SQL наверное самая кросс платформенная штука. Она работает везде, в том числе и на этом форуме. Если мы говорим о продвинутых устройствах, а не моргалках начального уровня, то почему это не использовать? Это очень пригодится в том случае, если вы захотите как то обрабатывать ваши данные. Не просто выложить куда то лог, а сформировать любые отчеты, провести вычисления с массивом данных, отобрать нужные вам данные по определенным вами критериям. И если вы данные собираете к примеру 1 раз в секунду по сотне параметров и в течение месяца, то вы задолбаетесь потом обрабатывать это в тексте или экселе. Сможете максимум построить какой то график, выложить его, мол вот. И все. ;)

Цитата: Alex_N от 01 Нояб. 2018 в 07:35Если по минимуму - USB за глаза.

Это не более чем один из интерфейсов.

Цитата: Alex_N от 01 Нояб. 2018 в 07:35КС, что бы ни писал Сорока, приходится использовать.

Используйте один из стандартных протоколов, хоть MODBUS, и там уже все есть. Зачем изобретать велосипед?
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

Гербалайф от всех болезней, Кашпировский лучший врач,  Орифлейм самая лучшая косметика, а МММ самый лучший способ вложения денег. Кто бы спорил. ;)

Кass

Цитата: Alex_Soroka от 01 Нояб. 2018 в 10:22
вот именно  :wow:

Александр, тема "ПРОДВИНУТОЕ ЗУ". В продвинутом ЗУ текстовой файл как карбюратор в продвинутом автомобиле. :)
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

Гербалайф от всех болезней, Кашпировский лучший врач,  Орифлейм самая лучшая косметика, а МММ самый лучший способ вложения денег. Кто бы спорил. ;)

serggio

[user]Кass[/user], у каждого свое видение на виды файлов.
Мне тоже текстовые больше нравятся, в них легко представлять табличные данные (считайте логи)

Кass

#652
Цитата: serggio от 01 Нояб. 2018 в 10:51Кass, у каждого свое видение на виды файлов.

Не. Виды файлов и их структуру определяют производители софта. Файл той же MS SQL .mdb, у Foxpro кажется .bdf, и каждый имеет свои особенности. Я же не призываю писать микроконтроллером непосредственно в файл. ИМХО это не правильно. Это вообще начальный уровень программирования, типа бейсика. Вообще механизмы записи непосредственно в файл существуют не для этого. Как правило это используется для вывода в файл и на печать какого то отчета. В той же 1С выгрузка через текстовые файлы осуществляется. Но сами данные накапливаются, хранятся и обрабатываются в файлах баз данных. У 1С это .dbf и индексы .cdx, как у Foxpro. Файлы баз данных позволяют в десятки и сотни раз увеличить скорость обработки данных.

Цитата: serggio от 01 Нояб. 2018 в 10:51Мне тоже текстовые больше нравятся, в них легко представлять табличные данные (считайте логи)

Табличные данные легко представлять и в текстовом файле, и файле электронной таблице и в базе данных. Но если бы данные можно было бы без проблем обрабатывать в текстовом файле, то зачем бы люди разрабатывали и покупали электронные таблицы и СУБД? Вдумайтесь. Ну наверное же есть на это какие то причины. :)

Ну давайте рассмотрим простейший пример.

1. Пишем в таблицу 20 параметров флоатов (по 4 байта).
2. Пишем 1 раз в секунду, в течение 1 месяца. За 30 дней это 2 592 000 строк. В каждой 20 параметров. то есть почти 52 млн параметров в файле. Вот попробуйте создать такой текстовой файл.
3. Теперь пробуем выбрать из этого файла только те строки, где 1 параметр (к примеру напряжение) находится в диапазоне 13.0-15.0В, другой параметр (значение тока ) более 0.05А (то есть идет заряд) и добавить колонку, в которой нарастающим итогом считается среднее значение тока, колонку с нарастающим итогом емкости.

И запустите обработку.  :hello: Думаю можно оставлять комп, и проверить на следующий день, что там.

Теперь все тоже самое, только все это пишем в файл mdb через СУБД, пишем запрос на SQL, отправляем и через пару секунд получаем новую таблицу (или график) с интересующими нас данными, и только с нужными столбцами.
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

Гербалайф от всех болезней, Кашпировский лучший врач,  Орифлейм самая лучшая косметика, а МММ самый лучший способ вложения денег. Кто бы спорил. ;)

Alex_N

Касс делает всё эпохально. На кой хрен для ЗУ (какое продвинутое оно бы ни было) всё это надо ?
Ну с пяток кривулек, и вся любовь. Текстового файла за глаза. Ну если уж совсем неймётся - можно сразу в Excel.
А вообще снимаю шляпу.
Да и мониторчик у Касса классный !

Кass

Цитата: Alex_N от 01 Нояб. 2018 в 19:01На кой хрен для ЗУ (какое продвинутое оно бы ни было) всё это надо ?

А зачем вообще тогда заморачиваться с какими то файлами? :)  Ну зарядил, счетчики вывел на дисплей и все. ;)
АРМ стенда онлайн: http://scada.kontar.ru Пользователь: Электротранспорт, Пароль: 111111

Гербалайф от всех болезней, Кашпировский лучший врач,  Орифлейм самая лучшая косметика, а МММ самый лучший способ вложения денег. Кто бы спорил. ;)

SapienzSPB

#655
Цитата: Alex_N от 01 Нояб. 2018 в 19:01Касс делает всё эпохально.
Да. И подходы у нас разные. Константин имеет профильное образование и реальные знания, имеет априори безлимитный интернет и серийные разработки ПЛК с интегрированными интерфейсами и опытом их эксплуатации. На более низкий уровень ему переходить и не надо. Дорого по времени и силам.
Остальное большинство не имея внятного ТЗ, опыта общения с промышленными решениями и самих ПЛК, пытается подогнать исполнение задачи к тем ресурсам, которые у них есть в наличии.
Вот поэтому диалог сводится к мерянию пиписьками, вместо того чтобы все же выработать хотя бы ТЗ.
Я бы к примеру (если бы Касс предложил уже нечто мною описанное) прошел бы по его инструкции и повторил бы продвинутое ЗУ. Вместо этого пытаюсь заложить фундамент(связь и взаимодействие модулей) из того что могу  купить занедорого.
Касс, у меня один вопрос. Могут ли ПЛК связываться по воздуху в сеть и обмениваться данными без наличия интернета? Это не стёб. Я реально хочу узнать.
Спойлер

ПС. Гуляем с женой по Москве на этих выходных. Погода супер.

Alex_N

Цитата: SapienzSPB от 03 Нояб. 2018 в 01:16и повторил бы продвинутое ЗУ
Предпосылки абсолютно верные, а выводы совсем в другую сторону.
У нас чем страна всегда славилась - умением сделать из г-на конфетку. Придумать "Ниву" из бюджета коробки передач. И поразить весь мир. И лучшие зарядки сделаны , или будут сделаны не на ПЛК. А на том, что доступно - на Ардуино. То есть мозгами а не деньгами.

Паяка

[user]Alex_N[/user], если речь об Ардуино, это скорее умение сделать взрослые вещи из детского конструктора. Изучить справочный листок к микроконтроллеру и оптимизировать код вполне возможно, и Ардуино поможет, а не помешает вырасти до такого уровня. Мешает не Ардуино, а спешка, суета, отвлекающие факторы, и навязчивое искушение сделать тяп-ляп, которое эти факторы стимулируют.

Вот что мне в Ардуино (Уно, Мега) не нравится, так это проприетарный шаг между половинками разъёмов. Явно ведь сделано, чтобы обычные макетки под пайку применять не получалось. Зато мелкие Ардуины этого недостатка лишены.
GT TF1 60V 20Ah Chilwee DZF

Alex_N

Да при чем здесь пайка.  Ардуино это первый  и единственный пока проект, где начинающие могут не думая об дорогущей аппаратуре запросто реализовать именно алгоритмы а не схемотехнику. Тем более, что в решении , например, задачи зарядки АКБ, не надо ничего более навороченного. В Ардуино есть для этого всё.
А вообще, конечно, форум вырождается. И вместо реальных проблем обсуждается всякая фигня. Вот я выложил результат доморощенного десульфататора. И что, никаких вопросов и комментариев. Никому, видимо , это не интересно.
А я как Касс готов поделиться любой информацией.

Яков93

Цитата: Alex_N от 03 Нояб. 2018 в 21:53
А вообще, конечно, форум вырождается. И вместо реальных проблем обсуждается всякая фигня. Вот я выложил результат доморощенного десульфататора. И что, никаких вопросов и комментариев. Никому, видимо , это не интересно.
А я как Касс готов поделиться любой информацией.
Наверное уже слегка объелись различными чудо-десульфаторами. Слишком много разнообразной информации и нет каких-то понятных стабильных результатов.

Alex_N

Я не делю вопросы на нравится-не нравится. Есть вопрос - есть ответ.
Попробовал наконец восстановленные АКБ в UPS. Нагрузка - 190Вт ( 2 лампочки ). UPS 1кВт. 3 АКБ. Отработал 20 мин. Это много, или мало ?

Паяка

Цитата: Яков93 от 03 Нояб. 2018 в 22:13Слишком много разнообразной информации и нет каких-то понятных стабильных результатов.
Постепенно появляются. Акцент смещается от десульфатации к балансировке, (которая включает в себя десульфатацию, но не ограничивается ею). И не только на форуме, но и в изделиях разных производителей. Сначала появились ЗУ с 12-13-разрядными АЦП, затем с многоступенчатой или плавной авторегулировкой тока. Классические ЗУ приобрели режимы прерывателя и модуляции, импульсные добавили CC/CV режимы. Диалектика развития в действии.
GT TF1 60V 20Ah Chilwee DZF

UriBas

#662
В свете "космических технологий", под вдохновением фильма на ютубе
Спойлер
решил попробовать числа Фибоначи. Критика приветствуется, насмешки игнорируются, за дельные советы - благодарность.   На скорую руку написал программку.. не хотел выкладывать сразу, но потом подумал, что может кто-то заинтересуется и дополнит, поправит.. да и чтобы не затерялось случайно из-за разных навалившихся дел (что часто бывает).  В процессе написания, получилось так, что код вышел не большим, всего около 900 байт (В Ардуино Иде 1,0 под Тини13) .поэтому сначала сделал под Тиньку 13,  но переделаю под мегу328 и уже там будет отладка и разные дополнения. 
Схема стандартная, - сама Тиня13, питание, измерение через делитель 1/4 рассчитан на максимальное входное напряжение 20В, управление через мосфет, одна нога свободна - можно еще что-то придумать, например отключение БП на время паузы.   В схеме и в скетче надо пины переназначить, распределить более рационально на мой взгляд.. но на Тиньке пока не буду заморачиваться, сразу перехожу на мегу328.
Функциональная схема алгоритма
Спойлер
Описание алгоритма
Спойлер
   
Алгоритм
•   В основе БП для ЗУ лежит СС – ограничение тока по паспорту АКБ, напряжение может быть любым, главное, чтобы (хотя бы один раз) был выставлен (вручную) оптимальный ток заряда. В принципе легко сделать, чтобы БП автоматически отключался, когда включается режим КАЧЕЛИ или когда длинная пауза.
•   Сам заряд осуществляется автоматически и основан на саморегуляции среднего тока.  Используется  постепенное увеличение длительности заряда с паузами по принципу чисел Фибоначи.  Также осуществляется контроль верхнего и нижнего порога, контроль скорости снижения НРЦ. Сам заряд условно разбит на три этапа – 1) Раскачка 2) Основной заряд 3) Добивка.  В конце - режим сохранения "КАЧЕЛИ".    Когда АКБ уже не принимает ток заряда менее 2-3% от паспортнной емкости, включаются качели как по нижнему порогу, так и по скорости падения НРЦ..  Тем самым исключается «вечная пауза»..когда, к примеру, - АКБ в хорошем состоянии или с высоким НРЦ = 13,2В и малым падением напряжения.  Контроль по скорости падения НРЦ  позволяет использовать заниженный порог.. для чего? – К примеру, если одна банка сильнее засульфатирована и недозаряжена - тогда НРЦ быстро падает ниже 12,8В.. в результате, качели превращаются в интенсивную добивку и это может повлечь терморазгон в слабых или перезаряженных банках.  Снижение порога даст больше времени отдохнуть банкам (остыть и чтобы ушло расслоение эл-та) перед новым зарядом. 
•   Немного о числах Фибоначи, что это такое и почему взяты в основу? –Ученый Фибоначи заметил, что строение галактик, пчелинных сот, раковин улиток и т.д. построены по определенному принципу выраженному в числах – 0,1,1,2,3,5,8.. т.е. когда каждое последующее число есть сумма двух предыдущих..  Но это не все, между собой эти числа соотносятся как золотое сечение=1,61, которое заложено во всей природе и даже в самом человеке!
•   Об ИНДИКАЦИИ – индикация в простом варианте на трех светодиодах, каждый из которых отображает следующие режимы
o   1) Красный  - мигающий ожидает подключения АКБ, не мигающий – напр ниже 10,8В
o   2) Желтый мигающий – пауза, не мигающий – заряд
o   3) Зеленый – напряжение заряда достигло 14,4В, мигающий -  режим качели
Работа алгоритма[\b]
•   Если  НРЦ менее чем 1В (0,5) то это принимается как нет контакта с АКБ. и тогда Мк в «вечном» ожидании..  когда НРЦ будет выше 1В включается процесс заряда.
•   Если НРЦ больше 1В  включается «заряд РАСКАЧКА  по Фибоначи» – используются числа фибоначи для формирования импульсов заряда, или лучше сказать - временных интервалов заряда ..т.е.  идет «раскачка»  начиная от 100мл.сек.  - ..100, 100, 200, 300, 500, 800, 1300.. и т.д.  Конечная длит имп заряда не ограничена, так что если АКБ в хорошем состоянии и с большой емкостью, то заряд будет идти на максимальном токе, по полной программе, - почти непрерывно (с небольшими паузами).
•   На всем этапе, между интервалами заряда делается пауза в 7 секунд. Почему именно 7?  Ну просто отсечку по скорости падения напр. еще не сделал, + так проще, + и меньше памяти как бы.. а 7 секунд это как раз оптимально, на мой взгляд для раскачки.. Потом, когда длительность итервалов заряда будет несколько минут, по моим расчетам, увеличение времени заряда будет незначительна, зато раскачка (по идее) должна быть эффективная и полезная...
•   Если непрерывная длительность (имп) заряда будет больше 40минут, то делается пауза в 40секунд.. за это время пусть отдохнут  БП, ЗУ и АКБ.. Если к примеру заряд будет длится 12 часов, то паузы составят меньше 20 минут.. это не много.
•   Если напряжение при заряде достигло верхнего порога (14,2В), и при этом длит импульса была больше 500млсек, то заряд каждый раз начинается с РАСКАЧКИ  по числам Фибоначи, т.е. начинаются с интервала 0,1сек.. - т.е. каждый раз, как только достигнут порог, цикл заряда начинается с раскачки.. Можно еще сделать, чтобы верхний порог увеличивался, если длит имп будет (к примеру) меньше чем 1-2 сек.. ведь в таком случае, средний ток будет уменьшен в 7 раз.. т.е. около 0,015С или почти 2% .. что дает эффект выравнивание малым током при повышенном напряжении.
•   Если напряжение при заряде достигло верхнего порога > 14,4-15В) И при этом длительность импульса заряда не превысила 500 млсек (0,5сек) это означает, что АКБ уже "накушался"  и включаются "КАЧЕЛИ". 
           "Качели" хороши тем, что дают достаточное время на  самовыравнивание заряда по площади и по глубине активной массы, на остывание и на  устранение расслоения электролита - что повышает эффективность последующего цикла заряда с раскачкой.    С момента, когда включаются качели" - включается зеленый светодиод и отслеживается нижний порог НРЦ = 12,8 .. 12,4   Как уже говорил выше, можно выставлять пониженный порог без опасения "вечной паузы" или сильного разряда АКБ. потому, что отслеживается скорость падения НРЦ на уровне 60мВ за 24часа.. т.е. если за 24 часа напряжение не упало больше  чем на 0,06В – качели прерываются и заряд начинается с самого начала.. т.е. с раскачки.   
   .. Если аккумулятор в хорошем состоянии, то на уровне 12,8В скорость падения составляет не более чем 10-20мВ за 24 часа (за сутки), поэтому, по любому, качели сработают раньше 12,8В -  где-то на уровне 12,9-13,0В.  Тем самым АКБ будет поддерживаться в 100% готовности "к бою" без опасности перегрева и перезаряда.
      Если  в аккумуляторе есть слабые банки с сильной сульфатацией или после глубокого разряда, то тут как раз порог в 12,4В будет для них лучше, потому что это даст больше времени на их восстановление.  (!!! Возможно надо будет сделать, чтобы в таком случае загорался красный светодиод, - если НРЦ в качелях упало до 12,4В - что показывало бы на неисправность с одной стороны, с другой можно было следить за восставнолением !!)

По поводу аварийных ситуаций
•   Что произойдет, если вдруг отсоединить контакты?  ЗУ быстро перейдет в режим качелей, а потом в начало программы и в режим "вечного" ожидания контакта - заряд не будет включен и будет мигать красный светодиод.
•   От КЗ и переполюсовки (пока) полноценной защиты нет.. лучше не допускать. Но при желании, легко реализовать,  если дополнить схему и скеч соответвтующими (несложными) проверками. ( В последующих разработках надо бы это дело предусмотреть).
Скетч 
Спойлер
   
// 29.05.2019 8:58 При формировании заряда используются числа Фибоначи
// последний размер 28/5/19 20:38  - 878 байт ..
// Теперь качели не только по порогу, но и по скорости саморазряда = 60мВ/24часа если меньше - заряд.

// #include <util/delay.h> // библа для Тини 13 и можно применять  _delay_ms(1000); вместо delay(1000);

// #define ChargePin 5; // Пин для управления зарядом (симистором-оптроном, реле, мосфет)
//#define led1_Pin A7 // пин для мигания светиком - режим заряда
//#define vin_pin A4  // Пин для измерения напряжения до шунта
//#define vinakb_pin A0 // Пин для измерения напр на АКБ (после шунта на клеммах АКБ)
//#define simistor_pin A5  // Пин для управления симистором (оптроном)или реле
//#define knopka1_pin A3 // Пин для кнопки или кнопок (пока одной)
//#define  ChargePin  13    //Пин включения зарядки для Меги328

#define  ChargePin  2    //Пин включения зарядки для Тини13
// #define knopka1_pin A3 // Пин для кнопки 2
//#define   MaxVoltage  794     //Напряжение в конце зарядки, делитель 1/4, 20В = 1023, 15.5В = 794
#define   NormVoltage 736     //Напряжение 14,4 делитель 1/4, 20В = 1023, 14.4В = 736 это для убитых аккумов
//#define   NormVoltage 696     //Напряжение поддержки, делитель 1/4, 20В = 1023, 13.6В = 696 это для нормальных аккумов
#define   MinVoltage  552     //Напряжение в конце разрядки делитель 1/4, 20В = 1023, 10.8В = 552
#define   MinPorogKachel  635     //Нижний порог НРЦ  12,6=645, 12.4В = 635  12,8=655
//#define   break_Voltage  410     //Аварийное напряжение  делитель 1/4, 20В = 1023, 8.0 = 410

#define  VoltagePin 1    //Пин измерения напряжения на АКБ
//#define PauzaRaskachka = 7000;
//int PauzaRaskachka = 7000;

void setup(void){
//Serial.begin(9600); 
//Serial.println("cketch RASKACHKA 26/05/2019 21:15 ");
//pinMode(LoadPin, OUTPUT);  // конфигурация пина как выход
pinMode(ChargePin, OUTPUT); // включает заряд
pinMode(1, INPUT); // вольтметр, делитель из 62 кОм и 15 кОм(земля), значение в 1023 это будет 24.35 В.
//pinMode(2, OUTPUT); // релюха, симистор, мосфет, - включение заряда (отключение само собой тоже)
pinMode(3, INPUT); // кнопка, не тактовая либо будем измерять ток.. если позволит размер
// четвертый пин - земля, восьмой - питание
//  5 – красный, 6- желтый, 7-зеленый (пусть будут)
pinMode(5, OUTPUT); // 1-й светодиод красный, горит значит авария, мигает -отсутсвия контакта с АКБ
pinMode(6, OUTPUT); // 2-й светодиод  желтый - горит, значит идет заряд, часто мигает - пауза
pinMode(7, OUTPUT); // 3-й светодиод зеленый, если горит = КАЧЕЛИ, мигает если V >= 14,4В
// красный + желтый = напр ниже минимального (10,8В)
// зеленый мигающий + желтый = напр достигло порога 14,4 В
// зеленый + желтый = режим КАЧЕЛИ

//digitalWrite(ChargePin, 0);       //Отключаем зарядку
//digitalWrite(LoadPin, 0);         //Отключаем разряд (нагрузку)
//pinMode(Mode1Pin, INPUT_PULLUP);  // подтяжка внутренних резисторов
//pinMode(Mode2Pin, INPUT_PULLUP);
//pinMode(Mode3Pin, INPUT_PULLUP);
}

// функция раскачки по Фибоначи, идет непрерывно, при достижении порога (14,4) все начинается сначала
  void Raskachka () {
// раскачка постепенное увеличение с мин. длит имп 0,1сек  и фикс. паузы 7 сек
// используются глобальные переменные –  ChargePin
  // Serial.println("Raskachka");  // вывод в порт что идет раскачка
//lcd.setCursor(0,0); lcd.print("Raskachka");  // вывод в на экран что идет раскачка !определить курсор
// if (digitalRead(2) == HIGH) { // считывает состояние портов - кнопок
// }
int V =0;   
unsigned long StartTime =0;   //сразу вместо инт прибавило 18 байт
int PauzaRaskachka = 7000;

// ************ ГЛАВНЫЙ №1 ЦИКЛ **************************************************************
do {  // начало главного цикла №1

V = analogRead(VoltagePin);     //Измеряем напряжение
//-- проверка подключен ли АКБ и если напр ниже 1 вольта то крутится цикл и мигает красный 2 Гц ожидая подкл. АКБ

        while(V < 25){   // если НРЦ менее 0,5В
                pinMode(5, HIGH);  // загорается красный
                    delay(500);   
                pinMode(5, LOW);   // гаснет красный
                    delay(500);
                V = analogRead(VoltagePin);
        }     
   
  //digitalWrite(ChargePin, 1);    // Включаем зарядку
  //digitalWrite(6, HIGH);         // вклчючается желтый светодиод - ЗАРЯД
  //StartTime = millis();          // Запоминаем время начала зарядки

   int F =0;   //само число
   int A =100;   // задает начальную длинну импульса (0,1сек)
   int C=0;

// ======== вложенный цикл №2 формирования заряда и пауз до верхнего порога ===========
// =====  ЗАРЯД  ========================
      do {   // начало цикла №2
            F = A + C;  //само число фибоначи в миллисекундах
            C = A;
            A = F;
            digitalWrite(ChargePin, HIGH);    // Включаем зарядку
            digitalWrite(6, HIGH);         // вклчючается желтый светодиод - ЗАРЯД
           
            StartTime = millis();           
            int i = 0;
             do {  // цикл отрабатывает время длит имп = F 
                    // delay(100);                            //Ждем 0.1 сек
                     V = analogRead(VoltagePin);     //Измеряем напряжение при заряде
                   /*  //------------------------------------------ проверка на низкое напр
                      if((V < MinVoltage)&&(i=0)){
                           pinMode(5, HIGH);  // загорается красный
                      }
                      else {
                             pinMode(5, LOW);  // гаснет красный
                      }
                      // ----------------------------------------------------------------------------
                      */
             }  while ((V < NormVoltage) && (StartTime + F > millis()) );

// ========== ПАУЗА ===================================================================
      digitalWrite(ChargePin, LOW);             //Выключаем зарядку
      digitalWrite(6, LOW);  // выклчючам желтый светодиод заряда
    //  StartTime = millis();                   //Запоминаем время начала паузы

// ПРОВЕРКА ЕСЛИ НАПР ВЫШЕ ПОРОГА!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if( V >= NormVoltage) break ; // выход из цикла №2 - передача для проверки длит имп

// ------- ПАУЗА 40 сек.  если длит имп > 40 минут ------------------------------------

      if(F > 2400000){ //если импульс заряда превышает 40мин.(2400сек =2400000млс)
           // Serial.println("impuls F >40min =   "); Serial.print (F);  // вывод в порт 
       StartTime = millis();
           do {
               digitalWrite(6, HIGH);  // выклч желтый светодиод заряда   
               delay(100);                            //Ждем 1 сек
               digitalWrite(6, LOW);  // выклч желтый светодиод заряда             
               // V = analogRead(VoltagePin);     //Измеряем напряжение в паузе
               //Serial.println("Voltage   ");  Serial.print(V);  // вывод в порт 
               // lcd.setCursor(0,0); lcd.print(Voltage);  // !здесь надо определить куда?
           } while (StartTime + 40000 >= millis());  // пауза 40сек.
      }  // конец if проверкии   

// -------- ПАУЗА 7 сек -----------------------------------------------------------------
      do { 
              digitalWrite(6, HIGH);  // выклч желтый светодиод заряда   
              delay(100);                            //Ждем 1 сек
              digitalWrite(6, LOW);  // выклч желтый светодиод заряда     
              //V = analogRead(VoltagePin);     //Измеряем напряжение в паузе
      } while (StartTime + PauzaRaskachka >= millis()) ;

      //delay(100);                            //Ждем 0.1 сек
      //V = analogRead(VoltagePin);     //Измеряем напряжение
     
   } while (V < NormVoltage );  // Цикл №2 завершение
     
//-------Если СЮДА ПОПАЛИ то V > 14.4v, теперь проверяем длит имп, если меньше 1сек то КАЧЕЛИ,
      if( F < 1000){
        // Если сюда попали, значит АКБ уже накушался и пора делать КАЧЕЛИ
        //StartTime = millis();
       // unsigned long Dt =0;
        int Vs=0; int V1=0; int i =0;
// ====  ПАУЗА В КАЧЕЛЯХ ========================================================
          do{  // цикл формирования паузы
               digitalWrite(7, LOW);  // вклч зел светодиод
               delay(1000);                            //Ждем 1 сек
               digitalWrite(7, HIGH);  // oтключаем зел светодиод
                //V = analogRead(VoltagePin);     //Измеряем напряжение
               for(int i=0; i<=30; i++) {
                  V = analogRead(VoltagePin);    //Измеряем напряжение
                  Vs =Vs + V;
               }
               V = Vs / 30; // вычисляем дейстующее среднее НРЦ на АКБ

   // попробуем вычислить когда скорость саморазряда будет меньше 10мВ за 2-5часов
   // засекаем время и напряжение на АКБ когда напр упало ниже 13,1-1,30 вольт (линейное..)

               if(( V < 675) && (i=0)){ // если НРЦ достигло 13,2V -запоминается (один раз)
                   i = 1;   //фдажок который дает выполнится условию только один раз
                   V1 = V;  // запомнили напряжение 1
                   StartTime = millis();  //запомнили время
               }
               //V2=V; 
               Vs=0; // сбрасываем для следующих измерений
   // Если скорость саморазряда меньше чем 3 АЦП (0,06 В) за 24часа (86400000 мл сек) то выход из цикла
               if((( millis() - StartTime) >86400000 )&& ((V1-V)<3)) break ;
             
         } while(V > MinPorogKachel);
// ===== КОНЕЦ ПАУЗЫ В КАЧЕЛЯХ =====================================================
      }  // выход из условия формирователя паузы в качелях
     
      // А если F (длит имп) больше, то просто идет перезапуск.. или после качели-паузы
     
//===== КОНЕЦ ГЛАВНОГО ЦИКЛА №1
} while ( V = 0 ); // конец - проверка главного цикла

}  // ******  конец функции раскачки

void loop(void){
Raskachka();
}
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

UriBas

Переделал скетч под Мегу328 про мини.  Каждый этап отслеживается через последовательный порт (туда пишутся данные)..  пока идет отладка алгоритма, паузы отрабатываются, числа Фибоначи -интервалы заряда тоже. Оптимизация кода программы будет после отладки. 
Скетч [\b]
Спойлер

//sketch_1_Mega328.ino
//#include <LiquidCrystal.h>
#define led1_Pin 13 // пин для мигания светиком - режим заряда
//#define vin_pin A4  // Пин для измерения напряжения до шунта
#define  VoltagePin A0    //Пин измерения напряжения на АКБ на Тини13
//#define vinakb_pin A0 // Пин для измерения напр на клемах АКБ
//#define simistor_pin A5  // Пин для управления симистором (оптроном)выключает БП
//#define knopka1_pin A3 // Пин для кнопки (пока одной)
#define ChargePin A2 // Пин для управления мосфет
//#define led1_Pin A7 // пин для мигания светиком - режим заряда
//#define vin_pin A4  // Пин для измерения напряжения до шунта
//#define vinakb_pin A0 // Пин для измерения напр на АКБ (после шунта на клеммах АКБ)
//#define simistor_pin A5  // Пин для управления симистором (оптроном)или реле
//#define knopka1_pin A3 // Пин для кнопки или кнопок (пока одной)
//#define  ChargePin  13    //Пин включения зарядки для Меги328
int i = 0;
int Kv =51;  // это коэф на который надо умножить, чтобы цифры АЦП превратить в реальное напряжение
// Unsigned long F =0;   //само число
// Unsigned long A =100;   // задает начальную длинну импульса (0,1сек)
// Unsigned long C=0;
//#define   MaxVoltage  794     //Напряжение в конце зарядки, делитель 1/4, 20В = 1023, 15.5В = 794
#define   NormVoltage 736     //Напряжение 14,4 делитель 1/4, 20В = 1023, 14.4В = 736 это для убитых аккумов
//#define   NormVoltage 696     //Напряжение поддержки, делитель 1/4, 20В = 1023, 13.6В = 696 это для нормальных аккумов
#define   MinVoltage  552     //Напряжение в конце разряда делитель 1/4, 20В = 1023, 10.8В = 552
#define   MinPorogKachel  635     //Нижний порог НРЦ  12,6=645, 12.4В = 635  12,8=655
//#define   break_Voltage  410     //Аварийное напряжение  делитель 1/4, 20В = 1023, 8.0 = 410


#define  VoltagePin 1    //Пин измерения напряжения на АКБ на Тини13
//#define PauzaRaskachka = 7000;
//int PauzaRaskachka = 7000;
//LiquidCrystal lcd(7, 6, 5, 4, 3, 2);  // так по схеме
//const int numRows = 2;
//const int numCols = 16;
//******************************************************************************************
void setup(void){ [\b]

  Serial.begin(9600); 
  Serial.println("cketch - sketch_1_Mega328.ino ");
  Serial.println("30/05/2019 2:10 ");
  // Serial.println("30/05/2019 2:10 ");
  //pinMode(LoadPin, OUTPUT);  // конфигурация пина как выход
  pinMode(ChargePin, OUTPUT); // включает заряд
  pinMode(VoltagePin, INPUT); // вольтметр, делитель из 62 кОм и 15 кОм(земля), значение в 1023 это будет 24.35 В.
  //pinMode(2, OUTPUT); // релюха, симистор, мосфет, - включение заряда (отключение само собой тоже)
  // pinMode(3, INPUT); // кнопка, не тактовая либо будем измерять ток.. если позволит размер
  //pinMode(simistor_pin, OUTPUT); // управление симистором через оптрон - зажигаем светодиод оптрона
  pinMode(led1_Pin, OUTPUT); // пин для мигания светиком - режим заряда
  //pinMode(7, OUTPUT); // 3-й светодиод зеленый, если горит = КАЧЕЛИ, мигает если V >= 14,4В

//digitalWrite(ChargePin, 0);       //Отключаем зарядку
//digitalWrite(LoadPin, 0);         //Отключаем разряд (нагрузку)
// pinMode(VoltagePin, INPUT_PULLUP);  // подтяжка внутренних резисторов
//pinMode(Mode2Pin, INPUT_PULLUP);
//pinMode(Mode3Pin, INPUT_PULLUP);
}
// функция раскачки по Фибоначи, идет непрерывно, при достижении порога (14,4) все начинается сначала

  void Raskachka () { [\b]
// раскачка постепенное увеличение с мин. длит имп 0,1сек  и фикс. паузы 7 сек
// используются глобальные переменные –  ChargePin
Serial.println("Raskachka");  // вывод в порт что идет раскачка
//lcd.setCursor(0,0); lcd.print("Raskachka");  // вывод в на экран что идет раскачка !определить курсор
// if (digitalRead(2) == HIGH) { // считывает состояние портов - кнопок
// }
float V =0;   
unsigned long StartTime =0;   //сразу вместо инт прибавило 18 байт
unsigned long F ;   //само число
unsigned long C ;
unsigned  long A ;   // задает начальную длинну импульса (0,1сек)
 
int PauzaRaskachka = 7000;  //пауза при длит имп менее 40минут

// ************ ГЛАВНЫЙ №1 ЦИКЛ **************************************************************
do {  // начало главного цикла №1
Serial.println("Nachalo tcikla 1********  F=0 A=100 C=0 ");
V = analogRead(VoltagePin);     //Измеряем напряжение
//-- проверка подключен ли АКБ и если напр ниже 1 вольта то крутится цикл и мигает красный 2 Гц ожидая подкл. АКБ
Serial.println("!!! Proverka Vxx akb   ");
//   Serial.println();
     i = 0;
        while(V < 25){   // если НРЦ менее 0,5В
                    delay(500);   
                    V = analogRead(VoltagePin);
               if(i=0){
                     i = 1;
                     Serial.print("Proverka !!! Vxx akb < 0.5V !!!   Vxx =   "); Serial.print(V/Kv);
                      Serial.println();
               }     
           
        }     
 
Serial.print("Vxx =  "); Serial.print(V/Kv,2);
Serial.println();
 
   F =0;   //само число
   A =100;   // задает начальную длинну импульса (0,1сек)
   C=0;

// ======== вложенный цикл №2 формирования заряда и пауз до верхнего порога ===========
// =====  ЗАРЯД  ========================
Serial.println("      nachalo tcika-2 *************** ");
      do {   // начало цикла №2
            F = A + C;  //само число фибоначи в миллисекундах
            C = A;
            A = F;
           digitalWrite(ChargePin, HIGH);    // Включаем зарядку
           digitalWrite(led1_Pin, HIGH);
            Serial.print("Zariad! --------"); // Serial.print(millis());
            Serial.println();
            StartTime = millis();           
           // int i = 0;
             do {  // цикл отрабатывает время длит имп = F 
                    // delay(100);                            //Ждем 0.1 сек
                     V = analogRead(VoltagePin);     //Измеряем напряжение при заряде
                   /*  //------------------------------------------ проверка на низкое напр
                      if((V < MinVoltage)&&(i=0)){
                           pinMode(led1_Pin, HIGH);  // загорается красный
                      }
                      else {
                             pinMode(led1_Pin, LOW);  // гаснет красный
                      }
                      // ----------------------------------------------------------------------------
                      */
             }  while ((V < NormVoltage) && (StartTime + F > millis()) );
                Serial.print("dlitelnost zariada F =  ");  Serial.print(F);
                 Serial.println();
// ========== ПАУЗА ===========ЗАРЯД ВЫКЛЮЧАЕТСЯ !! ========================================================
      digitalWrite(ChargePin, LOW);             //Выключаем зарядку
      digitalWrite(led1_Pin, LOW);
     // Serial.println("Pauza  7s "); //   Serial.print(millis());
      //digitalWrite(6, LOW);  // выклчючам желтый светодиод заряда
     // Serial.print(F);
      Serial.print("V = "); Serial.println(V/Kv);
       Serial.println();
// ПРОВЕРКА ЕСЛИ НАПР ВЫШЕ ПОРОГА!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if( V >= NormVoltage) {
       Serial.println("Wixod iz tcikla №2 (OUT do-while №2) V > "); Serial.print(NormVoltage/Kv);
       Serial.println();
      break ; // выход из цикла №2 - передача для проверки длит имп
      }
// ------- ПАУЗА 40 сек.  если длит имп > 40 минут ------------------------------------

      if(F > 2400000){ //если импульс заряда превышает 40мин.(2400сек =2400000млс)
           // Serial.println("impuls F >40min =   "); Serial.print (F);  // вывод в порт
            Serial.print("Pauza 40s F > 2400000 ms .. F = "); Serial.print(F);
       StartTime = millis();
           i = 0;
           do {
               //digitalWrite(6, HIGH);  // вкл желтый светодиод заряда   
               delay(1000);                            //Ждем 1 сек
               //digitalWrite(6, LOW);  // выкл желтый светодиод заряда             
               V = analogRead(VoltagePin);     //Измеряем напряжение в паузе
               if(i = 0){
                     i = 1;
                     Serial.println("Vxx1 = "); Serial.print(V/Kv);
               } 
               Serial.print("Voltage   ");  Serial.print(V/Kv);  // вывод в порт 
               Serial.println();
               // lcd.setCursor(0,0); lcd.print(Voltage);  // !здесь надо определить куда?
           } while (StartTime + 40000 >= millis());  // пауза 40сек.
      }  // конец if проверкии   
       
// -------- ПАУЗА 7 сек -----------------------------------------------------------------
     Serial.println("Pausa 7s "); 
      do { 
              //digitalWrite(6, HIGH);  // выклч желтый светодиод заряда   
              delay(100);                            //Ждем 1 сек
              //digitalWrite(6, LOW);  // выклч желтый светодиод заряда     
              //V = analogRead(VoltagePin);     //Измеряем напряжение в паузе
      } while (StartTime + PauzaRaskachka >= millis()) ;

      //delay(100);                            //Ждем 0.1 сек
      //V = analogRead(VoltagePin);     //Измеряем напряжение
     
   } while (V < NormVoltage );  //  завершение Цикла №2 который формирует заряд и паузы до порога
     
      Serial.println("Prowerka dlitelnosti impulsa posle poroga 14.4v  ");
//-------Если СЮДА ПОПАЛИ то V > 14.4v, теперь проверяем длит имп, если меньше 1сек то КАЧЕЛИ,
      if( F < 1000){
        // Если сюда попали, значит АКБ уже накушался и пора делать КАЧЕЛИ
        StartTime = millis();
       // unsigned long Dt =0;
       Serial.println("dlitelnosti impulsa posle poroga 14.4v < 1s (0.5s) - nachalo pauza-kachel ");
        int Vs=0; int V1=0; i =0;

// ====  ПАУЗА В КАЧЕЛЯХ ========================================================
          // Serial.println(" pauza-kachel po porogu 12.6v ");
         
          do{  // цикл формирования  ПАУЗА В КАЧЕЛЯХ
               //digitalWrite(7, LOW);  // вклч зел светодиод
               delay(1000);                            //Ждем 1 сек
               //digitalWrite(7, HIGH);  // oтключаем зел светодиод
                //V = analogRead(VoltagePin);     //Измеряем напряжение
               for(int ii = 0; ii <= 30; ii++) {
                  V = analogRead(VoltagePin);    //Измеряем напряжение
                  Vs =Vs + V;
               }
               
               V = Vs / 30; // вычисляем дейстующее среднее НРЦ на АКБ

   // попробуем вычислить когда скорость саморазряда будет меньше 10мВ за 2-5часов (60мВ за 24часа)
   // засекаем время и напряжение на АКБ когда напр упало ниже 13,1-1,30 вольт (линейное..)

               if(( V < 675) && (i=0)){ // если НРЦ достигло 13,2V -запоминается (один раз)
                   i = 1;   //фдажок который дает выполнится условию только один раз
                   V1 = V;  // запомнили напряжение 1
                   StartTime = millis();  //запомнили время
               }
               //V2=V; 
               Vs=0; // сбрасываем для следующих измерений
   // Если скорость саморазряда меньше чем 3 АЦП (0,06 В) за 24часа (86400000 мл сек) то выход из цикла
               if((( millis() - StartTime) >86400000 )&& ((V1-V)<3)) {
                  Serial.println("samorazriad < 0.06v za sutki (24h) .. wihod iz pauza-kachel - break ");
               break ;
               }
         } while(V > MinPorogKachel);
               Serial.println("wihod iz pauza-kachel po porogu 12.6v ");
// ===== КОНЕЦ ПАУЗЫ В КАЧЕЛЯХ =====================================================
      }  // выход из условия формирователя паузы в качелях
     
      // А если F (длит имп) больше, то просто идет перезапуск.. или после качели-паузы
     
//===== КОНЕЦ ГЛАВНОГО ЦИКЛА №1
} while ( true ); // конец - проверка главного цикла

}  // ******  конец функции раскачки

void loop(void){
// тело основного цикла
Raskachka();
}
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

UriBas

#664
Наконец приступил к "полевым" испытаниям алгоритма.. И хотя есть много над чем работать, первые результаты ободряют..

Для опытов взял один из трупаков" - АКБ 12В 12Ач  который  лет 7-8 назад купил с рук и уже был с остаточной емкостью 10-20%..  Естественно есть пара банок после сильного переразряда с переполюсовкой..  Зарядить по нормальному и снять хотя бы 50% заряда пока не получалось ничем..   Единственно что не пробовал с этим АКБ, - это метод восстановления малым током, как это делает Бранимир. Но есть еще два таких же, вот на одном попробую (даст Бог) ..  надо будет сравнить для интереса.

В общем поставил его на заряд, ранее никак не получалось добиться НРЦ хотя бы больше чем 12,5В..   три банки взлетали вверх и не хотели брать заряд, потом падали все дружно до 1В..  одна так и вообще до нуля.  Доливал воды, немного помогало.. но все равно, так и не вышли до нормы.   Ток вначале выставил 0,25А..  обычно при таком токе зарядить не получалось, но с помощью раскачки дело стало продвигаться..  ток увеличил до 0,5А (в качестве БП ДС-ДС ССCV), а потом снизил до 0,2А..  из за косяка" в алгоритме, но заряд продолжается и динамика обнадеживает.  Выкладываю график паузы в 40 сек, как меняется НРЦ..  ну и прикрепляю логи.
Спойлер
Внизу графика - секунды, всего 40секунд - это пауза в 40секунд которая делается, если либо порог выше 14,4В либо дельта выше 0,5В..  Дельта спасает слабые банки от взлета вверх! И все банки, равномерно берут ток..  НРЦ растет! 
По графику самые верхние кривые - последние данные.   Динамика положительная.. процесс заряда идет вроде как нормально..

Да, еще добавлю, что показания напряжения чуть завышены.. где-то на 0,2-0,3В ..  все собрано на макетке, да и до схемы еще путем не добрался довести до ума.
Восточная мудрость - "Шакал воет - караван идет"  Эл.вел. 350Вт.   Верую в Иисуса Христа, НЛО.  тема "продвинутой моргалки" https://electrotransport.ru/index.php?msg=1669651

Cyberpapa

Цитата: UriBas от 10 Июнь 2019 в 16:39Зарядить по нормальному и снять хотя бы 50% заряда пока не получалось ничем
Т.е. - имеющиеся у вас версии ЗУС не смогли выжать более 50% емкости ?
После заряда вашим алгоритмом какую емкость удалось получить ?