CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Солнечное электроснабжение на даче или шилд-контроллер заряда. Своими руками :)

Небольшое вступление.
1- Заранее предчувствуя высказывания и «советы» типа, “а на кой это нужно”, «Проще кабель проложить”, “купи готовое и не парься”, скажу сразу, весь этот проект носит скорее академический интерес, а не экономический.
2 — Читать данный „опус“ можно „по диагонали“, т.е., перейти непосредственно к практическим частям. А именно „Переделка UPS в инвертор 220 Вольт“ и „Самостоятельное изготовление PWM контроллера заряда аккумулятора“. Дело в том, что я не хотел разрушать целостность повествования, и мне было интересно!

Лето. Период дачного сезона в полном разгаре. Всякие посадки и крупные работы сделаны, теперь тупо шашлыки, отдых и ожидание сбора урожая :). И моя очередная попытка совместить полезное с приятным. А именно, захотелось мне попробовать свои силы в организации энергоснабжения второго этажа дачи (пока его там нету в принципе, только с помощью удлинителя).
Немного погуглив, и почитав соответствующие ресурсы я обозначил “кубики” будущего проекта. Типовая блок-схема организации “солнечного электроснабжения”.


»В крупную клетку" — все просто! Очень удобно, что любой такой кубик можно заменить/проапгрейдить в дальнейшем. Например, можно будет добавить в параллель еще один аккумулятор. Или доустановить солнечную панель, если мощности этой недостаточно ну и так далее. Короче, решил попробовать.

Как говорят, “Большому кораблю — большое плавание”, так и “К серьезному проекту — научный и тщательный расчет!” :)

Энергетическое обоснование.
Вот что я планирую использовать на втором этаже дачи:

Посидеть часок другой с ноутом (80 ватт), возможно роутер с 3G модемом, пару лампочек светодиодных (10..20 ватт), небольшой телевизор (80..100 ватт), небольшой паяльник иногда (25..35 ватт), ну и подзарядить телефон (планшет) (пусть еще 10 ватт). Это все, как правило, не одновременно и пару часов. Считаем, 250 ватт. Час работы всех энергопотребителей — 0,25 кВатт-час.
(Тут можно посмотреть примеры расчетов:
ru.wikipedia.org/wiki/%D0%9A%D0%B8%D0%BB%D0%BE%D0%B2%D0%B0%D1%82%D1%82-%D1%87%D0%B0%D1%81)
Обычный, средний автомобильный аккумулятор (55 А*Ч) имеет запас энергии 55*12=660 Ватт. Т. е., при грубом подсчете (даже с учетом всяческих потерь при преобразовании) должно хватить на больше, чем два часа (660/250=2.6) работы всего запланированного электрооборудования включенного одновременно. Еще немаловажно, что пользоваться этим я буду только в выходные- 2 дня, а заряжаться АКБ будет 5 дней. Даже учитывая, что погода у нас (в Республике Беларусь) не всегда солнечная, 50 ватная солнечная панель (3 Ампера) должна заряжать АКБ за 12 часов ВЕЛИКОЛЕПНОЙ солнечной погоды. Это теория. Практика говорит, что нужно накинуть еще. Хорошо-хорошо, пусть заряжается 20 часов. Очень-очень надеюсь, что за неделю в сумме должно же набраться эти ясные/солнечные 20 часов :)

Естественно, все блоки для солнечного электроснабжения можно купить. (Да и вообще, можно купить в этом мире практически все. Ну, кроме, наверное, самих денег. Но тогда вообще скучно жить).

Так что, дайте попробуем максимально все сделать самостоятельно.
Итак, Солнечная панель (далее по тесту СП) и аккумулятор (далее в тексте АКБ) — ничего не попишешь… Сэкономить не удастся.
Эти компоненты придется купить.
(Небольшая поправка насчет СП. Изначально я думал собрать ее самостоятельно, из отдельных панелек (0.5 вольта при стоимости около 3 у.е.). Получалось, что как минимум мне понадобиться порядка 30 панелек. Плюс ровные руки и куча терпения и аккуратности. Но, к счастью, нашел людей продающих готовые панели для наружного применения и не очень дорого-80 у.е. Ее параметры: 20 вольт холостого хода и ток КЗ порядка 3-х Ампер. Мощность 50 Ватт. Прямо, то, что мне и нужно. Заказал, пока жду).

А вот инвертор и контроллер — все в наших руках ;)

ИНВЕРТОР.
Для преобразования электроэнергии из 12 вольт АКБ в переменные 220 Вольт, обычно используются инверторы. Естественно, идеально для такого применения подойдет автомобильный инвертор. Но… Любимый принцип Ивановича: “используй то, что под рукою и не ищи себе другого”. Попробуем в качестве инвертора использовать UPS. Он же бесперебойник.

Думаю, в каждом офисе найдется парочка исправных ИБП (источник бесперебойного питания) с высаженными АКБ. Вот с ним то и попробуем замутить. Интернет просто кишит материалом о таком варианте. К счастью, бесперебойники у меня были ДАЖЕ на выбор. Однако я остановился на Vivaldi 800VA. Попробую пояснить почему. Что тоже важно:
1. он оказался самым мощным (800 ватт)
2. у него включение просто кнопка с двумя состояниями (а не сенсорная или интеллектуальная, типа нужно нажать и подержать пару секунд)
3. он выключается в зависимости от состояния АКБ (а не по заданному интервалу времени). Что тоже важно: он сам контролирует степень разряда аккумулятора.
4. у него на задней пенили две обычные розетки.
5. он оказался полностью рабочим и был в металлическом корпусе ;)


В качестве доработки я сделал:
— Установил небольшую плату переходник с предохранителем на 25 ампер
— Убрал сетевой шнур. Вместо него вывел мощные провода (сечением 4 мм2) с клеммами для подключения АКБ.
— Выпаял на фиг раздражающую пищалку-буззер
— Усилил самый горячий радиатор дополнительным медным
— Установил принудительный вентилятор и насверлил в корпусе под него отверстия

Провел “ходовые испытания”. Обычный ПЭВМ с ЭЛТ монитором (да, я нашел такой монитор) чудесно отработал 2 часа. Вполне хороший результат.

Ну и основная часть моего опуса:
КОНТРОЛЛЕР ЗАРЯДА.
Немного теории. Для общего понимания и развития.
Контроллер заряда является важным элементом в задуманной системе электроснабжения. Он поддерживает необходимый уровень напряжения на аккумуляторах, предотвращая их полный разряд или перезаряд. Существует несколько типов контроллеров:


Погуглив, я нашел два любопытных варианта контроллера MPPT:
1) www.256.co.uk/?p=1158
2) duino4projects.com/arduino-peak-power-tracker-solar-charger/
Но для реализации варианта MPPT нужно контролировать ток. Ничего подходящего для этого у меня под рукой не оказалось. На будущее, пришлось заказать в Китае микросхему MAX4173.

Ну, что же. Попробуем свои силы в изготовлении PWM контроллера.
За основу взял творение некого товарища из далекой Индии. Очень хорошо все описано и разжевано (правда, не на русском). Читайте тут: www.instructables.com/id/ARDUINO-SOLAR-CHARGE-CONTROLLER-PWM/

Мои “хотелки”:
— плата-шилд (стандартного размера)
— плата должна быть односторонней
— возможность быстрого подключения проводов (т.е., клеммники)
— вывод полезной информации на двухстрочный LCD 16х2
— LCD сделать выносным (вдруг понадобится разместить в корпус) и отключаемым (на разъемах)
— дополнительная светодиодная индикация (что бы издалека понимать, что происходит)
— автономная работа устройства (т.е., без дополнительных батарей и аккумуляторов)
— безопасность работы устройства без присмотра

Схема контроллера — это фактически компиляция кусков из разных схем. В окончательном виде она выглядит так.

Обратите внимание, в схеме отсутствует узел управления нагрузкой. Дело в том, что изготовленный мною самодельный “ИНВЕРТОР” сам контролирует этот момент.

Как говорится: «Хорошая мыслЯ — приходит опосля» :) Честно говоря, я думаю, что было бы более правильным сделать три отдельных линии от АКБ (5 Вольт, 12 Вольт и 220 Вольт) и все же контролировать напряжение на АКБ, во избежание сильного разряда аккумулятора. Например, зачем подключать к линии 220 Вольт блок питания того же роутера, если логичнее подключить его сразу к линии 5 Вольт. Но этот вариант я попробую учесть в следующей поделке. Хм, если не потеряю интерес.

Условно эту схему можно разбить на следующие узлы:


Узел питания. На рисунке под №5.
Чуть-чуть лирики. На работе многие коллеги обзавелись видео регистраторами. И для подключения к бортовой сети многие отказались от штатного подключения в прикуриватель. В связи с этим, нашей радиолюбительской братией был довольно плотно проштудирован вопрос DC-DC преобразователей. Для этих целей из Китая были получены чудесные STEP-DOWN преобразователи LM2576 в достаточно большом количестве. Ниже кусочек из даташита:


Согласитесь, что грешно пропадать полученным таким образом полезным наработкам и микросхемам :). Итак, для питания Arduino в автономном режиме я разместил на шилде такой преобразователь. Он будет запитываться (через диоды) и от СП и от АКБ (в темное время суток).

Что нам дает такое подключение? Пусть Анод первого диода подключен а АКБ (Аакб), анод второго диода подключен к СП (Асп), Катоды соединены вместе и подключены к преобразователю (К).

Имеем в худшем случае: Аакб = 14В, Асп = 18В. Падение на диоде пусть в худшем случае 1В,
тогда на общем катоде будет К = 18 — 1 = 17В. А, заметь, на Аакб = 14В, т.е. диод заперт обратным напряжением.
Посему с СП будет течь ток, потребляемый стабилизатором (сколько-то там ампер), а через диод АКБ будет лишь обратный ток утечки (он будет _в_ АКБ, типа зарядный) в несколько там микроампер, т.е. НОЛЬ. Ток будет потребляться с обоих источников — АКБ и СП — только когда их напряжения примерно равны. Когда напряжение на СП упадет ниже напряжения на АКБ примерно на 0.7-1В, ток будет потребляться только с АКБ.

Были небольшие сомнения, при выборе напряжения преобразователя 5 вольт или 9. Однако, решив, что двойное преобразование (на самой Arduino есть линейный стабилизатор) неэффективно, остановил свой выбор на 5-ти вольтовом варианте.

