PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Питание (http://pccar.ru/forumdisplay.php?f=173)
-   -   Блок питания для NEXUS7-2012,2013 или любого планшета -печатка, прошивка, инструкция (http://pccar.ru/showthread.php?t=27466)

oleg707 04.10.2018 00:55

Вложений: 1
Предыдущая часть

ITS724G, если по простому, представляет собой управляемый выключатель на 4 канала, с защитой по превышению тока и температуры.
Вложение 50269
Подавая на канал IN1-IN4 слаботочное напряжение ( в нашем случае >= +5В), этим включаем "силовое" выходное напряжение (+12) на соответствующих каналах OUT1-OUT4.

следующая часть

oleg707 04.10.2018 13:37

Вложений: 1
Предыдущая часть
C делителя R5-R6 около +6В пошло на IN4 интеллектуального ключа ITS724G. На выходе OUT4 появляется +12В, которое через резистор R1 пошло на контакт Vin ардуино.
Вложение 50270

следующая часть

oleg707 05.10.2018 12:53

стабильная прошивка m36 для 5mini, 5mini2,1 5mini2,2
 
PHP код:

const byte ver 36;// БЕТА( чем больше цифра, тем новее)
byte TipBlokaPitania 255// 177 - BP7. 255 - BP5mini,5mini2.1 //выбор типа блока питания.
// дата правки 29.07.18.1118

// для 5mini, 5mini2,1 5mini2,2 версии блока питания. 
// скетч проверен и записан на версии ардуино IDE 1.9.0  1,8,1 win7, 1.63 xp
// МОЮ сборку ардуино можно скачать тут  https://drive.google.com/file/d/1oAzCQYh9XUnrhFRb314IWGtA45K7Vonh/view?usp=sharing


//Н А С Т Р О Й К И      П О Л Ь З О В А Т Е Л Я      П О Д      С В О И      П О Т Р Е Б Н О С Т И 
// Н А С Т Р О Й К И      П О Л Ь З О В А Т Е Л Я      П О Д      С В О И      П О Т Р Е Б Н О С Т И 
//  Н А С Т Р О Й К И      П О Л Ь З О В А Т Е Л Я      П О Д      С В О И      П О Т Р Е Б Н О С Т И  
//   Н А С Т Р О Й К И      П О Л Ь З О В А Т Е Л Я      П О Д      С В О И      П О Т Р Е Б Н О С Т И 

const byte OTLADKA 0;     //  режим ОТЛАДКИ. 0 = нормальная работа. 1 = отладка. 2 = отладка. 
// Если на столе или в машине блок питания не включает выходы, выключается послы выключения зажигания, то для проверки функций включаем OTLADKA = 1;
// Для штатной, нормальной работы блока питания ставим OTLADKA = 0;  
// 1 - режим отладки, при котором напряжение АКБ принято за 14.50. Напряжение АСС = 14.50 при включенном АСС и реальное напряжениие на линии АСС при вЫключенном.   
// 2 - режим отладки, при котором ВСЕГДА напряжения АСС и АКБ приняты за 14.50В   

const byte brac_nastrojki_iz_EEPROM 0;      // если вы хотите СОХРАНИТЬ свои настройки в энергонезависимую память(еепром), тогда ставим 1, 0 - берём значения из скетча, игнорируя память ( кроме калибровки), 2 - берем значения из памяти eeprom,(если память пустая, берем значения из скетча.) 
 
byte reset_HUB_on_power_on 1;      // передёргивать ли хаб при каждом включении зажигания, для решения проблемы с определением изикапа (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.  При 1 могут быть проблемы с определением флешки в хабе, отгда поставить 0.
 
byte power_off_HUB_on_starting 1;  // выключать ли питание на хаб при старте авто ( 1- да, выключать) (0 - не выключать)
 
byte power_off_OTG_on_starting 1;  // выключать ли массу на OTG при старте авто   ( 1- да, выключать) (0 - не выключать)
 
byte HALL_as_power_Switch 0;       // 0 - используем ДХ как обычно. 1 - вместо ДХ подключаем кнопку питания планшета. Если подключено как КНОПКА, то задержка перед нажатием "кнопки" после включения АСС это SLEEP_timer_pri_vkl_ACC, а после вЫключения  SLEEP_timer_pri_vykl_ACC. Удержание нажатия = vremia_uderjanija_najatoj_knopki_POWER. ДХ = Датчик Холла.  
 
unsigned long  vremia_uderjanija_najatoj_knopki_POWER 250//если HALL_as_power_Switch = 1, то время "зажатия" (нажимания) кнопки питания планшета устанавливаем тут. 500 = 0,5с. 

//НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________
// напряжения должны быть записаны ТОЛЬКО в XX.X формате, например 11.0
  
float Uperezariadki 15.5;              // напряжение, выше которого будет считаться, что идёт перезарядка аккумулятора авто.
  
float UrabotyREM 11.8;                 // напряжение, выше которого будет работать усилитель звука, если акб не садился.
  
float UnevykluczeniaREM 13.7;          // напряжение, когда машина считается заведённой. Тогда, если завели машину, ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
  
float Uakb_Kogda_ACC_vYkluczeno 11.9;  // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вЫключенном АСС
  
float Uakb_Kogda_ACC_vkluczeno 11.1;   // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вКлюченном АСС
  
float UaccONorOFF 10.1;                // напряжение порога сработки асс.  Т.е. если на пин блока питания "вход АСС" подать ниже UaccONorOFF (11,1), то зажигание будет считаться выключенным.
//КОНЕЦ НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________
  
/*счётчики времени*/
  //НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!      НАСТРОЙКИ ТАЙМИНГОВ!!!      НАСТРОЙКИ ТАЙМИНГОВ!!!      НАСТРОЙКИ ТАЙМИНГОВ!!!      НАСТРОЙКИ ТАЙМИНГОВ!!!
  
 
unsigned long  timeUntilBATOff 345600000;                     // время до выключения питания на батарею планшета после выключения зажигания., считаем ОТ момента выключения зажигания. если прошло 48 часов, как выключили ACC // пауза  (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)
 
unsigned long  timeUntilALLOff 172800000 timeUntilBATOff;   // время до полного выключение блока,  после выключения зажигания (ACC)и уже после того, как выключится питание на батарею планшета    ) (2суток = 172800000)) (4суток = 345600000)
 
unsigned long timeBeforeRemOff 1800000;                            // 1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. ( то есть сколько времени будет включён усилитель звука, если заглушить машину и просто слушать музыку,  при нормальном АКБ)

 
unsigned long timeAfterACC_starting 7000;                // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время кручения стартером
 
unsigned long timeAfterACC_accOFF 2000;                  // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время обычного выключения зажигания
 
unsigned long timeWhileAkbLow 40000;                     // 40000 время, через которое начнётся полное выключение блока когда напряжение на АКБ очень низкое.   /* если севший аккумулятор //через 40с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
 
unsigned long pauseTimeHALL 140000;            // Для первого включения планшета. Раньше этого времени экран не будет тухнуть! Время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин
 
unsigned long vremia_obnovlenia_displeya 250;  // Время, через которое будет обновляться информация на дисплей I2C  (время обновления I2C дисплея)

//тут настраиваем паузу при вКлючении зажигания ( АСС) и по истечении этого времени активируем/деактивируем  
//соответствующий пин блока питания (время независимо друг от друга)
 
unsigned long  PlanshBAT_timer_pri_vkl_ACC 1100;// пауза  после включения ACC перед включением питания на батарею планшета
 
unsigned long  FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC 1400;// пауза  после включения ACC перед включением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ) 
 
unsigned long  OTG_timer_pri_vkl_ACC 50;// пауза  после включения ACC перед включением минуса на OTG ( 4й контакт ЮСБ разъема на планшете)  (включается определение ЮСБ периферии  планшетом.)
 
unsigned long  HUB_timer_pri_vkl_ACC 2100;// пауза  после включения ACC перед подачей питания на хаб. Значение должно быть больше либо равно FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC.
 
unsigned long  REGISTRATOR_timer_pri_vkl_ACC 2500;// пауза  после включения ACC перед включением  питания +12В на видеорегистратор
 
unsigned long  REM_timer_pri_vkl_ACC 2500;// пауза  после включения ACC перед включением  питания +12В на REM (включение усилителя звука)
 
unsigned long  SLEEP_timer_pri_vkl_ACC 3000// пауза  после включения ACC перед включением экрана планшета (масса на Датчик Холла)
 
unsigned long  I_dva_C_szina_ON_time 150;        //Время, через которое I2C шина включится после вКлючения зажигания - начнётся передача по шине I2C.

//тут настраиваем паузу при вЫключении зажигания ( АСС) и по истечении этого времени активируем/деактивируем 
//соответствующий пин блока питания (время независимо друг от друга)
 
unsigned long  OTG_timer_pri_vykl_ACC 2500// пауза  после вЫключения ACC перед вЫключением минуса на OTG ( 4й контакт ЮСБ разъема на планшете) (вЫключается определение ЮСБ периферии  планшетом.)
 
unsigned long  FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC 5000// пауза  после вЫключения ACC перед вЫключением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ) 
 
unsigned long  HUB_timer_pri_vykl_ACC 5000// пауза после вЫключения ACC перед убиранием питания с хаба. Значение должно быть меньше либо равно FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC.
 
unsigned long  SLEEP_timer_pri_vykl_ACC 0// пауза  после вЫключения ACC перед вЫключением экрана планшета (масса на Датчик Холла)
 
unsigned long  REM_timer_pri_vykl_ACC 1000;// не может быть больше timeAfterACC_accOFF и timeAfterACC_starting!  Пауза  после вЫключения ACC перед вЫключением  питания +12В на REM (вЫключение усилителя звука), тут 1000 это на сколько раньше выключать выход REM перед остальными выключениями
 
unsigned long  lcd_noBacklight_timer_pri_vykl_ACC 17000// 7000 пауза после вЫключения ACC перед убиранием подсветки I2C LSD дисплея (1602)
 
unsigned long  I_dva_C_szina_OFF_time lcd_noBacklight_timer_pri_vykl_ACC 3000;      //Время, которое I2C шина работает после вЫключения зажигания, потом  - закончится передача по шине I2C.
 
unsigned long  REGISTRATOR_timer_pri_vYkl_ACC timeUntilALLOff//  пауза  после вЫключения ACC перед вЫключением  питания +12В на видеорегистратор // unsigned long  REGISTRATOR_timer_pri_vYkl_ACC = 10000; = 10 секунд

unsigned long  rezerv3 =0;
unsigned long  rezerv4 =0;
float          rezerv5 =0;
float          rezerv6 =0;
float          rezerv7 =00.00;
 
//конец настроек таймингов.__________________________________________________________________________________________


//К О Н Е Ц      Н А С Т Р О Й К И      П О Л Ь З О В А Т Е Л Я      П О Д      С В О И      П О Т Р Е Б Н О С Т И 
// К О Н Е Ц      Н А С Т Р О Й К И      П О Л Ь З О В А Т Е Л Я      П О Д      С В О И      П О Т Р Е Б Н О С Т И 
//  К О Н Е Ц      Н А С Т Р О Й К И      П О Л Ь З О В А Т Е Л Я      П О Д      С В О И      П О Т Р Е Б Н О С Т И  
//   К О Н Е Ц      Н А С Т Р О Й К И      П О Л Ь З О В А Т Е Л Я      П О Д      С В О И      П О Т Р Е Б Н О С Т И 
   
const int nachalnyj_address_dannyh_polzovatelja_v_eeprom 2;                    // Переменная для хранения начального адреса еепром

struct myStruct_Znachenija_peremennyh_i_timingov {                   // Создаем пользовательскую структуру
 
byte reset_HUB_on_power_on;      // передёргивать ли хаб при каждом включении зажигания, для решения проблемы с определением изикапа (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.
 
byte power_off_HUB_on_starting ;  // выключать ли питание на хаб при старте авто ( 1- да, выключать)
 
byte power_off_OTG_on_starting;   // выключать ли массу на OTG при старте авто   ( 1- да, выключать)
 
byte HALL_as_power_Switch ;       // 0 - используем ДХ как обычно. 1 - вместо ДХ подключаем кнопку питания планшета. Если подключено как КНОПКА, то задержка перед нажатием "кнопки" после включения АСС это SLEEP_timer_pri_vkl_ACC, а после вЫключения  SLEEP_timer_pri_vykl_ACC. Удержание нажатия = 0,5с. 
  
float Uperezariadki ;              // напряжение, выше которого будет считаться, что идёт перезарядка аккумулятора авто.
  
float UrabotyREM ;                 // напряжение, выше которого будет работать усилитель звука, если акб не садился.
  
float UnevykluczeniaREM ;          // напряжение, когда машина считается заведённой. Тогда, если завели машину, ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
  
float Uakb_Kogda_ACC_vYkluczeno ;  // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вЫключенном АСС
  
float Uakb_Kogda_ACC_vkluczeno ;   // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вКлюченном АСС
  
float UaccONorOFF ;                // напряжение порога сработки асс.  Т.е. если на пин блока питания "вход АСС" подать ниже UaccONorOFF (11,1), то зажигание будет считаться выключенным.
  
unsigned long timeUntilBATOff;                                // 4 байта
  
unsigned long timeUntilALLOff;                                // 4 байта
  
unsigned long timeBeforeRemOff;                               // 4 байта
 
unsigned long timeAfterACC_starting;                                // 4 байта
 
unsigned long timeAfterACC_accOFF ;                                // 4 байта
 
unsigned long timeWhileAkbLow ;                                     // 4 байта
 
unsigned long pauseTimeHALL ;                                       // 4 байта
 
unsigned long vremia_obnovlenia_displeya ;                          // 4 байта
 
unsigned long  PlanshBAT_timer_pri_vkl_ACC;                               // 4 байта
 
unsigned long  FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC;    // 4 байта
 
unsigned long  OTG_timer_pri_vkl_ACC;                                         // 4 байта
 
unsigned long  HUB_timer_pri_vkl_ACC;                                        // 4 байта
 
unsigned long  REGISTRATOR_timer_pri_vkl_ACC;                            // 4 байта
 
unsigned long  REM_timer_pri_vkl_ACC;                                        // 4 байта
 
unsigned long  SLEEP_timer_pri_vkl_ACC;                                    // 4 байта
 
unsigned long  I_dva_C_szina_ON_time;                                        // 4 байта
unsigned long  OTG_timer_pri_vykl_ACC ;                                        // 4 байта
unsigned long  FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC ;// 4 байта
unsigned long  HUB_timer_pri_vykl_ACC;                                        // 4 байта
unsigned long  SLEEP_timer_pri_vykl_ACC;                        // 4 байта
unsigned long  REM_timer_pri_vykl_ACC ;                         // 4 байта
unsigned long  lcd_noBacklight_timer_pri_vykl_ACC ;             // 4 байта
unsigned long  I_dva_C_szina_OFF_time ;                         // 4 байта
unsigned long  vremia_uderjanija_najatoj_knopki_POWER 
unsigned long  REGISTRATOR_timer_pri_vYkl_ACC ;
unsigned long  rezerv3 ;
unsigned long  rezerv4 ;
float          rezerv5 ;
float          rezerv6 ;
float          rezerv7 ;
};

//***************************************************************************************************************************************************
// Массив режимов работы светодиода
byte modes[] = {
  
0B00000000//Светодиод выключен
  
0B11111111//Горит постоянно
  
0B00111111//Мигание по 0.8 сек
  
0B00000001//Короткая вспышка раз в секунду 
  
0B00000101//Две короткие вспышки раз в секунду  
  
0B00010101//Три короткие вспышки раз в секунду
  
0B01010101  //Частые короткие вспышки (4 раза в секунду) 
};
uint32_t msms1 0
uint8_t  blink_loop 0;
uint8_t  blink_mode 0;
//***************************************************************************************************************************************************
#include <JeeLib.h> // Low power functions library
// у кого ошибки компиляции! МОЮ сборку ардуино можно скачать тут  https://drive.google.com/file/d/1oAzCQYh9XUnrhFRb314IWGtA45K7Vonh/view?usp=sharing
ISR(WDT_vect) { Sleepy::watchdogEvent(); } // Setup the watchdog //для сна
#include <Wire.h> // для дисплея - I2C шина
#include <LiquidCrystal_I2C.h> // библиотека для дисплея 
#include <EEPROM.h> // для использования ЕЕПРОМ
//#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )
char     strokaI[32] = "                ";// Массив для вывода 1 строки на дисплей , объявляем длиннее(32символа), чтобы не было глюков с отображением на экране
char    strokaII[32] = "                ";// Массив для вывода 2 строки на дисплей
// ЭТО нужно для вывода на 128*64 Adafruit_SSD1306 дисплей
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display2(OLED_RESET);
#define XPOS 0
#define YPOS 1
#define DELTAY 2
// конец настройки для вывода на 128*64 Adafruit_SSD1306 дисплей
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например  d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\   https://github.com/marcoschwartz/LiquidCrystal_I2C например
LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A014561611121314POSITIVE);  // для newE  описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347
// обьявляем переменные и задаём их начальные значениия
float UakbONorOFF 12.1//  напряжение порога сработки акб
float U_acc_real 7.0;     //  реальное напряжение +ACC на входе делителя 
float U_akb_real 7.0;     //  реальное напряжение +30 на входе делителя 
int Uacc 0;             // напряжение с делителя ACC 0-1024 
int Uakb 0;             // напряжение с делителя АКБ 0-1024    

//PORTB
const byte SAMOZAPITKA_Pin                    9;   // номер пина самозапитки блока
const byte LED_Pin                            13;  // номер пина встроенного светодиода индикации 
const byte OTG_Pin                            10;  // номер пина управляющего микросхемой, управляющей режимом OTG
const byte HUB_Pin                            11;  // номер пина управляющего транзистором, управляющего Питанием ХАБа
const byte SLEEP_Pin                          12;  // номер пина управляющего микросхемой, которая даёт массу на пин сна ( датчик холла)
 
//PORTD
const byte PlanshBAT_Pin                      6;  // номер пина управляющего микросхемой, управляющей питанием БАТАРЕЕЙ планшета (через управляющую ногу IN2-5pin )0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
const byte REGISTRATOR_Pin                    4;  // номер пина управляющего микросхемой управляющей питанием видеорегистратора
const byte FIVE_Volt_OUT_na_POGO_or_USB_Pin   2;  // номер пина управляющего сном 2 преобразователя DC-DC (+5В)
const byte REM_Pin                            7;  // номер пина управляющего транзистором, управляющего Питанием ХАБа
 
//логические состояния блока питания (какая ножка какой сигнал должна выдавать)
    
uint8_t  PORTBregistr 0;               // Если у нас есть 8-битная переменная PORTBregistr, то мы можем присвоить её значение регистру PORTx, и тем самым установить ножки микроконтроллера в состояние, соответствующее значению переменной PORTBregistr
boolean SAMOZAPITKA 0;                     // byte SAMOZAPITKApin = 9; /*управление самозапиткой блока питания IN4*///1 = есть самозапитка; 0 = нет самозапитки
boolean LED 0;                             // Светодиод 1 = светит; 0 = не светит
boolean SLEEP=0;                             //byte SLEEPpin = ; //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна) ( также 0 означает ненажатую кнопку питания, если мы используем канал ДХ для управления кнопкой питания планшета.)
boolean HUB 0;                             //byte HUBpin = 11;  0-хаб вЫключен, 1 - хаб включен
boolean OTG 0;                             //byte OTGpin = ; //1 = есть масса на OTG; 0 = нет массы на OTG

    
uint8_t  PORTDregistr 0;               //  8-битная переменная PORTDregistr
boolean PlanshBAT 0;                       //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM            ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR 0;                     //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/ 
boolean FIVE_Volt_OUT_na_POGO_or_USB 0;    //byte FIVE_Volt_OUT_na_POGO_or_USBpin = 2;   32pin = PD2 = pin D2         включить управление SS2 выходом питания  +5V  на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
boolean REM 0;                             //byte REMpin = 7;           11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
 
int PINrawACC A0;   // замер для 5й версии
int PINrawAKB A1;   // замер для 5й версии
int PINkalibrovki A2// замер для 5й версии

//int PINrawACC = A7;   // замер для 7й версии
//int PINrawAKB = A8;   // замер для 7й версии
//int PINkalibrovki = A3; // замер для 7й версии
 
//пины состояния ITS
byte STATEpinI 1;        /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = авария*/
byte STATEpinII 1;       /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.*/

/*логические переменные, используемые в коде*/

byte flagACC 0;          /*признак включенного зажигания*/
byte flagAKB 0;             /* признак заряженной батареи*/
byte flagREM 0;             /* признак включенного выхода на усилитель звука (REM) 0 1 2*/
byte kalibrovkaNOW 0// признак того, что сейчас происходит калибровка встроенного вольтметра по АСС и АКБ.
byte kalibrovkaACC =  EEPROM.read(0);  // значение для калибровки для делителя АСС
byte kalibrovkaAKB =  EEPROM.read(1); // значение для калибровки для делителя АКБ
byte razreszenie_raboty_I_dva_C_sziny  0// Разрешили ли мы работать (инициализировали ли) I2C устройствам (дисплеи, звуковой  процессор) в текущем цикле. 1 - инициализировали и разрешили, 0 - НЕ инициализировали и запретили       
byte flagHALL 0;         //флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)
byte STARTUEM 0;         //Стартует ли авто ( крутим ли стартером) 0- не крутим, 1 - крутим.

   





int vremia_sna_ATMEGI 50//   sleep for XXX seconds   - когда запретили работу I2C шины, запускаем сон каждый цикл(loop) на 0,1 сек. (0-200) Нужно для режима энергосбережения атмеги.                                                                                         
unsigned long eventTime 0;
unsigned long pauseTimeACC millis();      // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB millis();
unsigned long pauseDisplay 0;             /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long timeAfterACC 5000;          /*базовое (для инициализации) , ни на что не влияет.  Меняйте   timeAfterACC_accOFF и timeAfterACC_starting   !        время после выключения зажигания, после истечения которого вырубается экран, хаб, otg-режим*/
unsigned long TimerREM 0;                 /*базовое (для инициализации) , ни на что не влияет.  Отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long TIMER millis();             /*базовое (для инициализации) , ни на что не влияет. */
unsigned long H = (millis()/3600000); // часы 
byte M = ((millis()-(H*3600000))/60000); //минуты
//===========================================================================================================================================================================================================================================================================
//===========================================================================================================================================================================================================================================================================
//===========================================================================================================================================================================================================================================================================


void vykluchic_vse()
{
 
PORTBregistr 0// выключили всё
 
SAMOZAPITKA 0;                     // byte SAMOZAPITKApin = 9; управление самозапиткой блока питания IN4//1 = есть самозапитка; 0 = нет самозапитки
 
LED 0;                             // Светодиод 1 = светит; 0 = не светит
 
SLEEP=0;                             //byte SLEEPpin = ; //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна) ( также 0 означает ненажатую кнопку питания, если мы используем канал ДХ для управления кнопкой питания планшета.)
 
HUB 0;                             //byte HUBpin = 11;  0-хаб вЫключен, 1 - хаб включен
 
OTG 0;                             //byte OTGpin = ; //1 = есть масса на OTG; 0 = нет массы на OTG

      
PORTDregistr 0// выключили всё 
 
PlanshBAT 0;                       //byte PlanshBATpin = 6;  10pin = PD6 = pin D6 PWM            ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
 
REGISTRATOR 0;                     //byte REGISTRATORpin = 4;  2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
 
FIVE_Volt_OUT_na_POGO_or_USB 0;    //byte FIVE_Volt_OUT_na_POGO_or_USBpin = 2;   32pin = PD2 = pin D2         включить управление SS2 выходом питания  +5V  на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
 
REM 0;                             //byte REMpin = 7;           11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
 
 
UPRAVLENIE_PINAMI(); // сказали регистрам исполнить  " выключили всё ", вызвав функцию    управления пинами
}

void UPRAVLENIE_PINAMI() // функция перевода логических параметров в реальные состояния пинов   // http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry  // https://geektimes.ru/post/255744/ Ускоряем свою Arduino   /* http://robotosha.ru/arduino/digitalwrite-optimizing-arduino.html */
{

    
// UPRAVLENIE_PINAMI ~~~//тут мы сначала пишем  в переменную регистры, а потом сделаем PORTB = PORTBregistr; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
// PORTBregistr - обрабатывем регистры порта B атмеги

/*        if (LED == 1 ){ PORTBregistr |= 1<<5;     } //PORTB |= 1<<5; //установит "1" (сигнал высокого уровня) на выводе PB5. //digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
             else { PORTBregistr &= ~(1<<5);  } //PORTB &= ~(1<<5); //установит "0" (сигнал низкого уровня) на выводе PB5. //digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
     if (SAMOZAPITKA == 1){ PORTBregistr |= (1 << 1); } else {PORTBregistr &= ~((1 << 1));}         //PB1 управление самозапиткой блока питания IN4///1 = есть самозапитка; 0 = нет самозапитки //http://microsin.net/programming/avr/accessing-avr-ports-with-winavr-gcc.html
             if (OTG == 1){ PORTBregistr |= (1 << 2); } else {PORTBregistr &= ~((1 << 2));}         //byte SLEEPpin = 10;  PB2  управление транзистор ом сна VT4 (на датчик холла)) //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
           if (HUB == 0)  { PORTBregistr |= (1 << 3); } else {PORTBregistr &= ~((1 << 3));}         //HUB =0;//byte HUBpin = 11;  PB3 управление транзистор ом питания хаба // 1-есть питание, 0 - нет питания
         if (SLEEP == 0)  { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));}         //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзистор ом OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
*/
      
digitalWrite(LED_PinLED);                   //управление встроенным светодиодом
      
digitalWrite(SAMOZAPITKA_PinSAMOZAPITKA);   // управление самозапиткой блока питания 1 = есть самозапитка; 0 = нет самозапитки //http://microsin.net/programming/avr/accessing-avr-ports-with-winavr-gcc.html
      
digitalWrite(OTG_PinOTG);                   // управление OTG    
      
digitalWrite(HUB_Pin, !HUB);                  // управление транзистором питания хаба // 1-есть питание, 0 - нет питания
      
digitalWrite(SLEEP_Pin, !SLEEP);               // управление микросхемой, которая даёт массу на пин сна ( датчик холла)
    
     
// PORTDregistr - обрабатывем регистры порта D атмеги
//PORTD

 
digitalWrite(PlanshBAT_PinPlanshBAT);        //управление питанием БАТАРЕЕЙ планшета (+4,0)
 
digitalWrite(REGISTRATOR_PinREGISTRATOR);    //управление питанием видеорегистратора (+12)
 
digitalWrite(FIVE_Volt_OUT_na_POGO_or_USB_PinFIVE_Volt_OUT_na_POGO_or_USB);   //управление вторым преобразователем DC-DC (+5В)
 
digitalWrite(REM_PinREM);                    //управление выходом REM (+12)
 
 
//       if (PlanshBAT == 1){ PORTDregistr |= (1 << 6); } else {PORTDregistr &= ~((1 << 6));}         //bool PlanshBAT = 0; //byte PlanshBATpin = 6;  10pin = PD6 = pin D6 PWM    включить 1 канал KIW            ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
    // if (REGISTRATOR == 1){ PORTDregistr |= (1 << 4); } else {PORTDregistr &= ~((1 << 4));}         //bool REGISTRATOR = 0;   //byte REGISTRATORpin = 4;  2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
 //if (FIVE_Volt_OUT_na_POGO_or_USB == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));}         //bool FIVE_Volt_OUT_na_POGO_or_USB = 0;   //byte FIVE_Volt_OUT_na_POGO_or_USBpin = 2;   32pin = PD2 = pin D2         включить 2 канал KIW    управление SS2 выходом питания  +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
//             if (REM == 1){ PORTDregistr |= (1 << 7); } else {PORTDregistr &= ~((1 << 7));}         //bool REM = 0; //byte REMpin = 7;           11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM

           // Serial.print ("PORTB, BIN = "  ); Serial.println (PORTB, BIN); // вывели порт B атмеги на монитор порта
           // Serial.print ("PORTDregistr, BIN = "  ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
           // Serial.print ("SAMOZAPITKA = "  ); Serial.println (SAMOZAPITKA);
//PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
//PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.

}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 



void setup() //настройки
{

 
  
RABOTA_z_EEPROM(); //читаем значения пользователя из памяти процессора, или пишем, или берем по умолчанию, в зависимости от переменной brac_nastrojki_iz_EEPROM   

  
Serial.begin(115200);

if( 
kalibrovkaACC == 255 ){kalibrovkaACC=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию  
if( kalibrovkaAKB == 255 ){kalibrovkaAKB=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию  =127

// настройки портов  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~   
 
DDRD 0b11010100;  // настройки порта D
 
DDRB 0b00111110;  // настройки порта B
 
pinMode(PINkalibrovkiINPUT);  // пин калибровки
 
digitalWrite(PINkalibrovki1); // подтяжка +5 пина калибровки
// конец настроек портов  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 

//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
//vykluchic_vse();
 /* PlanshBAT = 0;          //digitalWrite(PlanshBATpin, 0);  //вЫключаем питание на батарею планшета
  SAMOZAPITKA = 0;        // digitalWrite(SAMOZAPITKApin, 0);  //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
  OTG = 0;                //digitalWrite(OTGpin, 0); //вЫключаем минус на OTG (8 pin PW1)
  FIVE_Volt_OUT_na_POGO_or_USB = 0;    //digitalWrite(FIVE_Volt_OUT_na_POGO_or_USBpin, 0); //вЫключаем +5V (POGO(USB))
  HUB = 0;                //digitalWrite(HUBpin, 1); // подаем + на управляющий транзистор  хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
  REM = 0;                //digitalWrite(REMpin, 0); // // выключаем выход REM
  REGISTRATOR = 0;        //digitalWrite(REGISTRATORpin, 0); // выключаем питание  на видеорегистратор
 */
 //конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
}
//===========================================================================================================================================================================================================================================================================
//===========================================================================================================================================================================================================================================================================
//===========================================================================================================================================================================================================================================================================

void displayDataToDISPLAY()//>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>> 
{//void displayDataToDISPLAY()
//вывод на 2хстрочный дисплей LCM 1602 с I2C ( на базе расширителя портов PCF8574)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    //Serial.print("strokaI  = "); Serial.println(strokaI);  // раскомментить для вывода информации в ком порт для отладки
    
lcd.setCursor(00);
    
lcd.print(strokaI);
  
    
//Serial.print("strokaII = "); Serial.println(strokaII); // раскомментить для вывода информации в ком порт для отладки
    
lcd.setCursor(01); //2строка 0символ 
    
lcd.print(strokaII);


    
//вывод на 128*64 дисплей (Adafruit_SSD1306) первой строки
                                                        
                                                          
display2.clearDisplay();        // очистили буфер 
                                                          
display2.setTextSize(1);        // установили размер текста (1-4)
                                                          
display2.setCursor(0,0);        // начальная точка вывода
                                                          
display2.println(strokaI);      // скинули значение I строки в буфер 128*64 дисплея
    //вывод на 128*64 дисплей (Adafruit_SSD1306) второй строки
                                                          
display2.println(strokaII);     // скинули значение II строки в буфер 128*64 дисплея
            
if ( ((millis() - pauseTimeACC) >=  (5000+timeAfterACC)) && (flagACC==0) )    // после 5 сек после выключения зажигания буфер будет чиститься перед выводом, соответственно на 128*64 Adafruit_SSD1306 дисплей выводиться ничего не будет Это нужно для того, чтобы ночью экран не светился ( так как пиксели активные и дают свет без подсветки) 
                                                          
{
                                                          
display2.clearDisplay();        // очистили буфер           
                                                          

                                                          
display2.display();             //эта строка выводит картинку 1306 из буфера на экран!
//Вывод строк окончен.______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
      
}//void displayDataToDISPLAY()
void IntToCharI(int numchar *text)//функция, возвращающая число в текстовый вид 0 1
{
  
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
  //text[1] = ((num/10)%10) + '0';// второе значение __0
  
text[2] = (num%10) + '0'// третее значение ___
 
}

void IntToCharII(int numchar *text)//функция, возвращающая число в текстовый вид 00 11
{
  
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
  
text[0] = ((num/10)%10) + '0';// второе значение __0
  
text[1] = (num%10) + '0'// третее значение ___
 
}


void IntToCharIII(int numchar *text)//функция, возвращающая число в текстовый вид 00 11
{
  
text[0] = (num/100) + '0'// первое значение _00 - эта строчка нужна для 3хзначного числа.
  
text[1] = ((num/10)%10) + '0';// второе значение __0
  
text[2] = (num%10) + '0'// третее значение ___
}
  
void IntToCharIIII(int numchar *text)//функция, возвращающая число в текстовый вид 0000 1111
{
 
text[0] = (num/1000) + '0';//0 знач
 
text[1] = (num/100)%10 '0'// первое значение _00 - эта строчка нужна для 3хзначного числа.
 
text[2] = ((num/10)%10) + '0';// второе значение __0
 
text[3] = (num%10) + '0'// третее значение ___
}
void FloatToCharIIIII(float numchar *text)//функция, возвращающая число в текстовый вид 00.00 11.11
{

  
int Int num*100;
 
text[0] = (Int/1000) + '0';//0 знач   7896
 
text[1] = (Int/100)%10 '0'// первое значение _00 - эта строчка нужна для 3хзначного числа.
 
text[2] =  '.';
 
text[3] = ((Int/10)%10) + '0';// второе значение __0
 
text[4] = (Int%10) + '0'// третее значение ___
}

void RABOTA_z_EEPROM ()

{
//void RABOTA_z_EEPROM ()





if (brac_nastrojki_iz_EEPROM == 1)//1 - ПИШЕМ в еепром значения из скетча.  
    
{//if (brac_nastrojki_iz_EEPROM == 1)
myStruct_Znachenija_peremennyh_i_timingov znachenija_polzovatelia[] = // Создаем массив объектов пользовательской структуры из значений, прописанных в скетче в настройках пользователя
{//myStruct_Znachenija_peremennyh_i_timingov znachenija_polzovatelia           
 
{// Создаем массив объектов
  
reset_HUB_on_power_on ,      // передёргивать ли хаб при каждом включении зажигания, для решения проблемы с определением изикапа (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.
  
power_off_HUB_on_starting ,  // выключать ли питание на хаб при старте авто ( 1- да, выключать)
  
power_off_OTG_on_starting ,  // выключать ли массу на OTG при старте авто   ( 1- да, выключать)
  
HALL_as_power_Switch ,       // 0 - используем ДХ как обычно. 1 - вместо ДХ подключаем кнопку питания планшета. Если подключено как КНОПКА, то задержка перед нажатием "кнопки" после включения АСС это SLEEP_timer_pri_vkl_ACC, а после вЫключения  SLEEP_timer_pri_vykl_ACC. Удержание нажатия = 0,5с. 
   
Uperezariadki,              // напряжение, выше которого будет считаться, что идёт перезарядка аккумулятора авто.
   
UrabotyREM,                 // напряжение, выше которого будет работать усилитель звука, если акб не садился.
   
UnevykluczeniaREM,          // напряжение, когда машина считается заведённой. Тогда, если завели машину, ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
   
Uakb_Kogda_ACC_vYkluczeno,  // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вЫключенном АСС
   
Uakb_Kogda_ACC_vkluczeno ,  // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вКлюченном АСС
   
UaccONorOFF,                // напряжение порога сработки асс.  Т.е. если на пин блока питания "вход АСС" подать ниже UaccONorOFF (11,1), то зажигание будет считаться выключенным.
   
timeUntilBATOff,                     // время до выключения питания на батарею планшета после выключения зажигания., считаем ОТ момента выключения зажигания. если прошло 48 часов, как выключили ACC // пауза  (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)
   
timeUntilALLOff ,                    // время до полного выключение блока,  после выключения зажигания (ACC)и уже после того, как выключится питание на батарею планшета    ) (2суток = 172800000)) (4суток = 345600000)
  
timeBeforeRemOff ,                    // 1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. ( то есть сколько времени будет включён усилитель звука, если заглушить машину и просто слушать музыку,  при нормальном АКБ)
  
timeAfterACC_starting ,               // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время кручения стартером
  
timeAfterACC_accOFF ,                 // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время обычного выключения зажигания
  
timeWhileAkbLow,                      // 40000 время, через которое начнётся полное выключение блока когда напряжение на АКБ очень низкое.   /* если севший аккумулятор //через 40с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
  
pauseTimeHALL ,                       // Для первого включения планшета. Раньше этого времени экран не будет тухнуть! Время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин
  
vremia_obnovlenia_displeya,           // Время, через которое будет обновляться информация на дисплей I2C  (время обновления I2C дисплея)
   
PlanshBAT_timer_pri_vkl_ACC  ,       // пауза  после включения ACC перед включением питания на батарею планшета
   
FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC// пауза  после включения ACC перед включением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ) 
   
OTG_timer_pri_vkl_ACC ,              // пауза  после включения ACC перед включением минуса на OTG ( 4й контакт ЮСБ разъема на планшете)  (включается определение ЮСБ периферии  планшетом.)
   
HUB_timer_pri_vkl_ACC ,              // пауза  после включения ACC перед подачей питания на хаб. Значение должно быть больше либо равно FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC.
   
REGISTRATOR_timer_pri_vkl_ACC,       // пауза  после включения ACC перед включением  питания +12В на видеорегистратор
   
REM_timer_pri_vkl_ACC ,              // пауза  после включения ACC перед включением  питания +12В на REM (включение усилителя звука)
   
SLEEP_timer_pri_vkl_ACC,             // пауза  после включения ACC перед включением экрана планшета (масса на Датчик Холла)
   
I_dva_C_szina_ON_time ,              //Время, через которое I2C шина включится после вКлючения зажигания - начнётся передача по шине I2C.
   
OTG_timer_pri_vykl_ACC ,             // пауза  после вЫключения ACC перед вЫключением минуса на OTG ( 4й контакт ЮСБ разъема на планшете) (вЫключается определение ЮСБ периферии  планшетом.)
   
FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC // пауза  после вЫключения ACC перед вЫключением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ) 
   
HUB_timer_pri_vykl_ACC ,             // пауза после вЫключения ACC перед убиранием питания с хаба. Значение должно быть меньше либо равно FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC.
   
SLEEP_timer_pri_vykl_ACC ,           // пауза  после вЫключения ACC перед вЫключением экрана планшета (масса на Датчик Холла)
   
REM_timer_pri_vykl_ACC ,             // не может быть больше timeAfterACC_accOFF и timeAfterACC_starting!  Пауза  после вЫключения ACC перед вЫключением  питания +12В на REM (вЫключение усилителя звука), тут 1000 это на сколько раньше выключать выход REM перед остальными выключениями
   
lcd_noBacklight_timer_pri_vykl_ACC,  // 7000 пауза после вЫключения ACC перед убиранием подсветки I2C LSD дисплея (1602)
   
I_dva_C_szina_OFF_time,              //Время, которое I2C шина работает после вЫключения зажигания, потом  - закончится передача по шине I2C.
   
vremia_uderjanija_najatoj_knopki_POWER,
   
REGISTRATOR_timer_pri_vYkl_ACC,
   
rezerv3,
   
rezerv4,
   
rezerv5,
   
rezerv6,
   
rezerv7
 
}// конец Создаем массив объектов
};//myStruct_Znachenija_peremennyh_i_timingov znachenija_polzovatelia
EEPROM.put(nachalnyj_address_dannyh_polzovatelja_v_eepromznachenija_polzovatelia);    // ПИШЕМ пакет данных в EEPROM из созданнго массива (znachenija_polzovatelia) начиная с адреса (nachalnyj_address_dannyh_polzovatelja_v_eeprom)
    
}//if (brac_nastrojki_iz_EEPROM == 1)
        
if (brac_nastrojki_iz_EEPROM == 2//2 - берем значения из памяти eeprom, игнорируя скетч (если память пустая, берем(оставляем) значения из скетча.) 
    
{//if (brac_nastrojki_iz_EEPROM == 2)
     
myStruct_Znachenija_peremennyh_i_timingov znachenija_polzovatelia// В переменную znachenija_polzovatelia будем считывать данные из EEPROM
 
EEPROM.get (nachalnyj_address_dannyh_polzovatelja_v_eepromznachenija_polzovatelia); 
 
// теперь считанные данные из переменной znachenija_polzovatelia вытаскиваем и присваеваем соответственной переменоой
//но только ЕСЛИ reset_HUB_on_power_on равно 0 или 1 ( косвенный признак нормально записанных данных в ЕЕПРОМ)
if (znachenija_polzovatelia.reset_HUB_on_power_on<2)
{    
//if znachenija_polzovatelia.reset_HUB_on_power_on)
reset_HUB_on_power_on znachenija_polzovatelia.reset_HUB_on_power_on;
power_off_HUB_on_starting znachenija_polzovatelia.power_off_HUB_on_starting;
power_off_OTG_on_starting znachenija_polzovatelia.power_off_OTG_on_starting;
HALL_as_power_Switch znachenija_polzovatelia.HALL_as_power_Switch;
Uperezariadki znachenija_polzovatelia.Uperezariadki;
UrabotyREM znachenija_polzovatelia.UrabotyREM;
UnevykluczeniaREM znachenija_polzovatelia.UnevykluczeniaREM;
Uakb_Kogda_ACC_vYkluczeno znachenija_polzovatelia.Uakb_Kogda_ACC_vYkluczeno;
Uakb_Kogda_ACC_vkluczeno znachenija_polzovatelia.Uakb_Kogda_ACC_vkluczeno;
UaccONorOFF znachenija_polzovatelia.UaccONorOFF;
timeUntilBATOff znachenija_polzovatelia.timeUntilBATOff;
timeUntilALLOff znachenija_polzovatelia.timeUntilALLOff;
timeBeforeRemOff znachenija_polzovatelia.timeBeforeRemOff;
timeAfterACC_starting znachenija_polzovatelia.timeAfterACC_starting;
timeAfterACC_accOFF znachenija_polzovatelia.timeAfterACC_accOFF;
timeWhileAkbLow znachenija_polzovatelia.timeWhileAkbLow;
pauseTimeHALL znachenija_polzovatelia.pauseTimeHALL;
vremia_obnovlenia_displeya znachenija_polzovatelia.vremia_obnovlenia_displeya;
PlanshBAT_timer_pri_vkl_ACC znachenija_polzovatelia.PlanshBAT_timer_pri_vkl_ACC;
FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC znachenija_polzovatelia.FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC;
OTG_timer_pri_vkl_ACC znachenija_polzovatelia.OTG_timer_pri_vkl_ACC;
HUB_timer_pri_vkl_ACC znachenija_polzovatelia.HUB_timer_pri_vkl_ACC;
REGISTRATOR_timer_pri_vkl_ACC znachenija_polzovatelia.REGISTRATOR_timer_pri_vkl_ACC;
REM_timer_pri_vkl_ACC znachenija_polzovatelia.REM_timer_pri_vkl_ACC;
SLEEP_timer_pri_vkl_ACC znachenija_polzovatelia.SLEEP_timer_pri_vkl_ACC;
I_dva_C_szina_ON_time znachenija_polzovatelia.I_dva_C_szina_ON_time;
OTG_timer_pri_vykl_ACC znachenija_polzovatelia.OTG_timer_pri_vykl_ACC;
FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC znachenija_polzovatelia.FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC;
HUB_timer_pri_vykl_ACC znachenija_polzovatelia.HUB_timer_pri_vykl_ACC;
SLEEP_timer_pri_vykl_ACC znachenija_polzovatelia.SLEEP_timer_pri_vykl_ACC;
REM_timer_pri_vykl_ACC znachenija_polzovatelia.REM_timer_pri_vykl_ACC;
lcd_noBacklight_timer_pri_vykl_ACC znachenija_polzovatelia.lcd_noBacklight_timer_pri_vykl_ACC;
I_dva_C_szina_OFF_time znachenija_polzovatelia.I_dva_C_szina_OFF_time;
vremia_uderjanija_najatoj_knopki_POWER znachenija_polzovatelia.vremia_uderjanija_najatoj_knopki_POWER;
REGISTRATOR_timer_pri_vYkl_ACC znachenija_polzovatelia.REGISTRATOR_timer_pri_vYkl_ACC;
rezerv3 znachenija_polzovatelia.rezerv3;
rezerv4 znachenija_polzovatelia.rezerv4;
rezerv5 znachenija_polzovatelia.rezerv5;
rezerv6 znachenija_polzovatelia.rezerv6;
rezerv7 znachenija_polzovatelia.rezerv7;
}    
//if znachenija_polzovatelia.reset_HUB_on_power_on)
    
//if (brac_nastrojki_iz_EEPROM == 2)
//0 - берём значения из скетча, игнорируя память ( кроме калибровки)
}//void RABOTA_z_EEPROM ()

void printDISPLAY() //функция формирования информации на дисплей ( точнее на два: 128*64 и 1602)
{
//_____________________________________________ФОРМИРУЕМ СООБЩЕНИЕ НА LCD ДИСПЛЕЙ____________________________________________________________

 
= (millis()/3600000);
 
= ((millis()-(H*3600000))/60000); 
//int S = (((millis()/1000)-(H*3600))- (M*60));
//if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка дисплея
//int M = (millis()/60000); //минуты

 
if (flagACC == 1){lcd.backlight();}// для newE и для 0x27  
 // в 256 строке выключение подсветки LCD дисплея

 
 
 //пример: sprintf( strokaII,"SETUP volume on ");

//обработка 1й строки_________AKB ACC REM_____________________________________________________________________________________________________________________________________________________________________
 
sprintf(strokaI,"                ") ; 
                  
//IntToCharIIII((millis()/60000), &strokaI[0]); // вывод минут 0000 4 цифры СЕКУНД // если превысит 9999, то будут кроказябры!!! вида  ;0129
                  
IntToCharIII(H, &strokaI[0]);  // вывод часов 000 
                   
strokaI[3] =  ':'// вывод двоеточия 
                    
IntToCharII(M, &strokaI[4]);  // вывод минут 00 
                       
strokaI[7]= flagAKB '0';// вывод флага AKB 5 символ
                        
strokaI[8]= flagACC'0';// вывод флага AСС 6 символ
                         
strokaI[9]= REM '0';// вывод  rem 7 символ 1-усилитель звука включен, 0 - выключен
                          
strokaI[10]= flagREM '0';// вывод  флага!!! rem 7 символ 1-усилитель звука включен, 0,2 - выключен
                          
FloatToCharIIIII (U_acc_real,  &strokaI[11]);  // вывод напряжения АСС 
//конец обработки 1й строки ______________________________________________________________________________________________________________________________________________________________________________

//обработка 2й строки______________________________________________________________________________________________________________________________________________________________________________
 
TIMER = (  pauseTimeAKB  timeUntilALLOff millis()  )/60000// вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)


  // _______________________________Первые 30с после вкл -выкл ACC выводим версию блока.____________________________________________________________________________________________________________________________________________________
 
if (    ( millis()-pauseTimeACC  30000 )&& flagACC == 1   ){  sprintf(strokaII,"m__             ") ; IntToCharII(ver, &strokaII[1]);} else {  sprintf(strokaII,"____            ");   IntToCharIIII(TIMER, &strokaII[0]); } //Первые 30с после вкл -выкл ACC выводим версию блока
 // FloatToCharIIIII (rezerv7,  &strokaII[0]);
  // _____________________________________________________________________________________________________________________________________________________________________________________________________________________________________
 


//вывод STARTUEM OTG HUB POGO HALL
                      
strokaII[5]= STARTUEM '0';// Стартует ли авто ( крутим ли стартером) 0- не крутим, 1 - крутим.
                       
strokaII[6]= OTG '0';// вывод флага OTG 5 символ
                        
strokaII[7]= HUB '0';// вывод флага HUB 6 символ
                         
strokaII[8]= FIVE_Volt_OUT_na_POGO_or_USB '0';// вывод флага FIVE_Volt_OUT_na_POGO_or_USB (ПРИЗНАК ЗАРЯДКИ или зарядка на юсб) 7 символ 
                           
strokaII[9]= !SLEEP '0';// вывод флага flagHALL 8 символ (инверсно)  1-экран включен, 0 - выключен
                               
FloatToCharIIIII (U_akb_real,  &strokaII[11]); // вывод напряжения АКБ
//конец обработки 2й строки ______________________________________________________________________________________________________________________________________________________________________________

if (kalibrovkaNOW >= && kalibrovkaNOW 255 )// если активен режим калибровки, то выводим данные для калибровки.
                      
{
                       
sprintf (strokaI,"                ") ; 
                       
IntToCharIII(Uacc,  &strokaI[0]);
                       
IntToCharIII(Uakb,  &strokaI[4]);
                       
IntToCharIII(kalibrovkaNOW, &strokaI[7]);  // вывод РЕЖИМА калибровки 
                       
                       
sprintf(strokaII,"c               ") ;
                       
IntToCharIII(kalibrovkaACC, &strokaII[1]);  // вывод значения калибровки АСС 
                       
IntToCharIII(kalibrovkaAKB, &strokaII[5]);  // вывод значения калибровки АСС 
                       
                       
FloatToCharIIIII (U_acc_real,  &strokaI[11]); // вывод напряжения АКБ
                       
FloatToCharIIIII (U_akb_real,  &strokaII[11]); // вывод напряжения АКБ

                      
}

//Вывод строк.______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
 
 
displayDataToDISPLAY(); //>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>> 
  



  /* так выглядит индикация на дисплее
  
   ================
  |000:00 110212.10|          1 строка   *   вывод времени работы блока H:M                 *         AKB ACC REM            *    вывод напряжения АСС
  |2616 01110 14.50|    
   ================           2 строка   *   кол-во минут, оставшиеся до выключения блока    *        STARTUEM OTG HUB POGO HALL      *    вывод напряжения АКБ    
                                                                                               

*/
}

 
/******************************************конец индикации светодиодом и  вывода на дисплей********************************************************************************************************************************************************************************/
                                    

//===========================================================================================================================================================================================================================================================================
//===========================================================================================================================================================================================================================================================================
//===========================================================================================================================================================================================================================================================================

void analogReadU (byte averageFactor//функция усреднённого чтения аналоговых входов (A0 A1)
{//void analogReadU
  
int newUacc analogRead(PINrawACC);
  
int newUakb analogRead(PINrawAKB); 
 
   if (
averageFactor 0)        // усреднение показаний для устранения "скачков"
  
{      
    
Uacc = (Uacc * (averageFactor 1) + newUacc) / averageFactor;  
    
Uakb = (Uakb * (averageFactor 1) + newUakb) / averageFactor;  
    
// <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5 я тут немного поправил
  
} else {
    
Uakb=newUakb// не делаем усреднений, что прочитали то и считаем выводом
    
Uacc=newUacc// не делаем усреднений, что прочитали то и считаем выводом
  
}


}
//void analogReadU

void rejim_kalibrovki() //функция измерения, калибровки и записи полученных значений в еепром
{//void rejim_kalibrovki()
  
lcd.noBacklight();
  
delay (50);
  
lcd.backlight();
  
delay (250);
   if (
digitalRead(PINkalibrovki)== && kalibrovkaNOW 6)  {kalibrovkaNOW ++;} 
   else 
// тут достигли 6 касаний точки калибровки и ЗАПУСКАЕМ НЕПОСРЕДСТВЕННО ПРОЦЕСС КАЛИБРОВКИ ( ДЛЯ ЭТОГО ПОДАЁМ РОВНО 12,00В НА БЛОК ПИТАНИЯ ( асс и акб)
  
//else 
    
if (kalibrovkaNOW >= 6)
    {
//if (kalibrovkaNOW >= 6)
      
      
vykluchic_vse();
 
/*
 PORTBregistr = 0; // выключили всё
 SAMOZAPITKA = 0;                     // byte SAMOZAPITKApin = 9; управление самозапиткой блока питания IN4//1 = есть самозапитка; 0 = нет самозапитки
 LED = 0;                             // Светодиод 1 = светит; 0 = не светит
 SLEEP=0;                             //byte SLEEPpin = ; //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна) ( также 0 означает ненажатую кнопку питания, если мы используем канал ДХ для управления кнопкой питания планшета.)
 HUB = 0;                             //byte HUBpin = 11;  0-хаб вЫключен, 1 - хаб включен
 OTG = 0;                             //byte OTGpin = ; //1 = есть масса на OTG; 0 = нет массы на OTG

      PORTDregistr = 0; // выключили всё 
 PlanshBAT = 0;                       //byte PlanshBATpin = 6;  10pin = PD6 = pin D6 PWM            ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
 REGISTRATOR = 0;                     //byte REGISTRATORpin = 4;  2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
 FIVE_Volt_OUT_na_POGO_or_USB = 0;    //byte FIVE_Volt_OUT_na_POGO_or_USBpin = 2;   32pin = PD2 = pin D2         включить управление SS2 выходом питания  +5V  на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
 REM = 0;                             //byte REMpin = 7;           11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
 
 
      UPRAVLENIE_PINAMI(); // сказали регистрам исполнить  " выключили всё ", вызвав функцию
      */
      
delay (300); // для зарядки кондёров после снятия нагрузки
      //analogReadU (5); //вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(10)раз
      
kalibrovkaACC 1200000/Uacc-1410// вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
      
kalibrovkaAKB 1200000/Uakb-1410// вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания) 
      
{kalibrovkaNOW ++;} 
    }
//if (kalibrovkaNOW >= 6)   
  
}//else 
if ( kalibrovkaNOW == 15 &&  digitalRead(PINkalibrovki)== 0)   //по достижению счета в 15 и ПРИ МАССЕ НА ПИНЕ КАЛИБРОВКИ данные калибровки запишутся в еепром
                    
{
                      
kalibrovkaNOW 255;
                     
EEPROM.update(0,kalibrovkaACC);
                     
EEPROM.update(1,kalibrovkaAKB);
                      
                       
sprintf (strokaI,"end KALIBR.     ") ; 
                       
sprintf(strokaII,"c               ") ;
                       
IntToCharIII(kalibrovkaACC, &strokaII[1]);  // вывод значения калибровки АСС 
                       
IntToCharIII(kalibrovkaAKB, &strokaII[5]);  // вывод значения калибровки АСС 
                       
                       
FloatToCharIIIII (U_acc_real,  &strokaI[11]); // вывод напряжения АКБ
                       
FloatToCharIIIII (U_akb_real,  &strokaII[11]); // вывод напряжения АКБ
                      
displayDataToDISPLAY(); // 
                     
delay (10000);
                    
                     
                    }

}
//void rejim_kalibrovki()




void STATUS_REM() 
{
//void STATUS_REM() 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обработка статуса выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*если напруга батареи больше 12В, то включаем еще и усилитель звука (выход REM) /но включаем его только на  timeBeforeRemOff (30 минут), если не заведены.*/

    
if (U_akb_real >= UrabotyREM && flagACC == && flagREM == 0  ) {flagREM 1TimerREM millis();} //если подзаряжен акб и включили зажигание  - ВКЛЮЧАЕМ REM
    
if (U_akb_real >= UrabotyREM && flagACC == && ( millis() - TimerREM >= timeBeforeRemOff )) {flagREM ;}  //  если кончилось время обратного отсчета - статус рем - 2.
     //if (U_akb_real >= UnevykluczeniaREM && flagACC == 1){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
    
if (U_akb_real >= UrabotyREM && flagREM == && flagACC == 0){ flagREM 0;} // если восстановилось напряжение при выключенном зажигании - обнуляем статус РЕМ.
    
if (U_akb_real <= UrabotyREM && flagACC == 1){ flagREM 2;} //если подсел акб при включенном зажигании - статус рем - 2.
      
if (U_akb_real >= UnevykluczeniaREM && flagACC == ){ (flagREM 1);TimerREM millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
       
if (U_akb_real >= UnevykluczeniaREM &&  flagREM == 3){ (flagREM 1);TimerREM millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
    
if (U_akb_real >= Uperezariadki){flagREM 2;}// проверка на перезаряд
    
if( flagREM == ||  flagREM == 2){REM 0;}  // выключаем выход REM
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец отработки выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
}//void STATUS_REM() 


void obrabotka_ACC_ON() 
//START void obrabotka_ACC_ON() 
 //  ------------========================== блок ACC ========================-----------------------------------------------------------------------------


  //             -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============---------------- 
  
if ((Uperezariadki U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == && flagAKB == //проверка напруги АСС и АКБ при флаге ACC = 0
  
{
    
flagACC 1;
    
pauseTimeACC millis();
    
pauseTimeAKB millis();
    
  }

if (
U_acc_real >= UaccONorOFF)  //как только включили зажигание ( при любом напряжении батареи)
// как только включили зажигание ( при любом напряжении батареи)
            
if (razreszenie_raboty_I_dva_C_sziny  == 0// переопрашиваем дисплеи I2C и ставим флаг, чтобы они работали. 
              

               
lcd.begin(162); //инициализация дисплея 1602 для newE библиотеки
               
display2.begin(SSD1306_SWITCHCAPVCC0x3C);  // display 2 or adres 0x3D для 1306 дисплея
               
display2.clearDisplay();        // для 1306 дисплея
               
display2.setTextColor(WHITE);   // для 1306 дисплея
               // ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ТУТ надо будет включать питание на TDA7442 ! ! ! ! ! ! ! ! !  - для БП7
              
razreszenie_raboty_I_dva_C_sziny  1// разрешаем работу шины I2C 
              
}
// конец как только включили зажигание ( при любом напряжении батареи)



if (flagACC ==)
{
// если flagACC == 1
//проверить
      
if (((millis() - pauseTimeACC) >= (20)) )
      {
      if (
flagACC==&& flagAKB==1){STARTUEM 0;}  // определяем предположительный старт авто c задержкой XXXмс
      

//проверить      
  
if (millis() - pauseTimeACC >= PlanshBAT_timer_pri_vkl_ACC /* пауза 1.1c после включения ACC и потом делать следующ(пока включено ACC):*/
        
{
         
PlanshBAT 1;        //digitalWrite(PlanshBATpin, 1);  /*включаем питание на батарею планшета  = этим подаём 12В на DC-DC. На 1м канале dc-dc сразу появляется напряжение (3,8-4,2 - как настроено)*/ 
        
}
  
  if (
millis() - pauseTimeACC >= FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
        
{
          
FIVE_Volt_OUT_na_POGO_or_USB 1;  //digitalWrite(FIVE_Volt_OUT_na_POGO_or_USBpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
        
}
  
if (
millis() - pauseTimeACC >= OTG_timer_pri_vkl_ACC /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
       
{
         
OTG 1;              //digitalWrite(OTGpin, 1); /*включаем минус на OTG  (включается определение периферии  планшетом.)*/
       
}

if (
millis() - pauseTimeACC >= HUB_timer_pri_vkl_ACC /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
       
{
         
HUB 1;               //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзистор  хаба, тот открывается и пускает +5В dc-dc (2вых)на хаб*/
       
}
                  
  if (
reset_HUB_on_power_on == 1)
  {
                  if (
millis() - pauseTimeACC >= (HUB_timer_pri_vkl_ACC+500) ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
                         
{
                           
HUB 0;               //digitalWrite(HUBpin, 1); /*Выключаем хаб*/
                         
}
                         
                  if (
millis() - pauseTimeACC >= (HUB_timer_pri_vkl_ACC+1000) ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
                         
{
                           
HUB 1;               //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзистор  хаба, тот открывается и пускает +5В dc-dc (2вых)на хаб*/
                         
}
  }
       
  if (
millis() - pauseTimeACC >= REGISTRATOR_timer_pri_vkl_ACC )/*через 2,2с после включения ACC включаем:  */
        
{
          
REGISTRATOR 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание  на видеорегистратор*/
          
if (millis() < 15000)  {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
      
if( flagREM == 1  && flagAKB == ){REM 1;} /* включаем выход REM*/
        
}

 if (
millis() - pauseTimeACC >= REM_timer_pri_vkl_ACC )/*через 2,2с после включения ACC включаем:  */
        
{
         if (
millis() < 15000)  {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
         
if( flagREM == 1  && flagAKB == ){REM 1;} /* включаем выход REM*/
        
}        

if (
HALL_as_power_Switch == 0)
//if (HALL_as_power_Switch == 0)
        
if (millis() - pauseTimeACC >= SLEEP_timer_pri_vkl_ACC // пауза  после включения ACC и потом делать следующ(пока включено ACC):
        
{SLEEP 0;} //digitalWrite(SLEEPpin, 0); /*включаем экран*/
//if (HALL_as_power_Switch == 0) 

if (HALL_as_power_Switch == 1)
{
//if (HALL_as_power_Switch == 1)
    
if (millis() - pauseTimeACC >= SLEEP_timer_pri_vkl_ACC )    {SLEEP 1;}//digitalWrite(SLEEPpin, 0); /*включаем экран*/
    
if (millis() - pauseTimeACC >= (SLEEP_timer_pri_vkl_ACC+vremia_uderjanija_najatoj_knopki_POWER) ) { SLEEP 0;}
    
//if (millis() - pauseTimeACC >= (SLEEP_timer_pri_vkl_ACC+1000) ) { SLEEP = 1;}
}//if (HALL_as_power_Switch == 1)
    
    
}// если flagACC == 1

STATUS_REM(); //зашли в функцию обработки статуса выхода REM

        
}//END void obrabotka_ACC_ON() 

void obrabotka_ACC_OFF()
//START obrabotka_ACC_OFF()
 //-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
   

                                                            
  
if ((U_acc_real UaccONorOFF) && flagACC == 1)    
                                                {
                                                  
flagACC 0;  /*Выключили зажигание*/
                                                  
pauseTimeACC millis();
                                                  
pauseTimeAKB millis();
                                                }
 if (
flagACC==0)
 {
// if (flagACC==0)
  // 

  
if (((millis() - pauseTimeACC) >= (timeAfterACC-REM_timer_pri_vykl_ACC)) )  // тут REM_timer_pri_vykl_ACC (1000)- это на сколько раньше выключать выход REM перед остальными выключениями
                          
{
                          
REM 0;    //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
                          
flagREM 0/* выключаем флаг выхода REM*/ // обнуляем статус REM
                          
}
 
/*пауза 7c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
  
  
if (((millis() - pauseTimeACC) >= (100)) )
      {
      if (
flagACC==&& flagAKB==0){STARTUEM 1;}  // определяем предположительный старт авто c задержкой XXXмс
      


if (
HALL_as_power_Switch == 0)
//if (HALL_as_power_Switch == 0)
      
if (((millis() - pauseTimeACC) >= (timeAfterACC+SLEEP_timer_pri_vykl_ACC)) ) 
                                                    {
                                                        if (
flagHALL == 1)
                                                                 {
SLEEP 1;}//digitalWrite(SLEEPpin, 1); /*тушим экран (если прошло 2 минуты с момента включения блока )*/
                                                            
else {SLEEP 0;}//{digitalWrite(SLEEPpin, 0);}
                                                    
}
//if (HALL_as_power_Switch == 0)                                                     
if (HALL_as_power_Switch == 1)
{
//if (HALL_as_power_Switch == 1)
    
if (millis() - pauseTimeACC >= SLEEP_timer_pri_vykl_ACC )    {SLEEP 1;}//digitalWrite(SLEEPpin, 0); /*включаем экран*/
    
if (millis() - pauseTimeACC >= (SLEEP_timer_pri_vykl_ACC+HALL_as_power_Switch) ) { SLEEP 0;}
    
//if (millis() - pauseTimeACC >= (SLEEP_timer_pri_vykl_ACC+1000) ) { SLEEP = 1;}
}//if (HALL_as_power_Switch == 1)
    
                                                    
    
if ( ((millis() - pauseTimeACC) >=  (OTG_timer_pri_vykl_ACC+timeAfterACC))  ) /* 3000 пауза 3с чтобы не пукал усилитель*/
                                                            
{
                                                            
OTG 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на OTG (8 pin PW1)*/
                                                           
                                                            
}
    if ( ((
millis() - pauseTimeACC) >=  (FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC+timeAfterACC))  ) 
                                                            {
                                                            
FIVE_Volt_OUT_na_POGO_or_USB 0;//digitalWrite(FIVE_Volt_OUT_na_POGO_or_USBpin, 0); /*вЫключаем +5V зарядки. (POGO(USB))*/
                                                            
}
 
    if ( ((
millis() - pauseTimeACC) >=  (HUB_timer_pri_vykl_ACC+timeAfterACC))  ) 
                                                            {
                                                             
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзистор  хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
                                                            
}
                                                                                                                        
              
  if ( ((
millis() - pauseTimeACC) >=  (lcd_noBacklight_timer_pri_vykl_ACC+timeAfterACC))  ) 
                                                            {
                                                            
lcd.noBacklight();// тушим подсветку дисплея для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея 
                                                            
}
                              
                              
    if  ( ((
millis() - pauseTimeACC) >=  (I_dva_C_szina_OFF_time timeAfterACC ))  && (razreszenie_raboty_I_dva_C_sziny  == 1) )  //когда вЫключили зажигание, по истечении времени (I_dva_C_szina_OFF_time) и если разрешение на работу I2C шины всё еще вЫключено - вЫключаем шину I2C
                                                            

                                                            
lcd.clear(); //очистка дисплея 
                                                            
razreszenie_raboty_I_dva_C_sziny  0//запрещаем работу I2C шины
                                                            // ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ТУТ надо будет вЫключать питание на TDA7442 ! ! ! ! ! ! ! ! ! 
                                                                
                                                            
}

    if ( ((
millis() - pauseTimeACC) >=  (REGISTRATOR_timer_pri_vYkl_ACC+timeAfterACC))  ) 
                                                            {
                                                             
REGISTRATOR 0//digitalWrite(REGISTRATORpin, 0);       /* выключаем питание  на видеорегистратор*/
                                                            
}

                                                            
    if ((
razreszenie_raboty_I_dva_C_sziny == 0) || (flagHALL ==1)) //Не даём заснуть первые 15с  
    
{Sleepy::loseSomeTime(vremia_sna_ATMEGI);}//  Т У Т   С П И М   sleep for XXX seconds   - когда запретили работу I2C шины, запускаем сон каждый цикл(loop) на 0,1 сек.                                                                                           

                                                            
 
}// if (flagACC==0)
       
//END obrabotka_ACC_OFF()


void obrabotka_AKB()
{
//START  obrabotka_AKB()
  //  -------------------------========================= блок контроля АКБ ==========================-------------------------------------------------------------------------------


if (U_acc_real >= UaccONorOFF)   {UakbONorOFF Uakb_Kogda_ACC_vkluczeno;}  else {UakbONorOFF Uakb_Kogda_ACC_vYkluczeno;} /*при включении зажигания напряжение самовырубания станет 11,1 вместо 11,9*/

  
if ((Uperezariadki U_akb_real) && ((U_akb_real >= UakbONorOFF) && flagAKB == 0)) /*проверка +30 на перезаряд >15.5В, и больше заданного в 266 строке, и флага акб */
    
{
      if ((
millis() - pauseTimeACC >= 100) && flagAKB == 0)
        {
        
SAMOZAPITKA =1;//digitalWrite(SAMOZAPITKApin, 1);  /* включаем самозапитку процессора        */
        
flagAKB 1/*подняли флаг батареи*/
        
}
    }
   
//Serial.print ("razreszenie_raboty_I_dva_C_sziny = "  ); Serial.println (razreszenie_raboty_I_dva_C_sziny);
 
if (((U_akb_real UakbONorOFF) && flagAKB == 1)||(U_akb_real >Uperezariadki))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
    

      
flagAKB 0;//спустили флаг батареи
      
flagACC 0;
      
pauseTimeACC millis();
      
pauseTimeAKB millis();
      
UakbONorOFF Uakb_Kogda_ACC_vYkluczeno;
    }

  if ((
millis() - pauseTimeAKB >= timeWhileAkbLow) && flagAKB == 0/* если севший аккумулятор //через 40с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
    
{    
      
vykluchic_vse();
      
//PlanshBAT = 0;          //digitalWrite(PlanshBATpin, 0);       /*вЫключаем питание на батарею планшета */
      //OTG = 0;                //digitalWrite(OTGpin, 0);             /*вЫключаем минус на OTG )*/
      //FIVE_Volt_OUT_na_POGO_or_USB = 0;    //digitalWrite(FIVE_Volt_OUT_na_POGO_or_USBpin, 0); /*вЫключаем +5V (POGO(USB))*/
      //HUB = 0;                //digitalWrite(HUBpin, 1);             /* подаем + на управляющий транзистор  хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб*/
      //REM = 0;                //digitalWrite(REMpin, 0);             /* выключаем выход REM*/
      //REGISTRATOR = 0;        //digitalWrite(REGISTRATORpin, 0);     /* выключаем питание  на видеорегистратор*/
      //SAMOZAPITKA =0;         //digitalWrite(SAMOZAPITKApin, 0);     /*выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается*/
      //UPRAVLENIE_PINAMI(); 
      
delay (5000);         // задержка для аппаратного выключения
    
}

  if (
flagAKB == && flagACC == 0)  /*ситуация, когда норм акб и выключено зажигание (ACC)*/
  
{
    if ((
millis() - pauseTimeAKB )>= timeUntilBATOff && flagAKB == 1)    /* если прошло "timeUntilBATOff" 24 (86400000) часа, как выключили ACC // пауза  (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)*/
      

        
PlanshBAT 0;                                            // digitalWrite(PlanshBATpin, 0);  /*вЫключаем питание на батарею планшета (in2)//(батарея планшета))*/
      
}

    if ((
millis() - pauseTimeAKB) >= timeUntilALLOff && flagAKB == 1)   /* если давно выключили ACC     ) "timeUntilALLOff" (2суток = 172800000))     (самозапитка для регистратора, процессор БП активен)*/
      

        
vykluchic_vse();
        
//SAMOZAPITKA = 0;  //digitalWrite(SAMOZAPITKApin, 0);      /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
        //UPRAVLENIE_PINAMI(); 
        
delay (10000);              // задержка для аппаратного выключения
      
}
  }
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений  АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    
//END obrabotka_AKB()

void loop()
{while (
1){//для ускорения void loop
           
analogReadU (5);//вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП АКБ и АСС, потом их усреднили(5)раз.

if (kalibrovkaNOW != 255 && digitalRead(PINkalibrovki)== 0){if (  (millis() < 60000) || kalibrovkaNOW >= )  { rejim_kalibrovki();}      }  //    после 60с или если стоит ЗАПРЕТ(255-калибровка выполнена), калибровку НЕ ДЕЛАЕМ



// новое ( с T12 версии)  вычисление реального напряжения, с учетом значений калибровки в еепром (0 и 1 адреса)
U_acc_real =  Uacc * (1410.0+kalibrovkaACC)/100000;
U_akb_real =  Uakb * (1410.0+kalibrovkaAKB)/100000;

// если включен режим ОТЛАДКИ, тогда игнорируем реальные напряжения аккумулятора 
if (OTLADKA >= 1
   {
        
U_akb_real 14.50;                        //  принимаем напряжение аккумалятора автомобиля за 14,50В ( в режиме OTLADKA == 1 и OTLADKA == 2)
        
if (U_acc_real 6) {U_acc_real 14.50;}  //  принимаем напряжение после замка зажигания за 14,50В (если реальное напряжение АСС > 6В)
        
if (OTLADKA == )  {U_acc_real 14.50;}  //  принимаем напряжение после замка зажигания за 14,50В (всегда, в режиме OTLADKA == 2 )
   
}//конец режима отладки.

 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ кусок кода ниже нужен для того, чтобы при включении  и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  
if ( (millis() > pauseTimeHALL && flagHALL == )|| ((millis() > 15000) && flagACC == 1)) 
  {
flagHALL 1;} /*проверка отсчета при холодном старте при включении  и сразу выключении ACC*/
  /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
if ((U_akb_real U_acc_real) >=)/*проверка, выключили ли мы зажигание или просто стартуем, нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
          
{timeAfterACC timeAfterACC_accOFF; } //выключили зажигание.
     
else { timeAfterACC timeAfterACC_starting;     if (U_akb_real <=UakbONorOFF) {flagREM 3;REM 0;}   }//заводим машину (стартуем) или сел акб при включенном зажигании.
         
if (U_akb_real >= Uperezariadki){timeAfterACC 0;}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


  //  -------------------------========================= блок контроля АКБ ==========================------------------------------------------------------------------------------- 
obrabotka_AKB(); // запустили блок обработки АКБ

  //  ------------========================== блок ACC ========================-----------------------------------------------------------------------------
obrabotka_ACC_ON(); // запустили блок обработки ACC (обработка режима включённого зажигания)
obrabotka_ACC_OFF(); // запустили блок обработки ACC (обработка режима вЫключенного зажигания)
 

 



/******************************************индикация светодиодом и задержка вывода на дисплей********************************************************************************************************************************************************************************/
   
ms millis();
  
// Событие срабатывающее каждые 125 мс
  
if ( ( ms ms1 ) > 125 || ms ms1 ) {
    
ms1 ms;
    
// Режим светодиода ищем по битовой маске
    
if (  blink_mode << (blink_loop 0x07) ) {LED 1;}
    else { 
LED 0;}
    
blink_loop++;
  }
 
if (
razreszenie_raboty_I_dva_C_sziny  == 1// если разрешена работа для шины I2C 
{
  
// Событие срабатывающее каждые 350 мс
  
if ( ( ms pauseDisplay ) > vremia_obnovlenia_displeya || ms pauseDisplay 
  { 
   
pauseDisplay ms;
   
printDISPLAY(); // выводим на дисплей раз в 350( запуская фушкцию)
  
}
}  
  
  
 

 
/*настраиваем режимы моргания встроенного светодиода ардуины*/  
  
if (blink_mode != modes[5] || blink_mode != modes[5]) 
  {
  if (
flagAKB == ){blink_mode modes[4];}                 // индикация напруги батареи на ардуинине.- низкое напряжение АКБ авто - Две короткие вспышки раз в секунду 
  
if (flagAKB == && flagACC == 0) {blink_mode modes[3];} //- нормальное напряжение АКБ авто, ACC выключено.                     - Короткая вспышка раз в секунду
  
if (flagAKB == && flagACC == 1) {blink_mode modes[2];} //- нормальное напряжение, включено ACC, рабочий режим.                - Мигание по 0.8 сек
  
if (kalibrovkaNOW >= 1) {blink_mode modes[1];} // режим калибровки
      
  

 
/* ***********************данные для справки****************************************************************
    0B00000000, //Светодиод выключен blink_mode = modes[0]; 
    0B11111111, //Горит постоянно blink_mode = modes[1];      
    0B00111111, //Мигание по 0.8 сек  blink_mode = modes[2]; 
    0B00000001, //Короткая вспышка раз в секунду  = modes[3]; 
    0B00000101, //Две короткие вспышки раз в секунду 
    0B00010101, //Три короткие вспышки раз в секунду
    0B01010101  //Частые короткие вспышки (4 раза в секунду)= blink_mode = modes[6]; 
   */
//**********************************************************************************************************


//Serial.print ("HUB = "  ); Serial.println (HUB); 
if (STARTUEM == 1// когда крутим стартером ( заводимся) 
//если включено в настройках
    
if (power_off_HUB_on_starting == 1){HUB 0;} // выключаем питание на хаб в момент старта, если включено в настройках
    
if (power_off_OTG_on_starting ==1) {OTG 0;} // выключаем массу на OTG в момент старта, если включено в настройках
}

if (
kalibrovkaNOW 6//если запущена активная стадия режима калибровки, то НЕ запускаем управление выходами.
{
    
UPRAVLENIE_PINAMI(); 
}
 
//Sleepy::loseSomeTime(20);//  sleep for XXX seconds



}} /*конец цикла void loop() и конец while (1)*/
//===========================================================================================================================================================================================================================================================================
//===========================================================================================================================================================================================================================================================================
//===========================================================================================================================================================================================================================================================================
/* _
хотелки


______Сделано__________________________________________________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C,  библиотека вывода на экран https://github.com/enjoyneering/LiquidCrystal_I2C  и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 5 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше UrabotyREM (11.8 В), то включаем еще и усилитель звука (выход REM) /но включаем его только на 30-60мин, если не заведены. После заводки счетчик обнуляется.
v92 сделанъ плавный пуск - определяем нужное состояние пинов без их предварительного дергания в начальное нулевое.
v94 сделанъ вывод на экран через переменную, а не напрямую. ЭТО позволит выводить информацию ЕЩЕ И В КОМ ПОРТ!!! <<<<<<<========================================
v94 Сделана задержка включения REM после холодного запуска,  15с. Через 10 с после начала загрузки идёт инициализация звуковой, в этот момент слышен ПУК
t00 новая ветка блока, по факту продолжение старой.
t02 поскольку аптаймблока в машине превысил 9999 минут, то переделан вывод аптайма 000:00 ( часы : минуты)
t03 дисплей тухнет через 3 сек после операции завершения.
t04 добавлена поддержка дисплея Adafruit_SSD1306 128*64 (тестово). Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master
                   Без 2х библиотек одновременно работать не будет                    https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
t06 обработка напряжений выше 15,5 ( тушим экран и выключаем усилитель звука)
t07 в войд сетап задержки по 0,1с для инициализации дисплеев. Изменен алгоритм выключения - сначала тушим экран, потом все остальное( для таскера, чтобы паузу ставил и плей жал)  
                        выключен Serial.print. display2.begin(SSD1306_ - перекинута инициализация на включение зажигания - 318 строка
t08- ничего
t09 - перенесена строка  проверки заведённой авто, в конец, перед проверкой перезаряда. 
t10 - перешел на другую библиотеку для 1602 дисплея( newE) https://github.com/enjoyneering/LiquidCrystal_I2C. 128*64 не проверял.
t11 - в связи с тем, что у меня дребезжит контактная группа в машине, изменён алгоритм выключения выхода REM 
t12 - возможность калибровки с записью в еепром, переделан метод вывода на дисплей ( теперь через две функции (формирования строк и непосредственно вывода.), а не в основном цикле), убрн вотчдог, как не имеющий практического смысла( пока что просто заккоментирован).
t13  поправлена Логика работы REM = когда стартуем flagREM = 3 Обработка логики работы REM в 538 строках.
t14 - введена новая переменная timeUntilBATOff = время до выключения питания на батарею планшета после выключения зажигания.  24ч = 86400000 (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч) (2суток = 172800000) (4суток = 345600000) 
                               timeUntilALLOff = время до полного выключение блока,  после выключения зажигания (ACC)  ((самозапитка для регистратора)- чтобы легче было менять это время в начале скетча.
      увеличено время поддержки планшета включённым-timeUntilBATOff ( 2 суток после выкл АСС и еще 2 суток после этого до полного выключения блока)    
                           
m01-05 - Новая версия БП5mini. Переход на новые, хорошо себя зарекомендовавшие, дс-дс (mini360). Датчик холла и отг теперь управляются специализированной микросхемой-твердотельным реле. Из-за неё же теперь потеряна совместимость прошивок на БП5 (поскольку на управление холлом теперь нужен инверсный сигнал).  Поэтому уже заодно поменял местами пины управления ОТГ и ХОЛЛА (физически). Фишка полностью совместима с БП5, БП4, БП3.
m6 - обработка статуса выхода REM переведена в отдельную функцию                           
m7 - поменян порядок включения элементов и их тайминги. Тестово. По идее, должно быть стабильнее, либо вообще никак не повлияет. Убраны лишние закомментированны строчки.
m11 - отг включаю сразу.
m12 - Сделал все основные тайминги настраиваемыми в начале скетча. Отдельно на включение, отдельно на выключение. Искать по строке ______НАСТРОЙКИ ТАЙМИНГОВ!!!______.
m14 - теперь тайминги в const unsigned long. В настройках скетча можно включить ресет хаба после каждого включения зажигания( reset_HUB_on_power_on )= передёргивать ли хаб при каждом включении зажигания, для решения проблемы с изикапом (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.
m15 - добавил тайминг timeWhileAkbLow = 40000; в настройки, увеличил с 20до 40с, для машин с функцией подсветки пути домой.    //время, через которое начнётся полное выключение блока когда напряжение на АКБ очень низкое. 
m18 - перевел все основные значения напряжений, таймингов и пинов на переменные.  Облегчение портирования на разные аппаратные платформы. ----> Подготовка совместимости с БП7.
m19 - более дружественные комментарии.
m20-22 - переписывание скетча, чтобы не выводить через I2C шину информацию, для экономии энергопотребления и совместимости с БП7. Изменены режимы моргания встроенного светодиода ардуины ( тоже даёт экономию при выключенном зажигании 0,005А). Добавлено время обновления I2C дисплея в настройках пользователя.
m23 - исправлено. иногда не выключалась самозапитка при севшем АКБ! теряется 1 байт в конце PORTBregistr. Поправил - пока стандартными командами в void UPRAVLENIE_PINAMI_BPV.
m24-26 - оптимизация кода и комментариев. 
m27 - добавлен спящий режим для атмеги при выключении зажигания. Уменьшено энергопотребление блока питания. когда запретили работу I2C шины, запускаем сон каждый цикл(loop) на 0,1 сек.                                                                                  ________________________________________________________________ 
m28 - перенесена обработка режимов АСС (вкл, вЫкл) в отдельнее функции. Добавлены настройки для пользователя ( выключать ли питание на хаб при кручении стартером, убирать ли массу с IDюсб = OTG при кручении стартером) 
m29 - добавлена задержка на определение, крутим ли мы стартером и прекратили ли крутить, искать по переменной STARTUEM
m30 - добавлена возможность канал датчика холла подключать к физической кнопке питания планшета ( для тех, у кого нету датчика холла).
m31 - добавлена возможность писать свои некоторые персональные настройки в энергонезависимую память (EEPROM), подробнее в настройках пользователя и в void RABOTA_z_EEPROM (). 
m32 - Реализована возможность ВСЕ настройки пользователя писать в энергонезависимую память (EEPROM). Настройки НЕ совместимы с серсией m31, поэтому их надо переписать еще раз (brac_nastrojki_iz_EEPROM =1) 
      добавлена настройка vremia_uderjanija_najatoj_knopki_POWER. уменьшено время сна атмеги с 100 до 50, на потребление не повлияло. 
m33 - добавлен в настройки пользователя тайминг на вЫключение питания на регистратор после выключения зажигания. Управляемый канал +12В можно использовать в своих целях.
m34 - добавлен режим ОТЛАДКИ. Если на столе или в машине блок питания не включает выходы, выключается после выключения зажигания, то 
      для проверки функций включаем OTLADKA = 1; при этом напряжения аккумулятора принимается за 14,50(В) НЕЗАВИСИМО от реального напряжения источника питания.  
      для штатной, нормальной работы блока питания ставим OTLADKA = 0;
m35 - добавлены комментарии, функция obrabotka_AKB поставлена первее obrabotka_ACC_ON, 
      в режим отладки добавлена возможность включения-выключения зажигания, теперь есть два типа отладки.
      сделана переинициализация I2C дисплея при каждом включении зажигания
m36 - оптимизирован режим калибровки. Добавлена функция void vykluchic_vse()    
 собственное потребление блока по 12 вольтам, без планшета (для БП5mini)
                                                    - при 10В +30 и +15 выключены                              = 0,014-0,017 А  ( меньше, если выпаять светодиоды с ардуины; также много из этого потребляет CH340G)
                                                    - при 12В +30 и +15 включены                               = 0,056-0,060 A
                                                    - при 12В +30 включены +15 выключены (при питании батареи) = 0,020-0,021 A
________________________________________________________________
поведение встроенного светодиода
    низкое напряжение АКБ авто                                         - коротко моргает
    нормальное напряжение АКБ авто, ACC выключено.                     - быстро моргает
    нормальное напряжение, включено ACC, рабочий режим.                - медленно моргает 


ПРИМЕЧАЕНИЯ
->  strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так:  strcpy(strokaIIold,strokaII); // копируем новую строку в старую 
*/ 
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например  d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\  https://github.com/enjoyneering/LiquidCrystal_I2C например
//в версии T04 добавлена поддержка дисплея Adafruit_SSD1306 128*64  Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master  https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
//в версии m25 добавлена обязательная библиотека JeeLib library  https://github.com/jcw/jeelib .
// НЕДОСТАЮЩИЕ БИБЛИОТЕКИ СКАЧАТЬ И CКОПИРОВАТЬ В ПАПКУ libraries, например  d:\777\Soft\arduino\arduino-1.6.11\libraries\ . 


iMag 06.10.2018 18:24

Итак, Олег!
Начинаем работу по подключению BP5mini к Нехусу 2012. Случай, когда батарея остаётся в планшете, доступа к ней и к датчику Холла извне нет.
- Вывод "Батарея планшета" подаётся на +5V microUSB.
- +5V POGO никуда не подключается.
- HUB +5V подаётся на хаб.
- -SLEEP (HALL) не подключается.
- -Y-OTG подключается к 4-му контакту microUSB.
- GND PLANS подключается к выводу - microUSB (пятый контакт) И!!! к минусу питания хаба.
- ЦЗ-IN никуда не подключается.
- REM out (+12V) никуда не подключается.
- registrator+30 никуда не подключается.
- ACC подключается к контакту зажигания KEY ON.
- +30 подключается к постоянному +12V машины.
- GND IN подключается к минусу машины.

Итого, я подключаю всего 7 контактов разъёма: 3 - входные, 4 - выходные. Остальные не подключаю за неимением необходимости.

Олег, я правильно всё себе растолковал?
ЗЫ. По мне, было бы удобно использовать нумерацию ног разъёма, но так как они не обозначены, не стал вносить ещё большее непонимание для других читателей.

oleg707 06.10.2018 20:39

Вложений: 2
Цитата:

Сообщение от iMag (Сообщение 405690)
Итак, Олег!
Начинаем работу по подключению BP5mini к Нехусу 2012. Случай, когда батарея остаётся в планшете, доступа к ней и к датчику Холла извне нет.
- Вывод "Батарея планшета" подаётся на +5V microUSB.
- +5V POGO никуда не подключается.
- HUB +5V подаётся на хаб.
- -SLEEP (HALL) не подключается.
- -Y-OTG подключается к 4-му контакту microUSB.
- GND PLANS подключается к выводу - microUSB (пятый контакт) И!!! к минусу питания хаба.
- ЦЗ-IN никуда не подключается.
- REM out (+12V) никуда не подключается.
- registrator+30 никуда не подключается.
- ACC подключается к контакту зажигания KEY ON.
- +30 подключается к постоянному +12V машины.
- GND IN подключается к минусу машины.

Итого, я подключаю всего 7 контактов разъёма: 3 - входные, 4 - выходные. Остальные не подключаю за неимением необходимости.

Олег, я правильно всё себе растолковал?
ЗЫ. По мне, было бы удобно использовать нумерацию ног разъёма, но так как они не обозначены, не стал вносить ещё большее непонимание для других читателей.

Неправильно :no2:
Для подключения только по ЮСБ ( если не хочется потрошить планшет) можно подключать так:

Вывод "Батарея планшета" никуда не подключаем. Там постоянно есть 4,2. На батерее реального планшета напряжение не пропадает, а только гуляет 3,8-4,2
Вывод "+5V POGO" (на самом деле он подписан как "+5V_USB_(POGO)" ) подключаем на +5V microUSB.
У себя в стационарной установке 7-2012 я подключал +5V_USB_(POGO) как раз на контакт POGO.
Вывод "HUB +5V" подаётся на хаб. В хабе отрезаем +5В, идущее к планшету ( отпаиваем провод).
Вывод "-Y-OTG" подключается к 4-му контакту microUSB. Делается это для корректной переинициализации юсб устройств при выключении зажигания. В общем случае нужно сделать кабель, типа такого.
Вывод "- GND PLANS" подключается к выводу - microUSB (пятый контакт) И!!! к минусу питания хаба.
Вложение 50274Вложение 50275
Вывод "- REM out" (+12V) подключается на управление выхода REM внешнего усилителя звука, если он есть.
Вывод "+ACC" подключается к контакту зажигания KEY ON. ( или к АСС. или к +15. В общем к напряжению, которое появляется после включения замка зажигания в первую позицию либо при вставлении ключа в замок зажигания).
Вывод "+30" подключается к постоянному +12V машины. Желательно через предохранитель 5-7,5А. На плате блока питания есть физический предохранитель, но внешний по правилам должен тоже быть. ( Поскольку я подключался к фишке штатной магнитолы, то предохранитель у меня стоит по заводу в блоке предохранителей).
Вывод "-GND IN" подключается к минусу машины, желательно в ту же точку, что и магнитола, для избежания возможных помех по звуку (земляная петля)
Цитата:

Итого, я подключаю всего 7 контактов разъёма: 3 - входные, 4 - выходные. Остальные не подключаю за неимением необходимости.
Да, верно.
Прелесть блока в возможности подключать его почти как угодно.
Цитата:

ЗЫ. По мне, было бы удобно использовать нумерацию ног разъёма, но так как они не обозначены, не стал вносить ещё большее непонимание для других читателей.
На самом деле нумерация ног есть, в программе DipTrace при открытии проекта печатной платы. Но как раз это вносит большую запутанность, поэтому так проще и нагляднее.

Ps
Забыл сказать, что в планшет при таком подключении нужно будет прошить ядро, поддерживающее одновременно режим OTG и зарядку, например ядро elemental.

iMag 06.10.2018 20:58

Спасибо огромное за столь развёпнутый ответ!
По подключениям вовсе нет вопросов, всё исчерпано.
По нумерации тоже нет, всё равно уже разжёвано по максимуму. )
Разве что в самом мануале (который прилагается в блоку и который прикреплён к одному из постов текущей темы) зелёный цвет не совсем уместен, так как на бумажном варианте он получается размытым. Это проблеммно для тех, у кого зрение подсажено, но ещё не носит очки (вроде меня). То же относится и к серому цвету текста таблицы )

oleg707 06.10.2018 21:23

Цитата:

Сообщение от iMag (Сообщение 405696)
Спасибо огромное за столь развёпнутый ответ!
По подключениям вовсе нет вопросов, всё исчерпано.
По нумерации тоже нет, всё равно уже разжёвано по максимуму. )
Разве что в самом мануале (который прилагается в блоку и который прикреплён к одному из постов текущей темы) зелёный цвет не совсем уместен, так как на бумажном варианте он получается размытым. Это проблеммно для тех, у кого зрение подсажено, но ещё не носит очки (вроде меня). То же относится и к серому цвету текста таблицы )

Эта мини инструкция по подключению по факту тянется еще с 3 версии БП. Подумаю над цветами.
Забыл сказать, что в планшет при таком подключении нужно будет прошить ядро, поддерживающее одновременно режим OTG и зарядку, например ядро elemental.

Немного не в тему, но натолкнулся на классное описание простым языком про то, что такое диод.

Диод, часть 2

skanch 09.10.2018 08:42

Цитата:

Сообщение от oleg707 (Сообщение 405750)

А в твоём проекте, по какой схеме организована защита на стабилитронах? И почему по два в параллель?

oleg707 09.10.2018 13:06

Цитата:

Сообщение от skanch (Сообщение 405753)
А в твоём проекте, по какой схеме организована защита на стабилитронах? И почему по два в параллель?

У меня стабилитрон ставится, как последнее звено защиты.
Смысл в том, что если дс-дс сошел с ума (или пользователь решит поднять немного, на пару-тройку тройку вольт:big: напряжение, и оно превысит 5,6В), то тут стоИт выбор: либо сохраняем планшет живым, либо пропускаем на выход, скажем, 7 вольт.
Для меня выбор очевиден.
Стабилитроны ставятся в параллель для увеличения надёжности.По 2 штуки на дс-дс преобразователь.
Принцип такой: при увеличении напряжения выше 5,6В начинается его стабилилизация, с большим выделением тепла. Как правило один из двух стабилитронов ( практические испытания) уходит в короткое замыкание. Дс-дс при этом уходит в защиту по току, и пытается запуститься, но ему не даёт короткое замыкание стабилитрона.

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

___________

Кстати, может подскажет кто интеллектуальный ключ на 1 канал с напряжением 3-7 вольт? Или транзистор полевой p-канальный в корпусе dpak (TO252) с минимальным сопротивлением.
Ампера на 2-5.
Нужно, чтобы 5.5 вольт коммутировал с минимальным падением напряжения (5.45) на выходе при токе 2А.

skanch 09.10.2018 18:48

Вложений: 1
У тебя "голые" стабилитроны стоят на выходе каждого канала. Как вариант для "отладки на столе", пока тестируется и подбирается напряжение может и подходит, но как вариант полноценной защиты уже установленного блока в недра авто - не лучший вариант. Я тоже экспериментирую с различными защитами от перенапряжения и тока, и "голые" стабы тоже тестировал. Конкретно с модулем на MP1584 происходит следующее: пока напряжение на выходе преобразователя не превышает напряжение стабилизации - всё нормально, как только превысило расчётную величину стаб устраивает короткое замыкание на выходе DC-DC преобразователя и при этом сам начинает греться, да так, что плавится припой. Соответственно напряжения на выходе канала питания нет. Но есть одно "но"... Припой плавится, и стаб просто испустив последний дым с площадок отваливается, тем самым "разблокировав" короткое замыкание на модуле DC-DC и "высокое" напряжение устремилось к нагрузке. Если стаб сгорев всё-таки каким-то чудом удержится на плате, то микросхема от перегрева (порог 150С) переходит в защиту-отключается и это лучший вариант (при этом остыв примерно до 120С пытается включаться снова-процесс повторяется). Но в моих экспериментах стаб сваливался с платы раньше, чем отключалась микросхема. Если в линию питания добавить плавкий предохранитель, то при коротком замыкании перегорев он разомкнёт цепь. Тогда менять нужно будет и стаб, и предохранитель. Если в схему добавить тиристор на ток реально превышающий ток, выдаваемый модулем DC-DC, то менять нужно будет только предохранитель. По такому принципу работает схема ниже.

Вложение 50281
Источник.
Ставить этот "предохранитель на тиристоре" нужно после DC-DC преобразователя именно на выходе. Плавкий предохранитель FU1 в цепи защиты должен быть рассчитан на максимальный ток нагрузки самого DC-DC преобразователя.

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

P.S. Идеальный вариант защиты - это микросхемы от MAXIM. Но это уже не бюджетное решение.

oleg707 09.10.2018 21:24

Цитата:

Сообщение от skanch (Сообщение 405761)
У тебя "голые" стабилитроны стоят на выходе каждого канала. Как вариант для "отладки на столе", пока тестируется и подбирается напряжение может и подходит, но как вариант полноценной защиты уже установленного блока в недра авто - не лучший вариант. Я тоже экспериментирую с различными защитами от перенапряжения и тока, и "голые" стабы тоже тестировал. Конкретно с модулем на MP1584 происходит следующее: пока напряжение на выходе преобразователя не превышает напряжение стабилизации - всё нормально, как только превысило расчётную величину стаб устраивает короткое замыкание на выходе DC-DC преобразователя и при этом сам начинает греться, да так, что плавится припой. Соответственно напряжения на выходе канала питания нет. Но есть одно "но"... Припой плавится, и стаб просто испустив последний дым с площадок отваливается, тем самым "разблокировав" короткое замыкание на модуле DC-DC и "высокое" напряжение устремилось к нагрузке. Если стаб сгорев всё-таки каким-то чудом удержится на плате, то микросхема от перегрева (порог 150С) переходит в защиту-отключается и это лучший вариант (при этом остыв примерно до 120С пытается включаться снова-процесс повторяется). Но в моих экспериментах стаб сваливался с платы раньше, чем отключалась микросхема. Если в линию питания добавить плавкий предохранитель, то при коротком замыкании перегорев он разомкнёт цепь. Тогда менять нужно будет и стаб, и предохранитель. Если в схему добавить тиристор на ток реально превышающий ток, выдаваемый модулем DC-DC, то менять нужно будет только предохранитель. По такому принципу работает схема ниже.

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

P.S. Идеальный вариант защиты - это микросхемы от MAXIM. Но это уже не бюджетное решение.

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

Про пару стабилитронов - решение осознанное, потому как если один не сработал или выжегся, не уйдя в короткое замыкание, второй подстрахует. Стоимость копейки.

Ещё раз повторю, что простейшее копеечное решение установки стабилитрона уже спасло 2 планшета от перенапряжения выше 5.6В, что в тех случаях означало бы смерть материнской платы. Да, в тех двух случаях люди сами хотели поднять напряжение на выходе, но, не рассчитав, крутили подстроечный резистор больше, чем надо. В одном случае было 7,7В по выходу, во втором он сразу крутанул обратно, но было поздно.
В любом случае, если напряжение в норме, то стабилитроны не участвуют в работе, а если превышает 5,6В - это уже аварийная ситуация тогда пусть лучше горит стабилитрон, дс-дс, предохранитель, микросхема, да хоть весь блок питания! Главная задача - защитить планшет. Остальное ремонтируется.

skanch 09.10.2018 22:00

Спорить и что-то доказывать не вижу смысла. Я привёл тебе конкретные результаты тестов одиночных стабов, причём расписал, как работает подобная защита на модуле MP1584 - ты или не вник в суть написанного мною или просто "оно тебе не надо"...
Smart-ключ its724g стоИт у тебя до модулей и коммутирует входное напряжение от АКБ машины - так что к защите от короткого замыкания на выходе DC-DC преобразователей отношения не имееет и в таком виде использования выступает в роли простого коммутатора входного питания. При КЗ на выходе модуля микросхема MP1584 отключает нагрузку, но не блокирует входные цепи. Поэтому и привёл тебе пример с использованием предохранителя в цепи защиты именно выходного напряжения.

oleg707 10.10.2018 13:54

Цитата:

Спорить и что-то доказывать не вижу смысла. Я привёл тебе конкретные результаты тестов одиночных стабов, причём расписал, как работает подобная защита на модуле MP1584 - ты или не вник в суть написанного мною или просто "оно тебе не надо"...
я ж тебе написал тесты практических результаты завышения напряжения ( либо сам забывал уменьшить перед включением, либо подстроечные поврежденные). Чтобы выпаять закороченные стабилитроны и не пережарить электролит рядом, я иногда включал БП, стабы подогравались и я паяльным феном уже разогретые отпаивал ( так легче и быстрее).
Цитата:

Может у меня масса припоя большая, и защиты отрабатывают раньше - гадать нет смысла.
Как смогу, сделаю еще раз такой тест " в лоб".

Цитата:

"оно тебе не надо"
Ну как сказать, у некоторых ВООБЩЕ никакой защиты по выходу от перенапряжения нету :spiteful:
Причем перенапряжение подразумевает под собой автоматический выход планшета из строя.
Поэтому моя логика такая, что пускай сгорит хоть весь БП - он прекрасно ремонтопригодный, но мы спасаем планшет.
Про its724g, тут да, скорее про защиту от КЗ ДС-ДС модуля.
Цитата:

При КЗ на выходе модуля микросхема MP1584 отключает нагрузку, но не блокирует входные цепи
Ну да.:big: Я вроде и не утверждаю обратного.
Вообще, если посмотреть на компьютер управления двигателем или другие "мозги" автомобилей, то у всех автопроизводителей питания, которые выходят на запитку датчиков именно так себя и ведут. При замыкании - уходят в защиту (при этом пишут ошибку в память и зажигают индикатор ошибки на приборной панели), а при устранении КЗ - продолжают спокойно выдавать напряжение. Только там внутри стоят нормальные микросхемы, но стоимость нового блока обычно 500-1000 евро. Немножко разные весовые категории, поэтому приходится иногда идти на компромиссы :rolleyes2:

В остальном я с тобой согласен :beer:

oleg707 11.10.2018 13:10

Вложений: 2
Предыдущая часть

На плате ардуино установлен регулятор напряжения AMS1117, который при появлении +12В начинает выдавать +5В для запитки процессора и платы ардуино. Также эти +5В появляются на выходе ардуино "+5V", откуда идут через R9, R10 на подтяжку для I2C шины (подключение дисплея) и конденсатор С12 ( нужен для длительного поддержания питания процессора при низком напряжении аккумулятора, например при старте автомобиля. Также +5В идут для запитки дополнительного I2C дисплея.
Вложение 50291Вложение 50292
При появлении питания на ардуино начинает светиться светодиод питания.

следующая часть

tima10 11.10.2018 23:00

Вложений: 1
Уважаемые skanch, oleg707,
подскажите пжл, в авто есть ММС, а также установлен планшет Nexus 7 2012 WiFi,
решил немного привести в порядок проводку подключения планшета, так вот что я
хочу уточнить у Вас, я хочу подключить БП планшета к косичке ММС,где все есть: +12 В, земля, АСС. вопрос в том: можно ли осуществить такую схему подключения БП планшета и хватит ли теперь им обоим напряжения и тока при одновременном запуске при заводке автомобиля?
спасибо.:blush:

oleg707 11.10.2018 23:31

Цитата:

Сообщение от tima10 (Сообщение 405858)
Уважаемые skanch, oleg707,
подскажите пжл, в авто есть ММС, а также установлен планшет Nexus 7 2012 WiFi,
решил немного привести в порядок проводку подключения планшета, так вот что я
хочу уточнить у Вас, я хочу подключить БП планшета к косичке ММС,где все есть: +12 В, земля, АСС. вопрос в том: можно ли осуществить такую схему подключения БП планшета и хватит ли теперь им обоим напряжения и тока при одновременном запуске при заводке автомобиля?
спасибо.:blush:

Хватит. По асс блок ничего не берет, по + 30 ( постоянный плюс) максимум Ампера 4
В крайнем случае на линии постоянного плюса (+30) ммс поставить предохранитель на 5 ампер больший, чем должен стоять по заводу.
Подключение на столе ещё древней 4 версии
https://m.youtube.com/watch?v=ZXcNYxcIh9U&t=2s


tima10 12.10.2018 21:46

Цитата:

Сообщение от oleg707 (Сообщение 405862)
Хватит. По асс блок ничего не берет, по + 30 ( постоянный плюс) максимум Ампера 4
В крайнем случае на линии постоянного плюса (+30) ммс поставить предохранитель на 5 ампер больший, чем должен стоять по заводу.
Подключение на столе ещё древней 4 версии
https://m.youtube.com/watch?v=ZXcNYxcIh9U&t=2s


спасибо, значит будем делать.:drinks_cheers:

oleg707 13.10.2018 16:22

Вложений: 2
Предыдущая часть

При появлении питания на ардуино начинает светиться светодиод питания.
Примерно через секунду ( ожидание загрузчика) начинает выполняться программа, зашитая в процессор ( наш скетч).
По выполнению некоторых операций ( всё описать не буду, это будет повторением скетча) процессор считывает значения напряжений АКБ ( аккумулятора).
Для этого с делителя напряжения R3-R7 уменьшенное напряжение идёт на порт А1 ардуино.
Также процессор считывает значения напряжений АСС ( напряжение после замка зажигания).
Для этого с делителя напряжения R4-R8 уменьшенное напряжение идёт на порт А0 ардуино.

При входном напряжении питания 12В на АСС и АКБ на портах А0 и А1 должно быть 3,85В.
При входном напряжении питания 14,5В на АСС и АКБ на портах А0 и А1 должно быть 4,60В.


Если при входе 12В на портах А0 и А1 сильно заниженные напряжения (например 0,7В, 0,2В), возможно неисправны конденсаторы С7, С8. Также стоит проверить резисторы делителей напряжения R3, R7, R4, R8.
Вложение 50303Вложение 50304

Следующая часть

artolik 15.10.2018 20:51

Вложений: 6
Доброго времени всем,пришел сегодня мне кит набор блока питания.

Опыт пайки у меня не большой,а smd компонентов в таком количестве тем более. Взял флюс,припой (толстоватый для smd),заточил на наждаке паяльник на 40 Ватт и приступил к пайке. Начинал с самых мелких компонентов,потом на увеличение. Первая для меня трудность- это маркировка резисторов,на плате они указаны трехзначными,а используются четырехзначные высокоточные,Олег молодец,всегда онлайн и готов подсказать,но я ему об этом написал,когда уже сам разобрался. Если у вас нет опыта пайки,трясутся руки,лучше заказывайте готовый блок. Компоненты очень мелкие,запаса нет и если у вас что нибудь отскочит,то найти деталь будет практически не возможно. Я постелил белый лист бумаги,детали брал и укладывал маленьким пинцетом,потом прижимал деталь зубочисткой и паял.

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

https://c.radikal.ru/c09/1810/95/6cc31d519255.jpg

В процессе сборки у меня возникали некоторые вопросы и я их задавал Олегу в вайбер,ответы приходили быстро,спасибо Олег.

https://b.radikal.ru/b05/1810/ed/dc9df4bc90ef.jpg

https://c.radikal.ru/c02/1810/e5/e5a6ce010c88.jpg

https://b.radikal.ru/b20/1810/79/6de582cb282f.jpg

https://b.radikal.ru/b07/1810/41/2fbfd925368e.jpg

https://b.radikal.ru/b19/1810/c3/433ad66f91c4.jpg

https://a.radikal.ru/a43/1810/ae/943c23a60ad7.jpg

https://d.radikal.ru/d26/1810/98/c6f3d70dc296.jpg

https://d.radikal.ru/d19/1810/08/2faede3592f6.jpg

https://d.radikal.ru/d15/1810/33/244a324dcbde.jpg

https://b.radikal.ru/b33/1810/b5/fcef47a8c59b.jpg

https://c.radikal.ru/c29/1810/bd/baa087ac99fb.jpg

artolik 15.10.2018 23:34

Думал у меня будет затык с прошивкой нано,у меня нет мини usb кабеля,но Олег успокоил,прошивка залита. Так что в ближайшее время найду разъем atx и приступлю к калибровке,теперь правда не знаю нужны ли фото,или только текстом все описывать. Конечно лучше взять готовый,настроенный блок питания у автора,но лично мне гораздо интересней собирать самому.

artolik 16.10.2018 14:37

Сегодня нашел ATX разъем и попробовал включить блок питания,все запустилось,напряжение на батарею нужно немного понизить,думаю до 4,2 вольта. Осталось еще подключить экран и откалибровать блок. Ну и погонять под нагрузкой.

https://b.radikal.ru/b07/1810/37/11118c18072c.jpg

https://d.radikal.ru/d12/1810/a8/83c8d7660f11.jpg

artolik 16.10.2018 14:58

Олег хочу задать вопрос здесь,может кому еще будет интересно,я буду для нагрузки использовать нихромовую проволоку,на какой ток ее лучше настроить и когда подавать нагрузку,сразу или после старта блока питания?

oleg707 16.10.2018 19:09

Цитата:

Сообщение от artolik (Сообщение 405987)
Олег хочу задать вопрос здесь,может кому еще будет интересно,я буду для нагрузки использовать нихромовую проволоку,на какой ток ее лучше настроить и когда подавать нагрузку,сразу или после старта блока питания?

1.5-2 ампера на каждый дсдс. нагрузку подавать можно сразу, можно потом. Я и так и так тестирую.
например нa канал батареи я подключаю резистор 2 Ом, ток на 4.1В получается около 2х ампер.
на канал +5 (зарядки) 3 ома 1.5 А

artolik 17.10.2018 15:55

https://b.radikal.ru/b23/1810/82/0911a1fd2024.jpg

https://c.radikal.ru/c23/1810/0e/f10796d08a2b.jpg

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

В итоге,после выпайки стабилитронов я настроил dc dc на 4,1 вольт и впаял стабилитроны на место,один который выжил,второй Олег случайно или нарочно положил мне в комплект. Я совсем не гуру в электронике,но думаю в идеале нужно на dc dc вместо переменника ставить нормальный резистор,ну или хотя бы шунтировать переменник для более плавной регулировки в пределах 4-5 вольт. В принципе мне осталось намотать нагрузочные резисторы и погонять блок под нагрузкой и я думаю на этом,по блоку питания будет все. Постараюсь в ближайшее время это сделать. А еще вспомнил,вчера потратил немного времени на перестановку проводов в разъеме ATX,а то по умолчанию там было не совсем логично,в одной косе из трех проводов они все были разного цвета,теперь все красиво.

oleg707 17.10.2018 16:31

Цитата:

один который выжил,второй Олег случайно или нарочно положил мне в комплект
случайности неслучайны ;)
Цитата:

в идеале нужно на dc dc вместо переменника ставить нормальный резистор
согласен, но на практике одному надо 4.0, другому 5.0В. смд с дсдс выпаять не каждый сможет.
А кто может - запросто выпаяет подстроечный резистор и запаяет туда постоянный 0805 или 0603:derisive:

skanch 17.10.2018 16:53

Вложений: 2
Нужно проявлять заботу о "развивающихся регионах" и заранее впаивать многооборотные потенциометры ))).

Вложение 50331Вложение 50332

artolik 17.10.2018 17:28

Ну вот собрал такой колхоз. Нихром поленился к чему нибудь прикрутить,просто повесил все это в воздухе и погонял минут 20. Пирометра у меня нет,но на ощупь dc dc едва теплые,стабилитроны выжили,хотя боялся за б.у. из сгоревшей пары.Напряжения настроил 5,1 вольт на хаб и 4,1 на батарею.

https://b.radikal.ru/b17/1810/a6/61fa68140329.jpg

Олег я так понимаю 0805 и 0603 это для 4,1 и 5,1 вольт? А какой для какого? Мне наверно нужно как то расковырять подстроечник и выпаять частями,у меня же обычный старый паяльник. Хочу поставить постоянные и забыть. Подскажите еще к каким пятакам паять? Там же их будет три,спасибо. Ошибок мне допускать нельзя,стабилитронов больше в запасе нет.

Многооборотные конечно улучшат ситуацию,но добавят высоты,да и постоянный конечно наверно надежней.

Забыл написать,нагрузка у меня была подключена перед включением блока питания,при этом он стартовал стабильно.

skanch 17.10.2018 19:29

Цитата:

Сообщение от artolik (Сообщение 406018)
Многооборотные конечно улучшат ситуацию,но добавят высоты,да и постоянный конечно наверно надежней.

Хм...И сильно высоко получается? Прямо выше электролитов?
Цитата:

Сообщение от artolik (Сообщение 406017)
Олег я так понимаю 0805 и 0603 это для 4,1 и 5,1 вольт? А какой для какого? Мне наверно нужно как то расковырять подстроечник и выпаять частями,у меня же обычный старый паяльник. Хочу поставить постоянные и забыть. Подскажите еще к каким пятакам паять? Там же их будет три,спасибо. Ошибок мне допускать нельзя,стабилитронов больше в запасе нет.

Я понимаю вашу эйфорию по поводу самостоятельной сборки конструктора, но на форуме достаточно информации по этим модулям - нужно только поискать...

Цитата:

Сообщение от artolik (Сообщение 406016)
Ну вот собрал такой колхоз. Нихром поленился к чему нибудь прикрутить,просто повесил все это в воздухе и погонял минут 20. Пирометра у меня нет,но на ощупь dc dc едва теплые,стабилитроны выжили,хотя боялся за б.у. из сгоревшей пары.Напряжения настроил 5,1 вольт на хаб и 4,1 на батарею.

Это тесты модуля под нагрузкой. Если "чуть тёплые" (40-45С) - значит ток нагрузки не превышает 600-800 мА.

mazay66 17.10.2018 20:24

Цитата:

Сообщение от skanch (Сообщение 406020)
Хм...И сильно высоко получается? Прямо выше электролитов?

Какое практическая польза от них? Всегда считал, что запаять постоянный резистор нужного номинала намного надежнее и правильнее. Нечего там крутить и регулировать. Настроить с одного преобразователя 4,2-4,4В, а с другого 5,1-5,3В и забыть.

skanch 17.10.2018 20:42

Цитата:

Сообщение от mazay66 (Сообщение 406021)
Какое практическая польза от них? Всегда считал, что запаять постоянный резистор нужного номинала намного надежнее и правильнее. Нечего там крутить и регулировать. Настроить с одного преобразователя 4,2-4,4В, а с другого 5,1-5,3В и забыть.

На данном блоке питания - никакой пользы!

artolik 17.10.2018 20:58

Спасибо за ссылочку по dc dc,для меня она очень полезная. Извините,что сам не смог найти,я думаю форум для того и существует,чтобы участники помогали друг другу.

Еще вопросик,если использовать стандартные резисторы,то можно добится напряжений 5,66. 5,35. 4,5. 3,7 вольт. Исходя из этого я думаю настроить 4,5 вольт на батарею и 5,35 на хаб. Но не поплохеет ли стабилитронам от 5,35 вольт?

skanch 17.10.2018 21:50

Цитата:

Сообщение от artolik (Сообщение 406023)
Спасибо за ссылочку по dc dc,для меня она очень полезная. Извините,что сам не смог найти,я думаю форум для того и существует,чтобы участники помогали друг другу.

Еще вопросик,если использовать стандартные резисторы,то можно добится напряжений 5,66. 5,35. 4,5. 3,7 вольт. Исходя из этого я думаю настроить 4,5 вольт на батарею и 5,35 на хаб. Но не поплохеет ли стабилитронам от 5,35 вольт?

Не плодите отдельных постов - старайтесь писать компактно.
По последнему вопросу: чтобы получить точное напряжение на выходе нужно запастись прецизионными резисторами с разными номиналами и методом подбора получить нужное напряжение (для питания HUB-а от 44К до 47К, для питания планшета от 37К до 39К). Или подстроечником выставить нужное напряжение и аккуратно выпаяв его, померить на нём сопротивление (должно быть в рамках указанных выше значений).
P.S. Как правило купить прецизионные резисторы нужного типоразмера и нужного номинала не всегда есть возможность. В этом случае прецизионный многооборотный подстроечник нужного размера может пригодиться...
PS.PS.И если впаиваете постоянные сопротивления, то стабилитроны тем более не нужны.

artolik 17.10.2018 23:52

Еще раз спасибо.

oleg707 18.10.2018 00:33

Цитата:

PS.PS.И если впаиваете постоянные сопротивления, то стабилитроны тем более не нужны.
Так они и не мешают :) я бы не выпаивал просто из за лени:)
Цитата:

Олег я так понимаю 0805 и 0603 это для 4,1 и 5,1 вольт? А какой для какого? Мне наверно нужно как то расковырять подстроечник и выпаять частями,у меня же обычный старый паяльник. Хочу поставить постоянные и забыть. Подскажите еще к каким пятакам паять? Там же их будет три,спасибо. Ошибок мне допускать нельзя,стабилитронов больше в запасе нет.
Улыбнуло )))
0805 и 0603 это типоразмеры смд резисторов
Пятаки 2 штуки соединены параллельно. Я на подстроечнике уже очень долго, больше года точно катаюсь, никаких проблем. И это при незакрепленном блоке в бардачке. Можешь для успокоения каплю лака капнуть после настройки напряжений.

По поводу постоянных резисторов - можно посчитать необходимый номинал, в той же программе разработчика mps, но я не помню номинал другого резистора ( считаем то делитель), запаянного на дс-дс. Посмотреть и посчитать сейчас немного затруднительно, т.к. дс-дс на работе, а до домашнего компа добираюсь пару раз в неделю. В основном все с планшета или на работе с ноутбука, а там русских клавиш нету ((.Но если сильно надо, то можно будет глянуть и рассчитать.

Цитата:

.Или подстроечником выставить нужное напряжение и аккуратно выпаяв его, померить на нём сопротивление (должно быть в рамках указанных выше значений).
Аккуратно подстроечник можно только сдуть феном, ну или инфракрасной паялкой, но у меня не всегда получалось точно - точно измерить, то ли пинцетом задевал, то ли деформация от температуры, хз.
А вторая задача найти такой же ! резистор из стандартного модельного ряда, да ещё желательно высокоточный. Да ещё и у себя в наличии )))

Цитата:

. Нихром поленился к чему нибудь прикрутить,просто повесил все это в воздухе и погонял минут 20. Пирометра у меня нет,но на ощупь dc dc едва теплые,стабилитроны выжили,хотя боялся за б.у. из сгоревшей пары.Напряжения настроил 5,1 вольт на хаб и 4,1 на батарею.
Ток надо измерить кроме напряжения. У меня нагрузочные резисторы горяченные, дотронуться нельзя, и дс-дс горячие, дотронуться можно, но на мгновение. Резисторы раньше были на 10 ватт, керамические, аж потрескались, пришлось взять другие, на 100 Вт, с металлическими ребрами охлаждения. Охлаждение я временно не ставил, поэтому новые греются примерно как старые :rofl:
Ps
Во понаписали!

artolik 18.10.2018 02:40

Нихром я конечно руками не трогал и так на расстоянии чувствовал жар,спираль висела в воздухе,но до красна не нагревалась,возможно я уж слишком завысил сопротивление и по этому не прогрел dc dc до шестидесяти градусов. Но в любом случае я думаю с ними все нормально. С типоразмерами резисторов я лоханулся (стыдно) ,но хоть вас повеселил. Высокоточных в smd я врядли найду. Видимо оставлю все как есть,капну на них лака для ногтей. Жаль конечно,с обычным (высокоточным) я думаю было бы гораздо гораздей.

oleg707 18.10.2018 09:14

Цитата:

Сообщение от artolik (Сообщение 406029)
Жаль конечно,с обычным (высокоточным) я думаю было бы гораздо гораздей.

На самом деле никакой разницы на практике не ощущается:secret:
Что в сравнении с 1% резистором, запаянным вместо подстроечник, что в сравнении с 5%.

artolik 19.10.2018 13:05

Настроил на батарею 4,17 и на хаб 5,1 вольт.

https://b.radikal.ru/b31/1810/bf/fe1eb0393f71.jpg

creativ92 20.10.2018 18:56

Имитация штатной работы датчика холла по совету oleg707

нужно выпаять датчик холла (на примере nexus 7 2013)
http://d.radikal.ru/d10/1810/be/2b5039010921.jpg

запаять резистор 100кОм
http://a.radikal.ru/a07/1810/b1/6e087e56693d.jpg

на провод (красный на фото) будет подаваться масса с умного БП, планшет будет засыпать

oleg707 20.10.2018 20:43

Цитата:

Сообщение от creativ92 (Сообщение 406057)
Имитация штатной работы датчика холла по совету oleg707

нужно выпаять датчик холла (на примере nexus 7 2013)]

запаять резистор 100кОм

на провод (красный на фото) будет подаваться масса с умного БП, планшет будет засыпать

Уже прямо сейчас можно на сигнальный провод через 100 ом ( для перестраховки) можно подать массу и проверить работоспособность. Но я думаю, что это уже проделано .

oleg707 21.10.2018 15:47

Вложений: 5
Предыдущая часть

Когда процессор посчитал, что напряжений достаточно и зажигание включено, то начинается включение следующего:

включаем самозапитку ардуино, и, соответственно, процессора
Для этого включаем логическую единицу (+5В) на D9 ардуины. Напряжение идет через диод D6 на управляющую ногу IN4 интеллектуального ключа ITS724G. Теперь при выключении ACC можно поддерживать питание блока. Что при этом происходит, рассмотрено чуть выше.
Вложение 50333

Далее включаем вывод информации на дисплеи I2C.
Поддерживаются дисплеи:
i2c 1602Вложение 50334 и SSD1306Вложение 50335

Так выглядит индикация на дисплее
для версии скетча m34
Вложение 50337Вложение 50338
================
|000:00 110212.10|
|2616 01110 14.50|
================

1 строка

|000:00 110212.10| вывод часов:минут: - ОБЩЕЕ время работы процессора (полное время работы БП без отключения)
|2616 01110 14.50|

|000:00 110212.10| flagAKB - вывод флага AKB
|2616 01110 14.50|

|000:00 110212.10| flagACC - вывод флага AСС
|2616 01110 14.50|

|000:00 110212.10| REM - вывод rem 1-усилитель звука включен, 0 - выключен
|2616 01110 14.50|

|000:00 110212.10| flagREM - вывод флага!!! rem 1-усилитель звука включен, 0,2 - выключен
|2616 01110 14.50|

|000:00 110212.10| вывод напряжения АСС
|2616 01110 14.50|

2 строка

|000:00 110212.10|
|2616 01110 14.50| вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)

|000:00 110212.10|
|2616 01110 14.50| STARTUEM - Стартует ли авто ( крутим ли стартером) 0- не крутим, 1 - крутим.

|000:00 110212.10|
|2616 01110 14.50| OTG - вывод флага OTG

|000:00 110212.10|
|2616 01110 14.50| HUB - вывод флага HUB

|000:00 110212.10|
|2616 01110 14.50| вывод флага FIVE_Volt_OUT_na_POGO_or_USB ((ПРИЗНАК ЗАРЯДКИ или зарядка на юсб))

|000:00 110212.10|
|2616 01110 14.50| вывод флага flagHALL 1-экран включен, 0 - выключен

|000:00 110212.10|
|2616 01110 14.50| вывод напряжения АКБ



Cледующая часть


Часовой пояс GMT +4, время: 09:46.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot