Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Интегрированный солнечный контроллер заряда, инвертор, PowerBank, лампа

Компоненты и расходные материалы

Технология Microchip Atmega8
× 1
понижающий преобразователь
× 1
Светодиод SparkFun - алюминиевая печатная плата 3 Вт (5 шт., теплый белый
× 1
Дисплей Nokia 5110
× 1
Радиатор SparkFun
× 1
N-канальный MOSFET SparkFun
× 4
SparkFun P-Channel Mosfet
× 1
Солнечная панель 40 Вт или меньше для системы 12 В
× 1
Литий-ионная батарея SparkFun - ячейка 18650
× 1
DC-DC 0,9–5 В к USB-модулю 5 В постоянного тока Boost Повышающий источник питания
× 1
NPN-транзистор общего назначения
× 1
12-0-12 / 220 Трансформатор с центральным отводом
× 1
1N4007 - высоковольтный диод с высоким номинальным током
× 1
Male-Header 36 Position 1 Row- Long (0.1 ")
× 1
Ползунковый переключатель
× 1
Кнопочный переключатель SparkFun, 12 мм
× 1
Arduino Proto Shield
× 1
Strip / Vero / Proto Board 8x11 см
× 1
Arduino UNO
× 1
Arduino Nano R3
× 1
Arduino Mega 2560
× 1
Диод Шоттки 5822 с низким напряжением FW
× 1
Конденсатор 10 мкФ
× 1
Конденсатор 100 нФ
× 1

Необходимые инструменты и машины

Паяльник (общий)
Drill Motor
Пистолет для горячего клея (общий)

Приложения и онлайн-сервисы

IDE Arduino
AutoDesk 123D

Об этом проекте

Об этом проекте

У меня есть несколько солнечных панелей, 12-вольтовые батареи, трансформаторы и еще несколько вещей, которые некоторое время лежат вокруг и громко кричат, чтобы как-то их использовать. Так родилось это устройство - законченное небольшое фотоэлектрическое решение на одной плате. Давайте сначала рассмотрим, что делает, не так ли?

  • Контроллер заряда - это устройство, которое регулирует зарядку аккумулятора постоянного тока от фотоэлектрической солнечной панели и разрядку аккумулятора нагрузкой, чтобы продлить срок службы аккумулятора.
  • Инвертор - это устройство, которое преобразует постоянный ток электричества в переменный для работы с нагрузками переменного тока.
  • Power Bank обеспечивает питание 5 В постоянного тока через порт USB для гаджетов / мобильных устройств для портативной зарядки или зарядки вне сети.
  • Аварийная лампа - это сверхяркий светодиодный источник света, который можно использовать при отключении электроэнергии, в кемпинге, на открытом воздухе после сумерек.

Это устройство, которое я сделал, имеет все эти функции, последние две функции независимо поддерживаются бортовой литий-ионной батареей. С солнечной панелью (до 100 Вт), свинцово-кислотной батареей на 12 В и трансформатором можно использовать все варианты.

Протоверсия на Uno

Первая версия была разработана на плате Uno Board с минимумом оборудования и минимумом опций. Дисплей Nokia был установлен непосредственно, и был разработан экран полевого МОП-транзистора для поддержки зарядки / разрядки аккумулятора. Нет ни управления меню, ни инвертора, ни зарядки ШИМ, ни крутых функций! Просто включение / выключение зарядки и отображение уровней напряжения батареи и панели. Работает, но обаяния нет!

Полная версия на Protoboard

Затем я разработал этот новый со следующими функциями:

  • ШИМ-контроллер заряда от солнечной батареи до 100 Вт, панель
  • Преобразователь мощности прямоугольной формы 60 Вт
  • Контроль нагрузки до трех 12 В постоянного тока
  • Основная нагрузка постоянного тока поддерживает функции автоматического включения / выключения.
  • Независимый USB Power Bank
  • Модуль понижающего регулятора
  • Аварийная бортовая светодиодная лампа с регулировкой мигания и яркости.

2 кнопки / переключатели, контролируемые прокруткой и выбором меню для управления пользователем, отображением параметров и информации о состоянии на дисплее Nokia 5110. Очень круто! Задняя сторона изолирована горячим клеем для защиты от короткого замыкания металлических предметов!

Есть еще несколько удобных функций, таких как переключатель включения / выключения подсветки дисплея, отделяющий понижающий уровень для независимой работы путем отключения от внутренней батареи.

Доступ к меню на дисплее Nokia 5110 с помощью кнопки пользователя показан здесь:

Давайте узнаем некоторые технические детали!

Контроллер заряда может быть типа Вкл / Выкл, ШИМ или MPPT. Включение / выключение - это простейшая форма (моя версия 1 - рисунок выше) контроллера, который не регулирует ток зарядки, когда напряжение батареи приближается к напряжению полной зарядки.

В то время как PWM постепенно снижает ток зарядки по мере полного заряда аккумулятора. ШИМ-контроллер имеет следующие преимущества:

  • Помогает восстановить потерянную емкость аккумулятора и десульфатировать аккумулятор.
  • Повышает способность аккумулятора принимать больше заряда.
  • Поддерживайте высокую среднюю емкость аккумулятора до 95%.
  • Выровняйте дрейфующие элементы батареи, чтобы внутренние элементы могли иметь одинаковый потенциал.
  • Уменьшите нагрев батареи и выделение газов, предотвращая потерю электролита.
  • Замедляет старение и продлевает срок службы системы.

Но PWM не может получить большую часть электроэнергии от фотоэлектрических солнечных панелей, потому что он перетаскивает панель, чтобы работать с напряжением батареи. MPPT - это решение этой проблемы, которое в основном представляет собой регулируемый повышающий-понижающий преобразователь постоянного тока, он может преобразовывать большую часть солнечной энергии по сравнению с контроллером PWM.

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

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

Понижающий стабилизатор - это понижающий преобразователь постоянного тока в постоянный, здесь я использовал понижающий модуль для зарядки литий-ионной батареи 4,2 В, которая питает контроллер (дисплей Arduino +), независимый USB-блок питания, встроенную светодиодную лампу.

Теперь USB power bank в основном представляет собой повышающий DC-DC, который может преобразовывать диапазон напряжений ниже 5 (например, диапазон от 3,3 до 4,2 вольт) с литий-ионной или литий-полимерной батареи в 5 вольт, что является напряжением шины USB, которое может заряжать мобильные устройства. .

Он также имеет понижающий преобразователь для зарядки этой батареи. В моем проекте понижающий модуль потребляет немного энергии от панели для зарядки внутренней (бортовой) батареи.

Работа оборудования

Прежде чем вдаваться в подробности, проверьте это изображение всего, что связано с устройством:

Система имеет различное оборудование для различных целей. Конечно, мозг - это микроконтроллер AVR Atmega8A (можно использовать Atmega328P с небольшими изменениями, обсуждаемыми ниже), который запрограммирован на Arduino.

Свежий Atmega8A записывается с помощью загрузчика Arduino Optiboot8, вы можете купить загруженный Arduino Mini / Atmega328, чтобы избежать хлопот.

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

Ползунковый переключатель позволяет включать / выключать устройство по мере необходимости.

Функция солнечной зарядки выполняется P-MOSFET, управляемым схемой управления на основе транзистора 2N2222, которая управляется через PWM от микроконтроллера. ШИМ управляется в зависимости от уровня напряжения внешней батареи. Ток от солнечных панелей течет через P-MOSFET к свинцово-кислотной батарее. Когда аккумулятор полностью заряжен, MOSFET отключается от микроконтроллера. После отключения зарядки напряжение аккумулятора начинает постепенно падать, а когда оно достигает 13,6 В, зарядка возобновляется снова с низким коэффициентом заполнения для поддержания плавающей зарядки.

Нагрузка 12 В постоянного тока управляется через N-MOSFET путем управления выводом затвора с микроконтроллера.

Встроенная светодиодная лампа также управляется NMOS. Затвор этого полевого МОП-транзистора управляется ШИМ для регулировки яркости светодиода.

Блок инвертора состоит из 2 N-MOSFET, которые попеременно включаются / выключаются для имитации переменного тока. Добавив внешний центральный трансформатор с ответвлениями, можно реализовать источник переменного тока прямоугольной формы.

На следующем рисунке поясняется действие инвертора:

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

Оба полевых МОП-транзистора должны переключаться на удвоенную частоту переменного тока. Посмотрите следующее изображение, чтобы понять это:

Чтобы создать переменный ток частотой 50 Гц, переменная прямоугольная волна подается на низкую сторону трансформатора с центральным ответвлением 12–0–12 В / 220 В. 50 Гц означает время 20 мс для каждой волны.

Вот почему 20 мс / 2 =10 мс или 100 раз Переключение сигналов затвора, применяемых к полевым МОП-транзисторам, управляющим трансформатором (инверторные полевые МОП-транзисторы).

Внимание !!! :Напряжение переменного тока смертельно для человека, может привести к смерти / травмам! Никогда не прикасайтесь к высоковольтной стороне трансформатора голыми руками!

Если функция инвертора не используется, опция 2XDC Load позволяет использовать еще две 12-вольтовые нагрузки постоянного тока на клемме инвертора.

Магия программного обеспечения

Предоставляются два набора кода, один - полный код в одной вкладке Arduino, другой - код с вкладками в соответствии с отдельными функциями.

Я обобщил группу задач в единую функцию.

Например:

Get_ADCVal () будет измерять напряжения панели, внутренней и внешней батареи, брать 20 выборок, усреднять эти значения и обновлять информацию о переменном удерживающем напряжении.

Context_Control () будет выполнять действия, связанные с взаимодействием с пользователем, контролем действий, обновлением информации при отображении.

Charging_Control (), Discharging_Control (), Load_Control () - это фоновые функции, которые действуют как ЗАКРЫТЫЙ КОНТУР для системы, контролируют уровень напряжения батареи, контролируют функцию автоматической загрузки, контроль защиты от перезарядки / глубокой разрядки и т. Д.

Пользовательские вводы собираются с помощью переключателей мгновенного действия, управляемых прерыванием. При нажатии этих переключателей выполняется ISR, связанная с INT0 / INT1. Две изменчивые переменные dp и ds изменения. Еще одна третья переменная уровень вместе с dp (указатель отображения ->) и ds (селектор отображения содержимого) позволяет пользователю перемещаться по меню / подменю и выполнять необходимые действия.

16-битный TImer1 AVR настроен для генерации прерывания переполнения таймера каждые 10 мс и меняет PIN_INVP и PIN_INVN, когда функция инвертора включена.

Все функции Lcd _.... () имеют какое-то отношение к управлению дисплеем.

Atmega8A против Atmega328P (Uno)

Систему можно легко модернизировать для работы с Atmega328P / Uno, внося следующие изменения в код. Найти и заменить

  TIMSK с TIMSK1 # определить ADC_VREF 2.69 с #define ADC_VREF 1.11 #define ADCVDIV_R1 22 с #define ADCVDIV_R1 8.2  

В аппаратной части вам необходимо использовать резистор 8,2 кОм вместо 22 кОм . Чтобы уменьшить масштаб панели, напряжение батареи должно соответствовать диапазону измерения АЦП.

Видео с боевыми действиями

Обычно я не читаю одних слов о каком-то проекте, а сначала смотрю видео. Если вы похожи на меня, наслаждайтесь видео:

Объем улучшений

У меня закончилось место для Flash в Atmega8A. Не удалось добавить некоторые важные функции, например:

  • Программно управляемая защита от перегрузки / короткого замыкания
  • Некоторые графические значки и логотип
  • Измерение энергии и лесозаготовки
  • Оценка времени резервного копирования и сигнал тревоги
  • Вариант зарядки ноутбука
  • Поддержка системы на 6 вольт
  • Контроль нагрузки Bluetooth
  • Контроль нагрузки на основе таймера
  • Часы RTC для других интересных функций.
  • Решение с подключением к Интернету вещей

Если у вас есть планы сделать что-то подобное, не забудьте добавить некоторые из этих функций!

Atmega328P (Uno) или Arduino Mega могут быть лучшим кандидатом для включения всех этих опций.

В любом случае, он делает свою работу, я доволен.

Дополнительные ресурсы

  • Загрузите Arduino 1.0.6 с поддержкой платы Atmega8.
  • Откройте Arduino.exe, выберите «Инструменты»> «Плата»> «Optiboot8».
  • Записать загрузчик с помощью этого метода
  • Скомпилировать и загрузить код

Код

  • Код с одной вкладкой
  • Полный код
  • Загрузчики
Код с одной вкладкой Arduino
 #define PIN_SCE 12 # define PIN_RESET 13 #define PIN_DC 8 # define PIN_SDIN 7 # define PIN_SCLK 6 # define PIN_INVP 4 # define PIN_INVN 5 # define PIN_LOAD 9 // 12 v dc load # define PIN_LAMP 10 // WHITE LED LIGHT #define PIN_BATTPWM 11 // Управляет PMOS для зарядки Ext BAtt #define PIN_BATTint_Sense A2 #define PIN_BATTint_Sense A2 #define PIN_SOLAR_Sense A0 # define PIN_BATText_Sense A3 #define ADC_VREF 2.695 // внутреннее эталонное напряжение, около 1,11 В для Arduino Uno aka Atmega my Atmega! define ADCVDIV_R1 22 // нижний резистор делителя напряжения 22 кОм # define ADCVDIV_R2 175 // верхний резистор делителя напряжения 175 к 0 &1 КАК ПРОГРАММИРОВАНИЕ // СБРОС PIN КАК # определить LCD_C LOW # определить LCD_D HIGH # определить LCD_X 84 # определить LCD_Y 48uint8_t x =0; uint8_t level =0; uint8_t blinker =0; boolean Load_Auto_Enable =0; float maxADC_Voltage =0,0; float BattInt_Voltage =0,0; float BattExt_Voltage =0,0; float PV_Voltage =0,0; volatile int y =0; volatile uint8_t dp =0; volatile uint8_t ds =0; volatile цикл =0; volatile uint8_t cdc_level =0; // int i; void setup (void) {LcdInitialise (); LcdClear (); LcdString ("* АРДУБОЙ PV *"); LcdString («КОНТРОЛЛЕР»); LcdString ("ИНВЕРТОР ПЕРЕМЕННОГО ТОКА"); LcdString ("БАНК СИЛЫ"); LcdString ("ВЕЩЬ ЛАМПЫ !!"); задержка (3000); analogReference (ВНУТРЕННИЙ); maxADC_Voltage =(ADC_VREF / ADCVDIV_R1) * (ADCVDIV_R1 + ADCVDIV_R2); pinMode (PIN_LOAD, ВЫХОД); digitalWrite (PIN_LOAD, LOW); pinMode (2, INPUT_PULLUP); attachInterrupt (0, SW1, FALLING); // Прерывание для Swithc 1 pinMode (3, INPUT_PULLUP); attachInterrupt (1, SW2, FALLING); // Прерывание для Swithc 2} void loop (void) {Get_ADCVal (); Context_Control (); Charging_Control (); Discharging_Control (); Load_Control (); LcdClear ();;} // /////////// АЦП /////////////// void Get_ADCVal (void) {int I =0; int J =0; int K =0; for ( x =0; x <20; x ++) {I =I + analogRead (PIN_BATTint_Sense); J =J + analogRead (PIN_BATText_Sense); K =K + analogRead (PIN_SOLAR_Sense); } // среднее напряжение BattInt_Voltage =I / 20.0; BattExt_Voltage =J / 20.0; PV_Voltage =K / 20.0; BattInt_Voltage =maxADC_Voltage * BattInt_Voltage / 1023.0; BattExt_Voltage =maxADC_Voltage * PV_ADC_Voltage * PV_ADC_Voltage * PV_ADC_Voltage * PV_ADC_Voltage * PV_ADC_Voltage * PV_ADC_Voltage * PV_ADC_Voltage * PV_Voltage / 10_Voltage * PV_Voltage * / 10Voltage * PV_Voltage / 10_Voltage * ////////// Отображение и управление ////////////// void Context_Control (void) {if (ds ==0) {show_menu ();} if (ds ==1 &&dp ==0) {show_info (); delay (100);} // LcdClear (); Get_ADCVal ();} /////////////////////// Вход в первое подменю ////// ////////////////////// if (ds ==1 &&dp ==1) {level =1; dp =0; в то время как (уровень ==1) {int temp =ds; LcdClear (); show_load_ctrl (); задержка (250); if (dp ==0) {if (ds! =temp) {Load_Auto_Enable =0; digitalWrite (PIN_LOAD, LOW);}} if (dp ==1) {if (ds! =temp) {Load_Auto_Enable =0; digitalWrite (PIN_LOAD, HIGH);}} if (dp ==2) {if (ds! =temp) {Load_Auto_Enable =1;}} if (dp ==3) {show_load_ctrl (); delay (250); level =0; dp =0; ds =0;}}} //////////////////////// Вход во второе подменю /////////// /////////////////// if (ds ==1 &&dp ==2) {level =2; dp =0; в то время как (уровень ==2) {int temp =ds; show_inv_ctrl (); задержка (250); LcdClear (); if (dp ==0) {if (ds! =temp) {Timer1_Init ();}} if (dp ==1) {if (ds! =temp) {Timer1_DeInit ();}} if (dp ==2 ) {if (ds! =temp) {Timer1_DeInit (); digitalWrite (PIN_INVP, 1); digitalWrite (PIN_INVN, 1);}} if (dp ==3) {show_inv_ctrl (); delay (250); level =0; dp =0; ds =0;}}} ////////////////////////////////////// /////////////////// //////////////// Вход в 3-е подменю /////////// ////////////////// if (ds ==1 &&dp ==3) {level =3; dp =0; в то время как (уровень ==3) {int temp =ds; LcdClear (); show_led_ctrl (); задержка (250); if (dp ==0) {blinker =0; if (ds! =temp) {if (y <=255) {y =y + 15; analogWrite (PIN_LAMP, y);}}} if (dp ==1 ) {blinker =0; if (ds! =temp) {if (y> =0) {y =y-15; analogWrite (PIN_LAMP, y);}}} if (dp ==2) {if (ds! =temp) {blinker ^ =1; analogWrite (PIN_LAMP, 127); delay (250); analogWrite (PIN_LAMP, 0);}} if (dp ==3) {show_led_ctrl (); delay (250); level =0; dp =0; ds =0;}}} ////////////////////////////////////// /////////////////// // {show_inv_ctrl ();} // {show_led_ctrl ();} //} if (blinker ==1) {analogWrite (PIN_LAMP, 0);} delay (250); if (blinker ==1) {analogWrite (PIN_LAMP, 127);}} ////////////////////////// /// Текст меню для отображения на дисплее Nokia 5110 /////////////////// void show_menu (void) {LcdXY (0, dp); LcdString ("->" ); LcdXY (15,0); LcdString ("Sys Info"); LcdXY (15,1); LcdString ("DC Load +"); LcdXY (15,2); LcdString ("AC Load ~"); LcdXY ( 15,3); LcdString ("Светодиодная лампа");} void show_info (void) {LcdXY (0,0); LcdString ("Bat_I ="); LcdNumtoString (BattInt_Voltage); LcdString ("v"); LcdXY (0 , 1); LcdString ("Bat_E ="); LcdNumtoString (BattExt_Voltage); LcdString ("v"); LcdXY (0,2); LcdString ("Sol_ P ="); LcdNumtoString (PV_Voltage); LcdString (" v "); LcdXY (0,3); if (BattExt_Voltage> 8.0) {LcdString (" Batt Conn OK ");} else {LcdString (" Connect Batt ");} if (PV_Voltage> 10,5 &&cdc_level! =3 &&cdc_level! =0) {LcdString ("Charging:ON");} else {LcdString ("Charging:OFF");} if (TCNT1> =45535) {LcdString ("Inverter:ON");} else {LcdString ("Inverter:OFF");}} void show_load_ctrl (void) {LcdXY (0, dp); LcdString ("->"); LcdXY (15,0); LcdString («Загрузка отключена»); LcdXY (15,1); LcdString («Загрузка включена»); LcdXY (15,2); LcdString («Загрузка автоматически»); LcdXY (15,3); LcdString («Возврат» ); LcdXY (0,4); LcdString ("Необходимо подключение"); LcdString ("Нагрузка 12 В постоянного тока");} void show_inv_ctrl (void) {LcdXY (0, dp); LcdString ("->"); LcdXY ( 15,0); LcdString («AC Inv On»); LcdXY (15,1); LcdString («AC Inv Off»); LcdXY (15,2); LcdString («2XDC Load»); LcdXY (15,3 ); LcdString («Возврат»); LcdXY (0,4); LcdString («2XDC Load, NO»); LcdXY (0,5); LcdString («ТРАНСФОРМАТОР!»);} Void show_led_ctrl (void) {LcdXY ( 0, dp); LcdString ("->"); LcdXY (15,0); LcdString ("LED ++"); LcdXY (15,1); LcdString ("LED -"); LcdXY (15,2 ); LcdString ("LED Blk" ); LcdXY (15,3); LcdString ("Return"); LcdXY (0,4); LcdString ("LED DISABLEs"); LcdXY (0,5); LcdString ("When INVR On");} // //////////// Прерывание ISR ////////////// void SW1 () {dp ++; if (dp>
 3) {dp =0;}} void SW2 () {ds ^ =1;} ISR (TIMER1_OVF_vect) {noInterrupts (); TCNT1 =45535; // TCNT1 =25535; цикл ^ =1; если (цикл ==0); {digitalWrite (PIN_INVP, HIGH); delayMicroseconds (1); // зона нечувствительности digitalWrite (PIN_INVN, LOW); delayMicroseconds (1); } если (цикл ==1) {digitalWrite (PIN_INVP, LOW); delayMicroseconds (1); // зона нечувствительности digitalWrite (PIN_INVN, HIGH); delayMicroseconds (1); } прерывания (); } ///////////// Функции Nokia 5110 ////////// static const byte ASCII [] [5] ={{0x00, 0x00, 0x00, 0x00, 0x00} / / 20, {0x00, 0x00, 0x5f, 0x00, 0x00} // 21!, {0x00, 0x07, 0x00, 0x07, 0x00} // 22 ", {0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 # , {0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $, {0x23, 0x13, 0x08, 0x64, 0x62} // 25%, {0x36, 0x49, 0x55, 0x22, 0x50} // 26 &, { 0x00, 0x05, 0x03, 0x00, 0x00} // 27 ', {0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (, {0x00, 0x41, 0x22, 0x1c, 0x00} // 29), {0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *, {0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +, {0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,, {0x08, 0x08, 0x08, 0x08, 0x08} // 2d -, {0x00, 0x60, 0x60, 0x00, 0x00} // 2e., {0x20, 0x10, 0x08, 0x04, 0x02} // 2f /, {0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0, {0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1, {0x42, 0x61, 0x51, 0x49, 0x46} // 32 2, {0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3, {0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4, {0x27, 0x45, 0x45, 0x45, 0x39} // 35 5, {0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6, {0x01, 0x71, 0x09, 0x05, 0x03 } // 37 7, {0x36, 0x49, 0x49, 0x49, 0x36} // 38 8, {0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9, {0x00, 0x36, 0x36, 0x00, 0x00} / / 3a:, {0x00, 0x56, 0x36, 0x00, 0x00} // 3b;, {0x08, 0x14, 0x22, 0x41, 0x00} // 3c <, {0x14, 0x14, 0x14, 0x14, 0x14} // 3d =, {0x00, 0x41, 0x22, 0x14, 0x08} // 3e>, {0x02, 0x01, 0x51, 0x09, 0x06} // 3f?, {0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @, {0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A, {0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B, {0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C, {0x7f , 0x41, 0x41, 0x22, 0x1c} // 44 D, {0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E, {0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F, {0x3e, 0x41 , 0x49, 0x49, 0x7a} // 47 G, {0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H, {0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I, {0x20, 0x40, 0x41 , 0x3f, 0x01} // 4a J, {0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K, {0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L, {0x7f, 0x02, 0x0c, 0x02 , 0x7f} // 4d M, {0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N, {0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O, {0x7f, 0x09, 0x09, 0x09, 0x06 } // 50 P, {0x3e, 0x41, 0x 51, 0x21, 0x5e} // 51 Q, {0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R, {0x46, 0x49, 0x49, 0x49, 0x31} // 53 S, {0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T, {0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U, {0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V, {0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 Вт, {0x63, 0x14, 0x08, 0x14, 0x63} // 58 X, {0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y, {0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z, {0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [, {0x02, 0x04, 0x08, 0x10, 0x20} // 5c, {0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ], {0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^, {0x40, 0x40, 0x40, 0x40, 0x40} // 5f _, {0x00, 0x01, 0x02, 0x04, 0x00} // 60 `, {0x20, 0x54, 0x54, 0x54, 0x78} // 61 a, {0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b, {0x38, 0x44, 0x44, 0x44, 0x20} // 63 c, {0x38 , 0x44, 0x44, 0x48, 0x7f} // 64 d, {0x38, 0x54, 0x54, 0x54, 0x18} // 65 e, {0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f, {0x0c, 0x52 , 0x52, 0x52, 0x3e} // 67 g, {0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h, {0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i, {0x20, 0x40, 0x44 , 0x3d, 0x00} // 6a j, {0 x7f, 0x10, 0x28, 0x44, 0x00} // 6b k, {0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l, {0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m, {0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n, {0x38, 0x44, 0x44, 0x44, 0x38} // 6f o, {0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p, {0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q, {0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r, {0x48, 0x54, 0x54, 0x54, 0x20} // 73 s, {0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t, {0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u, {0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v, {0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w, {0x44, 0x28, 0x10, 0x28, 0x44} // 78 x, {0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y, {0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z, {0x00, 0x08, 0x36, 0x41, 0x00} // 7b {, {0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |, {0x00, 0x41, 0x36, 0x08, 0x00} // 7d}, {0x10, 0x08, 0x08, 0x10, 0x08} // 7e, {0x78, 0x46, 0x41, 0x46, 0x78} // 7f}; void LcdCharacter (символьный символ) {LcdWrite (LCD_D, 0x00); for (int index =0; index <5; index ++) {LcdWrite (LCD_D, ASCII [символ - 0x20] [индекс]); } LcdWrite (LCD_D, 0x00);} void LcdClear (void) {for (int index =0; index  0) {digitalWrite (PIN_LOAD, HIGH);} if (Load_Auto_Enable ==1 &&PV_Voltage> 10,5 || cdc_level ==0) {digitalWrite (PIN_LOAD, LOW);}} void Charging_Control (void) {// BattExt_Voltage Level 14.3 Зарядка выключена, 13.5 или ниже Зарядка включена, 10.8 Нагрузка выключена, 12.5 Нагрузка включена // это следующее условие предотвращает попытки зарядки в ночное время% night PV составляет 0 вольт! if (PV_Voltage> 10,5 &&BattExt_Voltage> 8,0) {if (BattExt_Voltage <=12,5) {analogWrite (PIN_BATTPWM, 255); cdc_level =0; } если (BattExt_Voltage> 12,5 &&BattExt_Voltage <=12,9) {analogWrite (PIN_BATTPWM, 200); cdc_level =1; } если (BattExt_Voltage> 12,9 &&BattExt_Voltage <=13,3) {analogWrite (PIN_BATTPWM, 160); cdc_level =1; } если (BattExt_Voltage> 13,3 &&BattExt_Voltage <=13,6) {analogWrite (PIN_BATTPWM, 120); cdc_level =2; } if (BattExt_Voltage> 13,6 &&BattExt_Voltage <=13,9 &&cdc_level ==2) {analogWrite (PIN_BATTPWM, 80); cdc_level =2; } if (BattExt_Voltage> 13.9 &&BattExt_Voltage <=14.3 &&cdc_level ==2) {analogWrite (PIN_BATTPWM, 40); cdc_level =2; } // Блокировка из-за перенапряжения, пока cdc_level равен 3, зарядка НЕТ! Зарядка возобновляется, когда cdc равно 2, что ниже 13,5 В if (BattExt_Voltage> 14,3) {analogWrite (PIN_BATTPWM, 0); cdc_level =3; } }else {analogWrite(PIN_BATTPWM,0);cdc_level =3;}}/// Under voltage Lockoutvoid Discharging_Control (void){if (BattExt_Voltage <=10.8) { cdc_level =0; {digitalWrite(PIN_LOAD,LOW);} Timer1_DeInit(); }}/////////////// Timer 2 Functions //////////////// This portion of the code is written in AVR stylevoid Timer1_Init(void){ noInterrupts(); // disable all interrupts pinMode(PIN_INVP,OUTPUT); pinMode(PIN_INVN,OUTPUT); TCCR1A =0; TCCR1B =0; /* ========================================50 Hz AC means 20 ms Wave which is formed by 2, 10 ms Pulses from PIN_INVP and PIN_INVN pins so both this pin should toggle at 100 Hz ! Now 100 Hz =.01 sec Arduino System Clock 16 MHz =16000000 cycle in 0,01 sec we have 160000 cycles using prescaler of 8 (CS11) makes timer count 160000/8 =20000 timer ticks Since the timer 2 is 16 bit Up Counter and it Overflows at 65635 value we need to start counting from 65535-20000 =from 45535 value upto 65535 thus TCNT1 starts at 45535 ..then tick tick tick ... 46000 .... 50000 .............. 65536 !!! Boom Timer Over Flow Interrupt and toggle the Inverter driving pins in ISR and start counting from 45535 Again !!! (This happens in the Background) ========================================*/ TCNT1 =45535; //TCNT1 =25535; TCCR1B |=(1 < 
Full CodeC/C++
Code Organized &Readable
No preview (download only).
BootloadersC/C++
 Нет предварительного просмотра (только загрузка). 

Схема


Производственный процесс

  1. Что такое солнечный инвертор и как он работает?
  2. Галогенная лампа
  3. Лавовая лампа
  4. Солнечная система отопления
  5. Интегральная схема
  6. Солнечный элемент
  7. Умный светофор
  8. Игровой контроллер Arduino
  9. Solar Tracker V2.0
  10. Понимание солнечной энергии