Контроль напряжения на АКБ и на СП. (Узлы №1 и 3 соответственно)
Берем с запасом, максимальные напряжения на выводах солнечной панели 25 вольт, на АКБ — 15 Вольт. Естественно такие напряжения напрямую подавать на Ардуино — смерти подобно.
Воспользуемся on-line калькулятором для делителя напряжения (он же Voltage Divider). Кому лень (или нет интернета :)), расчет ведется по формуле
Vout=(Ra*Vin)/(Ra+Rb).
Чтобы не “плодить номенклатуру”, резистор Ra возьмем 100 kOm.
Получаем такие величины
Для СП:
Input Voltage=25V
Ra=100kOm
Output Voltage=4.5V
=> Rb=22 kOm

Для АКБ:
Input Voltage=15V
Ra=100kOm
Output Voltage=4.5V
=> Rb=42 kOm (у меня под рукой был на 47 kOm)

Для пересчета значения “из попугаев” на входе АЦП в реальные вольты пришлось высчитать нужные коэффициенты.

Индикация состояния: два светодиода и LCD дисплей.
Светодиоды — ничего нового. А подключение LCD — “дудка в дудку” в соответствии с описанием на официальном ресурсе

Сам дисплей сделан выносным и к шилду подключается двумя шлейфами: питание и сигнальная линия.

ШИМ-контроллер (Узел №2).
Подробнее о ШИМ можно почитать тут arduino.cc/en/Tutorial/PWM
или тут robocraft.ru/blog/arduino/34.html
Этот узел я нагло слизал у индуса. (Нет, конечно, я честно попытался заменить “полевик” на n- канальный (они более распространены и в открытом состоянии имеют меньшее сопротивление). Но, для его полного открытия необходимо обеспечить положительный потенциал (обычно около 10 вольт) между Gate и Source. Напомню, что Source в нашей схеме подключается к “+” АКБ. Выход из такой ситуации есть: т.н., Charge pump. Но мне что-то не хотелось в тот момент усложнять схему. Тем более, что я планирую в дальнейшем изготовление MPPT контроллера).

Обычно PWM контроллеры работают с частотой 50/100 Герц. А у Ардуино по умолчанию на 6-ом пине ШИМ с частотой 976.5625 Герц. Короче, для изменения частоты ШИМа просто изменим значение предделителя на 1024 (вместо 64).
TCCR0B = TCCR0B & 0b11111000 | 0x05; // prescaling 1024
И получим что-то около 61 Герца. Пока так. Естественно, при этом перестают корректно работать функции delay() и тому подобные. К счастью, в данном скетче это не критично.

В целях защиты, на плате дополнительно установлен предохранитель на 3 Ампера. (Хотя, более удобно было бы его установить в разрыв соединительных проводов).

Итак, печатная плата:


Далее, классическая цепочка: ЛУТим — ТРАВИМ — ЛУДИМ — ПАЯЕМ…
Фу, Готово. Готовый контроллер выглядит примерно вот так:

Обратная сторона (предохранитель по цепи питания от преобразователя (на всякий пожарный случай) и SMD-диодик)


Вид “сбоку” с установленным на “полевик” радиатором:



Назначение узлов, перемычек и разъемов на плате


Перемычка №3 — питание Ардуино от СП и АКБ (при использовании внешнего БП или батарейки, перемычку нужно снять)
№2 — индикатор работы преобразователя (можно отключить перемычкой №1)
№4 — регулировка контрастности LCD дисплея
№5 — делители напряжения
№6 — светодиодные индикаторы заряда батареи и состояния

Для отладки системы я пользовался “полудохлым” АКБ из авто (как раз один коллега купил новый, а старый отдал на опыты) и блоком питания 15 Вольт (3 Ампера) -(т.к., пока у меня нету реальной солнечной панели).


Теперь переходим к софтверной части.

Алгоритмы “правильного” заряда нашел на форуме arduino.ru/forum/proekty/pwm-kontreller-zaryada-na-attiny13?page=2 (Спасибочки товарищу с ником HWman, который не поленился и разрисовал для меня каждую стадию заряда).

Я решил выделить пять состояний, в которых будет находиться контроллер:
режим сна. (SLEEP Mode). В этот режим контроллер переходит в случае, если напряжение с СП меньше, чем необходимое для заряда АКБ
режим ЗАРЯДА (Charge Mode). В этом режиме весь ток, от СП отдается АКБ
режим ВЫРАВНИВАЮЩЕГО ЗАРЯДА (Balance Mode). В этом режиме, с помощью изменения ШИМ на АКБ поддерживается необходимое напряжение
режим ПОДДЕРЖИВАЮЩЕГО ЗАРЯДА (Storage Mode). В этом режиме ничего не происходит, а контролируется напряжение на АКБ. И при определенном значении, переходит в режим заряда.
— Ну и небольшой BONUS :) режим ВОССТАНОВЛЕНИЯ АКБ (Refresh MODE). Вот, что натолкнуло на эту мысль:

Реализация кода — Конечный автомат (он же, [Finite State Machine]).
Граф состояний (может будет кому-то полезным):

Для удобства восприятия, на графе я использовал те же переменные и константы, что и в скетче.
А ниже и собственно скетч. Он оказался не очень объемным, поэтому я привел здесь его полностью. Для отладки, оставлен вывод в СОМ-порт. Естественно, полезная критика приветствуется :)
(Прокомментирован — по максимуму. Несколько раз перечитывал, даже сам разобрался :)

/* Simple Arduino Solar Charger Controller
     PWM Version with P-chanel MOSFET
                       Ghost D. 2014
====================================
И окончательный алгоритм (спасибо HWman, с ресурса ARDUINO.RU) будет такой:
1- ШИМ=255 пока Uакб<14.4
2- Как только Uакб=>14.4 ставим ШИМ при котором Uакб=13.8 и держим напряжение на таком уровне
3- Если значение ШИМ уже очень мало(ток заряда уже маленький), то отключаем заряд вообще и переходим в ждущий режим 
4- как Uакб<=12.7 - снова с пункта 1
====================================
Lead-Acid Batteries

BOOST Voltage = 14.4 Volts
NORMAL Voltage = 13.9 Volts
STORAGE Voltage = 13.3 Volts

*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11, 5, 4, 3, 2);
int redLed=7;             // Светодиод - состояние АКБ - разряжен
int greenLed=8;           // Светодиод - состояние заряда
int pwmPin=6;             // ШИМ вывод на MOSFET
byte batPin=A0;           // Аналговый порт подключения делителя с АКБ
byte solarPin=A1;         // Аналоговый порт подключения делителя с АКБ

float solar_volt =0; // Напряжение на солнечной панели
float bat_volt=0;    // Напряжение на АКБ
float real_bat_volt=0;    // Напряжение на АКБ при ШИМ=0
float start_bat_volt=0; //Напряжение на АКБ, с которого стартовал режим REFRESH (Восстановление)
byte curPWM=0;  //Текущее значение ШИМ
int charged_percent =0; //Заряд АКБ в %
volatile boolean state = LOW; //для мигания светодиодом
//long int timeWork=0;
byte mode=0; //Режим работы "КОНЕЧНОГО АВТОМАТА"
byte tmpCount=0; //счетчик, для возможности "крутиться" в нужном режиме нужное кол-во раз
char outMess[16]; //содержимое второй строки на LCD

//коэф. делителя для 100к/47к
#define batDev 3.2
//коэф. делителя для 100к/22к
#define solDev 5.8
//коэфициент для пересчета данных с АЦП в вольты
#define adc2volt 0.0047

//Границы напряжения на АКБ
#define bat_full_volt 14.3
#define bat_balance_volt 13.8
#define bat_disch_volt 11.4
#define bat_storage_volt 12.7
#define bat_refresh_volt 9 

//Значения для ШИМ
#define pwm_charge 255
#define pwm_off 0
//шаг изменения значения ШИМ
#define deltaPWM 10

//режимы работы
#define mode_charge 1
#define mode_balance 2
#define mode_storage 3
#define mode_sleep 4
#define mode_refresh 5


//-----------------------------------
// Чтение значения АЦП с аналогового порта
// 250 замеров и подсчет среднего
float readVolts(byte pin){
  float tmpRead=0;
  for (int i=0;i<250;i++){
    tmpRead+=analogRead(pin);
  }
  tmpRead=tmpRead/250;
  return(tmpRead*adc2volt);
}
//-----------------------------------
// считываем значения напряжений на СП и АКБ
void read_U()
{
  solar_volt=(readVolts(solarPin))*solDev;
  bat_volt=(readVolts(batPin))*batDev;
}

// считываем значения напряжения на АКБ при ШИМ=0
void read_U_bat_real()
{
  analogWrite(pwmPin,0);  
  real_bat_volt=(readVolts(batPin))*batDev;
  analogWrite(pwmPin,curPWM);
 }

void setup()
{
  TCCR0B = TCCR0B & 0b11111000 | 0x05; // Устанавливаем ШИМ 61.03 Hz (при этом портиться функция delay)
  Serial.begin(9600);
  pinMode(pwmPin,OUTPUT);
  pinMode(redLed,OUTPUT);
  pinMode(greenLed,OUTPUT);
  
  digitalWrite(pwmPin,LOW);
  digitalWrite(redLed,LOW);
  digitalWrite(greenLed,LOW);

  lcd.begin(16,2);                     // 
  lcd.clear();                         // 
  
  read_U();
   mode=mode_sleep;

} //end setup


void loop()
{
  
switch (mode){
  
  case (mode_charge):
  // Режим ЗАРЯДА. ШИМ=100% 
  // В этом режиме горит красный светодиод, зеленый мигает
  // Пока напряжение на АКБ напряжение не станет больше, чем 14.4Вольта
  // после этого переход в режим ВЫРАВНИВАЮЩЕГО заряда
  Serial.println("==============");
  Serial.println("MODE: Charge");
  Serial.println("==============");
  
    curPWM=pwm_charge;
    digitalWrite(redLed, HIGH);
    digitalWrite(greenLed,state);
    state = !state;
    if (bat_volt >= bat_full_volt) 
      {
        mode=mode_balance;
        tmpCount=3;
      }
   sprintf(outMess, "%2d%% CHRG PWM=%3d",charged_percent, (map(curPWM,pwm_off,pwm_charge,0,100)));
  break;
  
  case (mode_balance):
  // Режим ВЫРАВНЕВАЮЩЕГО ЗАРЯДА. ШИМ= динамический, для удержания напряжения на АКБ =13,8В 
  // В этом режиме красный и зеленый светодиоды перемигиваются
  // При значении ШИМ меньше, чем 10
  // переход в режим ПОДДЕРЖИВАЮЩЕГО заряда
  // после изменения ШИМ, "для устаканивания" значения делаем 3 прохода
  Serial.println("==============");
  Serial.print("MODE: Balance/Count: ");
  Serial.println(tmpCount);
  Serial.println("==============");
  
      if (tmpCount==0)
    {
      if (bat_volt >= bat_balance_volt)
        {
          if (curPWM < deltaPWM) curPWM=pwm_off; 
          if (curPWM != pwm_off) curPWM=curPWM-deltaPWM;
           
           Serial.print("- Decrise. ");
           Serial.println(curPWM);
        }
      
      if (bat_volt < bat_balance_volt)
        {
          if(curPWM > (pwm_charge-deltaPWM)) curPWM=pwm_charge;
          if(curPWM != pwm_charge) curPWM=curPWM+deltaPWM;
          
           Serial.print("+ Incrise. ");
           Serial.println(curPWM);
        }
        tmpCount=3;
    }

    digitalWrite(redLed, state);
    digitalWrite(greenLed,!state);
    state = !state;
    tmpCount=tmpCount-1;
    if (curPWM < 10) mode=mode_storage; 
    sprintf(outMess, "Balance. PWM=%3d", (map(curPWM,pwm_off,pwm_charge,0,100)));   
   break;
  
  case (mode_storage):
  // Режим ПОДДЕРЖИВАЮЩЕГО ЗАРЯДА. ШИМ=0 
  // В этом режиме горит зеленый светодиод, красный мигает
  // Пока напряжение на АКБ напряжение станет меньше, чем 12.7 Вольта
  // переход в режим ЗАРЯДА
  Serial.println("==============");
  Serial.println("MODE: Storage");
  Serial.println("==============");
  
    curPWM=pwm_off;
    if (bat_volt < bat_storage_volt) mode=mode_charge;
    digitalWrite(greenLed, HIGH);
    digitalWrite(redLed,state);
    state = !state;
    sprintf(outMess, "Storage Mode     ");
  break;
  
  case (mode_sleep):
  // Режим СНА. ШИМ=0 
  // В этом режиме светодиоды не горят
  // Когда напряжение на СП станет больше, чем 14.4 Вольта
  // переход в режим ЗАРЯДА
  sprintf(outMess, "Sleep Mode      ");
  Serial.println("==============");
  Serial.println("MODE: Sleep");
  Serial.println("==============");
  
    curPWM=pwm_off;
    digitalWrite(redLed, LOW);
    digitalWrite(greenLed,LOW);
    if ((solar_volt > bat_full_volt) && (bat_volt >= bat_disch_volt)) mode=mode_charge;
    if ((solar_volt > bat_full_volt) && (bat_volt < bat_disch_volt) && (bat_volt >= bat_refresh_volt))
     { 
       mode=mode_refresh; 
       start_bat_volt=bat_volt;
       tmpCount=5;
     }
  break;
  
  case (mode_refresh):
  // Режим ВОССТАНОВЛЕНИЯ АКБ. ШИМ= ИМПУЛЬСЫ, соотношение времени 4/1 
  // В этом режиме красный и зеленый светодиоды вспыхивают
  // Выход из этого режима при достижении значения на АКБ bat_disch_volt
  // или если напр. на АКБ станет (вдруг, откл. АКБ) < bat_refresh_volt
  Serial.println("==============");
  Serial.println("MODE: Refresh");
  Serial.println("==============");
  lcd.setCursor(0,0);
  lcd.print("- Refresh Mode -");
  curPWM=pwm_charge;
    if (tmpCount==0)
  {
    tmpCount=5;
    curPWM=pwm_off;
  }
  tmpCount=tmpCount-1;
  lcd.setCursor(0,1);
  lcd.print("Ust:");
  lcd.print(start_bat_volt,1);
  lcd.print("  Uc:");
  lcd.print(real_bat_volt,1);
    
  if (real_bat_volt >= bat_disch_volt) mode=mode_charge;
 
    digitalWrite(redLed, state);
    digitalWrite(greenLed,state);
    state = !state;
  break;
} //end switch



//Общая процедура вывода информации (пока сумбурно)
  read_U();
  if (solar_volt < bat_full_volt) mode=mode_sleep;
  read_U_bat_real();
  if (real_bat_volt<bat_refresh_volt) 
  {
    sprintf(outMess, "!Low Battery! :(");   
    mode=mode_sleep;
  }
 // analogWrite(pwmPin,curPWM);
  
//  if (curPWM==pwm_off) read_U_bat_real();
  Serial.print("SP  voltage :");
  Serial.println(solar_volt);
  Serial.print("AKB voltage :");
  Serial.println(bat_volt);
  Serial.print("Real AKB voltage :");
  Serial.println(real_bat_volt);
  Serial.print("PWM=");
  Serial.println(curPWM);
  Serial.print("pwm duty cycle is (%) :");
  Serial.println(map(curPWM,pwm_off,pwm_charge,0,100));
  charged_percent=map(bat_volt*10, (bat_disch_volt)*10, (bat_full_volt)*10, 0, 99);
  if (mode != mode_refresh) lcdShow();
  
  delay(100);
  
  Serial.println("----------------------------------------");

}// конец основного цикла

void lcdShow()
{
  lcd.setCursor(16,1);
  lcd.print(" ");
  lcd.setCursor(0,0);
  lcd.print("SP:");
  lcd.print(solar_volt,1);
  lcd.print(" BAT:");
  lcd.print(bat_volt,1);
  
  lcd.setCursor(0,1); 
  lcd.print(outMess);
}


Над кодом я трудился несколько недель… (период отпусков, и все такое...). При тестировании с блоком питания (вместо солнечной панели, никак не довезут) — все очень даже красиво и хорошо.

Во время зарядки, «полевик» достаточно хорошо нагревался. Я замерял его температуру (есть у нас такой прибамбас к тестеру)- и она доходила до 65 градусов Цельсия. Многовато, но вполне приемлемо.

Честно говоря, я пока не могу уверенно сказать, что КАЧЕСТВО заряда — ИДЕАЛЬНОЕ! Время покажет :)
Естественно, данный код можно приспособить для зарядки других аккумуляторов и реализации других алгоритмов. Как Ваша душа пожелает!!!

Для всех заинтересовавшихся и желающих повторить, весь материал одним архивом — ТУТ!!!
  • 0
  • 29 июля 2014, 17:18
  • Ghost_D

Комментарии (35)

RSS свернуть / развернуть
+
0
Пожалуйста :)
avatar

HWman

  • 4 августа 2014, 23:03
+
0
Замените int *Led=7; на #define *Led 7 ну и по аналогии сэкономите пару байт.
ЗЫ Пожалуйста :)
avatar

HWman

  • 4 августа 2014, 23:06
+
0
Обратная сторона (предохранитель по цепи питания от преобразователя (на всякий пожарный случай) и SMD-диодик)

А можно узнать поточнее, номинал деталей.
avatar

motor4

  • 29 августа 2014, 16:32
+
0
Конечно можно…
Оба элемента выпаяны из старой мат. платы: предохранитель — наверное на 1.1 Ампер или на 0,11 Ампер. (Я ничего не нашел по принципам маркировки восстанавливающихся smd предохранителей), и диод — с маркировкой PJ58. Его я выбирал по размеру :)
avatar

Ghost_D

  • 29 августа 2014, 16:45
+
0
спасибо)
avatar

motor4

  • 29 августа 2014, 16:50
+
0
Скажите, какой (сколько вольт и ампер ) взять БП (вместо солнечной панели), что бы и для заряда атомобильного аккумулятора(55 А*Ч) хватило, и на выходе контроллера получить 12v 200w
avatar

motor4

  • 29 августа 2014, 22:21
+
0
… может переделать компьютерный БП для этой цели?
avatar

motor4

  • 29 августа 2014, 22:39
+
0
Хм, мне не понятна ваша конечная цель. Для эммуляции солнечной панели я использовал блок питания с параметрами: 15 вольт, 2 Ампера. При этом АКБ заряжается порядка 20 часов, или около того. А 200w при 12 вольтах — это ток должен быть (200/12)=16 Ампер!!! Этот шилд не готов к таким токам. А вот с заряженного АКБ можно получить данную мощность.
avatar

Ghost_D

  • 30 августа 2014, 07:54
+
0
Принял решение собрать данный контроллер по нескольким причинам:
1. На мой взгляд это неплохое зарядное устройство для АКБ (UNO и дисплей уже долгое время лежат в запасе без дела), осталось найти подходящий БП.
2. Есть желание было, до того как узнал что данный шилд не для большущих токов.
avatar

motor4

  • 30 августа 2014, 19:50
+
0
А от БП 12В 5А для заряда АКБ(55А/ч) шилд не выгорит, выдержит?
avatar

motor4

  • 30 августа 2014, 20:00
+
0
БП должен быть порядка 14..15 Вольт.
IRF9540 расчитан на 100 вольт и 23 Ампера.
Так, что 5 Ампер этот шилд должен выдержать, НО НУЖНО ИЛИ УСИЛИТЬ РАДИАТОР на ПОЛЕВИКЕ, либо УСТАНОВИТЬ ВЕНТИЛЯТОР!
А так, никаких препятствий я не вижу.
А еще скажу, заряд меньшим током (2 А) считается более эффективным, но длительным по времени
avatar

Ghost_D

  • 31 августа 2014, 09:00
+
0
Думаю блок питания для ноутбука Toshiba 15V 4A подойдет.
Теперь можно браться за сборку. Спасибо за ответы.
avatar

motor4

  • 31 августа 2014, 17:59
+
0
Время зарядки АКБ вы вычисляли опытным путём? Не могу найти принцип расчёта.
И что за СП использовались, хороший ток для компактных размеров и скромной мощности 50ватт.

Спасибо, очень интересная тема, написано обстоятельно и понятно. Жду продолжений :-)
avatar

_Pashtet_

  • 30 августа 2014, 08:33
+
0
Ну да, расчеты весьма приблизительные. Наверняка меня подымут на смех более знающие люди :) я рассуждал примерно вот так:
При заряде полностью разряженной батареи необходимо ей сообщить в 1,2—1,5 раза большее количество электричества по сравнению с потраченным при разряде. Обычно рекомендуют ток заряда -не более 10%, т.е, для АКБ 55 Ач — максимальный ток 5,5 Ампер, а время заряда при этом может составить 12 ÷ 15 часов.
Ну а при токе заряда около 2 Ампер — время увеличивается более чем в два раза.

А солнечную панель (50 Ватт) мне до сих пор (блин, уже и лето заканчивается) мне так и не привезли :(
заказывал тут: baraholka.onliner.by/viewtopic.php?t=9646625

Не очень серьезные люди, несколько раз рассказывали байки несуразные типа, ошибочно не вам отправили и т.п.
avatar

Ghost_D

  • 30 августа 2014, 11:13
+
0
Я думаю над тем чтоб заказать себе что то вроде этого www.aliexpress.com/store/product/promotion-80W-flexible-solar-panel-with-Front-Side-Connection-box-and-0-9M-cable-suitable-to/232329_1355349904.html
А контроллер уже получил вполне нормальный, есть правда странности в схемотехнике, хотя может это и нормально (не силён в ней) там + на все общий(!)вроде как и на 2 СП должно вытянуть при нашем климате
www.aliexpress.com/item/LCD-10A-12V-24V-MPPT-Solar-Panel-Battery-Regulator-Charge-Controller-Three-time-interval/1913047631.html
avatar

_Pashtet_

  • 31 августа 2014, 20:30
+
0
Для начала решил просто попробовать залить скетч в Ардуино Про Мини + дисплей через I2C, скетч под I2C переделал, а на экране ничего не выводиться. Или так и должно быть, если использовать вне платы шилда. Один лишь раз как то получилось увидить на экране надпись Low Battery! :(. Монитор порта работает.
avatar

motor4

  • 2 сентября 2014, 13:32
+
0
Ну, без платы замеров не будет… А так, скорее всего, контрастность нужно крутить на дисплее (как-то же вам удалось получить надпись экране надпись Low Battery!)
avatar

Ghost_D

  • 2 сентября 2014, 13:35
+
0
Собрал данный девайс, пришлось немного изменить печатную плату и код под Arduino pro mini. С LCD разобрался, теперь все работает (коротили соединительные провода, под изолентой) Жаль нет подходящего БП (не могу определиться купить или сделать), что бы проверить его работоспособность.
avatar

motor4

  • 6 сентября 2014, 09:19
+
0
Молодца! Можешь поделиться переработанной платой и фото готового изделия. А ты планируешь этот шилд как контроллер заряда АКБ?
avatar

Ghost_D

  • 6 сентября 2014, 10:44
+
0
Пока солнечной панели нет планирую исспользовать как контроллер заряда АКБ. Подобрал корпус для ЗУ и планирую туда поместить и БП. В корпус все оформлю позже, так как жду самоклейку что б красиво оформить переднею панель. Как удобней и куда выложить фото свого изделия, плату и код?
avatar

motor4

  • 6 сентября 2014, 12:27
+
0
Прикольно, тут еще одного канала не хватает, для ветряка.
avatar

ioleg73

  • 9 сентября 2014, 11:18
+
0
3 А смешной ток для такого транзистора. Он вообще без радиатора греться не должен. Кажется он включен не правильно сток с истоком местами перепутаны. И зачем диод после транзистора?
avatar

Aizef

  • 11 сентября 2014, 08:02
+
0
На плате правильно включен, а на схеме не совсем правильно.))
avatar

Aizef

  • 11 сентября 2014, 08:51
+
0
Блин, с p-канальными полевиками никак не наведу порядок в мыслях…
Вы имеете ввиду, что перепутана на схеме маркировка (D и S)? Очень на то похже :(((
Пользовался этой статьей www.electronics-tutorials.ws/transistor/tran_7.html
Но не доглядел…
avatar

Ghost_D

  • 11 сентября 2014, 09:45
+
0
На схеме буквы D S перепутаны. И резистор к истоку, а не к стоку нужно. n-канальный полевик то же можно довольно легко поставить. Через оптрон или через конденсатор вольтодобавки или даже напрямую. Не понял зачем 60 Гц частота? 900 вполне себе нормально вроде…
avatar

Aizef

  • 11 сентября 2014, 13:37
+
0
С n-канальным я видел только вариант с умножителем на диодах и кондерах… Планирую попробовать…
А 60 Гц — я просто обратил внимание, что у промышленных контроллеров частоты 50/60/100 Гц. Ну и сделал по аналогии.
avatar

Ghost_D

  • 11 сентября 2014, 13:41
+
0
автор молодец за проделанную роботу!!! у меня вопрос — почему без подключения АКБ и Солнечной панели на ЖК и порту пишет различные цифры напряжения? как это устранить
avatar

Dum

  • 2 октября 2014, 07:58
+
0
Привет!)
Смотрел Вашу публикацию солнечного контроллера заряда на arduino очень понравелась, паралельно возникла идея в разработке нового устройтсва «солнечный лимитер»
Так как программировать я не умею, хочу Вам предложить вместе разработать такое устройство.
Актуальность устройства заключаеться в следующем. Люди которые устанавливают солнечные батареи на основе сетевого инвертора (устройство которое сбрасывает всю электроенергию в сеть без аккумуляторов) сталкиваються с проблемой следующого характера. В день когда солнечная активность большая, а потребителей электроенергия нет или очень мало, счетчик может наматывать электроенергию, вместо того чтобы не считать. А лимитер в этом случаи должен отключать сетевой инвертор, или еще лутче включать баластную нагрузку чтобы добро не пропадало даром.
Алгоритм работы я примерно составил, нужен чеовек который умеет програмировать, и ему будет интересно это делать. У меня пока поверхносное знание в программировании ардуино, зато умею паять, травить платы, также есть сетевой инвертор и солнечные фотомодули, тоесть я бы смог полноценно тестировать устройство
avatar

bravo_192

  • 23 ноября 2016, 20:59
+
0
Привет.
Повторил ваш проект. В целом работает, но как говорится не без нюансов.
1. В обозначении на схеме распиновки полевика нужно поменять местами D и S. (P-канальный включается истоком к +)
2. Сравнил с оригинальной схемой перейдя по ссылке на прототип который вы взяли за основу обнаружил что резистор 10К для запирания затвора должен быть между затвором и истоком (к той стороне к которой подходит питание от СП).
3. Во время процесса заряда напряжение которое отображается на дисплее сильно отличается от напряжения которое показывает мультиметр, если полностью снять напряжение от СП (или другого источника зарядного напряжения, то показания выравниваются. Хотя как я понял из описания работы схемы, Ардуино замеряет напряжение при отключенном ШИМе. Возможно это происходит из за того что средняя точка делителя напряжения не подтянута к земле через конденсатор как показано в прототипе.
4. Честно говоря так и не понял назначение диода между транзистором и батареей, в оригинале его нет.
Сама программа реализована отлично, в перспективе как вы уже писали не плохо было бы сделать контроль тока. Подключил дисплей через I2C, естественно подключив библиотеку и проинициализировав её. В общем получился прекрасный контролер, правда придётся что то сделать с показаниями напряжения о которых я писал выше.
avatar

Parkan23

  • 19 декабря 2016, 15:56
+
0
После усиления дорожек всё нюансы исчезли, конденсаторы от средних точек делителей тоже не нужны. В общем и схема и программа работают отлично. Спасибо огромное автору, благодаря его уму я собрал себе отличный зарядник для автомобильного аккумулятора.
avatar

Parkan23

  • 20 декабря 2016, 08:58
+
0
Привет. Молодец, мне очень даже приятно, что кто-то пользуется моими статьями… На самом деле, у меня много чего было изменено в этом проекте в дальнейшем. И тоже было собрано зарядное для автомобильных АКБ, вторая версия платы… Но потом все как-то забросилось/отложилось/забилось. Жаль, что здесь в комментариях нельзя добавлять картинки. Благодаря тебе, я решил написать мини-статью продолжение. Уже без оформления и рюшечек. Постараюсь сегодня-завтра собрать материалы до кучи :)
avatar

Ghost_D

  • 20 декабря 2016, 11:27
+
0
Привет. Зарядник «заточенный» чисто под автомобильный аккум это вообще очень актуальная тема для многих. И хотя я уже собрал эту версию, с удовольствием соберу вторую, для неё я заказал на Али модуль ACS712 для Ардуино, правда его придётся как то связать с ШИМом. Надеюсь вместо контроля напряжения СП реализовать как раз контроль тока, нужно будет только установить зависимость ШИМа от тока. Пишу надеюсь потому что начинать учить язык программирования почти в 50 лет немного поздновато даже для радиолюбителя, но я стараюсь. А теперь есть смысл подождать ваш новый проект, надеюсь что ссылку на статью вы здесь дадите.
avatar

Parkan23

  • 20 декабря 2016, 17:05
+
0
Вот, осилил «сбить в кучу» что у меня по вопросу контроллера имеется. Читайте тут: robocraft.ru/blog/3413.html
avatar

Ghost_D

  • 24 декабря 2016, 17:05
+
0
Огромное спасибо, будем изучать.
Жду когда друзья из Китая пришлют модуль на ACS712 на 20 ампер. Пока думаю как лучше его вписать в разработанный вами скетч. В первом приближении будет так —
1. Считывание нужно будет производить только при ШИМе равном 255 тем же пином который считывает сейчас напряжение СП.
2. Отключить «Режим Сна» и ввести контроль тока с выводом на экран вместо индикации напряжения от СП.
Ток думаю сделать фиксированным, чисто для защиты от того, чтобы аккум с «голодухи» не зажарил полевик. Разряженный аккум ток жрёт без меры (зависит от напряжения которое ему дали) и от полевика с диодом можно будет подкуривать.
Если и когда что то получится обязательно покажу что натворил.
avatar

Parkan23

  • 26 декабря 2016, 19:04
+
0
Наконец то пришёл модуль ACS712 на 20 ампер. Друг помог допилить его под конкретную модель датчика.
Скачать Скетч можно здесь: https://yadi.sk/d/iGkAGd5g3GsTft
avatar

Parkan23

  • 11 апреля 2017, 19:11

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.