PDA

Просмотр полной версии : Блок питания NEXUS7-2012,2013 (или любого другого планшета)


Страницы : 1 2 3 [4] 5 6

oleg707
11.01.2017, 22:37
можно разъяснить почему так?

я тебе уже писал вроде. Так сделано на 3й версии блока. У меня есть проблема с морганием иногда экрана при выключении зажигания. И непонятно, что это: блок, прошивка, софт.
Кстати, в 51 версии на этой линии сделана грубая ошибка: 12 в через 2 резистора попадают на ногу процессора. Так что щас удалю :secret:

morzik45
12.01.2017, 09:55
я тебе уже писал вроде. Так сделано на 3й версии блока. У меня есть проблема с морганием иногда экрана при выключении зажигания. И непонятно, что это: блок, прошивка, софт.
Кстати, в 51 версии на этой линии сделана грубая ошибка: 12 в через 2 резистора попадают на ногу процессора. Так что щас удалю :secret:

И ещё вопрос(заранее извиняюсь за глупость и если не в тему), можно ли при вашей схеме ардуину подключить к хабу? ведь там отрезаны только 5V, а RX и TX на месте, прокинуть их с ардуины на планшет... то есть по идее планшет будет общаться с ардуиной... и можно будет перепрошивать блок питания, и даже вносить какие нить мелкие правки в скетч, прямо на коленке через Nexus7 предварительно скинув на него прошивку, чем нить например таким (http://www.arduinodroid.info/) (блок питания будет замурован в консоли за планшетом, и разбирать пол салона в будущем чтобы исправить какой нить баг или увеличить тайминг на отключения(к примеру) как то не хочется) . А так же это даст возможность прикрутить через эту же ардуину энкодер для управления громкостью планшеты, на подобии вот так (http://dixom.ru/instruktsii-i-uroki/media-enkoder-na-arduino-micro) (ну уж привык я регулировать громкость крутилкой на магнитоле, для меня это критично, на руле кнопок нет, а каждый раз тыкать в сенсер пытаясь попасть в нужное место при наших "хороших" дорогах...).

ps. ссылка на ваш Youtube канал в шапке - пустая

morzik45
12.01.2017, 11:06
http://pccar.ru/showpost.php?p=359629&postcount=375
для 49ой печатки добавить еще один диод и две SMD резистора 223


Вот спасибо за то что тыкнул носом, очень помогло, поизучал новую печатку и ваш список, нашёл изменения:

Изменились:
С3 – было 2200мкф стало 3300мкФ 10В
С4 – было 1000мкф стало 3300мкФ 10В
С7 – было 220мкФ стало 220- 470мкф 16В
R16 – было СМД 2кОм (202) стало СМД 10кОм (103)
R14 — было СМД 470кОм (474) стало СМД 10кОм (103)
R15 — было СМД 10кОм (103) стало (пусто, но как я понимаю так и осталось?)
Rxверх — было СМД 220кОм (224) 2шт стало СМД 120 кОм (124) 1шт

Добавились: R19, R20 – СМД 22кОм (223)
D10 – СМД диод

Просьба вас или автора подтвердить или опровергнуть мои наблюдения. Многое теперь стало понятно, но ещё прошу немного пояснений по поводу U4...

oleg707
12.01.2017, 13:33
R 19 20 - от 1 до 30К - это подтяжка на I2C шину. По заводу 4,3К.
R15 - 103 - Возможно, надо подбирать в связи с изменением Rx2,2верх, что повлекло увеличение питания батареи планшета ( вроде до 4,0В)
Кондёры по возможности подбирать с LOW ESR.

Az0m@
12.01.2017, 15:40
И ещё вопрос(заранее извиняюсь за глупость и если не в тему), можно ли при вашей схеме ардуину подключить к хабу? ведь там отрезаны только 5V, а RX и TX на месте, прокинуть их с ардуины на планшет...
по сути можно, но при этом надо иметь ввиду чтобы не подавать на ардуинку по УСБ +5в от хаба... либо в ардуинке отрезать питание стаба от УСБ..

P.S. Олег не любитель универсальности :pleasantry: то есть данный контроллер отвечает за работу БП и только... за другие плюшки отдельный контроллер должен быть -)))

oleg707
12.01.2017, 19:42
И ещё вопрос(заранее извиняюсь за глупость и если не в тему), можно ли при вашей схеме ардуину подключить к хабу? ведь там отрезаны только 5V, а RX и TX на месте, прокинуть их с ардуины на планшет... то есть по идее планшет будет общаться с ардуиной... и можно будет перепрошивать блок питания, и даже вносить какие нить мелкие правки в скетч, прямо на коленке через Nexus7

НЕЛЬЗЯ.
Блок прошивать только на столе в снятом состоянии!


прикрутить через эту же ардуину энкодер для управления громкостью
Вам сюда (http://pccar.ru/showthread.php?t=24440)

morzik45
12.01.2017, 19:43
НЕЛЬЗЯ.
Блок прошивать только на столе в снятом состоянии!

До меня уже дошло что прошивать БП напрямую с питаемого им планшета (при учёте что БП является для него единственным источником питания) - не самая гениальная идея :blush:

oleg707
15.01.2017, 18:00
в версии T04 добавлена поддержка дисплея SSD1306 128*64 (https://duino.ru/OLED-displei-0-96---128h64--belyi.html) Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master

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


http://www.youtube.com/watch?v=FPD0_ztjzNE
https://youtu.be/FPD0_ztjzNE

byte ver =06;// ( чем больше цифра, тем новее)
// дата правки 16.1.17.1500

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 252)
//ТЕСТОВАЯ! пока норм.
// скетч проверен и записан на версии ардуино IDE 1,6,12 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/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
/* _
хотелки
strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
переделать логику выключения - нужно сначала выключать экран, а потом звуковую карту - для таскера ,чтобы на паузу ставил плеер при тушении экрана.
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, c версии 63 включительно поменяна библиотека вывода на экран. НОВАЯ ВЗЯТА https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше 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 ( тушим экран и выключаем усилок)
__________________________________________________ ______________

потребление блока по 12 вольтам, без планшета - при 10В +30 и +15 включены - 0,02 А
- при 12В +30 и +15 включены - 0,092-0,1 А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает */


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

uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;

//************************************************** ************************************************** ***********************************************

#include <Wire.h> // для экрана - I2C шина
#include <LiquidCrystal_I2C.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 дисплей



LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например

//LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347

float UakbONorOFF = 12.1;// в 258 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.4;//11.1 // напряжение порога сработки асс

/*ноги ардуины*/
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 = 10; /*управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или 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

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

/*логические переменные, используемые в коде*/
boolean flagACC = 0; /*признак включенного зажигания*/
byte flagAKB = 0; /* признак заряженной батареи*/
byte flagREM = 0; /* признак включенного выхода на усилитель звука (REM) 0 1 2*/
boolean flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long pauseTimeHALL = 140000; /* время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин*/
int timeAfterACC = 5000; /* время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg*/
unsigned long TimerREM = 0; /* отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long timeBeforeRemOff = 1800000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
//unsigned long timeBeforeRemOff = 180000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
unsigned long TIMER = millis();
int H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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 (SLEEP == 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 (OTG == 1) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

// PORTDregistr - обрабатывем регистры порта D атмеги

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 (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 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 ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~



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


wdt_disable(); //Отключение таймера watchdog
Serial.begin(250000);
//lcd.begin(16, 2); для newE
lcd.init(); /* initialize the lcd занимает почти секунду для 0x27*/
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины

DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; /* PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);




// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

void IntToCharI(int num, char *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 num, char *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 num, char *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 num, char *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 num, char *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 loop()
{

long Uacc = 0; //Читаем напругу с делителя ACC R4-R5 и вычисляем среднее арифметическое
long Uakb = 0; ////Читаем напругу с делителя R2-R3 и вычисляем среднее арифметическое
for (int i=0; i<100; ++i)
{ // делаем 20 замеров. 1000 замеров = примерно секунда.
Uacc = Uacc + analogRead(A0); // замер для 5й версии
Uakb = Uakb + analogRead(A1); // замер для 5й версии
//Uacc = Uacc + analogRead(A1); // замер для 4й версии
//Uakb = Uakb + analogRead(A0); // замер для 4й версии
}
Uacc = Uacc/100;
Uakb = Uakb/100;







float U_acc_real = 0.0 + Uacc * 0.01537;/*(5 / 1023.0 * 3.136); Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления) 0.2-падение на диоде*/
float U_akb_real = Uakb * 0.015330;/*(5 / 1023.0 * 3.145); Вычисляем реальное напряжение +30 на входе делителя (A1)*/
//float Utest = 18.79;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( (millis() > pauseTimeHALL && flagHALL == 0 )|| ((millis() > 15000) && flagACC == 1))
{flagHALL = 1;} /*проверка отсчета при холодном старте при включении и сразу выключении ACC*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 2000;} /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 6000;} /* 5000 0 - заводим машину (стартуем).*/
if (U_akb_real >= 15.5){timeAfterACC = 0;}
// ввести новую переменную int starting_mode = 1;//стартуем 0 = не_стартуем.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


// ------------========================== блок ACC ========================-----------------------------------------------------------------------------


// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((15.5 > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
//lcd.clear(); //очистка экрана не нужна со строковым выводом
}


if (flagACC ==1 )
{// если flagACC == 1

if (millis() - pauseTimeACC >= 1100 ) /* пауза 1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на Y-OTG (включается звуковая карта) // тестово, для более устойчивого определения перифирии.*/
II_KIW_pin_POGO = 1; //digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
HUB =1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб*/
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета (in2) = этим подаём 12В на KIW3312s. На 1м канале КИВ сразу появляется напряжение (3,8-4,2 - как настроено)*/

}


if (millis() - pauseTimeACC >= 1500 )/*через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)*/
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}

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

}

}// если flagACC == 1


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

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



//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------

if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 5c или 0.5c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (1500+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (1800+timeAfterACC)) )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
}

if ( ((millis() - pauseTimeACC) >= (5000+timeAfterACC)) )
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
}
}// if (flagACC==0)


// -------------------------========================= блок АКБ ==========================-------------------------------------------------------------------------------


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

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

if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >15.5))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = 11.9;
//lcd.clear(); //очистка экрана
}

if ((millis() - pauseTimeAKB >= 20000) && flagAKB == 0) /* если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)*/
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается*/
//delay (5000); /* задержка для аппаратного выключения*/
}

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

if ((millis() - pauseTimeAKB) >= 172800000 && flagAKB == 1) /* если давно выключили ACC ) (2суток = 172800000)) (самозапитка для регистратора)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (3000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



/*
//******************************************отслежив ания аварийной ситуации ITS716G (превышение по току по выходам out1-4)************************************************ ************************************************** ************************************************** ****************************


//*отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//*отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"

if(SAMOZAPITKA==1 || PlanshBAT ==1 ||REM==1 || REGISTRATOR ==1) // если проц включал любой канал ITS
{


STATEpinI = digitalRead(5); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
STATEpinII = digitalRead(8);
if(STATEpinI == 0) { // и если пин защиты STATEpinI показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты STATEpinII показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI();delay(493); LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
}

//************************************************** ************************************************** ************************************************** ************************************************** ******************
*/

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

ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}




// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;

//_____________________________________________СООБЩ ЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________

H = (millis()/3600000);
M = ((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 + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)


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



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



//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________
//>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>

//вывод на 2хстрочный дисплей LCM 1602 с I2C ( на базе расширителя портов PCF8574)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Serial.print("strokaI = "); Serial.println(strokaI);
lcd.setCursor(0, 0);
lcd.print(strokaI);

Serial.print("strokaII = "); Serial.println(strokaII);
lcd.setCursor(0, 1); //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 из буфера на экран!
//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________









/* // _______________________________вывод состояния REM_______________________________________________ __________________________________________________ __________________________________________________ _
if ( REM == 0) {
strokaII [6] = 'o';
strokaII [7] = 'f';
strokaII [8] = 'f';
}
else
{
strokaII [6] = 'r';
strokaII [7] = 'e';
strokaII [8] = 'm';
//strokaII [9] = '.';
}
// __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ______________________________________________
*/

/* так выглядит индикация на дисплее


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


*/
//__________________________________________________ __________________________________________________ ______________________
}

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

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

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

UPRAVLENIE_PINAMI();
wdt_reset(); /*Сброс таймера watchdog*/

} /*конец цикла void loop()*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

oleg707
16.01.2017, 17:56
надо еще подробные фото блока, пока он на столе?

Graval08
16.01.2017, 19:07
Да конечно. Если можно сделайте фоток. Тоже собираю блок по вашей схеме.

oleg707
17.01.2017, 00:14
Ссылка на фото 5 версии блока.
https://mega.nz/#!ZkgCiZJR!ZjlvRsucGo9FqI-dQTKG3NgRQr7ha_T1r_Hk0Ksb2ZA

Xoma43
17.01.2017, 09:26
А у меня такой вопрос? Каким диаметром сверла делали отверстия на плате?

oleg707
17.01.2017, 12:24
А у меня такой вопрос? Каким диаметром сверла делали отверстия на плате?

под детали. 0,8 1,0 и на ATX разъём уже не помню.

Xoma43
17.01.2017, 19:15
Спасибо

oleg707
18.01.2017, 16:39
byte ver =07;// ( чем больше цифра, тем новее)
// дата правки 17.1.17.2133

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 252)
//ТЕСТОВАЯ! пока норм.
// скетч проверен и записан на версии ардуино IDE 1,6,12 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/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
/* _
хотелки
strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
переделать логику выключения - нужно сначала выключать экран, а потом звуковую карту - для таскера ,чтобы на паузу ставил плеер при тушении экрана.
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, c версии 63 включительно поменяна библиотека вывода на экран. НОВАЯ ВЗЯТА https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше 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 строка

__________________________________________________ ______________

потребление блока по 12 вольтам, без планшета - при 10В +30 и +15 включены - 0,02 А
- при 12В +30 и +15 включены - 0,092-0,1 А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает */


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

uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;

//************************************************** ************************************************** ***********************************************

#include <Wire.h> // для экрана - I2C шина
#include <LiquidCrystal_I2C.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 дисплей



LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например

//LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347

float UakbONorOFF = 12.1;// в 258 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.4;//11.1 // напряжение порога сработки асс

/*ноги ардуины*/
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 = 10; /*управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или 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

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

/*логические переменные, используемые в коде*/
boolean flagACC = 0; /*признак включенного зажигания*/
byte flagAKB = 0; /* признак заряженной батареи*/
byte flagREM = 0; /* признак включенного выхода на усилитель звука (REM) 0 1 2*/
boolean flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long pauseTimeHALL = 140000; /* время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин*/
int timeAfterACC = 5000; /* время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg*/
unsigned long TimerREM = 0; /* отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long timeBeforeRemOff = 1800000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
//unsigned long timeBeforeRemOff = 180000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
unsigned long TIMER = millis();
int H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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 (SLEEP == 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 (OTG == 1) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

// PORTDregistr - обрабатывем регистры порта D атмеги

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 (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 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 ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~



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


wdt_disable(); //Отключение таймера watchdog
//Serial.begin(250000);
//lcd.begin(16, 2); для newE

lcd.init(); /* initialize the lcd занимает почти секунду для 0x27*/
//delay(100);
//display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
//display2.clearDisplay(); // для 1306 дисплея
//display2.setTextColor(WHITE); // для 1306 дисплея
//delay(100);
// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины

DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; /* PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);




// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

void IntToCharI(int num, char *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 num, char *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 num, char *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 num, char *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 num, char *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 loop()
{while (1){//для ускорения void loop

long Uacc = 0; //Читаем напругу с делителя ACC R4-R5 и вычисляем среднее арифметическое
long Uakb = 0; ////Читаем напругу с делителя R2-R3 и вычисляем среднее арифметическое
for (int i=0; i<100; ++i)
{ // делаем 20 замеров. 1000 замеров = примерно секунда.
Uacc = Uacc + analogRead(A0); // замер для 5й версии
Uakb = Uakb + analogRead(A1); // замер для 5й версии
//Uacc = Uacc + analogRead(A1); // замер для 4й версии
//Uakb = Uakb + analogRead(A0); // замер для 4й версии
}
Uacc = Uacc/100;
Uakb = Uakb/100;







float U_acc_real = 0.0 + Uacc * 0.01537;/*(5 / 1023.0 * 3.136); Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления) 0.2-падение на диоде*/
float U_akb_real = Uakb * 0.015330;/*(5 / 1023.0 * 3.145); Вычисляем реальное напряжение +30 на входе делителя (A1)*/
//float Utest = 18.79;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( (millis() > pauseTimeHALL && flagHALL == 0 )|| ((millis() > 15000) && flagACC == 1))
{flagHALL = 1;} /*проверка отсчета при холодном старте при включении и сразу выключении ACC*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 2000;} /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 7000;} /* 5000 0 - заводим машину (стартуем).*/
if (U_akb_real >= 15.5){timeAfterACC = 0;}
// ввести новую переменную int starting_mode = 1;//стартуем 0 = не_стартуем.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


// ------------========================== блок ACC ========================-----------------------------------------------------------------------------


// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((15.5 > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
//lcd.clear(); //очистка экрана не нужна со строковым выводом
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея
}


if (flagACC ==1 )
{// если flagACC == 1

if (millis() - pauseTimeACC >= 1100 ) /* пауза 1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на Y-OTG (включается звуковая карта) // тестово, для более устойчивого определения перифирии.*/
II_KIW_pin_POGO = 1; //digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
HUB =1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб*/
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета (in2) = этим подаём 12В на KIW3312s. На 1м канале КИВ сразу появляется напряжение (3,8-4,2 - как настроено)*/
//display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
//display2.clearDisplay(); // для 1306 дисплея
//display2.setTextColor(WHITE); // для 1306 дисплея
}


if (millis() - pauseTimeACC >= 1500 )/*через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)*/
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}

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

}

}// если flagACC == 1


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

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



//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------

if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 6c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (2500+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (3000+timeAfterACC)) )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
}

if ( ((millis() - pauseTimeACC) >= (7000+timeAfterACC)) )
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
}
}// if (flagACC==0)


// -------------------------========================= блок АКБ ==========================-------------------------------------------------------------------------------


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

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

if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >15.5))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = 11.9;
//lcd.clear(); //очистка экрана
}

if ((millis() - pauseTimeAKB >= 20000) && flagAKB == 0) /* если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)*/
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается*/
//delay (5000); /* задержка для аппаратного выключения*/
}

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

if ((millis() - pauseTimeAKB) >= 172800000 && flagAKB == 1) /* если давно выключили ACC ) (2суток = 172800000)) (самозапитка для регистратора)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (3000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



/*
//******************************************отслежив ания аварийной ситуации ITS716G (превышение по току по выходам out1-4)************************************************ ************************************************** ************************************************** ****************************


//*отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//*отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"

if(SAMOZAPITKA==1 || PlanshBAT ==1 ||REM==1 || REGISTRATOR ==1) // если проц включал любой канал ITS
{


STATEpinI = digitalRead(5); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
STATEpinII = digitalRead(8);
if(STATEpinI == 0) { // и если пин защиты STATEpinI показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты STATEpinII показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI();delay(493); LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
}

//************************************************** ************************************************** ************************************************** ************************************************** ******************
*/

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

ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}




// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;

//_____________________________________________СООБЩ ЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________

H = (millis()/3600000);
M = ((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 + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)


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



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



//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________
//>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>

//вывод на 2хстрочный дисплей LCM 1602 с I2C ( на базе расширителя портов PCF8574)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//Serial.print("strokaI = "); Serial.println(strokaI);
lcd.setCursor(0, 0);
lcd.print(strokaI);

//Serial.print("strokaII = "); Serial.println(strokaII);
lcd.setCursor(0, 1); //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 из буфера на экран!
//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________









/* // _______________________________вывод состояния REM_______________________________________________ __________________________________________________ __________________________________________________ _
if ( REM == 0) {
strokaII [6] = 'o';
strokaII [7] = 'f';
strokaII [8] = 'f';
}
else
{
strokaII [6] = 'r';
strokaII [7] = 'e';
strokaII [8] = 'm';
//strokaII [9] = '.';
}
// __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ______________________________________________
*/

/* так выглядит индикация на дисплее


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


*/
//__________________________________________________ __________________________________________________ ______________________
}

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

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

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

UPRAVLENIE_PINAMI();
wdt_reset(); /*Сброс таймера watchdog*/

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





https://youtu.be/q7hpA5HYkrI

Xoma43
18.01.2017, 22:41
А можно ли конденсатор C8 заменить конденсатором SMD электролитическим? А C11 другого номинала, например 100мф или 220мф? а то не могу найти точно такие же. Заранее спасибо за ответ.

oleg707
18.01.2017, 23:08
С8 можно. с11 можно или не ставить.

Az0m@
19.01.2017, 00:33
не по теме.. но как ты запускаешь автовоспроизведение поверамп? аля таскер юзаешь?

oleg707
19.01.2017, 13:09
не по теме.. но как ты запускаешь автовоспроизведение поверамп? аля таскер юзаешь?

заюзал таскер. До этого был аутомейт ит. Ничего, но таскер мощнее.
При тушении экрана музыка ставится на паузу, при включении - плей.
Если музыка НЕ играла, по плей не жмём.

Есть одно НО. У меня при выключении зажигания может моргнуть экран. Секунд через 10. или 30... Жена сказала, что было так: выключила зажиг, всё потухло, а музыка подумала и стала через динамики планшета играть.
Сам пока не видел.

Sergey 4_4
19.01.2017, 16:12
заюзал таскер. До этого был аутомейт ит. Ничего, но таскер мощнее.
При тушении экрана музыка ставится на паузу, при включении - плей.
Если музыка НЕ играла, по плей не жмём.

Есть одно НО. У меня при выключении зажигания может моргнуть экран. Секунд через 10. или 30... Жена сказала, что было так: выключила зажиг, всё потухло, а музыка подумала и стала через динамики планшета играть.
Сам пока не видел.Смотрите внимательно созданные задачи,может где косяк есть. Torque пользуете? Он может будить планшет.

oleg707
19.01.2017, 17:55
Смотрите внимательно созданные задачи,может где косяк есть. Torque пользуете? Он может будить планшет.

так было еще до таскера. Torque нет. Сегодня день катался - отлично всё отрабатывало, тушило экран, ставило на паузу, само снимало. Будем наблюдать.

oleg707
20.01.2017, 13:12
да, кстати, забыл дописать. На 2м канале кив у меня сдох конденсатор на 3300. ( потёк электролит). Так вот, я поставил 1000. День откатался - отлично. Всё прекрасно работает.

papant
22.01.2017, 16:03
друзья! может ли кто-нить продать лишний кив и про-нано (может кто заказывал себе несколько штук и сейчас валяются без дела)? я себе заказал у китаезов в начале декабря - тишина... еще раз заказывать и ждать еще полтора месяца что-то не улыбает. с предложениями в личку

Az0m@
22.01.2017, 23:42
друзья! может ли кто-нить продать лишний кив и про-нано (может кто заказывал себе несколько штук и сейчас валяются без дела)? я себе заказал у китаезов в начале декабря - тишина... еще раз заказывать и ждать еще полтора месяца что-то не улыбает. с предложениями в личку

могу даже готовую плату подогнать -))))

P.S. есть пару свободных кивов и нано - могу подогнать. у нас в магазе их за 240 без ножек, и 290 с ножками башлаяют.

oleg707
22.01.2017, 23:51
вот кстати да, зачем про то ? Если мой блок собирать, то там только под нано порты ( управляются через РЕГИСТРЫ). Потому про спалить можно или просто работать не будет. Надо скетч править будет.

papant
23.01.2017, 14:39
Потому про спалить можно или просто работать не будет. Надо скетч править будет.
Затупил, конечно просто НАНО

Xoma43
27.01.2017, 16:09
А если планшет использовать без батареи, то в блоке питания надо что то менять?

nikopol70
27.01.2017, 17:41
а музыка подумала и стала через динамики планшета играть.

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

oleg707
27.01.2017, 19:47
А если планшет использовать без батареи, то в блоке питания надо что то менять?

нет, только просадок АКБ избегать. Мне не понравилось.

oleg707
27.01.2017, 19:50
подтверждаю - есть такое - после тушения экрана, звуковая отключается, звук идет через динамики планшета. такое проявляется не всегда, один из 5-6 раз.
с чем связано не знаю.

Уже недели 2 катаюсь на T07 версии с таскером, все стабильно работает. И это на 2м канале кондёр 1000мФ.

Xoma43
27.01.2017, 20:23
нет, только просадок АКБ избегать. Мне не понравилось.
Понятно, спасибо.

Graval08
29.01.2017, 16:57
Если использовать ваш блок с планшетом без батареи, то при отключении АСС питание планшета будет пропадать полностью - я правильно понимаю?

oleg707
29.01.2017, 17:00
Если использовать ваш блок с планшетом без батареи, то при отключении АСС питание планшета будет пропадать полностью - я правильно понимаю?

нет, через 2е суток, если не включать зажигание и норм батарея.

Graval08
29.01.2017, 17:09
нет, через 2е суток, если не включать зажигание и норм батарея.
Включаю собранный блок на столе, пока без планшета (просто проверяю).
Подключаю 12В, имитирую вкл зажигания, все включается нормально и 1 канал кив и второй. После выкл зажигания выключается выход и 1 канала кив и 2-го. Остается вкл только ардуина в дежурном режиме и потребление
как у вас 0.02А. Так должно быть? Если так откуда тогда питаться планшету если он без батареи?

oleg707
29.01.2017, 17:12
Включаю собранный блок на столе, пока без планшета (просто проверяю).
Подключаю 12В, имитирую вкл зажигания, все включается нормально и 1 канал кив и второй. После выкл зажигания выключается выход и 1 канала кив и 2-го. Остается вкл только ардуина в дежурном режиме и потребление
как у вас 0.02А. Так должно быть? Если так откуда тогда питаться планшету если он без батареи?

выведи монитор ком порта (раскомменти в скетче) или дисплей подключи. Скорее всего напряжение малое. Батарея должна оставаться на подпитке. 2й канал кива отключается ( хаб)

Graval08
29.01.2017, 17:14
выведи монитор ком порта (раскомменти в скетче) или дисплей подключи. Скорее всего напряжение малое. Батарея должна оставаться на подпитке. 2й канал кива отключается ( хаб)

Спасибо, понятно. Монитор еще не приехал, жду вот чтоб подключить.

Az0m@
29.01.2017, 19:07
Спасибо, понятно. Монитор еще не приехал, жду вот чтоб подключить.

монитор имеется ввиду терминал ком порта в arduino IDE...

Graval08
29.01.2017, 19:16
монитор имеется ввиду терминал ком порта в arduino IDE...

Не, имел в виду маленький дисплей что подключается к плате блока питания.

oleg707
29.01.2017, 19:43
а одно другому не мешает. Для отладки можно использовать ком порт.
вот T07 с включенным компортом
Serial.begin(250000); !!!!
byte ver =07;// ( чем больше цифра, тем новее)
// дата правки 17.1.17.2133

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 252)
//ТЕСТОВАЯ! пока норм.
// скетч проверен и записан на версии ардуино IDE 1,6,12 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/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
/* _
хотелки
strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
переделать логику выключения - нужно сначала выключать экран, а потом звуковую карту - для таскера ,чтобы на паузу ставил плеер при тушении экрана.
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, c версии 63 включительно поменяна библиотека вывода на экран. НОВАЯ ВЗЯТА https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше 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 строка

__________________________________________________ ______________

потребление блока по 12 вольтам, без планшета - при 10В +30 и +15 включены - 0,02 А
- при 12В +30 и +15 включены - 0,092-0,1 А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает */


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

uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;

//************************************************** ************************************************** ***********************************************

#include <Wire.h> // для экрана - I2C шина
#include <LiquidCrystal_I2C.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 дисплей



LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например

//LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347

float UakbONorOFF = 12.1;// в 258 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.4;//11.1 // напряжение порога сработки асс

/*ноги ардуины*/
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 = 10; /*управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или 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

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

/*логические переменные, используемые в коде*/
boolean flagACC = 0; /*признак включенного зажигания*/
byte flagAKB = 0; /* признак заряженной батареи*/
byte flagREM = 0; /* признак включенного выхода на усилитель звука (REM) 0 1 2*/
boolean flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long pauseTimeHALL = 140000; /* время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин*/
int timeAfterACC = 5000; /* время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg*/
unsigned long TimerREM = 0; /* отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long timeBeforeRemOff = 1800000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
//unsigned long timeBeforeRemOff = 180000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
unsigned long TIMER = millis();
int H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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 (SLEEP == 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 (OTG == 1) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

// PORTDregistr - обрабатывем регистры порта D атмеги

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 (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 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 ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~



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


wdt_disable(); //Отключение таймера watchdog
Serial.begin(250000);
//lcd.begin(16, 2); для newE

lcd.init(); /* initialize the lcd занимает почти секунду для 0x27*/
//delay(100);
//display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
//display2.clearDisplay(); // для 1306 дисплея
//display2.setTextColor(WHITE); // для 1306 дисплея
//delay(100);
// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины

DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; /* PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);




// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

void IntToCharI(int num, char *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 num, char *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 num, char *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 num, char *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 num, char *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 loop()
{while (1){//для ускорения void loop

long Uacc = 0; //Читаем напругу с делителя ACC R4-R5 и вычисляем среднее арифметическое
long Uakb = 0; ////Читаем напругу с делителя R2-R3 и вычисляем среднее арифметическое
for (int i=0; i<100; ++i)
{ // делаем 20 замеров. 1000 замеров = примерно секунда.
Uacc = Uacc + analogRead(A0); // замер для 5й версии
Uakb = Uakb + analogRead(A1); // замер для 5й версии
//Uacc = Uacc + analogRead(A1); // замер для 4й версии
//Uakb = Uakb + analogRead(A0); // замер для 4й версии
}
Uacc = Uacc/100;
Uakb = Uakb/100;







float U_acc_real = 0.0 + Uacc * 0.01537;/*(5 / 1023.0 * 3.136); Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления) 0.2-падение на диоде*/
float U_akb_real = Uakb * 0.015330;/*(5 / 1023.0 * 3.145); Вычисляем реальное напряжение +30 на входе делителя (A1)*/
//float Utest = 18.79;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( (millis() > pauseTimeHALL && flagHALL == 0 )|| ((millis() > 15000) && flagACC == 1))
{flagHALL = 1;} /*проверка отсчета при холодном старте при включении и сразу выключении ACC*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 2000;} /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 7000;} /* 5000 0 - заводим машину (стартуем).*/
if (U_akb_real >= 15.5){timeAfterACC = 0;}
// ввести новую переменную int starting_mode = 1;//стартуем 0 = не_стартуем.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


// ------------========================== блок ACC ========================-----------------------------------------------------------------------------


// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((15.5 > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
//lcd.clear(); //очистка экрана не нужна со строковым выводом
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея
}


if (flagACC ==1 )
{// если flagACC == 1

if (millis() - pauseTimeACC >= 1100 ) /* пауза 1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на Y-OTG (включается звуковая карта) // тестово, для более устойчивого определения перифирии.*/
II_KIW_pin_POGO = 1; //digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
HUB =1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб*/
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета (in2) = этим подаём 12В на KIW3312s. На 1м канале КИВ сразу появляется напряжение (3,8-4,2 - как настроено)*/
//display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
//display2.clearDisplay(); // для 1306 дисплея
//display2.setTextColor(WHITE); // для 1306 дисплея
}


if (millis() - pauseTimeACC >= 1500 )/*через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)*/
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}

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

}

}// если flagACC == 1


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

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



//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------

if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 6c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (2500+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (3000+timeAfterACC)) )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
}

if ( ((millis() - pauseTimeACC) >= (7000+timeAfterACC)) )
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
}
}// if (flagACC==0)


// -------------------------========================= блок АКБ ==========================-------------------------------------------------------------------------------


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

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

if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >15.5))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = 11.9;
//lcd.clear(); //очистка экрана
}

if ((millis() - pauseTimeAKB >= 20000) && flagAKB == 0) /* если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)*/
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается*/
//delay (5000); /* задержка для аппаратного выключения*/
}

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

if ((millis() - pauseTimeAKB) >= 172800000 && flagAKB == 1) /* если давно выключили ACC ) (2суток = 172800000)) (самозапитка для регистратора)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (3000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



/*
//******************************************отслежив ания аварийной ситуации ITS716G (превышение по току по выходам out1-4)************************************************ ************************************************** ************************************************** ****************************


//*отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//*отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"

if(SAMOZAPITKA==1 || PlanshBAT ==1 ||REM==1 || REGISTRATOR ==1) // если проц включал любой канал ITS
{


STATEpinI = digitalRead(5); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
STATEpinII = digitalRead(8);
if(STATEpinI == 0) { // и если пин защиты STATEpinI показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты STATEpinII показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI();delay(493); LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
}

//************************************************** ************************************************** ************************************************** ************************************************** ******************
*/

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

ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}




// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;

//_____________________________________________СООБЩ ЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________

H = (millis()/3600000);
M = ((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 + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)


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



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



//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________
//>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>

//вывод на 2хстрочный дисплей LCM 1602 с I2C ( на базе расширителя портов PCF8574)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Serial.print("strokaI = "); Serial.println(strokaI);
lcd.setCursor(0, 0);
lcd.print(strokaI);

Serial.print("strokaII = "); Serial.println(strokaII);
lcd.setCursor(0, 1); //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 из буфера на экран!
//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________









/* // _______________________________вывод состояния REM_______________________________________________ __________________________________________________ __________________________________________________ _
if ( REM == 0) {
strokaII [6] = 'o';
strokaII [7] = 'f';
strokaII [8] = 'f';
}
else
{
strokaII [6] = 'r';
strokaII [7] = 'e';
strokaII [8] = 'm';
//strokaII [9] = '.';
}
// __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ______________________________________________
*/

/* так выглядит индикация на дисплее


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


*/
//__________________________________________________ __________________________________________________ ______________________
}

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

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

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

UPRAVLENIE_PINAMI();
wdt_reset(); /*Сброс таймера watchdog*/

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

Graval08
29.01.2017, 20:48
Вывел монитор ком порта, на выходе блока питания выставлено ровно 12.1В
В мониторе в конце строк стоит 11.22-11.23
Оба канала кива отключаются при выкл АСС.
На ардуине после делителей, напряжение на А0=3.74В, на А1=3,71В
на VIN после 3-х диодов 11.1В
Это нормально?

oleg707
29.01.2017, 21:37
Вывел монитор ком порта, на выходе блока питания выставлено ровно 12.1В
В мониторе в конце строк стоит 11.22-11.23
Оба канала кива отключаются при выкл АСС.
На ардуине после делителей, напряжение на А0=3.74В, на А1=3,71В
на VIN после 3-х диодов 11.1В
Это нормально?

В мониторе в конце строк стоит 11.22-11.23 вот потому и вырубается. неправильно напругу видит. Это СОСВЕМ севший АКБ!
Сколько на ардуине после делителей я как то не мерял.
Можешь поменять коэфф. делителя в скетче или резаки на делителе ( что тебе проще).
Еще момент - при подключении к ЮСБ ардуины напряжение врет! Поэтому я настраивал делитель по физическому дисплею и тестеру. Напругу тестером мерять на входе в блок ( исключаем потери проводов ).

И еще... тут некоторые товарищи 3 источника +12В разных пробовали, и на всех блок не работал... такие вот *овно были источники.
Как ведет себя БП при разных условиях, можно посмотреть в видео на ютубе.

Az0m@
29.01.2017, 21:44
Вывел монитор ком порта, на выходе блока питания выставлено ровно 12.1В

а вы мультиком не пробывали проверить... возможно он врет.
ИМХО... я сколько на столе тестил платы... показания напряжения на ардуине показывали всегда реальную величину.

Graval08
29.01.2017, 22:14
Видео на ютубе пересмотрел и по нескольку раз, поэтому и спрашиваю что у вас показывает одно и тоже напряжение на блоке питания и на дисплее ардуино.
Все напряжения проверены мультиметром и на б.п. и на ардуине.
Теперь выставил на б.п. 12.5В. Светодиод на ардуине заморгал как надо, второй канал кива не выкл-ся при выкл АСС. В мониторе порта напряжение показывает 11.59. Расхождение с реальностью 0.9-1.0В. Не подскажете как в скетче поменять коэф. делителя?

oleg707
29.01.2017, 22:37
Видео на ютубе пересмотрел и по нескольку раз, поэтому и спрашиваю что у вас показывает одно и тоже напряжение на блоке питания и на дисплее ардуино.
Все напряжения проверены мультиметром и на б.п. и на ардуине.
Теперь выставил на б.п. 12.5В. Светодиод на ардуине заморгал как надо, второй канал кива не выкл-ся при выкл АСС. В мониторе порта напряжение показывает 11.59. Расхождение с реальностью 0.9-1.0В. Не подскажете как в скетче поменять коэф. делителя?

291 и 292 строки
float U_acc_real = 0.0 + Uacc * 0.01537;/*(5 / 1023.0 * 3.136); Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления) 0.2-падение на диоде*/
float U_akb_real = Uakb * 0.015330;/*(5 / 1023.0 * 3.145); Вычисляем реальное напряжение +30 на входе делителя (A1)*/

Graval08
29.01.2017, 22:48
291 и 292 строки
float U_acc_real = 0.0 + Uacc * 0.01537;/*(5 / 1023.0 * 3.136); Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления) 0.2-падение на диоде*/
float U_akb_real = Uakb * 0.015330;/*(5 / 1023.0 * 3.145); Вычисляем реальное напряжение +30 на входе делителя (A1)*/

Поднял каждый коэффициент на 0,001 и все стало как надо.
На б.п выход 12.5в
на монитор порта верхняя строка 12.40-12.39
нижняя строка 12.28
оставлю пока так, когда придет дисплей посмотрю что на нем.
Спасибо за помощь!

oleg707
29.01.2017, 22:59
Поднял каждый коэффициент на 0,001 и все стало как надо.
На б.п выход 12.5в
на монитор порта верхняя строка 12.40-12.39
нижняя строка 12.28
оставлю пока так, когда придет дисплей посмотрю что на нем.
Спасибо за помощь!

пожалуйста. Точность до 0,05 выставляй, но уже с дисплеем.

papant
31.01.2017, 00:57
Олег, подскажите плиз номинал сопротивления R15.
И не нашел на схеме R9. Написано R10 = 1кОм, если ставить R9. А куда его ставить (если надо) не нашел )

oleg707
31.01.2017, 12:30
Вроде ж всё везде подписал. Для сомневающихся выложил фотки, много фоток. Можно по ним смотреть.
Обнаружил. что несоответствуют некоторые номиналы фоткам. поправил.
46588

oleg707
31.01.2017, 17:31
Олег, подскажите плиз номинал сопротивления R15.
И не нашел на схеме R9. Написано R10 = 1кОм, если ставить R9. А куда его ставить (если надо) не нашел )

R9 вообще убрать, R10 101, добавить диод последовательно. Так стабильнее. У некоторых хаб иногда отваливался до переделки. У меня всё работало и так и по старому. Подробнее в печатке (DIP)
R15 - 202
R14 - 474

Graval08
31.01.2017, 17:56
А что за смд конденсатор у вас на фотках, на транзисторе Q1 (Y-OTG) между стоком и истоком, не нашел его на печатке?

oleg707
31.01.2017, 18:44
А что за смд конденсатор у вас на фотках, на транзисторе Q1 (Y-OTG) между стоком и истоком, не нашел его на печатке?

экперименты. даже номинала не знаю. по задумке должен стабилизировать линию ID юсб.
По идее не нужен, но не выпаиваю. Я про него вообще забыл:blush:.

oleg707
01.02.2017, 01:38
кому надо файлы и демо автопаузы и автоплея http://pccar.ru/showpost.php?p=381097&postcount=15

papant
03.02.2017, 03:15
кому надо файлы и демо автопаузы и автоплея http://pccar.ru/showpost.php?p=381097&postcount=15
что-то кажись видео не работает ...

oleg707
03.02.2017, 14:52
что-то кажись видео не работает ...

на ютуб надо идти. Вставка не работает - косяк форума.

papant
05.02.2017, 03:39
Олег, снова нужна помощь )
Как Вы уже писали ранее - штатный загрузчик у наны не имеет watchdog, для этого надо прошить загрузчик Optiboot вроде как. Хорошо, скачал, куда надо подложил.
Но имея на руках 2 ардуины нано не могу использовать одну из них как программатор. Делаю так: в одну из них (1) заливаю скетч из примеров ArduinoISP, после чего она должна стать прошивальщиком, вроде ). Беру вторую (2) нану, цепляю MISO (1) к MISO (2), MOSI (1) к MOSI (2), SCK (1) к SCK (2). Жмем Инструменты ->программатор->ArduinoISP, нажимаем Прошить загрузчик и получаем "avrdude: Error: Could not find USBtiny device (0x2341/0x49)
Ошибка при записи загрузчика". Че не так я не знаю уже, замучался гуглить. или может забить на этот watchdog? часто у вас оно там подвисало и удавалось ли определить что был перезагруз?

oleg707
05.02.2017, 14:48
Олег, снова нужна помощь )
Как Вы уже писали ранее - штатный загрузчик у наны не имеет watchdog, для этого надо прошить загрузчик Optiboot вроде как. Хорошо, скачал, куда надо подложил.
Но имея на руках 2 ардуины нано не могу использовать одну из них как программатор. Делаю так: в одну из них (1) заливаю скетч из примеров ArduinoISP, после чего она должна стать прошивальщиком, вроде ). Беру вторую (2) нану, цепляю MISO (1) к MISO (2), MOSI (1) к MOSI (2), SCK (1) к SCK (2). Жмем Инструменты ->программатор->ArduinoISP, нажимаем Прошить загрузчик и получаем "avrdude: Error: Could not find USBtiny device (0x2341/0x49)
Ошибка при записи загрузчика". Че не так я не знаю уже, замучался гуглить. или может забить на этот watchdog? часто у вас оно там подвисало и удавалось ли определить что был перезагруз?
лейте на штатный загрузчик. Через юсб.
Если через isp шить, загрузчик удаляется.
С зависаниями давно разобрался - не было подтяжки на i2c. Внутренней не хватало.
А так ни разу не зависало, если слюнявым пальцем кварц не трогать.

papant
05.02.2017, 15:25
лейте на штатный загрузчик. Через юсб.
Если через isp шить, загрузчик удаляется.
С зависаниями давно разобрался - не было подтяжки на i2c. Внутренней не хватало.
А так ни разу не зависало, если слюнявым пальцем кварц не трогать.
Тогда вырезаю нафиг ватчдог, ибо не смогаю прошить загрузчик всеравно ).
Спасибо за поддержку проекта! )

oleg707
05.02.2017, 16:25
Тогда вырезаю нафиг ватчдог, ибо не смогаю прошить загрузчик всеравно ).
Спасибо за поддержку проекта! )

не вырезай, оно и так работает (как вырезанное (https://geektimes.ru/post/255800/))!

papant
07.02.2017, 00:40
не вырезай, оно и так работает (как вырезанное (https://geektimes.ru/post/255800/))!
Да вот нифига, вчера поймал бутлуп (ватчдог так отработал из-за того что бутлоадер его не поддерживает). не знаю как так получилось, а сегодня экран перестал вообще зажигаться ((( (но зато больше бутлупов нет).

Собственно очередной вопрос:
Почему-то у меня на верхнем канале напряжение на выходе 1,1-1,2 вольта, выше не поднимается. подумал что может стабилитроны не той стороной впаял - выпаял, лучше не стало. убрал вообще сопротивление R2верх (у меня подстроечное на 200кОм) стало 0,5-1,2 вольта прыгать. блин, че не так? может я не то сопротивление выломал на КИСе? второй канал подстроил ровно на 5 вольт (подстроечник рулит) и там все норм. Посмотрите плиз на мою картинку - то ли я выломал? смущает, что в первом канале на верху зеленая шняжка верхняя осталась, ниже нее 2 черных сопротивления (нижний выломан, помечен цифрой 1). на нижнем канале у меня выломана именно зеленая шняжка (помечена цифрой 2) и ниже нее 2 сопротивления остались. внимание вопрос - то ли я выломал на верхнем канале? )
http://s8.hostingkartinok.com/uploads/thumbs/2017/02/f0b90db984eb5c971d4637f0154f90e0.png (http://hostingkartinok.com/show-image.php?id=f0b90db984eb5c971d4637f0154f90e0)

oleg707
07.02.2017, 00:49
Да вот нифига, вчера поймал бутлуп (ватчдог так отработал из-за того что бутлоадер его не поддерживает). не знаю как так получилось, а сегодня экран перестал вообще зажигаться ((( (но зато больше бутлупов нет).

Собственно очередной вопрос:
Почему-то у меня на верхнем канале напряжение на выходе 1,1-1,2 вольта, выше не поднимается. подумал что может стабилитроны не той стороной впаял - выпаял, лучше не стало. убрал вообще сопротивление R2верх (у меня подстроечное на 200кОм) стало 0,5-1,2 вольта прыгать. блин, че не так? может я не то сопротивление выломал на КИСе? второй канал подстроил ровно на 5 вольт (подстроечник рулит) и там все норм. Посмотрите плиз на мою картинку - то ли я выломал? смущает, что в первом канале на верху зеленая шняжка верхняя осталась, ниже нее 2 черных сопротивления (нижний выломан, помечен цифрой 1). на нижнем канале у меня выломана именно зеленая шняжка (помечена цифрой 2) и ниже нее 2 сопротивления остались. внимание вопрос - то ли я выломал на верхнем канале? )
http://s8.hostingkartinok.com/uploads/thumbs/2017/02/f0b90db984eb5c971d4637f0154f90e0.png (http://hostingkartinok.com/show-image.php?id=f0b90db984eb5c971d4637f0154f90e0)

выломал то. (фотки ж есть вроде)
Я шью isp, соответственно проблем с загрузчиком не имею.
На дисплей вся инфа ОБЯЗАНА выводится! Даже без кива!
При этом светодиод на ардуине должен внятно моргать - посмотрите на видео.
Если на кив пришло питание и управление на ss\sd1,2 (3,3В) то киву хана. менять. Еще кондёры по выходу кива проверить.
R2верх убирать нельзя - микруха будет накачивать дросселя до одурения - то есть до напряжения питания. Что чревато пробоем стабилитрона 5V1 на плате кива.

papant
07.02.2017, 01:30
выломал то. (фотки ж есть вроде)
Если на кив пришло питание и управление на ss\sd1,2 (3,3В) то киву хана. менять. Еще кондёры по выходу кива проверить.
R2верх убирать нельзя - микруха будет накачивать дросселя до одурения - то есть до напряжения питания. Что чревато пробоем стабилитрона 5V1 на плате кива.
что-то не очень понял - что имеете в виду под "Если на кив пришло питание и управление на ss\sd1,2 (3,3В) то киву хана."? Я так понял эту фразу: на вход кива пришло 12 вольт. даем питание на сс1 или сс2 - и все, КИВ в металолом? А как же тогда управлять каналами 1 и 2 если не через сс1 и сс2? я так думал что когда на них 0, то каналы закрыты, когда единица (или питания нет) - открыты

oleg707
07.02.2017, 12:07
что-то не очень понял - что имеете в виду под "Если на кив пришло питание и управление на ss\sd1,2 (3,3В) то киву хана."? Я так понял эту фразу: на вход кива пришло 12 вольт. даем питание на сс1 или сс2 - и все, КИВ в металолом? А как же тогда управлять каналами 1 и 2 если не через сс1 и сс2? я так думал что когда на них 0, то каналы закрыты, когда единица (или питания нет) - открыты

когда на них 0, то каналы закрыты.
когда на них 3,3В (опорка), то каналы открыты.
в первом канале в любом случае управляющий отключен, поэтому если на втором есть 5В, то на первом тоже обязано быть напряжение.
Прозвони тестером + и - на 1 канале. Не должно быть замыкания ( бывает кондёры коротят, особенно танталовые) или стабилитрон запаял не той стороной. При этом кив сильно греется. Еще могло выбить смд резистор 0ом на киве.

papant
07.02.2017, 21:20
когда на них 0, то каналы закрыты.
когда на них 3,3В (опорка), то каналы открыты.
в первом канале в любом случае управляющий отключен, поэтому если на втором есть 5В, то на первом тоже обязано быть напряжение.

Ничего не понял. Если они притянуты к нулю - то каналы закрыты. кстати, по принципиальной схеме у вас второй канал подтянут к нулю через сопротивление 1 кОм, а включается через сопротивление 10кОм, типа делитель получается, при этом я так понимаю на ноге включения второго канала получалось бы 0,5В. Однако на монтажной плате у вас подтяжки к нулю нету, только со 2 ноги ардуины через 10кОм идет управление на сс2 (сейчас у вас там еще диод стоит). Я немного доработал вашу схему и сс1 включаю ногой ардуины, так же через сопротивление и диод, по идее никакой разницы я не вижу между каналами и все должно бы работать. Но оно не работает. Проверю вечером как вы сказали на предмет короткого между + и -. Но так и не дошел до меня смысл фразы "Если на кив пришло питание и управление на ss\sd1,2 (3,3В) то киву хана." В каком случае издохнет КИВ хотелось бы понять, у меня их не так много осталось )? на сс входах не должно быть больше 3,3? или 5? Дак у меня там и не бывает больше 5 - оно ж диджиталврайт с ардуины, там максимум 5В

oleg707
07.02.2017, 21:42
Ничего не понял. Если они притянуты к нулю - то каналы закрыты. кстати, по принципиальной схеме у вас второй канал подтянут к нулю через сопротивление 1 кОм, а включается через сопротивление 10кОм, типа делитель получается, при этом я так понимаю на ноге включения второго канала получалось бы 0,5В. Однако на монтажной плате у вас подтяжки к нулю нету, только со 2 ноги ардуины через 10кОм идет управление на сс2 (сейчас у вас там еще диод стоит). Я немного доработал вашу схему и сс1 включаю ногой ардуины, так же через сопротивление и диод, по идее никакой разницы я не вижу между каналами и все должно бы работать. Но оно не работает. Проверю вечером как вы сказали на предмет короткого между + и -. Но так и не дошел до меня смысл фразы "Если на кив пришло питание и управление на ss\sd1,2 (3,3В) то киву хана." В каком случае издохнет КИВ хотелось бы понять, у меня их не так много осталось )? на сс входах не должно быть больше 3,3? или 5? Дак у меня там и не бывает больше 5 - оно ж диджиталврайт с ардуины, там максимум 5В
так, по порядку.
1 - берём последнюю схему (49 или 50), по ней работаем и разговариваем.
2 - отпаиваем все резисторы от SS\SD1и2 ( оставляем их в воздухе)
3 - подаём питание на КИВ +12В (напрямую или управляя ардуиной через ITS)
4 - кив ДОЛЖЕН выдать на выходе напряжения! Без переделки 1,2В и 3,3В ( вроде), с переделкой - 5,0 и 3,8-4,0 ( в зависимости от резисторов настройки).
5 - на блоке питания, с которого вы берёте +12В ограничить ток 0,2А ( если блок умеет ограничивать максимальный ток)
6 - Весь БП в сборе потребляет сам 0,1А, не больше.


сс1 включаю ногой ардуины
а зачем? 1 канал включится автоматически, когда на кив придёт +12В с ITS 716G, а уже ITSом управляет ардуина. То есть вы 2 раза включаете сигнал на батарею? :blink2:

papant
07.02.2017, 22:02
а зачем? 1 канал включится автоматически, когда на кив придёт +12В с ITS 716G, а уже ITSом управляет ардуина. То есть вы 2 раза включаете сигнал на батарею? :blink2:
Ну я писал, что у меня немного допиленный Ваш БП, например обработка кнопок руля, температура радиатора усилителя регулируется ардуиной с кулером, камера заднего вида (реле).
Нога сс1 управляется отдельно в виду того, что немного хочу поменять логику работы - не снятие с охраны будит всю систему, а сработка охраны должна пробудить лишь регистратор (на 3-5 минут) без пробуждения планшета в машине, чтоб не привлекать и так лишнее внимание.
Итак, вернемся к нашим баранам: канал КИВа тушится при подтягивании сс1/2 к земле, просыпается при подаче туда 5В? тут все норм я понял? Будем считать что издохший КИВ у меня образовался случайно, и не издохнет следующий. Напряжение на входе выше 12В не подавал, нагрузка на выходе в виде кондеров есть - почему труп не ясно...

oleg707
07.02.2017, 22:31
Ну я писал, что у меня немного допиленный Ваш БП, например обработка кнопок руля, температура радиатора усилителя регулируется ардуиной с кулером, камера заднего вида (реле).
Нога сс1 управляется отдельно в виду того, что немного хочу поменять логику работы - не снятие с охраны будит всю систему, а сработка охраны должна пробудить лишь регистратор (на 3-5 минут) без пробуждения планшета в машине, чтоб не привлекать и так лишнее внимание.
Итак, вернемся к нашим баранам: канал КИВа тушится при подтягивании сс1/2 к земле, просыпается при подаче туда 5В? тут все норм я понял? Будем считать что издохший КИВ у меня образовался случайно, и не издохнет следующий. Напряжение на входе выше 12В не подавал, нагрузка на выходе в виде кондеров есть - почему труп не ясно...

канал КИВа тушится при подтягивании сс1/2 к земле, просыпается при убирании земли. ВСЁ.
сработка охраны должна пробудить лишь регистратор (на 3-5 минут)
хм, это мысль. У меня рег планировалось держать сутки включённым.
Если подойти с другого боку, то рег включается через ITS. То есть можно без аппаратной переделки поменять скетч.
Подключать на +12в ЦЗ (вход). (19пин) сигнал аварийки.
То есть - сработка охраны - включили регистратор ( если напруга не ниже 10В).
Если зажигание включено продолжительно долго ( больше 5-10с), то выполняем цикл загрузки планшета.

papant
07.02.2017, 23:10
канал КИВа тушится при подтягивании сс1/2 к земле, просыпается при убирании земли. ВСЁ.

Да я это понял, и уже несколько сообщений назад ). Как подтянуть понятно - digitalwrite (pin,0). А как убрать землю? я знаю только digitalwrite (pin,1) - но это не убирание земли, а подача 5 вольт. или это одно и то же?

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

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

papant
07.02.2017, 23:13
Подключать на +12в ЦЗ (вход). (19пин) сигнал аварийки.
То есть - сработка охраны - включили регистратор ( если напруга не ниже 10В)
Писать регистратор при сработке сигналки считаю полезнее, чем разряженный аккум по утру, поэтому писать в любом случае, хоть если там даже 7В осталось ). Да и не высадит рег за 3-5 минут аккум, пусть и дохлый

oleg707
08.02.2017, 00:12
Да я это понял, и уже несколько сообщений назад ). Как подтянуть понятно - digitalwrite (pin,0). А как убрать землю? я знаю только digitalwrite (pin,1) - но это не убирание земли, а подача 5 вольт. или это одно и то же?

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

А как убрать землю? я знаю только digitalwrite (pin,1) - но это не убирание земли, а подача 5 вольт. или это одно и то же?
ну так а диод зачем ;-) ?
digitalwrite (pin,1) будет работать

а по вашей методе тогда просыпался бы еще планшет (сс1 то к земле не подтянут)
Что мешает включить сначала рег, а потом, секунд через 10 планшет? Схему переделывать не надо. Оно и так будет работать.
Можно это вывести на включение рега, а запуск планшета включить позже, с проверкой зажигания секунд на 5 постоянных.
if (millis() - pauseTimeACC >= 1500 )/*через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)*/
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
}
вот когда поставлю рег в машину, тогда и буду обкатывать на практике.
кстати, какой скетч взят за основу? а то в последних версиях много чего изменено ( некоторое кардинально).

oleg707
08.02.2017, 00:14
Писать регистратор при сработке сигналки считаю полезнее, чем разряженный аккум по утру, поэтому писать в любом случае, хоть если там даже 7В осталось ). Да и не высадит рег за 3-5 минут аккум, пусть и дохлый

ниже 7,7 вольт блок не работает :big:
( хотя рег может и запустит, хз, надо пробовать. Тут вопрос, запустится ли рег :big:)

papant
08.02.2017, 00:34
ну так а диод зачем ;-) ?
digitalwrite (pin,1) будет работать

а я откуда знаю? ). в моем понятии диод - это нипель "туда дуй - обратно х@й", ну или на крайняк как я тут выяснил в Вашей схеме можно пользовать P-N переход для падения напруги на 0.7В. Так что зачем нужен диод мне не ясно, вот сопротивление ясно ).

Что мешает включить сначала рег, а потом, секунд через 10 планшет?
Схему переделывать не надо. Оно и так будет работать.
Можно это вывести на включение рега, а запуск планшета включить позже, с проверкой зажигания секунд на 5 постоянных.
[PHP] if (millis() - pauseTimeACC >= 1500 )/*через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)*/

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

вот когда поставлю рег в машину, тогда и буду обкатывать на практике.
кстати, какой скетч взят за основу? а то в последних версиях много чего изменено ( некоторое кардинально).
за основу (если можно так сказать) взята версия t03 вроде, хотя все управление ардуиной с3,14зжено с версии 47 (вроде), где все управлялось не регистрами, а digitalwrite-ами и прочим, ибо я пользую выводы А6 и А7, а они к сожалению регистрами не рулятся (
Да и свою логику тоже добавляю по работе с серийным портом, кнопками руля. в своем предыдущем блоке питания делал назначение одной из кнопок руля (при длительном нажатии кнопки положить трубку) - отложить выключение системы на то кол-во минут, на сколько секунд перед выключением зажигания я удерживал кнопку. например в машине дети остались и чтоб не оставлять ключ - жму кнопку 5 сек и потом спокойно достаю ключ и ухожу, система при этом играет 5 минут. за это время я уже например вернулся, сунул ключ, завелся и поехал - при этом планшет продолжал играть

oleg707
08.02.2017, 00:46
а я откуда знаю? ). в моем понятии диод - это нипель "туда дуй - обратно х@й", ну или на крайняк как я тут выяснил в Вашей схеме можно пользовать P-N переход для падения напруги на 0.7В. Так что зачем нужен диод мне не ясно, вот сопротивление ясно ).

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

за основу (если можно так сказать) взята версия t03 вроде, хотя все управление ардуиной с3,14зжено с версии 47 (вроде), где все управлялось не регистрами, а digitalwrite-ами и прочим, ибо я пользую выводы А6 и А7, а они к сожалению регистрами не рулятся (
Да и свою логику тоже добавляю по работе с серийным портом, кнопками руля. в своем предыдущем блоке питания делал назначение одной из кнопок руля (при длительном нажатии кнопки положить трубку) - отложить выключение системы на то кол-во минут, на сколько секунд перед выключением зажигания я удерживал кнопку. например в машине дети остались и чтоб не оставлять ключ - жму кнопку 5 сек и потом спокойно достаю ключ и ухожу, система при этом играет 5 минут. за это время я уже например вернулся, сунул ключ, завелся и поехал - при этом планшет продолжал играть
диод не пускает плюс с проца на ss\sd2
детей нефиг в машине оставлять без присмотра. Неинтуитивнопонятный интерфейс. Нафиг.
что для включения Rem нужно включение KIWа
неа, не угадал. Даже рядом не стояло. Вот тебе задачка: "Разберись, как ардуина включается при первичной подаче питания.:be: "
Подсказка: кив не участвует. Совсем. иначе блок бы жрал в простое, как мамонт.

papant
08.02.2017, 01:13
диод не пускает плюс с проца на ss\sd2
Ах ты хитрый сукин сын! )

неа, не угадал. Даже рядом не стояло. Вот тебе задачка: "Разберись, как ардуина включается при первичной подаче питания.:be: "
Подсказка: кив не участвует. Совсем. иначе блок бы жрал в простое, как мамонт.
ну тут вроде ясна - с делителя на микруху 4 вход - там с выхода 4-го через 3 диода на арудину, она заводица и все

oleg707
08.02.2017, 01:22
ну тут вроде ясна - с делителя на микруху 4 вход - там с выхода 4-го через 3 диода на арудину, она заводица и все

да. А потом проц, включившись, включает самозапитку, подав на этот же пин лог1 (+5В).
По тому же принципу (http://www.infineon.com/dgdl/Infineon-ITS716G-DS-v01_01-en.pdf?fileId=db3a304412b407950112b428c2cf3e6d) включается видеорегистратор и REM. Подали 1 - ITS включила канал.
Так при чём тут кив? :smile1:

papant
08.02.2017, 01:42
По тому же принципу (http://www.infineon.com/dgdl/Infineon-ITS716G-DS-v01_01-en.pdf?fileId=db3a304412b407950112b428c2cf3e6d) включается видеорегистратор и REM. Подали 1 - ITS включила канал. Так при чём тут кив? :smile1:
Дак ответ тут один - как обычна, затупил )

papant
09.02.2017, 14:03
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен

А у вас точно эта нога арудины управляет питанием хаба? тут или коммент кривой или название переменной (на мой взгляд), ибо вроде как этот пин отвечает за +5 В на ПОГО-пине

boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
Тут тоже не правильное описание, ведь это включение 2-го канала КИВа, который включает хаб. Короче эти 2 переменные надо местами поменять, кажись )

oleg707
09.02.2017, 15:19
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен

А у вас точно эта нога арудины управляет питанием хаба? тут или коммент кривой или название переменной (на мой взгляд), ибо вроде как этот пин отвечает за +5 В на ПОГО-пине

boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
Тут тоже не правильное описание, ведь это включение 2-го канала КИВа, который включает хаб. Короче эти 2 переменные надо местами поменять, кажись )

сначала включается 2 кив (II_KIW_pin_POGO). С 2 кива питание идёт на пого ( или юсб) для признака зарядки. Нужно для автозапуска планшета.

Потом открываем полевик и пропускаем питание +5 с 2кива на хаб ( HUB ).


А вот в описании подключения есть ошибка.
POGO и HUB надо поменять местами. Тогда и скетч правильно читается, и схема.
46684
46685
В скетче это делается одновременно, так что физически разницы НЕТ.

plus88
09.02.2017, 15:34
Собираю новый БП. с ардуиной. и чет запутался... пока есть вот такая схема и вот такой скетч.

http://pccar.ru/attachment.php?attachmentid=46686&stc=1&d=1486640003


//Кнопка для д.Холла и выключение блока питания хаба D12
int powerbutton = 12;
//
int sleepButton = 11;
int powerButtonHub = 7;
int sleepControl = 10;
int powerControl = 9;
int powerControlHub = 11;

boolean lastButton = LOW;
boolean currentButton = LOW;
boolean lastpowerButton = LOW;
boolean currentpowerButton = LOW;

boolean powerHubOn = false;
boolean powerOn = false;
void setup() {
// put your setup code here, to run once:

pinMode(powerbutton, INPUT);
pinMode(sleepButton, INPUT);
pinMode(powerButtonHub, INPUT);
pinMode(sleepControl, OUTPUT);
pinMode(powerControl, OUTPUT);
pinMode(powerControlHub, OUTPUT);
}
boolean debounce(boolean last)
{
boolean current = digitalRead(powerbutton);
if (last != current)
{
delay(5);
current = digitalRead(powerbutton);
}
return current;
}

boolean debouncepower(boolean lastpower)
{
boolean currentpower = digitalRead(powerbutton);
if (lastpower != currentpower)
{
delay(5);
currentpower = digitalRead(powerbutton);
}
return currentpower;
}


void loop() {
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
powerHubOn = !powerHubOn;
}
lastButton = currentButton;
digitalWrite(powerControlHub, powerHubOn);
digitalWrite(sleepControl, powerHubOn);




//Упрвление питанием планшета
currentpowerButton = debounce(lastpowerButton);
if (lastpowerButton == LOW && currentpowerButton == HIGH)
{
powerOn = !powerOn;
}
lastpowerButton = currentpowerButton;
digitalWrite(powerControl, powerOn);
}


Прошу посмотреть и указать на ошибки. Спасибо

oleg707
09.02.2017, 15:49
Собираю новый БП. с ардуиной. и чет запутался... пока есть вот такая схема и вот такой скетч.

http://pccar.ru/attachment.php?attachmentid=46686&stc=1&d=1486640003


//Кнопка для д.Холла и выключение блока питания хаба D12
int powerbutton = 12;
//
int sleepButton = 11;
int powerButtonHub = 7;
int sleepControl = 10;
int powerControl = 9;
int powerControlHub = 11;

boolean lastButton = LOW;
boolean currentButton = LOW;
boolean lastpowerButton = LOW;
boolean currentpowerButton = LOW;

boolean powerHubOn = false;
boolean powerOn = false;
void setup() {
// put your setup code here, to run once:

pinMode(powerbutton, INPUT);
pinMode(sleepButton, INPUT);
pinMode(powerButtonHub, INPUT);
pinMode(sleepControl, OUTPUT);
pinMode(powerControl, OUTPUT);
pinMode(powerControlHub, OUTPUT);
}
boolean debounce(boolean last)
{
boolean current = digitalRead(powerbutton);
if (last != current)
{
delay(5);
current = digitalRead(powerbutton);
}
return current;
}

boolean debouncepower(boolean lastpower)
{
boolean currentpower = digitalRead(powerbutton);
if (lastpower != currentpower)
{
delay(5);
currentpower = digitalRead(powerbutton);
}
return currentpower;
}


void loop() {
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
powerHubOn = !powerHubOn;
}
lastButton = currentButton;
digitalWrite(powerControlHub, powerHubOn);
digitalWrite(sleepControl, powerHubOn);




//Упрвление питанием планшета
currentpowerButton = debounce(lastpowerButton);
if (lastpowerButton == LOW && currentpowerButton == HIGH)
{
powerOn = !powerOn;
}
lastpowerButton = currentpowerButton;
digitalWrite(powerControl, powerOn);
}


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

plus88
09.02.2017, 16:25
Вот поправил плату и схему.

plus88
09.02.2017, 16:33
Значит общиц принцип такой. к + 12 подключаем 7805 LM2596. Обвязываем 7805 кондерами, не знаю зачем в схемах выглядит именно так. С 7805 питание приобразуем в 5V и подаем на вход ардуино (+5). К ногам ардуины D11 и D12 подключаем кнопки через стягивающие резисторы. К ногам D9 и D 8 подключаем 5 пин с плат LM2596C(On/OFF). К пину D10 подключем реле NRP05 вторую ногу реле кидаем на минус. С другой стороны кидаем ногу на минус и на датчик холла планшета. (по идее две ноги земли можно замкнуть). ACC подаем на вторую LM2596 на схеме её нет, будет прикручена с верху. пин D8 подается на ее пятую ногу (On-Off).
Вроде ничего не забыл....

oleg707
09.02.2017, 17:02
нууу... это не схема, это рисунок. Красиво, но ничего не понятно.
Реле нельзя напрямую к ногам ардуины подключать. ( макс ток по ноге 100мА)
Кнопки то зачем?! рисуй схему
7805 встроенная на нано есть. AMS -1117-5. И уже подключено в ардуино (+5).

кнопки через стягивающие резисторы
подтягивающие резисторы 20К встроены в атмегу, достаточно их активировать в скетче.

МНОГО теории, практики 0.
Да, и еще, LM2596 я бы на питание планшета не вешал - не понравились.

papant
09.02.2017, 18:16
Да, и еще, LM2596 я бы на питание планшета не вешал - не понравились.

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

papant
09.02.2017, 18:22
А вот в описании подключения есть ошибка.
POGO и HUB надо поменять местами. Тогда и скетч правильно читается, и схема.
В скетче это делается одновременно, так что физически разницы НЕТ.
Я чувствую что меня где-то пытаются обмануть ). Ибо пытаюсь разобраться со скетчем - а там комменты не соответствуют подкючению.
И еще вопрос: че там за хитрый коэф. при расчете Исс? Попробовал его пересчитать по комментам - еще хуже стало ). Видимо придется просто методом перебора подгонять под реальное напряжение (по китайскому мультиметру)

oleg707
09.02.2017, 18:43
Я чувствую что меня где-то пытаются обмануть ). Ибо пытаюсь разобраться со скетчем - а там комменты не соответствуют подкючению.
И еще вопрос: че там за хитрый коэф. при расчете Исс? Попробовал его пересчитать по комментам - еще хуже стало ). Видимо придется просто методом перебора подгонять под реальное напряжение (по китайскому мультиметру)

так исторически сложилось, что некоторые комменты перешли из 3й версии бп:smile2:
А в 3ю версию со 2й :big:
Так шта хвост длиииный.
Но ты пиши, будем вместе баги вылавливать.
че там за хитрый коэф
ты про это?
float U_acc_real = 0.0 + Uacc * 0.01537;/*(5 / 1023.0 * 3.136); Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления)
Так 5В максимум ацп 1023 количество шагов, 3.136 - коэфф. резистивного делителя напряжения.
На практике быстрее по тестеру подогнать.

plus88
09.02.2017, 19:47
нууу... это не схема, это рисунок. Красиво, но ничего не понятно.
Реле нельзя напрямую к ногам ардуины подключать. ( макс ток по ноге 100мА)
Кнопки то зачем?! рисуй схему
7805 встроенная на нано есть. AMS -1117-5. И уже подключено в ардуино (+5).


подтягивающие резисторы 20К встроены в атмегу, достаточно их активировать в скетче.

МНОГО теории, практики 0.
Да, и еще, LM2596 я бы на питание планшета не вешал - не понравились.


Все правильно :) у меня с этим делом туго совсем. Помогите сократить ? как активировать встроенную 7805 и на каком пине она? И получается подключать питание к ардуине можно прямо с бортовой сети авто? при старте двигателя или поссле старта проблем не будет? генератор же 13 v выдает... Подтягивающие резисторы встроенные тоже хорошо, можно активировать и тогда мои можно убрать будет.! Схему не знаю как нарисовать :)


И ктстате тоже хочется чтобы ардуина считала напряжение в сети и при падении меньше 11 вольт в боротовой сети выключала все оборудование.

на лмках пока сделал потому что
https://ru.aliexpress.com/item/Mini-DC-DC-Buck-Converter-Step-Down-Module-Power-Supply-aeromodelling/32644256091.html вот эти штуки еще в пути.
И кстати когда они прийдут скет надо будет править, переделвать и вместо + подавать -.... тут же + подаем на управляющую ногу ЛМ.. а там надо минус на какой-то пин подавать верно ?

plus88
09.02.2017, 19:58
oleg707, Вы гораздо опытнее. Может есть простая рабочая схема их тех же материалов ?))))

plus88
09.02.2017, 20:05
oleg707, еще заметил на твоем видео кнопки подэкранные как раз такие как мне нужны! чем их делал ?))))

oleg707
09.02.2017, 20:12
oleg707, еще заметил на твоем видео кнопки подэкранные как раз такие как мне нужны! чем их делал ?))))

в автодроиде штатно, включаются в настройках

oleg707, Вы гораздо опытнее. Может есть простая рабочая схема их тех же материалов ?))))
БП №3. Просто, понятно, надёжно.

plus88
09.02.2017, 20:39
в автодроиде штатно, включаются в настройках


БП №3. Просто, понятно, надёжно.

А если в моей версии просто активировать встроенные резистор и преобразователь 7805. Как это сделать ? будет же тоже нормально ? Ну лмки заменю когда приедут замены )

И если нельзя реле, как с ардуины подать минус на датчик холла ?

plus88
09.02.2017, 20:43
oleg707, подскажи чего нужно добавить и чего убрать. Пожалуйста.

Судя по информации о arduino nano https://duino.ru/arduino-nano-v30-ch340-usb.html
можно смело подключаться прямо с бортовой сети авто на вход Vin ардуино нано!? думаю для гшения скачков на вход рядом поставить кондер на 10000 мкф, за одно гасить момент кручения стартером будет. так?

plus88
09.02.2017, 21:18
Правильно ли я понял, что на 13 пине есть встроенный регистор 20K. Получается можно с датчика холла без всяких реле подключать к 13 пину ардуины нано ?

oleg707
09.02.2017, 21:22
Правильно ли я понял, что на 13 пине есть встроенный регистор 20K. Получается можно с датчика холла без всяких реле подключать к 13 пину ардуины нано ?

есть.
нельзя. загрузчик не учитываешь. Но попробовать можешь :yes4:
на 13 вообще ничего лучше не вешать.
На Vin можно подавать не больше 12В. (5В+7В) Поизучай мои схемы БП. И даташиты.

plus88
09.02.2017, 21:31
на arduino.ru пишут https://duino.ru/arduino-nano-v30-ch340-usb.html

что можно на Vin подавать от 6 до 20 V. брешут?

Как тогда на счет встроенного 7805? в итоге я правильно схему сделал или нет чет не пойму.
Цитирую:
"Питание:
Arduino Nano может получать питание через подключение Mini-B USB, или от нерегулируемого 6-20 В (вывод 30), или регулируемого 5 В (вывод 27), внешнего источника питания. Автоматически выбирается источник с самым высоким напряжением."

Упустил про загрузчик... с ним то что ?еще? как с остальными вопросами заданными ранее?
Схему изучаю и боюсь что не понимаю)

oleg707
09.02.2017, 21:42
на arduino.ru пишут https://duino.ru/arduino-nano-v30-ch340-usb.html

что можно на Vin подавать от 6 до 20 V. брешут?

Как тогда на счет встроенного 7805? в итоге я правильно схему сделал или нет чет не пойму.
Цитирую:
"Питание:
Arduino Nano может получать питание через подключение Mini-B USB, или от нерегулируемого 6-20 В (вывод 30), или регулируемого 5 В (вывод 27), внешнего источника питания. Автоматически выбирается источник с самым высоким напряжением."

http://www.advanced-*******hic.com/pdf/ds1117.pdf
ABSOLUTE MAXIMUM RATINGS (Note 1)
Input Voltage 15V
Обманул, не 12 а 15, по даташиту.
Но где-то видел формулу, что входное напряжение должно быть не больше выходного + 7В. Давно это было. Потому и диоды в питании ардуины в БП5.

plus88
09.02.2017, 21:51
Ну по идее можно прямо так подключаться... в целом должно работать, кондер будет гасить всплески и должно быть норм. так ?

oleg707
09.02.2017, 22:01
Ну по идее можно прямо так подключаться... в целом должно работать, кондер будет гасить всплески и должно быть норм. так ?

а если пробъёт атмегу и на ДХ пойдёт +12В ? По идее не должно, а на практике может:shok:
Но ты можешь попробовать :secret:

plus88
09.02.2017, 22:04
посмотрел твою схему... для меня это темный лес.... подскажи как правильно сделать, буду весьма признателен

oleg707
09.02.2017, 22:09
посмотрел твою схему... для меня это темный лес.... подскажи как правильно сделать, буду весьма признателен

схема есть, если сам не можешь - проси других. Никто не говорил, что будет легко :wink2:.
Начни с простого - с питания в прикуриватель. а потом видно будет.

plus88
09.02.2017, 22:18
У меня на схеме для входной подачи питания на ардуино использовался преобразователь 7805... ты говоришь в ардуино есть встроенный... Когда спрашиваю можно ли подавать напрямую, говоришь нельзя... но и как активировать встроенный тоже не говоришь%)... что наводит на странные мысли... ну и если посмотреть по теме оч много вопросов осталось без ответов, тем не менее спасибо. пойду возвращать все что успел удалить пока беседовал...

plus88
09.02.2017, 22:24
а что там с загрузчиком ? и как подключиться к датчику холла без релешки?

oleg707
09.02.2017, 22:26
но и как активировать встроенный прекрасно видно, если на печатке 5 БП посмотреть. Более того, буквально пару страниц назад это обсуждалось (http://pccar.ru/showpost.php?p=381735&postcount=824)!
У меня нет возможности обучать вас элементарной электротехнике. Потому и "детские" вопросы могу проигнорировать.
Создайте свою тему и попросите помощи, может кто и подскажет.

oleg707
09.02.2017, 22:34
а что там с загрузчиком ? и как подключиться к датчику холла без релешки?

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

К ДХ подключится транзистором, ну посмотри, не ленись. Даже схема есть.
Даже В ШАПКЕ есть!
Даже БЕЗ АРДУИНЫ есть!
Даже фотки есть.

plus88
09.02.2017, 22:44
Нет ты прав, надо постигать. что делать :)

papant
09.02.2017, 23:50
загрузчик около секунды при включении проца тупо ждёт соединения по уарт. На ногах при этом чёрти что. (начальное состояние проца)

К ДХ подключится транзистором, ну посмотри, не ленись. Даже схема есть.
Даже В ШАПКЕ есть!
Даже БЕЗ АРДУИНЫ есть!
Даже фотки есть.
Терпения Вам, Олег )
А Плюсу88 рекомендую почитать форум, тут много схем БП всевозможных, покурить мануалы и даташиты, сделать свой БП (у вас попытки уже есть, но знаний не хватает), потом плюнуть на это и сделать по схеме Олега (я сейчас в этой стадии )) . Схема принципиальная есть, печатная есть, даже скетч есть и картинки, а вы лезете со своей схемой в чужую ветку с глупыми как и мои вопросами ). создайте свою и не мешайте людям постигать дзен )

oleg707
10.02.2017, 00:02
да дело в том, что я все эти стадии прошёл. Начинал вообще с зарядного, воткнутого в прикуриватель. Полгода так ездил. Заглушил - вынял:big:
Не зря же БП уже есть 6 версии ( не дам, то же самое что и 5, но на голой атмеге, без ардуины) и 7 в разработке.

Az0m@
10.02.2017, 00:41
есть 6 версии ( не дам, то же самое что и 5, но на голой атмеге, без ардуины) и 7 в разработке.
бяка :pleasantry::big::big::big::big:

mazay66
10.02.2017, 00:49
Вообщем, поддерживаю. Пройдя несколько стадий тоже склоняюсь к схеме на полевых транзисторах/электронных ключах. Всевозможные реле - это зло. То дребезг контактов, то подмерзание на морозе, то не срабатывания из-за посадок. Решил повнимательнее изучить ваш вариант блока питания. Зачем ставить полевик на датчик холла. Там же все просто. Делитель напряжения на двух резисторах и кондер, который может обеспечить любую задержку на погашение экрана. У меня так работает давно. Никаких проблем. Делитель 4 к 1. Появилось +12, на делителе будет около 3В, планшет "проснется". Пропало ААС - на делителе "ноль" (после разряда конденсатора). Планшет "уснул". Не проще?

oleg707
10.02.2017, 01:20
Вообщем, поддерживаю. Пройдя несколько стадий тоже склоняюсь к схеме на полевых транзисторах/электронных ключах. Всевозможные реле - это зло. То дребезг контактов, то подмерзание на морозе, то не срабатывания из-за посадок. Решил повнимательнее изучить ваш вариант блока питания. Зачем ставить полевик на датчик холла. Там же все просто. Делитель напряжения на двух резисторах и кондер, который может обеспечить любую задержку на погашение экрана. У меня так работает давно. Никаких проблем. Делитель 4 к 1. Появилось +12, на делителе будет около 3В, планшет "проснется". Пропало ААС - на делителе "ноль" (после разряда конденсатора). Планшет "уснул". Не проще?

ок. ситуация:
планшет и зажигание выключено.
Включаем зажигание на 4 секунды, выключаем и идём дальше ( грузить вещи в машину).
Планшет запускается, начинается загрузка системы. Поскольку ДХ сразу не обрабатывается, то загрузка идёт с бутанимацией, потом рабочий стол. И всё это щасце светится, пока системе не надоест и она не потушит экран. Или пока не передёрнешь зажигание.

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

plus88
10.02.2017, 08:05
я просто думал на датчик холла можно подавать либо землю либо ничего )
т.е. если можно с ноги ардуины через делитель подать 3 V это прям то что надо :)
если питание есть оно работает, если нет спит :) то что нужно :)

oleg707
10.02.2017, 13:05
я просто думал на датчик холла можно подавать либо землю либо ничего )
т.е. если можно с ноги ардуины через делитель подать 3 V это прям то что надо :)
если питание есть оно работает, если нет спит :) то что нужно :)

тогда ДХ надо выпаивать.

mazay66
10.02.2017, 18:50
Ну да, разве проблема? А вы к ноге датчика паялись, без выпаивания? Какой смысл оставлять датчик?

oleg707
10.02.2017, 18:58
Ну да, разве проблема? А вы к ноге датчика паялись, без выпаивания? Какой смысл оставлять датчик?

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

plus88
10.02.2017, 20:29
у меня из сопротивлений под рукой есть только 10кОм и 27 кОм. Проблема в том что перед датчиком холла после делителя получается 3.2... это не много для датчика холла?

О! нашел в закромах еще R100кОм :)

oleg707
10.02.2017, 20:35
у меня из сопротивлений под рукой есть только 10кОм и 27 кОм. Проблема в том что перед датчиком холла после делителя получается 3.2... это не много для датчика холла?

а ты померяй, сколько там штатно.
Поднеси магнитик. Посмотри.

plus88
10.02.2017, 20:49
при использовании R100кОм и R27кОм на выходе получаем 1.2v. так норм ?

oleg707
10.02.2017, 21:05
при использовании R100кОм и R27кОм на выходе получаем 1.2v. так норм ?

а ты померяй, сколько там штатно.
Поднеси магнитик. Посмотри.:acute:

mazay66
10.02.2017, 21:54
Я использую 4,1к и 1к.
oleg707 а в чём необходимость оставлять АКБ в планшете? Если уже отвечали на этот вопрос, дайте ссылку. Посмотрел схему без ардуино и ваше видео с описанием работы. Видимо, используете нексус 12 wi-fi. Для работы с планшетом 3G надо делать задержку на включение отг 15-18сек после "автостарта".
p.s. Вопрос снят. Увидел, что вы уже избавились от батареи.

plus88
11.02.2017, 01:21
Стал использовать вот такой транзистор http://www.radioradar.net/datasheet_search/0/6/N/06N03LA_InfineonTechnologiesCorporation.pdf.html . По схеме вроде аналогичный.
Итак если смотреть прямо на него. левую ногу подключил к выходу делителя напряжения около 3V получил. С которого в свою очередь приходит с одной стороны нога ардуины с другой стороны земля. За вторым резистором так же как и на схеме приходит земля на крайнюю правую ногу транзистора.
средняя нога идет на датчик холла. Пока на левую ногу подается питание, транзистор включен и на датчик холла поступает что-то%) а когда питание с левой ноги убрать, то транзистор отключается.

Пожалуйста поправьте если не так понял %).Заранее спасибо

oleg707
11.02.2017, 03:46
Стал использовать вот такой транзистор http://www.radioradar.net/datasheet_search/0/6/N/06N03LA_InfineonTechnologiesCorporation.pdf.html . По схеме вроде аналогичный.
Итак если смотреть прямо на него. левую ногу подключил к выходу делителя напряжения около 3V получил. С которого в свою очередь приходит с одной стороны нога ардуины с другой стороны земля. За вторым резистором так же как и на схеме приходит земля на крайнюю правую ногу транзистора.
средняя нога идет на датчик холла. Пока на левую ногу подается питание, транзистор включен и на датчик холла поступает что-то%) а когда питание с левой ноги убрать, то транзистор отключается.

Пожалуйста поправьте если не так понял %).Заранее спасибо

по факту понял правильно, будет работать. по сути - нет.
Давай по порядку.
к выходу делителя напряжения
вот где ты делитель то увидел? токограничивающий резистор и подтяжку транзистора делителем обзываешь? :big:
Левая нога - это затвор. Управляющий вывод.
Пока на левую ногу подается питание, транзистор открыт и пропускает через себя массу. Которую и подаём на ДХ.

Я бы рекомендовал посмотреть на ютуб канале ролик про принцип действия БП 3й версии. Там всё разжевано. Мноого вопросов должно отпасть.

oleg707
11.02.2017, 03:52
Я использую 4,1к и 1к.
oleg707 а в чём необходимость оставлять АКБ в планшете? Если уже отвечали на этот вопрос, дайте ссылку. Посмотрел схему без ардуино и ваше видео с описанием работы. Видимо, используете нексус 12 wi-fi. Для работы с планшетом 3G надо делать задержку на включение отг 15-18сек после "автостарта".
p.s. Вопрос снят. Увидел, что вы уже избавились от батареи.

неа, не избавился.
Самое нужное мне применение батареи - то, что планшет помнит дату и время. Ну и как кондёр работает многофарадный. Иначе иногда могло подглючить при длинном старте авто. Звуковуху не увидеть, например. Приходилось передёргивать зажигание. Контроллер в штатном режиме - то есть все защиты не вырезал, оставил как по заводу было.
Для работы с планшетом 3G надо делать задержку на включение отг 15-18сек после "автостарта".
Хм. Не знаю, как на 3G, а на этом почти сразу можно пихать.
Мы же можем воткнуть Y-OTG шнурок в выключенный планшет с клавиатурой, например. И только потом включить планшет. И что, не увидит клаву?

Sergey 4_4
11.02.2017, 09:38
Хм. Не знаю, как на 3G, а на этом почти сразу можно пихать.
Мы же можем воткнуть Y-OTG шнурок в выключенный планшет с клавиатурой, например. И только потом включить планшет. И что, не увидит клаву?Клаву увидит. Проблемы могут быть с работой изикапа,также если пользоваться поверампом и слушать музыку которая записана на флешку,может не сохраняться пауза и трек при включении планшета и монтирования флешки играет с начала а не с момента остановки. oleg707А можешь немного "поспойлерить" про версию блока на атмеге? Размеры? Что в качестве преобразователей использовал?

plus88
11.02.2017, 11:16
по факту понял правильно, будет работать. по сути - нет.
Давай по порядку.

вот где ты делитель то увидел? токограничивающий резистор и подтяжку транзистора делителем обзываешь? :big:
Левая нога - это затвор. Управляющий вывод.
Пока на левую ногу подается питание, транзистор открыт и пропускает через себя массу. Которую и подаём на ДХ.

Я бы рекомендовал посмотреть на ютуб канале ролик про принцип действия БП 3й версии. Там всё разжевано. Мноого вопросов должно отпасть.

Смотрю видео. В восторге, надо было раньше посмотреть все сразу становится понятно! спасибо большое! буду штурмовать дальше:)
ВОпрос по поводу патча, какой патч ставили для автостарта планшета по подаче +5 на зарядку ? я видел только автовключение при появлении любого питания.

oleg707
11.02.2017, 13:25
ВОпрос по поводу патча, какой патч ставили для автостарта планшета по подаче +5 на зарядку ? я видел только автовключение при появлении любого питания.

Это он и есть.

]А можешь немного "поспойлерить" про версию блока на атмеге? Размеры? Что в качестве преобразователей использовал?
А смысл? Там проект до конца не закончен, физически не обкатан. По сути повторяет 5 версию, только на голом проце.
Ща найти не могу
46727

plus88
11.02.2017, 15:30
oleg707, если не сложно взгляни пожалуйста. Схема не идеал конечно еще пилить и пилить. За основу взята схема твего блока 3 версии.

Все В описании по сути как и у тебя. За исключением пары моментов. У меня батареи нет, соответственно дополнительно на транзистор "сна" ничего не подаю.
Еще пока не придумал как сделать это так же через трназисторы вот какую штуку.
По схеме видно что у меня сразу все включается. Обе Lmки и LM7805. Которая включает ардуину в свою очередь.
Ардуина прогружается и выключает LMку с USB хаба. Надо какой-то фокус, может так же на транзисторах, чтобы до прогрузки ардуины вторая лмка не включалась.
Далее с +12 и ACC так же через делители на аналоговые пины ардуины ушли контакты для мониторинга состояния бортовой сети.
Далее по активации кнопки включается LMка усб хаба и с транзистора сна убирается +, планшет просыпается.

Укажи пожалуйста на явные ошибки, думаю мысль ты понял :) заранее огромное спасибо. За видео отдельный поклон! Посмотрел и прям все разжевано :)

oleg707
11.02.2017, 15:40
oleg707, если не сложно взгляни пожалуйста. Схема не идеал конечно еще пилить и пилить. За основу взята схема твего блока 3 версии.

Все В описании по сути как и у тебя. За исключением пары моментов. У меня батареи нет, соответственно дополнительно на транзистор "сна" ничего не подаю.
Еще пока не придумал как сделать это так же через трназисторы вот какую штуку.
По схеме видно что у меня сразу все включается. Обе Lmки и LM7805. Которая включает ардуину в свою очередь.
Ардуина прогружается и выключает LMку с USB хаба. Надо какой-то фокус, может так же на транзисторах, чтобы до прогрузки ардуины вторая лмка не включалась.
Далее с +12 и ACC так же через делители на аналоговые пины ардуины ушли контакты для мониторинга состояния бортовой сети.
Далее по активации кнопки включается LMка усб хаба и с транзистора сна убирается +, планшет просыпается.

Укажи пожалуйста на явные ошибки, думаю мысль ты понял :) заранее огромное спасибо. За видео отдельный поклон! Посмотрел и прям все разжевано :)

опять ты просишь разработать схему. Kiw3312s стоит 5$ за 10! штук. Купи ты его и ставь, как по схеме. Всё.
Когда я пришел на этот форум и начал искать готовый для повторения БП, я ВООБЩЕ ничего не нашёл. Поэтому пришлось разрабатывать с нуля.
У тебя же есть готовое решение, ну так модифицируй и пользуйся. Не умеешь - повтори и пользуйся. Наберёшься опыта - своё допилишь.

plus88
11.02.2017, 16:39
ну тогда просто скажи есть ошибки?

oleg707
11.02.2017, 17:09
ну тогда просто скажи есть ошибки?

качество *****. не видно.

mazay66
11.02.2017, 22:49
Ну что ж, хватило терпения прочитать всю ветку форума. Понял, что схема, с которой вы начинали, мало чего общего имеет с платой последней модификации. Чего не понял, так это того, в какой момент в схеме появилась ITS716G и с какой целью? На последнем фото, смотрю вообще нет полевиков, есть ещё микросхемка. Чего не устраивает, что ищите?
Поделюсь своей концепцией подхода к БП. Сейчас у меня установлен 12-й нексус с 3G? аналоговый БП на КИСах с необходимыми задержками и отключением при просадке батареи. Работает не плохо, но хочу уйти от реле и перейти на 13-й. Ваша схема (без реле) интересна, но концепция у меня немного другая:
1. Отсутствие батареи в планшете
2. Отсутствие дополнительных кнопок - только автозапуск.
3. Никакого перерезания питающего провода между хабом и планшетом.
Реализуется просто - через таймер времени на NE555. Появилось питание +5В, после включения ААС, и через замкнутые контакты реле таймера отправляется на контакт пого (в 13-м видимо на рабъём микро юсб). Сработал таймер через несколько секунд, пого-контакт планшета обесточился. Но +5В там больше и не требуется. Планшет уже стартонул из выключенного состояния, необходимое действие свершилось) Таймер перекинул +5 с пого на реле замыкающее 4-й контакт микро юсб на землю. Подключился режим ОТГ. Отключили АСС, таймер откинул контакты реле назад. ОТГ отключилось, POGO подключиля, но +5В уже с КИСа не раздоется. Экран тухнет с задержкой через делитель и конденсатор по ДХ. КИС на 4,2В продолжает питать планшет в спящем режиме. Через 3-и часа Таскер полностью отключает планшет и потребленее его почти отсутствует. НО, время не сбрасывается, поскольку КИС поддерживает 4,2В. При просадке напряжения батареи ниже 11В, КИС отключится, посколько получает информацию о состоянии батарее по входу ON/Off. Но за год использования, такого не происходило.
Вот в раздумьях теперь - скопитовать ваш БП или как-то заменить мои реле полевыми транзисторами/эл ключами.
Не подскажете, как можно "заставить" ключ на полевом транзисторе выдать кратковременные +5в. Интервалом в 4-5 сек (для автостарта 13-го нексуса)?

plus88
12.02.2017, 00:01
качество *****. не видно.

Поправил выгружаю еще раз. Посмотри пожалуйста.

plus88
12.02.2017, 00:47
Вот помудрил еще чуть чуть. Интересует только участок,который в зеленом пунктирном квадрате выделен. Так будет работать?
Смысл такой что когда включаем АСС, блок питания хаба остается выключенным пока не включится ардуина и не "продавит" минусом на пятый управляющий пин, что включит блок питания usb хаба. Ну и дальше ардуина уже будет рулить. или надо еще какой то узел чтобы закрывать транзисторы и не включать их больше после старта ардуины?

plus88
12.02.2017, 01:05
Вот немного по-другому. Посмотрел по даташиту на LM2596s там на управлющую ногу можно подавать от 1.3 до 25 v. По-этому схему немного переделал. Так правильнее?

oleg707
12.02.2017, 02:36
Ну что ж, хватило терпения прочитать всю ветку форума. Понял, что схема, с которой вы начинали, мало чего общего имеет с платой последней модификации. Чего не понял, так это того, в какой момент в схеме появилась ITS716G и с какой целью? На последнем фото, смотрю вообще нет полевиков, есть ещё микросхемка. Чего не устраивает, что ищите?
Поделюсь своей концепцией подхода к БП. Сейчас у меня установлен 12-й нексус с 3G? аналоговый БП на КИСах с необходимыми задержками и отключением при просадке батареи. Работает не плохо, но хочу уйти от реле и перейти на 13-й. Ваша схема (без реле) интересна, но концепция у меня немного другая:
1. Отсутствие батареи в планшете
2. Отсутствие дополнительных кнопок - только автозапуск.
3. Никакого перерезания питающего провода между хабом и планшетом.
Реализуется просто - через таймер времени на NE555. Появилось питание +5В, после включения ААС, и через замкнутые контакты реле таймера отправляется на контакт пого (в 13-м видимо на рабъём микро юсб). Сработал таймер через несколько секунд, пого-контакт планшета обесточился. Но +5В там больше и не требуется. Планшет уже стартонул из выключенного состояния, необходимое действие свершилось) Таймер перекинул +5 с пого на реле замыкающее 4-й контакт микро юсб на землю. Подключился режим ОТГ. Отключили АСС, таймер откинул контакты реле назад. ОТГ отключилось, POGO подключиля, но +5В уже с КИСа не раздоется. Экран тухнет с задержкой через делитель и конденсатор по ДХ. КИС на 4,2В продолжает питать планшет в спящем режиме. Через 3-и часа Таскер полностью отключает планшет и потребленее его почти отсутствует. НО, время не сбрасывается, поскольку КИС поддерживает 4,2В. При просадке напряжения батареи ниже 11В, КИС отключится, посколько получает информацию о состоянии батарее по входу ON/Off. Но за год использования, такого не происходило.
Вот в раздумьях теперь - скопитовать ваш БП или как-то заменить мои реле полевыми транзисторами/эл ключами.
Не подскажете, как можно "заставить" ключ на полевом транзисторе выдать кратковременные +5в. Интервалом в 4-5 сек (для автостарта 13-го нексуса)?

Чего не устраивает, что ищите
тема длинная, дискутировать можно долго.
если вкратце, то по сравнению с 3й версией 5я версия ГИБЧЕ. То есть, если я захочу поменять кое-какие тайминги в 3БП, мне придётся его перепаивать.
А если в 5БП - я просто меняю программу. Причём кручу, как хочу. Совсем.

Its716 использовал, так как это же полноценные электронные ключи, с управлением напрямую от проца и с защитой от КЗ. Причем есть еще диагностика ( там доп выводы). Малого размера.
В BMW X5 X6 ( и в более простых) в блоке управления светом ( фары, противотуманки, габариты) используются такого плана ITS, только у них управление по I2C.

При просадке напряжения батареи ниже 11В, КИС отключится, посколько получает информацию о состоянии батарее по входу ON/Off.
это как? обычно либо стабилитрон и транзистор в ключевом режиме, либо процессор и делитель напряжения.
3. Никакого перерезания питающего провода между хабом и планшетом.
Если не убрать с ID( 4 конт) юсб массу, то планшет подаёт на хаб питание. Если отключить в этот момент зарядку ( пого или юсб, неважно), планшет всё равно считает, что зарядка идёт.
У кого нету ДХ и таскер (автоматизатор) тушит экран по признаку зарядки - тем весело:be:.
Еще причина не перерезания питающего провода между хабом и планшетом - я не знаю, что я завтра захочу воткнуть в хаб. И сколько оно захочет потребить.

А еще одна причина, почему я так сделал - описана у меня в проекте:
Когда то в начале я не хотел лезть в батарею и датчик холла. Поэтому зарядка планшета шла через ПОГО (те же яйца, что и ЮСБ, только ток мощнее берёт), а экран тух программно, по признаку пропадания зарядки. звук брался с наушников.
Использовалась тогда обычная зарядка в прикуриватель. Когда запускался одновременно плеер и навителл, то зарядка была меньше разрядки или около того. За 6 часов езды с навигатором батарея скорее разряжалась, чем заряжалась.

Потом пришла звуковая (2704).:spiteful:
Хаб я не хотел, потому звуковуху повесил на ЮСБ через Y-OTG кабель.
Звук меня приятно удивил для 10$ вообще лепота.
НО...
1 - Пошла разрядка батареи. То есть заряда по ПОГО ( примерно 0,6-0,7А 5,0 вольт) не хватало чтобы поддерживать тупо поверамп и звуковуху.
2 - если подать на пого 5 вольт и прицепить y-otg кабель, то планшет будет давать питание на ЮСБ (питая нашу звуковуху). А вот если в этот момент убрать питание на пого, то планшет продолжал питать ЮСБ-звуковуху и вообще показывал зарядку (питаясь от батареи) :shok:
Даже экран не тух ( таскером по признаку зарядки).
Вот тогда мне это дало стимул конкретно заморочиться БП(3 а сейчас и уже 4 версии). Демонтировал планшет, вывел сигнальный пин датчика холла, подпаялся параллельно батарее, прямо к материнке, (к черному и красному) оставив контроллер.

Смысл в том, что батарея, даже в хлам разряженная, должна была поддерживаться блоком питания и не проседать ниже 3,8 вольт, заодно подрабатывая конденсатором (как аккумулятор в автомобиле).
НО. Одновременно подавалось питание 4,85 вольт на ПОГО. ( для признака зарядки). Планшет, имея штатное юсб питание, начинал успешно заряжать батарею:wink2: (когда напруга поднималась выше 3,8, KIW3312s понижал зарядный ток на батарею, в итоге схема находила баланс и прекрасно себя чувствовала). Хреново чувствовал себя только контроллер батареи, который сбил свои реальные значения заряда-разряда и показывал ~33-40%. Меня это не заботило, поскольку система наконец таки начала работать стабильно. :worthy2:

До одного утра... что то разрядило батарею планшета ниже 0%. Как бы и хрен бы с ним, у нас же блок питания даёт 3,8В, должно хватать с запасом. Ан нет, планшет (с патчем автозагрузки) грузит систему, та, получив от контроллера батареи заряд 0%, пишет ВЫКЛЮЧЕНИЕ и вырубает тело. У того патч автозагрузки, видя признак заряда на ПОГО, включает планшет :be: и так по кругу, пока контроллер заряда не сообщит системе, что батарея уже 1%.
Решения этой бяки оказалось 3.
1- вырубать планшет раньше блока питания. планш через 2 часа, а блок через 3.
2- отрезать от контроллера батареи шину данных( не помню точно, вроде бы I2C там). Тогда в трее болтается красный значёк батареи с 0% заряда, но система не вырубается.
3- прошить ядро, которое чихать хотело на батарею ( ядро Даниэля в моём случае.)

3 способ был самым правильным, поскольку тогда я прошил автодроид 1,2 (слимКэт, основанный на стоке), и УРА, батарея стала показывать всегда 100%(правда при этом перестала мерять температуру, что летом плохо, а зимой, при -25, хорошо).
Значёк батареи я за ненадобностью скрыл.
С тех пор всё работает стабильно и предсказуемо.

дополнение... при -20 или при полном разряде батареи планшет отказывался включаться.
для теста отрезал 2 провода данных от контроллера, оставил только питание. На планшет приходит 3.1v(севшая батарея), странно, но работает. БП выдаёт 3,8.

Не подскажете, как можно "заставить" ключ на полевом транзисторе выдать кратковременные +5в. Интервалом в 4-5 сек (для автостарта 13-го нексуса)?

либо мудрить кондёр с транзисторами в ключевом режиме, либо 555, липо проц ( который заодно меряет напругу и рулит блоком)

Не хочу хвастаться, но в бп как 3 так и 5й версий ( 4 это точно такая же 5, только плата растрассирована по другому) учтены много мелочей, которые вылезали на практике. И про которые я не то что вопросов не видел на форуме, а вообще упоминания нет этих проблем.
( как пример, могу указать ДХ).
Мне нужно включить планшет. Но ехать я пока НЕ собираюсь.
Алгоритм.
1 - вкл зажигание.
Автостартанув, планшет пошел загружаться.
2 - ждём 3-5 сек выключаем зажигание и идём по своим делам ( вещи загружать).
3 - Планшет показывает бутанимацию.
4- загрузился. Экран СВЕТИТСЯ. А светится потому, что ДХ обрабатывается ПРОГРАММНО, системой. И когда система загружается, ей надо, чтобы ДХ был неактивен ( не было массы)
5 - Чтобы этого не было, пришлось считать, что если 1я загрузка, то 2 минуты держать ДХ в высоком уровне.
6 - а вдруг планшет уже загружен, а я на БП просто ресет нажал? Тогда надо проверять наличие включения зажигания ( скажем, секунд 15), и последующее включение.

Вот как такие извращённые логики без процессора реализовывать?:blink2:

скопировать ваш БП или как-то заменить мои реле полевыми транзисторами/эл ключами.
да как вашей душе угодно :yes2:
Я дал рабочее решение, которое можно полностью либо частично копировать.
Причём решений этих аж 3 штуки: Без ардуины, с ардуиной попроще, и с ардуиной посложнее.
4е решение на голом проце выкладывать не стал - потому как его нужно прошить, на внутренний кварц фьюсы прописать. А это уже уровень явно выше среднего - такие люди сами быстрее что-нить сделают, чем ждать будут.

oleg707
12.02.2017, 02:45
Вот немного по-другому. Посмотрел по даташиту на LM2596s там на управлющую ногу можно подавать от 1.3 до 25 v. По-этому схему немного переделал. Так правильнее?

хрень какая то. Не будет работать. Диод между ногой проца и питанием это вообще пздц. плюнь на него и 12В пойдет на ногу, весело выжигая вывод. Хоть резак токозащитный воткни.
В общем так: Собирай макетную плату, паяй на столе свою схему и проверяй, соответствует ли теория реальной работе. А планшет пока не подключй:wink2::yes4:

plus88
12.02.2017, 17:22
Поправил. Убрал всю конструкцию, оставил с ардуины сразу на LM2596. Так нормально будет? или лучше взять 5 вольт с той же ардуины?

plus88
12.02.2017, 17:41
как-то так

oleg707
12.02.2017, 18:58
Поправил. Убрал всю конструкцию, оставил с ардуины сразу на LM2596. Так нормально будет? или лучше взять 5 вольт с той же ардуины?

попробуй собери на макетке.

plus88
12.02.2017, 20:05
ну на вид ошибок больше не видно?

mazay66
12.02.2017, 23:43
это как? обычно либо стабилитрон и транзистор в ключевом режиме, либо процессор и делитель напряжения. Это просто. Где-то в этой теме была даже ссылка на схему с описанием. КИС немного переделывается и вместо отрицательного смещения на контакт ON/OFF подаем положительное (через делитель). При снижении напряжения батареи, снижается и потенциал на делителе. Резисторы делителя подобраны таким образом, что бы при требуемом напряжении батареи, КИС отключался.
Если не убрать с ID( 4 конт) юсб массу, то планшет подаёт на хаб питание. Если отключить в этот момент зарядку ( пого или юсб, неважно), планшет всё равно считает, что зарядка идёт.
У кого нету ДХ и таскер (автоматизатор) тушит экран по признаку зарядки - тем весело:be:.
Еще причина не перерезания питающего провода между хабом и планшетом - я не знаю, что я завтра захочу воткнуть в хаб. И сколько оно захочет потребить. Совершенно верно, планшет всегда показывает зарядку при включенном режиме ОТГ. Такова особенность ядра Даниэля в режиме включенного ОТГ. Но к чему вы это написали? Не понял. У меня, при выключении зажигания, режим ОТГ отключается, хотя и тушу экран ДХ, а не софтом. И последняя причина – не причина. Захотите хаб, установите. Только поставьте активный, с отдельным входом для доп питания. Зачем что-то резать и перепаивать? Вы же сами сторонник того, что бы работало всё штатно. Это следует из ваших постов.
2 - если подать на пого 5 вольт и прицепить y-otg кабель, то планшет будет давать питание на ЮСБ (питая нашу звуковуху). А вот если в этот момент убрать питание на пого, то планшет продолжал питать ЮСБ-звуковуху и вообще показывал зарядку (питаясь от батареи) :shok:
Даже экран не тух ( таскером по признаку зарядки).
Вот тогда мне это дало стимул конкретно заморочиться БП(3 а сейчас и уже 4 версии).
Ещё раз повторю, планшет показывал зарядку без подключенного пого, потому что у вас установлено ядро Даниэля и включен режим отг. В режиме ОТГ планшет и должен выдавать питание на звуковуху. Не понимаю, в чем тут не стыковка? Всё логично. Отключаете питание пого, отключаете отг и совершенно спокойно гасите экран Таскером. Разве нет? В чём я ошибаюсь?
либо мудрить кондёр с транзисторами в ключевом режиме, либо 555, липо проц ( который заодно меряет напругу и рулит блоком). Вот реально, спасибо. Посмотрев ваше видео, о принципе работы полевых транзисторов, и добавив к ним таймер на биполярнике, набросал схемку. Сбегал в радиодетали за транзистором и макетницей. Собрал и сразу получил требуемый результат.

oleg707
13.02.2017, 21:34
Ещё раз повторю, планшет показывал зарядку без подключенного пого, потому что у вас установлено ядро Даниэля и включен режим отг. В режиме ОТГ планшет и должен выдавать питание на звуковуху. Не понимаю, в чем тут не стыковка? Всё логично. Отключаете питание пого, отключаете отг и совершенно спокойно гасите экран Таскером. Разве нет? В чём я ошибаюсь?
Во первых, тогда стоял цианогенмод 11. Там свои ядра. Несовместимые со стоком.
Во вторых да, вы правы, забыл за давностью лет. С ОТГ попутал.
В любом случае, я теперь снимаю массу с отг, снимаю питание с хаба, снимаю питание с планшета ( признак зарядки), и тушу экран через датчик холла.
Питание на хаб я не режу где-то внутри планшета, а просто не подаю через юсб кабель ( который всё равно надо паять, чтобы Y-OTG режим планшету скормить).
Если кому либо не надо эти функции в БП, то можно их не подключать.
Кстати, экран по ДХ стал гасить из-за нестабильности тогдашней операционки - могло иногда включить экран. С ДХ всё работает очень стабильно - за последние пару лет не помню таких сбоев.

А так я даже в видео показал, как только через ЮСБ питание без разборки планшета, с помощью таскера, можно делать кар-пс.

papant
13.02.2017, 22:02
Протестил БП, пробег 40 часов на столе )
Иногда если пошевелить экран, то все символы пропадают и вылазит вот это
http://s8.hostingkartinok.com/uploads/thumbs/2017/02/83b8789975348e0805ea73d0be84a964.png (http://hostingkartinok.com/show-image.php?id=83b8789975348e0805ea73d0be84a964)
С чем это связано? Подтяжка по I2C есть. Отключение и подключение экрана не помогает, только полное выкл и снова вкл.

oleg707
13.02.2017, 22:38
Протестил БП, пробег 40 часов на столе )
Иногда если пошевелить экран, то все символы пропадают и вылазит вот это
http://s8.hostingkartinok.com/uploads/thumbs/2017/02/83b8789975348e0805ea73d0be84a964.png (http://hostingkartinok.com/show-image.php?id=83b8789975348e0805ea73d0be84a964)
С чем это связано? Подтяжка по I2C есть. Отключение и подключение экрана не помогает, только полное выкл и снова вкл.

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

пробег 40 часов
у меня как то стояло 9999 минут (вроде), так когда цифры перестали влезать, переделал индикацию аптайма на сутки, часы. Это в реальной работе на машине.

papant
13.02.2017, 23:25
неконтакт по экрану. Тоже бывало такое. Отключение и подключение экрана не помогут, так как ему INIT нужен.
Да, добавление init в блок появления зажигания исправляет сей косяк.
я вот тоже хотел сначала экран врезать в корпус, но сейчас передумал, хотя с ним действительно корпус из простой невзрачной коробочки превращается в нечто крутое )

oleg707
13.02.2017, 23:31
Да, добавление init в блок появления зажигания исправляет сей косяк.
я вот тоже хотел сначала экран врезать в корпус, но сейчас передумал, хотя с ним действительно корпус из простой невзрачной коробочки превращается в нечто крутое )

можешь 0.96" врезать, он поменьше. Но через годик выцветет в 2 раза. Смысл в экране вижу для отладки и настройки напряжений. Ну и поиграться. Уже давно без него езжу, поскольку работает. Хотя в бардачке валяется ))

plus88
15.02.2017, 10:18
Собрал схему :) вроде работает. Сегодня буду тестить на столе с подключением OTG .и пого пина.

Пока вот видео. Да простят меня электросхемотехники. :)
https://youtu.be/QzCmQMgivoY
Перерисовал схему в более человеческий вид.


Отдельное спасибо, Oleg707!

oleg707, не совсем понял про погопин для хаба. Я не нашел на схеме 3 версии.%) может не там смотрел...
В общем питание + OTG кабеля перерезаем и на пого пин подаем +5 с узла который питает USB хаб так ? И что с 4 пином USB тоже резать и подавать землю отдельно через питание хаба?

oleg707
15.02.2017, 14:57
Собрал схему :) вроде работает. Сегодня буду тестить на столе с подключением OTG .и пого пина.

Пока вот видео. Да простят меня электросхемотехники. :)
https://youtu.be/QzCmQMgivoY
Перерисовал схему в более человеческий вид.


Отдельное спасибо, Oleg707!

oleg707, не совсем понял про погопин для хаба. Я не нашел на схеме 3 версии.%) может не там смотрел...
В общем питание + OTG кабеля перерезаем и на пого пин подаем +5 с узла который питает USB хаб так ? И что с 4 пином USB тоже резать и подавать землю отдельно через питание хаба?
погопин для хаба
:big:
питание на погопин брать с питания хаба.

4 пин USB - паять отдельно кабель и подключать 4 пин к соответствующему контакту БП.
по асс резистор воткни.

Вопросы на засыпку:
Что будет, если замкнёт Д1?
Что будет, если замкнёт Т5?

plus88
16.02.2017, 09:20
:big:
питание на погопин брать с питания хаба.

4 пин USB - паять отдельно кабель и подключать 4 пин к соответствующему контакту БП.
по асс резистор воткни.

Вопросы на засыпку:
Что будет, если замкнёт Д1?
Что будет, если замкнёт Т5?

Забыл убрать это из схемы

oleg707
16.02.2017, 14:03
Забыл убрать это из схемы

а ты можешь сам просматривать картинки, перед тем как их выкладывать?! Качество никакое.

papant
19.02.2017, 18:36
Олег, а можно еще разок про номиналы резисторов 13-15. у меня почему-то оказалось так, что на датчик холла всегда идет "-", планшет все время спит. Думаю а зачем нужно R15, которое соединяет затвор с плюсовым выходом КИВа на планшет? Получается что когда плюс на планшет есть, то приоткрывается полевик. Или его номинал мал, что не смогает перетянуть стягивающий резистор R14? Я вот подумал и решил - а нужен ли гемморой с транзистором, если вопрос можно решить просто выходом ардуины и диодом, который не пропускает плюс, но пропускает минус на холл для сна?

oleg707
19.02.2017, 22:46
Олег, а можно еще разок про номиналы резисторов 13-15. у меня почему-то оказалось так, что на датчик холла всегда идет "-", планшет все время спит. Думаю а зачем нужно R15, которое соединяет затвор с плюсовым выходом КИВа на планшет? Получается что когда плюс на планшет есть, то приоткрывается полевик. Или его номинал мал, что не смогает перетянуть стягивающий резистор R14? Я вот подумал и решил - а нужен ли гемморой с транзистором, если вопрос можно решить просто выходом ардуины и диодом, который не пропускает плюс, но пропускает минус на холл для сна?

13-102
14-474
15-202

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

Да, еще, первые 2 минуты экран должен гореть постоянно. (время для загрузки).

papant
19.02.2017, 23:44
13-102
14-474
15-202

спасибо, поправлю, у меня похоже не такие, не помню уже сейчас

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

Что-то не понял как при обесточенной ардуине будет включен планшет? Или он у вас на батарейках?
И инициализация ардуины идет может секунду, пока она не загрузица - планшет всеравно не стартанет и экран не загорит. Короче я у себя временно пока эту дорожку от r15 отрезал и все заработало. скорее всего там номиналы не те, поэтому глючит. Буду плату снимать на доделку (че-та кулер не включается, хотя ардуина говорит что пора), гляну номиналы

Как всегда спасибо за поддержку проекта! )

oleg707
20.02.2017, 00:46
спасибо, поправлю, у меня похоже не такие, не помню уже сейчас

Что-то не понял как при обесточенной ардуине будет включен планшет? Или он у вас на батарейках?
И инициализация ардуины идет может секунду, пока она не загрузица - планшет всеравно не стартанет и экран не загорит. Короче я у себя временно пока эту дорожку от r15 отрезал и все заработало. скорее всего там номиналы не те, поэтому глючит. Буду плату снимать на доделку (че-та кулер не включается, хотя ардуина говорит что пора), гляну номиналы

Как всегда спасибо за поддержку проекта! )

батарея оставлена. Без батареи нестабильно. Надо фарадный кондёр вместо батареи ставить, прямо на плату.

кулер... какой еще кулер? :blink2:

Пожалуйста.

oleg707
20.02.2017, 01:31
на IDE 1.6.12 перестал работать USBasp
не смог прошить по isp. Поиск дал вот что:
http://arduino.ru/forum/apparatnye-voprosy/na-ide-1612-perestal-rabotat-usbasp

выдает ошибки:

avrdude: Warning: cannot query manufacturer for device: No such file or directory
avrdude: Warning: cannot query product for device: No such file or directory
avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'
avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'


Решение
в менеджере плат на 1.6.13 откатитесь
или

(мой вариант) и есть новый драйвер USBASP

http://www.protostack.com/download/USBasp-win-driver-x86-x64-v3.0.7.zip


есть еще решение,, не проверял
прекращаем эти танцы с бубном вокруг драйверов - проблема не в них, а в сломаном avrdude

меняем в дистрибутиве Дуино ИДЕ avrdude.exe на оригинальный https://download.savannah.gnu.org/releases/avrdude/avrdude-6.3-mingw32.zip

papant
20.02.2017, 23:01
батарея оставлена. Без батареи нестабильно. Надо фарадный кондёр вместо батареи ставить, прямо на плату.
кулер... какой еще кулер? :blink2:
Пожалуйста.
Очередной косяк в моей доделке )
Короче, у меня ардуина посылает в сериал всякие полезности с датчиков, например кнопок руля. При первом включении, задержка на ОТГ например 5 секунд, планшет загружается, но не видит на сериале ардуину. стоит переткнуть ОТГ, как ардуина обнаруживается, вылазит окошко от SerialManager - типа использовать это устройство по умолчанию - что говорит о том, что ардуина нашлась и все вроде норм. НО! Если согласиться с предложенным окошком и использовать ардуину вместе с SerialManager, то происходит неведомое - вся конструкция перезагружается. А перезагружается она походу от того, что (ВЕРОЯТНО) идет переинициализация ардуины (выполняется блок setup из скетча). Не уверен что это возможно, ибо я всетаки думаю, что этот блок выполняется единожды при включении ардуины. Тогда если это не так и блок выполняется один раз, то значит ардуина всеравно переходит в какое-то начальное состояние и дергает ногами - при этом микруха вырубает самозапитку, планшет и т.д. Вот думаю повесить кондер чтоль куда-нить - ясно что костыль, только вот куда подвесить его ).
По идее надо бы добиться чтоб при инициализации сериала ардуина не дергала ногами, но как???

Кулер - это просто. У меня в корпусе акромя БП еще есть усилок на TDAшке, она в свою очередь к радиатору, на котором прикручено термосопротивление и ардуина измеряет с его помощью температуру радиатора и по достижении некоторой включает кулер. С этим разобрался, неправильно мосфет был подключен )

oleg707
20.02.2017, 23:57
Очередной косяк в моей доделке )
Короче, у меня ардуина посылает в сериал всякие полезности с датчиков, например кнопок руля. При первом включении, задержка на ОТГ например 5 секунд, планшет загружается, но не видит на сериале ардуину. стоит переткнуть ОТГ, как ардуина обнаруживается, вылазит окошко от SerialManager - типа использовать это устройство по умолчанию - что говорит о том, что ардуина нашлась и все вроде норм. НО! Если согласиться с предложенным окошком и использовать ардуину вместе с SerialManager, то происходит неведомое - вся конструкция перезагружается. А перезагружается она походу от того, что (ВЕРОЯТНО) идет переинициализация ардуины (выполняется блок setup из скетча). Не уверен что это возможно, ибо я всетаки думаю, что этот блок выполняется единожды при включении ардуины. Тогда если это не так и блок выполняется один раз, то значит ардуина всеравно переходит в какое-то начальное состояние и дергает ногами - при этом микруха вырубает самозапитку, планшет и т.д. Вот думаю повесить кондер чтоль куда-нить - ясно что костыль, только вот куда подвесить его ).
По идее надо бы добиться чтоб при инициализации сериала ардуина не дергала ногами, но как???

Кулер - это просто. У меня в корпусе акромя БП еще есть усилок на TDAшке, она в свою очередь к радиатору, на котором прикручено термосопротивление и ардуина измеряет с его помощью температуру радиатора и по достижении некоторой включает кулер. С этим разобрался, неправильно мосфет был подключен )
про сериал у меня 2 варианта. Либо загрузчик убрать - прошить по ISP.
Либо отрезать ресет ардуины от ch340 ( по схеме надо смотреть). Можешь посмотреть при инициализации юсб ардуиной на ресете что происходит. По идее у тебя будет там висеть +5В и сбрасываться в ноль на перезагрузке дуины.

Можно вообще поднять ногу (ресет) атмеги и перез килоом на +5 (питание) повесить. Но это для пряморуких квест :secret:

papant
21.02.2017, 08:00
про сериал у меня 2 варианта. Либо загрузчик убрать - прошить по ISP.

Про ISP очково что-то, у мну на столе лежит уже один труп, в который я пытался по ISP прошивать загрузчик для поддержки ватчдога. как в последствии оказалось это была нано 168, а не 328... может поэтому издохла ). или во фразе "либо убрать загрузчик" имеется в виду не именно убирать загрузчик из памяти, а просто прошивать скетч через ISP? Тогда не страшно, но что это дает

Либо отрезать ресет ардуины от ch340 ( по схеме надо смотреть). Можешь посмотреть при инициализации юсб ардуиной на ресете что происходит. По идее у тебя будет там висеть +5В и сбрасываться в ноль на перезагрузке дуины.

Можно вообще поднять ногу (ресет) атмеги и перез килоом на +5 (питание) повесить. Но это для пряморуких квест :secret:
Пытаюсь измерять, но то ли китайский вольтметр не успевает отследить изменение +5 на 0, либо у мну о5 кривые руки )

oleg707
21.02.2017, 13:01
Про ISP очково что-то, у мну на столе лежит уже один труп, в который я пытался по ISP прошивать загрузчик для поддержки ватчдога. как в последствии оказалось это была нано 168, а не 328... может поэтому издохла ). или во фразе "либо убрать загрузчик" имеется в виду не именно убирать загрузчик из памяти, а просто прошивать скетч через ISP? Тогда не страшно, но что это дает

Пытаюсь измерять, но то ли китайский вольтметр не успевает отследить изменение +5 на 0, либо у мну о5 кривые руки )

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

Убирать загрузчик из памяти это и означает прошивать скетч через ISP:spiteful:

вольтметр не успевает отследить потому как импульс короткий.

oleg707
01.03.2017, 00:42
я тут на сайте MPS инструменты разработчика нашёл.
https://goo.gl/LIx24p
http://www.*******hicpower.com/Design-Support/DC-DC-Designer-Online/Login

papant
01.03.2017, 21:50
Это что вообще такое?
вторая ссыль не открываеца

oleg707
01.03.2017, 22:55
Это что вообще такое?
вторая ссыль не открываеца

вторая ссыль дубль первой. http://pccar.ru почему то её режет.
А это инструменты разработчика для расчета DC-DC преобразователя под свои параметры.

oleg707
02.03.2017, 01:12
перестала отображать после какой то обновы ардуины библиотека на 1602 дисплей. Перешел на новую.
В аттаче скетч плюс 2 библиотеки на 1602 экран и 128x64 Adafruit_SSD1306
46878

lavalamp
06.03.2017, 19:40
Здравствуйте, Олег и другие пользователи помогите с номиналами пожалуйста. Пока сломан компьютер пользуюсь распечатками. Некоторые места не могу найти на схеме либо подписанные номиналы в лейке не совпадают со схемой, не знаю чему верить. Непонятные номиналы обвел красным http://vk.com/photo10894674_456239207

lavalamp
06.03.2017, 19:42
https://pp.userapi.com/c837537/v837537674/2a777/nmAfYSI2JrA.jpg

oleg707
06.03.2017, 22:34
Здравствуйте, Олег и другие пользователи помогите с номиналами пожалуйста. Пока сломан компьютер пользуюсь распечатками. Некоторые места не могу найти на схеме либо подписанные номиналы в лейке не совпадают со схемой, не знаю чему верить. Непонятные номиналы обвел красным http://vk.com/photo10894674_456239207

это БП 3 версии. Как доберусь, сделаю его фото. Главное не забыть.

lavalamp
07.03.2017, 09:04
это БП 3 версии. Как доберусь, сделаю его фото. Главное не забыть.

Буду очень признателен, либо может кто собирал подскажет номиналы

lavalamp
07.03.2017, 09:41
Подскажите что актуальнее схема в splane блок питания от oleg707 29.08.15 или печатная плата которая выше, просто и схемно и элементной они не совпадают. Хочу или переразвести новую либо поправить существующую под свои транзисторы потому что цоколевка совсем не совпала

oleg707
07.03.2017, 14:38
Подскажите что актуальнее схема в splane блок питания от oleg707 29.08.15 или печатная плата которая выше, просто и схемно и элементной они не совпадают. Хочу или переразвести новую либо поправить существующую под свои транзисторы потому что цоколевка совсем не совпала

печатка

mazay66
07.03.2017, 20:53
Олег, не могли бы вы разъяснить вопрос с подзарядкой планшета. Как вам удается питать 13-й нексус через юсб и использовать хаб одновременно?

oleg707
08.03.2017, 00:05
Олег, не могли бы вы разъяснить вопрос с подзарядкой планшета. Как вам удается питать 13-й нексус через юсб и использовать хаб одновременно?

во первых у меня 12.
Во вторых, на хаб отдельный выход +5, а энергию на планшет даём напрямую на батарею. Режим ОТГ. Автоматизация по датчику холла.

mazay66
08.03.2017, 23:36
Эээ., почему-то решил, что вы уже перешли на 13-й. Вроде бы где-то такое читал. Значит ошибся. По 12-у вопросов нет, там и пого пин можно использовать. Так это вы говорили про страшные тормоза на 6-м и 7-м андроиде применительно к 12-у? Это было и так очевидно, Tegra - слабоват. Я почему-то решил, что вы экспериментировали с 13-м андроидом и вернулись на прошивку 4.4.4. Всё перепутал, виноват.

oleg707
09.03.2017, 01:08
Эээ., почему-то решил, что вы уже перешли на 13-й. Вроде бы где-то такое читал. Значит ошибся. По 12-у вопросов нет, там и пого пин можно использовать. Так это вы говорили про страшные тормоза на 6-м и 7-м андроиде применительно к 12-у? Это было и так очевидно, Tegra - слабоват. Я почему-то решил, что вы экспериментировали с 13-м андроидом и вернулись на прошивку 4.4.4. Всё перепутал, виноват.

не, у меня всё интереснее.
12 у меня ездит в машине, в качестве мультимедиа системы.
13 у меня используется дома, в качестве планшета ( заодно новые программы и технологии на нём могу обкатать. Это ж не инсталл снимать).
:big:

lavalamp
09.03.2017, 16:11
День добрый, подскажите собрал 3ю версию платы и даже на холостом ходу Кив тепленький, так же и было в предыдущих блоках, но те и не были хороши. Так вот нормально ли это что он греется?

oleg707
09.03.2017, 19:10
День добрый, подскажите собрал 3ю версию платы и даже на холостом ходу Кив тепленький, так же и было в предыдущих блоках, но те и не были хороши. Так вот нормально ли это что он греется?

да, это особенность работы дс-дс преобразователей.

lavalamp
10.03.2017, 10:01
http://vk.com/photo10894674_456239210
Добрый день собрал схему и получается так что на выходе 5в у меня все время открыт транзистор,сейчас нет ардуино по идее он должен быть закрыт,но у меня вышло что вольты проходят через внутренний диод. Единственное решение виду это поменять sourse и drain местами. Тогда получится что и во всей схеме нужно это сделать. Правильно ли я думаю?

lavalamp
10.03.2017, 10:03
https://pp.userapi.com/c837537/v837537674/2b0cd/u78JCznle14.jpg

oleg707
10.03.2017, 18:52
http://vk.com/photo10894674_456239210
Добрый день собрал схему и получается так что на выходе 5в у меня все время открыт транзистор,сейчас нет ардуино по идее он должен быть закрыт,но у меня вышло что вольты проходят через внутренний диод. Единственное решение виду это поменять sourse и drain местами. Тогда получится что и во всей схеме нужно это сделать. Правильно ли я думаю?

да, надо поменять sourse и drain местами.
на схеме неправильно, на печатке правильно.
Отмою 3ю версию от канифоли, сделаю фотки - нету времени.

oleg707
11.03.2017, 01:55
ФОТО БЛОКА 3й ВЕРСИИ (https://mega.nz/#F!MlBUQTZJ!4bg-F1e60gkQ9h1AGPfnXQ)
поскольку плата первой ревизии, то присутствует навесной монтаж. В печатках последней ревизии он уже нарисован на плате.

papant
11.03.2017, 17:56
Олег, вопрос:
хочу управлять ногой А3 как цифровым выходом. Такая запись правильная?
DDRC = 0b00001000;
//pinMode(A3, OUTPUT);
И потом чтоб до него добраться делаю так:
if (REM == 1){ PORTDregistr |= (1 << 3); } else {PORTDregistr &= ~((1 << 3));}
Оно вроде включается, но вот когда выключается, то почему-то происходит сброс ардуины в начальное состояние и загрузка планшета начинается с выключенного положения.

oleg707
11.03.2017, 18:24
Олег, вопрос:
хочу управлять ногой А3 как цифровым выходом. Такая запись правильная?
DDRC = 0b00001000;
//pinMode(A3, OUTPUT);
И потом чтоб до него добраться делаю так:
if (REM == 1){ PORTDregistr |= (1 << 3); } else {PORTDregistr &= ~((1 << 3));}
Оно вроде включается, но вот когда выключается, то почему-то происходит сброс ардуины в начальное состояние и загрузка планшета начинается с выключенного положения.

не.
у вас не обьявлено uint8_t PORTСregistr = 0;
и boolean A3= 0; (цифры в имени КРАЙНЕ нежелательны).

либо DDRС = 0b00001000;
PORTC = 0b00001000;

Либо если через переменную, то запись в регистр должна быть
if (А3== 1){ PORTCregistr |= (1 << 3); } else {PORTCregistr &= ~((1 << 3));}
PORTC = PORTCregistr;
Только вы учтите, что регистры А0 и А1 трогать нельзя, у них то аналогинпут.

Вроде так. поверьте и отпишитесь.

Да, еще, коль затронули тему, вот новый скетч с реализацией АВТОКАЛИБРОВКИ АСС и АКБ. С записью в еепром.
ПОЛНОСТЬЮ ТЕСТОВЫЙ. На столе работает. Защита от дурака слабая, но есть.
Ну вот, написал, теперь придётся видео снимать, как запускать автокалибровку:dntknw:

byte ver = 12;// ( чем больше цифра, тем новее)
// дата правки 11.03.17.1717

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 252)
//ТЕСТОВАЯ! пока норм.
// скетч проверен и записан на версии ардуино IDE 1,6,12 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например 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
/* _
хотелки
strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
сделать автоматическую калибровку с записью значений в еепром ( A7 a2 ножка)
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, c версии 63 включительно поменяна библиотека вывода на экран. НОВАЯ ВЗЯТА https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше 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 - возможность калибровки с записью в еепром, переделан метод вывода на дисплей ( теперь через две функции (формирования строк и непосредственно вывода.), а не в основном цикле), убрн вотчдог, как не имеющий практического смысла( пока что просто заккоментирован).
__________________________________________________ ______________

потребление блока по 12 вольтам, без планшета - при 10В +30 и +15 выключены - 0,02 А
- при 12В +30 и +15 включены - 0,092-0,1 А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает */


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

uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;

//************************************************** ************************************************** ***********************************************

#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 дисплей



//LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например

LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347

float UakbONorOFF = 12.1;// в 258 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.4;//11.1 // напряжение порога сработки асс
float U_acc_real = 0; // реальное напряжение +ACC на входе делителя (A0)
float U_akb_real = 0; // реальное напряжение +30 на входе делителя (A1)
int Uacc = 0; //Читаем напругу с делителя ACC R4-R5 0-1024 analogRead(A0);
int Uakb = 0; ////Читаем напругу с делителя R2-R3 0-1024 analogRead(A1);

/*ноги ардуины*/
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 = 10; /*управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или 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


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

/*логические переменные, используемые в коде*/
boolean 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); // значение для калибровки для делителя АКБ

boolean flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long pauseTimeHALL = 140000; /* время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин*/
int timeAfterACC = 5000; /* время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg*/
unsigned long TimerREM = 0; /* отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long timeBeforeRemOff = 1800000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
//unsigned long timeBeforeRemOff = 180000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
unsigned long TIMER = millis();
int H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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 (SLEEP == 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 (OTG == 1) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

// PORTDregistr - обрабатывем регистры порта D атмеги

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 (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 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 ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~



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



// wdt_disable(); //Отключение таймера watchdog
Serial.begin(115200);
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
if( kalibrovkaACC == 255 ){kalibrovkaACC=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию
if( kalibrovkaAKB == 255 ){kalibrovkaAKB=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию =127

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины

DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; /* PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);
pinMode(A2, INPUT); // пин калибровки
digitalWrite(A2, 1); // подтяжка +5 пина калибровки

// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
// wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

void IntToCharI(int num, char *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 num, char *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 num, char *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 num, char *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 num, char *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 printDISPLAY() //функция формирования информации на дисплей ( точнее на два: 128*64 и 1602)
{
//_____________________________________________ФОРМИ РУЕМ СООБЩЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________

H = (millis()/3600000);
M = ((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 + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)


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



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

if (kalibrovkaNOW >= 1 && 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 111 0.000| 1 строка * вывод времени работы блока H:M * AKB ACC REM * вывод напряжения АСС
|2616 1110 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * OTG HUB POGO HALL * вывод напряжения АКБ


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

//Serial.print("strokaII = "); Serial.println(strokaII);
lcd.setCursor(0, 1); //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 analogReadU (byte averageFactor) //функция усреднённого чтения аналоговых входов (A0 A1)
{//void analogReadU
int newUacc = analogRead(A0); // замер для 5й версии
int newUakb = analogRead(A1); // замер для 5й версии
//int newUacc = analogRead(A1); // замер для 4й версии
//int newUakb = analogRead(A0); // замер для 4й версии
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(A2)== 1 && kalibrovkaNOW < 6) {kalibrovkaNOW ++;}
else // тут достигли 6 касаний точки калибровки и ЗАПУСКАЕМ НЕПОСРЕДСТВЕННО ПРОЦЕСС КАЛИБРОВКИ ( ДЛЯ ЭТОГО ПОДАЁМ РОВНО 12,00В НА БЛОК ПИТАНИЯ ( асс и акб)
{ //else
if (kalibrovkaNOW >= 6)
{//if (kalibrovkaNOW >= 6)
PORTBregistr = 0; // выключили всё
PORTDregistr = 0; // выключили всё
UPRAVLENIE_PINAMI(); // сказали регистрам исполнить " выключили всё ", вызвав функцию
delay (600); // для зарядки кондёров после снятия нагрузки
analogReadU (10); //вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(10)раз
kalibrovkaACC = 1200000/Uacc-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
kalibrovkaAKB = 1200000/Uakb-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
{kalibrovkaNOW ++;}
}//if (kalibrovkaNOW >= 6)
}//else
if ( kalibrovkaNOW == 15 && digitalRead(A2)== 0) //по достижению счета в 254 и ПРИ МАССЕ НА ПИНЕ КАЛИБРОВКИ данные калибровки запишутся в еепром
{
kalibrovkaNOW = 255;
EEPROM.write(0,kalibrovkaACC);
EEPROM.write(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 loop()
{while (1){//для ускорения void loop

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

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

/*
if ( digitalRead(A2)== 1 ) { kalibrovkaNOW = 255 ;} // после 60с калибровку НЕ ДЕЛАЕМ
if (digitalRead(A2)== 0) { if( (727 < Uakb && Uakb < 848) && (727 <= Uacc && Uacc <= 848)) {kalibrovkaNOW ++; rejim_kalibrovki();} }
*/



/* // старое вычисление реального напряжения, без учета значений еепром, по Т11 включительно
U_acc_real = 0.0 + Uacc * 153.7/10000;//(5 / 1023.0 * 3.136); Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления) 0.2-падение на диоде
U_akb_real = Uakb * 153.30/10000;//(5 / 1023.0 * 3.145); Вычисляем реальное напряжение +30 на входе делителя (A1) */

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


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

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 2000;} //выключили зажигание /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 7000;}//стартуем /* 5000 0 - заводим машину (стартуем).*/
if (U_akb_real >= 15.5){timeAfterACC = 0;}
// ввести новую переменную int starting_mode = 1;//стартуем 0 = не_стартуем.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


// ------------========================== блок ACC ========================-----------------------------------------------------------------------------


// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((15.5 > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
//lcd.clear(); //очистка экрана не нужна со строковым выводом
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея
}


if (flagACC ==1 )
{// если flagACC == 1

if (millis() - pauseTimeACC >= 1100 ) /* пауза 1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на Y-OTG (включается звуковая карта) // тестово, для более устойчивого определения перифирии.*/
II_KIW_pin_POGO = 1; //digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
HUB =1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб*/
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета (in2) = этим подаём 12В на KIW3312s. На 1м канале КИВ сразу появляется напряжение (3,8-4,2 - как настроено)*/
//display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
//display2.clearDisplay(); // для 1306 дисплея
//display2.setTextColor(WHITE); // для 1306 дисплея
}


if (millis() - pauseTimeACC >= 1500 )/*через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)*/
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}

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

}

}// если flagACC == 1


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

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



//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------

if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
//REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
//flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)

if (((millis() - pauseTimeACC) >= (timeAfterACC-1000)) ) // тут 1000 это на сколько раньше выключать выход REM перед остальными выключениями
{
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
}

if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 6c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (2500+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (3000+timeAfterACC)) )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
}

if ( ((millis() - pauseTimeACC) >= (7000+timeAfterACC)) )
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
}
}// if (flagACC==0)


// -------------------------========================= блок АКБ ==========================-------------------------------------------------------------------------------


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

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

if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >15.5))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = 11.9;
//lcd.clear(); //очистка экрана
}

if ((millis() - pauseTimeAKB >= 20000) && flagAKB == 0) /* если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)*/
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается*/
//delay (5000); /* задержка для аппаратного выключения*/
}

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

if ((millis() - pauseTimeAKB) >= 172800000 && flagAKB == 1) /* если давно выключили ACC ) (2суток = 172800000)) (самозапитка для регистратора)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (3000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



/*
//******************************************отслежив ания аварийной ситуации ITS716G (превышение по току по выходам out1-4)************************************************ ************************************************** ************************************************** ****************************


//*отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//*отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"

if(SAMOZAPITKA==1 || PlanshBAT ==1 ||REM==1 || REGISTRATOR ==1) // если проц включал любой канал ITS
{


STATEpinI = digitalRead(5); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
STATEpinII = digitalRead(8);
if(STATEpinI == 0) { // и если пин защиты STATEpinI показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты STATEpinII показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI();delay(493); LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
}

//************************************************** ************************************************** ************************************************** ************************************************** ******************
*/

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

ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}




// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;
printDISPLAY(); // выводим на дисплей раз в 350( запуская фушкцию)
}

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

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

UPRAVLENIE_PINAMI();

//wdt_reset(); /*Сброс таймера watchdog*/

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

papant
11.03.2017, 23:09
Да, с вашей правкой заработало
Теперь другая проблема - начал щелкать КИВ на 2-ом канале (где ХАБ висит), выкл вкл иногда помогает и канал запускается. Это он издох?

oleg707
11.03.2017, 23:24
Да, с вашей правкой заработало
Теперь другая проблема - начал щелкать КИВ на 2-ом канале (где ХАБ висит), выкл вкл иногда помогает и канал запускается. Это он издох?

кондёр по выходу стоит? или КЗ по выходу, или косяк по управлению. Смотри что по ss\sd1. 2 висит и по выходу. Можешь свои +5 подать.

oleg707
12.03.2017, 15:39
как сделать калибровку БП5 верс T12 (https://www.youtube.com/watch?v=MmqlD5PbX7Q)

ZoomZoom
12.03.2017, 23:08
Как к кису припоять подстроечный резистор ?

Какие ножки куда фото есть ?

oleg707
12.03.2017, 23:42
Как к кису припоять подстроечный резистор ?

Какие ножки куда фото есть ?

к кису нет, к киву есть. К кису гуглится за 2 минуты.

ZoomZoom
13.03.2017, 00:48
к кису нет, к киву есть. К кису гуглится за 2 минуты.

нашел , сделал работает.

Сколько кто подает напругу на планшет без батарее?
И сколько на хаб?

oleg707
13.03.2017, 01:03
нашел , сделал работает.

Сколько кто подает напругу на планшет без батарее?
И сколько на хаб?

вы шапку читали? или я там забыл картинки вставить?
5,0 хаб, юсб, пого.
3,8-4,2 батарея.
У меня сейчас 4,0. На 3,8 больше года стабильно.

papant
14.03.2017, 00:26
Сегодня пала смертью храбрых микруха 716, стала ни с того ни с сего аццки греца, прозвонка показала пробой одного из каналов (который шел на КИВ). Что ему не хватило не знаю. я правильно понимаю, что этот канал можно легко заменить полевиком P-проводимости или не правильно? Ни у кого не издыхала микруха? коротких вроде не делал, все аккуратно.... не понятно короче

jonikus81
14.03.2017, 07:56
минута молчания...
да, заменить можно, но не одним полевиком, а ключиком (транзистор+ полевик или полевик + полевик).
http://s011.radikal.ru/i318/1703/2b/1a2e557e91e1.jpg (http://radikal.ru)

skanch
14.03.2017, 10:16
Сегодня пала смертью храбрых микруха 716, стала ни с того ни с сего аццки греца, прозвонка показала пробой одного из каналов (который шел на КИВ). Что ему не хватило не знаю. я правильно понимаю, что этот канал можно легко заменить полевиком P-проводимости или не правильно? Ни у кого не издыхала микруха? коротких вроде не делал, все аккуратно.... не понятно короче
Неплохо бы сначала найти причину выхода из строя 716... Если вышел из строя только один канал (логика работает параллельно на два канала), то "накрылся" внутренний MOSFET. Если "стала ни с того ни с сего аццки греца", то на выходе канала было КЗ и искать уже дальше по схеме, что микра коммутировала на этом канале. Конечно всегда остается вариант брака самой микры, но вероятность такого случая очень мала. И обратите внимание на "близнеца" 716 (http://www.farnell.com/datasheets/1685501.pdf) - это BTS 724G. (http://datasheet.octopart.com/BTS724G-Infineon-datasheet-12554833.pdf) Эта микросхема имеет немного лучшие характеристики чем 716... Расположение ног идентичное.

papant
14.03.2017, 13:14
Неплохо бы сначала найти причину выхода из строя 716...

Спасибо за схему. А обязательно использование двух полевиков? Ведь автор БП использует один на ОТГ, ПОГО-пин и т.д. и вроде все работает...

alexfox
14.03.2017, 13:36
минута молчания...
да, заменить можно, но не одним полевиком, а ключиком (транзистор+ полевик или полевик + полевик).
http://s011.radikal.ru/i318/1703/2b/1a2e557e91e1.jpg (http://radikal.ru)
На схеме перепутаны местами клеммы подключения p-канала "+12V" и "+нагрузка".

oleg707
14.03.2017, 14:00
не дурите головы, 716 и 724 - в случае выхода из строя - только полная замена. Дело не в том, что транзюками можно заменить, дело в внутренней аппаратной защите от КЗ и прочих плюшках - читайте даташит.
Если вам так неймётся, то в 716 -724 4 канала.
2 важных ( KIW, ардуина) и REM и регистратор.
Вот можете взять канал регистратора.
В даташите есть картинка с распиновкой.
ПЕРЕД этим отдельно подайте питание на KIW (+12) и проверьте стабильный выход +5 и +4,0.

jonikus81
14.03.2017, 16:12
На схеме перепутаны местами клеммы подключения p-канала "+12V" и "+нагрузка". спасибо, да так и есть, на быструю руку набрасывал :blush:

Xoma43
14.03.2017, 19:57
Олег подскажите пожалуйста. Сразу скажу, что с электроникой и паяльником пользовался второй раз в жизни)) но, если показать и объяснить, то вроде доходит.
Собрал БП 5 версии по вашей схеме, вроде все спаял,но подключив ничего не произошло,БП не включился. Решил проверить мультиметром, 12 вольт подходит к ITS 716, а вот уже не выходит к VIN на КИВ. Это значит ITS неисправен? Если подключаю 12 вольт напрямую к КИВ на VIN и GDN, то на выходе где то по 3 вольта на обоих каналах.
Объясните пожалуйста, где искать что? Желательно по пунктам. Если подключаю 12 вольт к SS/SD2 , то на ардуине загорается PWR.

oleg707
14.03.2017, 20:11
Олег подскажите пожалуйста. Сразу скажу, что с электроникой и паяльником пользовался второй раз в жизни)) но, если показать и объяснить, то вроде доходит.
Собрал БП 5 версии по вашей схеме, вроде все спаял,но подключив ничего не произошло,БП не включился. Решил проверить мультиметром, 12 вольт подходит к ITS 716, а вот уже не выходит к VIN на КИВ. Это значит ITS неисправен? Если подключаю 12 вольт напрямую к КИВ на VIN и GDN, то на выходе где то по 3 вольта на обоих каналах.
Объясните пожалуйста, где искать что? Желательно по пунктам. Если подключаю 12 вольт к SS/SD2 , то на ардуине загорается PWR.

прошивка залита? АСС и АКБ ( 14В ) поданы? Дисплей I2C есть? Светодиод как моргает?

Xoma43
14.03.2017, 20:20
прошивка залита? АСС и АКБ ( 14В ) поданы? Дисплей I2C есть? Светодиод как моргает?

Да прошивку T03 заливал через USBasp. Дисплей есть. Светодиод PWR горит постоянно при подаче напрямую SS/SD2.

oleg707
14.03.2017, 20:58
Да прошивку T03 заливал через USBasp. Дисплей есть. Светодиод PWR горит постоянно при подаче напрямую SS/SD2.

не, не так.
Откройте даташит на 716. Посмотрите. Там 4 входа, включаются от +5.
При включении зажигания от АСС через делитель идёт +5В на включение канала ( IN-OUT 4), its включает 4 канал, подав питание на диоды и потом на Vin ардуины. На дуине загорается светодиод питания и включается дисплей.
Если этого нет, то в дебри не лезем.

oleg707
14.03.2017, 21:00
Насколько я посмотрел свой канал ютуб, описание БП 5 версии я не делал. Надо ли это кому набудь, отпишитесь. А то не хочется час времени убивать.

Xoma43
14.03.2017, 21:10
на VIN ардуины сколько должно поступать напруги? У меня на дорожке к нему где то 12.25 при выходе с БП 14, а вот меряю на самом кантакте VIN 1.27. Значит контакт плохой?

Xoma43
14.03.2017, 21:14
Насколько я посмотрел свой канал ютуб, описание БП 5 версии я не делал. Надо ли это кому набудь, отпишитесь. А то не хочется час времени убивать.

Желательно бы. Лишние вопросы может бы отпали.

oleg707
14.03.2017, 21:35
на VIN ардуины сколько должно поступать напруги? У меня на дорожке к нему где то 12.25 при выходе с БП 14, а вот меряю на самом кантакте VIN 1.27. Значит контакт плохой?

если на входе диодов есть 12В, то диодам хана (любой 1 из 3х). я ща для опыта диоды выкинул и 75 ом резак закинул. Но пока не ездил.

Xoma43
14.03.2017, 22:06
если на входе диодов есть 12В, то диодам хана (любой 1 из 3х). я ща для опыта диоды выкинул и 75 ом резак закинул. Но пока не ездил.

А сколько там тогда должно быть? ITS же выдает? Надо все таки описание блока питания.

papant
15.03.2017, 08:43
описание бы конечно не помешало, хотя я уже с ним за столько времени разобрался досконально ).
по вашему вопросу - можно ардуину пока достать чтоб случайно не спалить. АСС выключен. проверяем микруху - на выходах из нее должно быть 0 на всех 4 выходах. (если на этом этапе не работает - единственный вариант на мой взгляд это наоборот впаяна микруха ). Если до этого этапа все отработало норм - далее вкл АСС, на одном из выходов микрухи, который идет на диоды, должно появиться 12 В. Если нет - смотрим обрывы и правильно ли впаяна микруха ну или как вариант (мой) - перетравилась одна из дорожек ). Если все норм и на этом этапе - вставляем ардуину, она должна бодро замигать лампочкой на пине13 (точно так же как она мигает при прошитом скетче по USB). Как до этого этапа дойдете - отпишитесь ).

papant
15.03.2017, 09:00
кстати, друзья! может у кого есть в хозяйстве лишняя микруха 716 или 724, а то из китая ждать месяц, также не помешал бы кив 1-2 штуки, а то остался последний и начинаю переживать как бы он не издох раньше времени )

Xoma43
15.03.2017, 12:32
описание бы конечно не помешало, хотя я уже с ним за столько времени разобрался досконально ).
по вашему вопросу - можно ардуину пока достать чтоб случайно не спалить. АСС выключен. проверяем микруху - на выходах из нее должно быть 0 на всех 4 выходах. (если на этом этапе не работает - единственный вариант на мой взгляд это наоборот впаяна микруха ). Если до этого этапа все отработало норм - далее вкл АСС, на одном из выходов микрухи, который идет на диоды, должно появиться 12 В. Если нет - смотрим обрывы и правильно ли впаяна микруха ну или как вариант (мой) - перетравилась одна из дорожек ). Если все норм и на этом этапе - вставляем ардуину, она должна бодро замигать лампочкой на пине13 (точно так же как она мигает при прошитом скетче по USB). Как до этого этапа дойдете - отпишитесь ).

Хорошо, попробую когда домой приеду, пока на работе.

oleg707
15.03.2017, 13:43
ОПИСАНИЕ ЖЕЛЕЗА БП5 (https://youtu.be/9JHC0zdvXm4)
Делалось на скорую руку с отходняком после зубного:eat::sty000::secret:

rsoft_andrey
15.03.2017, 21:09
Ну теперь осталось выложить последнюю версию схемы со всеми исправлениями и наминалами деталей и навести небольшой порядок в шапке и будет нормуль.

ZoomZoom
15.03.2017, 21:16
http://s45.radikal.ru/i109/1703/fe/1084ed9a7569.jpg


с таким блоком езжу

papant
15.03.2017, 21:25
с таким блоком езжу

И к чему это? Оффтопик явный

ZoomZoom
15.03.2017, 21:31
И к чему это? Оффтопик явный

наглядный пример без разного геморроя все просто все работает уже как пол года

oleg707
15.03.2017, 22:12
наглядный пример без разного геморроя все просто все работает уже как пол года

ну это у вас еще сложно:shok::big:
У меня ПЕРВЫЙ блок питания был сделан в виде покупного зарядного в прикуриватель, +5В 2А. Правда припаянного к пого пинам (+ -)
Приехал - вытянул зарядку.
В планшете автоматизатор по наличию зарядки включал-тушил экран.

Кто делал еще проще?:rofl:

Xoma43
15.03.2017, 22:17
описание бы конечно не помешало, хотя я уже с ним за столько времени разобрался досконально ).
по вашему вопросу - можно ардуину пока достать чтоб случайно не спалить. АСС выключен. проверяем микруху - на выходах из нее должно быть 0 на всех 4 выходах. (если на этом этапе не работает - единственный вариант на мой взгляд это наоборот впаяна микруха ). Если до этого этапа все отработало норм - далее вкл АСС, на одном из выходов микрухи, который идет на диоды, должно появиться 12 В. Если нет - смотрим обрывы и правильно ли впаяна микруха ну или как вариант (мой) - перетравилась одна из дорожек ). Если все норм и на этом этапе - вставляем ардуину, она должна бодро замигать лампочкой на пине13 (точно так же как она мигает при прошитом скетче по USB). Как до этого этапа дойдете - отпишитесь ).
Нашел причину почему не включалась ардуина, был плохой контакт к Vin, припоял перемычку от дорожки к ноге ардуины и появилось питание, загорелся светодиод PWR и L, но издавались какие то щелчки, перевернул плату и услышал звук от ITS, решил пропаять ножки получше, далее подключил питание без ACC и сразу же загорелись светодиоды на ардуине и от ITS пошло какое то шипение. Короче думаю спалил я ITS.

papant
15.03.2017, 22:21
похоже на то, раз без ITS (читай без АСС) питание поступает, не должно. ITSы еще есть? а то я сегодня заказал, жду месяц и по получении могу поделица )

Xoma43
15.03.2017, 22:27
похоже на то, раз без ITS (читай без АСС) питание поступает, не должно. ITSы еще есть? а то я сегодня заказал, жду месяц и по получении могу поделица )

Еще одна есть) Лишь бы вторую не спалить. А так спасибо за предложение, тем более рядом почти живем)))

papant
15.03.2017, 22:55
Еще одна есть) Лишь бы вторую не спалить. А так спасибо за предложение, тем более рядом почти живем)))
Смотри внимательно из-за чего издохла микруха. неправильно впаял? коротнул по выходу?

Xoma43
15.03.2017, 22:59
Смотри внимательно из-за чего издохла микруха. неправильно впаял? коротнул по выходу?

Даже не в курсе. Может быть припоял как нить криво.

oleg707
15.03.2017, 23:00
Смотри внимательно из-за чего издохла микруха. неправильно впаял? коротнул по выходу?

там защита от короткого, я из принципа пинцетом коротил.

papant
15.03.2017, 23:56
Олег, сейчас спрошу очередную ерунду:
Итак, у меня проблема, детская причем. Дано: усилок, который надо включать этим БП, усилок китайский, вот такой (https://ru.aliexpress.com/item/TDA7850-Car-Audio-Power-Amplifier-Board-Stereo-4-50W-with-BA3121-Denoiser-DC-12V/32611516500.html?spm=2114.10010208.1000016.1.eK7K6 A&isOrigTitle=true). Т.е. у него нет разъемчика включения по REM, нужно скоммутировать именно влючение. Делаю это обычным релейным модулем вот таким (https://duino.ru/product_info.php/info/p2424_Modul-rele-dvuh-kanalnyi-10A.html), умеет активироваться хоть по высокому уровню, хоть по низкому. ОК. Стандартно подключают такой модуль на выход ардуины +5, землю на землю, активацию реле на какой-нить пин ардуины. вроде все понятно и должно бы работать - но скетч выполняется только до того места, когда должно было бы активироваться реле (на выходе реле нагрузки при этом нет даже!!!). Т.е. скетч выполняется до активации реле (смотрю по экрану LCD) и вот он долгожданный щелчек реле и ... происходит моргание экраном, перезагруз планшета, лампочка ардуины тоже успевает моргнуть, при всей этой вакханалии реле очевидно обратно отскакивает. тут снова оживает ардуина и срабатывает реле второй раз (как будто очнулась ардуина и смотрит что реле отпущено ). Короче со стороны это выглядит как активация усилка с двойным щелканьем реле и перезагрузом планшета. И потом все работает норм до следующего "поворачивания ключа АСС" на столе. Что это такое понять не могу. Думал может питалова с ардуины много берет и в момент активации ей не хватает и она уходит в ребут. Меры борьбы - добавлял кондер, переключал реле на выход для планшета (к выходу кива), пробовал активировать не высоким уровнем, а низким - нифига, проблема остается. читал тут по инету, у людей такие проблемы тоже есть, но только когда коммутируют большую нагрузку (трехфазный движок или что-то подбное), типа наводки в сигнальных проводах и т.д. Но блин у меня с нагрузочной стороны реле концы висят в воздухе и как бороться с этой проблеммой пока не представляю. Кстати заметил, что если запитать ардуину от компа по ЮСБ, то отрабатывает все вроде нормуль, если запитывать БП от моего сетевого хранилища (12В 3А), то опять начинается эта чехарда с реле. Походу от этого у меня и издох КИВ на втором канале, утянув за собой микруху единственную ((((. Щас сижу в ожидании новой с китаю в размышлениях о моей проблеме с подключением реле. Если коммутировать не релюхой, а полевиком мощным поможет нет? или греться будет безбожно?

oleg707
16.03.2017, 00:41
Олег, сейчас спрошу очередную ерунду:
Итак, у меня проблема, детская причем. Дано: усилок, который надо включать этим БП, усилок китайский, вот такой (https://ru.aliexpress.com/item/TDA7850-Car-Audio-Power-Amplifier-Board-Stereo-4-50W-with-BA3121-Denoiser-DC-12V/32611516500.html?spm=2114.10010208.1000016.1.eK7K6 A&isOrigTitle=true). Т.е. у него нет разъемчика включения по REM, нужно скоммутировать именно влючение. Делаю это обычным релейным модулем вот таким (https://duino.ru/product_info.php/info/p2424_Modul-rele-dvuh-kanalnyi-10A.html), умеет активироваться хоть по высокому уровню, хоть по низкому. ОК. Стандартно подключают такой модуль на выход ардуины +5, землю на землю, активацию реле на какой-нить пин ардуины. вроде все понятно и должно бы работать - но скетч выполняется только до того места, когда должно было бы активироваться реле (на выходе реле нагрузки при этом нет даже!!!). Т.е. скетч выполняется до активации реле (смотрю по экрану LCD) и вот он долгожданный щелчек реле и ... происходит моргание экраном, перезагруз планшета, лампочка ардуины тоже успевает моргнуть, при всей этой вакханалии реле очевидно обратно отскакивает. тут снова оживает ардуина и срабатывает реле второй раз (как будто очнулась ардуина и смотрит что реле отпущено ). Короче со стороны это выглядит как активация усилка с двойным щелканьем реле и перезагрузом планшета. И потом все работает норм до следующего "поворачивания ключа АСС" на столе. Что это такое понять не могу. Думал может питалова с ардуины много берет и в момент активации ей не хватает и она уходит в ребут. Меры борьбы - добавлял кондер, переключал реле на выход для планшета (к выходу кива), пробовал активировать не высоким уровнем, а низким - нифига, проблема остается. читал тут по инету, у людей такие проблемы тоже есть, но только когда коммутируют большую нагрузку (трехфазный движок или что-то подбное), типа наводки в сигнальных проводах и т.д. Но блин у меня с нагрузочной стороны реле концы висят в воздухе и как бороться с этой проблеммой пока не представляю. Кстати заметил, что если запитать ардуину от компа по ЮСБ, то отрабатывает все вроде нормуль, если запитывать БП от моего сетевого хранилища (12В 3А), то опять начинается эта чехарда с реле. Походу от этого у меня и издох КИВ на втором канале, утянув за собой микруху единственную ((((. Щас сижу в ожидании новой с китаю в размышлениях о моей проблеме с подключением реле. Если коммутировать не релюхой, а полевиком мощным поможет нет? или греться будет безбожно?
Модуль реле к +5В ардуины подключен?!
А, всё, прочитал внимательно еще раз, так ты и подключил.
Так НЕЛЬЗЯ. У БП +5 берется с встроенного стаба, а тот через диоды питается. Там такой бросок тока идёт при попытке коммутации:secret:!


Сделай проще, возьми простое реле, один конец катушки на массу, второй на выход REM.
Параллельно катушке желательно поставить диод для защиты от обратного броска тока. Полоской на REM, треугольником на массу.
И делай абзацы, читать очень неудобно.:acute:
А вообще я бы полевик повесил, там до 100 ампер можно токами рулить:be: а размер меньше. Схему можешь подсмотреть в БП3, там REM полевиком управляется.

Если не получится, я у себя на столе попробую реле включить. ТОлько не модуль , а реле именно.

papant
16.03.2017, 07:56
Модуль реле к +5В ардуины подключен?!
А, всё, прочитал внимательно еще раз, так ты и подключил.
Так НЕЛЬЗЯ. У БП +5 берется с встроенного стаба, а тот через диоды питается. Там такой бросок тока идёт при попытке коммутации:secret:!
Так я пробовал и со второго канала КИВа брать питалова модуля - один хрен двойной щелчек и ребут планшета происходит. Куда уж больше тока то??? Тут мне кажется именно чего-то с помехой от щелчка реле чтоль, думаю в сторону или фильтра RC, ферритового кольца (только что на него мотать пока не придумал - провода питания от реле, провод от пина ардуины или все вместе) или голову не парить и пользовать мощный полевик. Склоняюсь к полевику ). Как правильно его расчитать? Усилок имеет 4*50 Вт (китайских), честных наверное около 20-25. Это что, всего пару ампер через полевик пойдет или я не догоняю чего-то? Нужен ли будет радиатор для него? Брать лучше который стоком на плату пояется лежа как все остальные в этом БП или стоячий с радиатором отдельным (и на сколько большим)?


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

Ну вот это то как раз и не по феншую совсем. Пин ардуины вроде до 40 мА смогает выдать, а катушка будет жрать около 100. Издохнет пин однозначно, не сразу так потом

jonikus81
16.03.2017, 08:02
Олег, спасибо за видео. Эх, еслиб ты его выложил когда я только начал разбираться с блоком, с месяц точно съэкономил мне бы гемороя)) Теперь видео будет очень полезно для таких новичков как я в будущем.

oleg707
16.03.2017, 14:59
Ну вот это то как раз и не по феншую совсем. Пин ардуины вроде до 40 мА смогает выдать, а катушка будет жрать около 100. Издохнет пин однозначно, не сразу так потом

Выход REM - это НЕ управляющий с ардуины, а выход с ITS для включения "взрослого" усилителя. до 2,4 А ток вас устроит?
То есть вместо REM усилка провод с выхода БП5 подключить к рэле. Когда надо включить усилок, БП5 выдаёт на REM +12В. Я ж в видео объяснял принцип действия.

А вообще усилок можно запитать от замка зажигания или разгрузочного реле. В вашем случае - с ISO фишки, которая шла по заводу на магнитолу. По той линии предохранитель штатно должен стоять, ампер 10-15.

Xoma43
24.03.2017, 21:56
Олег подскажите в чем может быть дело? Пересобрал блок питания, начал смотреть видео и проверять работоспособность блока и выяснил, что не идет питания после делителя , а точнее после R7. В чем может быть дело? Дорожки целые, резистор перепаивал. Незнаю уже в чем дело.

oleg707
24.03.2017, 22:10
Олег подскажите в чем может быть дело? Пересобрал блок питания, начал смотреть видео и проверять работоспособность блока и выяснил, что не идет питания после делителя , а точнее после R7. В чем может быть дело? Дорожки целые, резистор перепаивал. Незнаю уже в чем дело.

отпаять D1.
ITS той стороной запаян? на С1 +12 есть?
Померять сопротивление от массы к D1.

Xoma43
24.03.2017, 22:19
отпаять D1.
ITS той стороной запаян? на С1 +12 есть?
Померять сопротивление от массы к D1.

ITS да той стороной, это точно. Да к С1 подходит +12. Напишу как померяю сопротивление, а то на работу на сутки. А сколько должно быть сопротивление?

oleg707
24.03.2017, 22:21
ITS да той стороной, это точно. Да к С1 подходит +12. Напишу как померяю сопротивление, а то на работу на сутки. А сколько должно быть сопротивление?

не кз, так точно. больше килоома.

oleg707
24.03.2017, 22:28
byte ver = 13;// ( чем больше цифра, тем новее)
// дата правки 18.03.17.1209

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 252)
//ТЕСТОВАЯ! пока норм.
// скетч проверен и записан на версии ардуино IDE 1,6,12 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например 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
/* _
хотелки
strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
сделать автоматическую калибровку с записью значений в еепром ( A7 a2 ножка)
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, c версии 63 включительно поменяна библиотека вывода на экран. НОВАЯ ВЗЯТА https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше 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 строках.
__________________________________________________ ______________

потребление блока по 12 вольтам, без планшета - при 10В +30 и +15 выключены - 0,02 А
- при 12В +30 и +15 включены - 0,092-0,1 А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает */


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

uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;

//************************************************** ************************************************** ***********************************************

#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 дисплей



//LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например

LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347

float UakbONorOFF = 12.1;// в 258 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.4;//11.1 // напряжение порога сработки асс
float U_acc_real = 0; // реальное напряжение +ACC на входе делителя (A0)
float U_akb_real = 0; // реальное напряжение +30 на входе делителя (A1)
int Uacc = 0; //Читаем напругу с делителя ACC R4-R5 0-1024 analogRead(A0);
int Uakb = 0; ////Читаем напругу с делителя R2-R3 0-1024 analogRead(A1);

/*ноги ардуины*/
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 = 10; /*управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или 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


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

/*логические переменные, используемые в коде*/
boolean 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); // значение для калибровки для делителя АКБ

boolean flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long pauseTimeHALL = 140000; /* время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин*/
int timeAfterACC = 5000; /* время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg*/
unsigned long TimerREM = 0; /* отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long timeBeforeRemOff = 1800000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
//unsigned long timeBeforeRemOff = 180000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
unsigned long TIMER = millis();
int H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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 (SLEEP == 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 (OTG == 1) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

// PORTDregistr - обрабатывем регистры порта D атмеги

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 (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 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 ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~



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



// wdt_disable(); //Отключение таймера watchdog
Serial.begin(115200);
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
if( kalibrovkaACC == 255 ){kalibrovkaACC=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию
if( kalibrovkaAKB == 255 ){kalibrovkaAKB=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию =127

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины

DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; /* PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);
pinMode(A2, INPUT); // пин калибровки
digitalWrite(A2, 1); // подтяжка +5 пина калибровки

// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
// wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

void IntToCharI(int num, char *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 num, char *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 num, char *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 num, char *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 num, char *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 printDISPLAY() //функция формирования информации на дисплей ( точнее на два: 128*64 и 1602)
{
//_____________________________________________ФОРМИ РУЕМ СООБЩЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________

H = (millis()/3600000);
M = ((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 + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)


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



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

if (kalibrovkaNOW >= 1 && 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 111 0.000| 1 строка * вывод времени работы блока H:M * AKB ACC REM * вывод напряжения АСС
|2616 1110 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * OTG HUB POGO HALL * вывод напряжения АКБ


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

//Serial.print("strokaII = "); Serial.println(strokaII);
lcd.setCursor(0, 1); //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 analogReadU (byte averageFactor) //функция усреднённого чтения аналоговых входов (A0 A1)
{//void analogReadU
int newUacc = analogRead(A0); // замер для 5й версии
int newUakb = analogRead(A1); // замер для 5й версии
//int newUacc = analogRead(A1); // замер для 4й версии
//int newUakb = analogRead(A0); // замер для 4й версии
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(A2)== 1 && kalibrovkaNOW < 6) {kalibrovkaNOW ++;}
else // тут достигли 6 касаний точки калибровки и ЗАПУСКАЕМ НЕПОСРЕДСТВЕННО ПРОЦЕСС КАЛИБРОВКИ ( ДЛЯ ЭТОГО ПОДАЁМ РОВНО 12,00В НА БЛОК ПИТАНИЯ ( асс и акб)
{ //else
if (kalibrovkaNOW >= 6)
{//if (kalibrovkaNOW >= 6)
PORTBregistr = 0; // выключили всё
PORTDregistr = 0; // выключили всё
UPRAVLENIE_PINAMI(); // сказали регистрам исполнить " выключили всё ", вызвав функцию
delay (600); // для зарядки кондёров после снятия нагрузки
analogReadU (10); //вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(10)раз
kalibrovkaACC = 1200000/Uacc-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
kalibrovkaAKB = 1200000/Uakb-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
{kalibrovkaNOW ++;}
}//if (kalibrovkaNOW >= 6)
}//else
if ( kalibrovkaNOW == 15 && digitalRead(A2)== 0) //по достижению счета в 254 и ПРИ МАССЕ НА ПИНЕ КАЛИБРОВКИ данные калибровки запишутся в еепром
{
kalibrovkaNOW = 255;
EEPROM.write(0,kalibrovkaACC);
EEPROM.write(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 loop()
{while (1){//для ускорения void loop

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

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

/*
if ( digitalRead(A2)== 1 ) { kalibrovkaNOW = 255 ;} // после 60с калибровку НЕ ДЕЛАЕМ
if (digitalRead(A2)== 0) { if( (727 < Uakb && Uakb < 848) && (727 <= Uacc && Uacc <= 848)) {kalibrovkaNOW ++; rejim_kalibrovki();} }
*/



/* // старое вычисление реального напряжения, без учета значений еепром, по Т11 включительно
U_acc_real = 0.0 + Uacc * 153.7/10000;//(5 / 1023.0 * 3.136); Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления) 0.2-падение на диоде
U_akb_real = Uakb * 153.30/10000;//(5 / 1023.0 * 3.145); Вычисляем реальное напряжение +30 на входе делителя (A1) */

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


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

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 2000;} //выключили зажигание /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 7000; if (U_akb_real <=UakbONorOFF) {flagREM = 3;REM = 0;} }//стартуем /* 5000 0 - заводим машину (стартуем) или сел акб при включенном зажигании.*/ Логика работы REM в 537 строках
if (U_akb_real >= 15.5){timeAfterACC = 0;}
// ввести новую переменную int starting_mode = 1;//стартуем 0 = не_стартуем.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


// ------------========================== блок ACC ========================-----------------------------------------------------------------------------


// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((15.5 > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
//lcd.clear(); //очистка экрана не нужна со строковым выводом
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея
}


if (flagACC ==1 )
{// если flagACC == 1

if (millis() - pauseTimeACC >= 1100 ) /* пауза 1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на Y-OTG (включается звуковая карта) // тестово, для более устойчивого определения перифирии.*/
II_KIW_pin_POGO = 1; //digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
HUB =1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб*/
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета (in2) = этим подаём 12В на KIW3312s. На 1м канале КИВ сразу появляется напряжение (3,8-4,2 - как настроено)*/
//display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
//display2.clearDisplay(); // для 1306 дисплея
//display2.setTextColor(WHITE); // для 1306 дисплея
}


if (millis() - pauseTimeACC >= 1500 )/*через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)*/
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}

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

}

}// если flagACC == 1


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

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



//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------

if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
//REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
//flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)

if (((millis() - pauseTimeACC) >= (timeAfterACC-1000)) ) // тут 1000 это на сколько раньше выключать выход REM перед остальными выключениями
{
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
}

if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 6c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (2500+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (3000+timeAfterACC)) )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
}

if ( ((millis() - pauseTimeACC) >= (7000+timeAfterACC)) )
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
}
}// if (flagACC==0)


// -------------------------========================= блок АКБ ==========================-------------------------------------------------------------------------------


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

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

if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >15.5))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = 11.9;
//lcd.clear(); //очистка экрана
}

if ((millis() - pauseTimeAKB >= 20000) && flagAKB == 0) /* если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)*/
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается*/
//delay (5000); /* задержка для аппаратного выключения*/
}

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

if ((millis() - pauseTimeAKB) >= 172800000 && flagAKB == 1) /* если давно выключили ACC ) (2суток = 172800000)) (самозапитка для регистратора)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (3000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



/*
//******************************************отслежив ания аварийной ситуации ITS716G (превышение по току по выходам out1-4)************************************************ ************************************************** ************************************************** ****************************


//*отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//*отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"

if(SAMOZAPITKA==1 || PlanshBAT ==1 ||REM==1 || REGISTRATOR ==1) // если проц включал любой канал ITS
{


STATEpinI = digitalRead(5); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
STATEpinII = digitalRead(8);
if(STATEpinI == 0) { // и если пин защиты STATEpinI показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты STATEpinII показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI();delay(493); LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
}

//************************************************** ************************************************** ************************************************** ************************************************** ******************
*/

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

ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}




// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;
printDISPLAY(); // выводим на дисплей раз в 350( запуская фушкцию)
}

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

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

UPRAVLENIE_PINAMI();

//wdt_reset(); /*Сброс таймера watchdog*/

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

lavalamp
26.03.2017, 13:15
День добрый, Подскажите можно ли на 3й версии блока питания собрать еше и кнопки на руле,а именно интересует скетч ардуины, там просто надо 2 файла в среде поменять, щалтется ли тогда корректно скетч 3й версии

oleg707
26.03.2017, 15:19
День добрый, Подскажите можно ли на 3й версии блока питания собрать еше и кнопки на руле,а именно интересует скетч ардуины, там просто надо 2 файла в среде поменять, щалтется ли тогда корректно скетч 3й версии

на 328 атмеге? а юсб вы как эмулировать будете?

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

lavalamp
28.03.2017, 17:17
на 328 атмеге? а юсб вы как эмулировать будете?

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

Не силен в этом деле. Делал кнопки на руле и управление питанием на Леонардо,но там готовый скетч был,вот тут думал сделать также

oleg707
28.03.2017, 17:29
Не силен в этом деле. Делал кнопки на руле и управление питанием на Леонардо,но там готовый скетч был,вот тут думал сделать также

тогда не сделаете. На 328 атмеге в последних скетчах использовано прямое управление портами. Скрестить то можно, но нужно даташиты долго курить.

oleg707
30.03.2017, 20:30
поиск неисправностей в БП5 (https://www.youtube.com/watch?v=b07RHzDJQs4&feature=youtu.be)
https://youtu.be/b07RHzDJQs4

oleg707
04.04.2017, 01:41
что- то лазил тут по интеллектуальным ключам и набрёл на VNQ660SP (http://www.st.com/content/ccc/resource/technical/document/datasheet/group1/e0/c6/a5/3d/9c/fc/46/27/CD00002278/files/CD00002278.pdf/jcr:content/translations/en.CD00002278.pdf)
Читаю так, и нечего, нравится.
Может на его базе следующее поколение замутить?!
Кто что думает?

skanch
04.04.2017, 09:41
что- то лазил тут по интеллектуальным ключам и набрёл на VNQ660SP (http://www.st.com/content/ccc/resource/technical/document/datasheet/group1/e0/c6/a5/3d/9c/fc/46/27/CD00002278/files/CD00002278.pdf/jcr:content/translations/en.CD00002278.pdf)
...Кто что думает?
На мой взгляд вполне достойная релюха. Минимум обвязки, большой ток на канал, форм-фактор позволяет развести плату в домашних условиях (расстояние между ногами 1.27мм), можно реализовать отключение по току или перенапряжению (Pin "STATUS"), опять же цена сопоставима с аналогичными решениями (у китайцев можно найти в районе 100 руб) ... Как коммутатор каналов в блоке питания вполне подойдет.
От того же производителя (http://www.st.com/content/ccc/resource/technical/document/datasheet/20/b9/2a/c0/79/1a/44/15/CD00160181.pdf/files/CD00160181.pdf/jcr:content/translations/en.CD00160181.pdf) чуть "умнее", мощнее, дешевле (в Китае можно купить за 70 рублей),но в домашних условиях не каждый сможет сделать плату под эту микру- расстояние между ногами 0.5мм!

oleg707
04.04.2017, 18:37
отключение по току или перенапряжению (Pin "STATUS")
На 10 странице даташита описание СТАТУСа. Насколько я понял, там просто появляется логическая единица при превышению по току или напруге. А они большие.
Table 11. Truth table
Conditions Input Output Status


ITS 716 или 724 выглядят предпочтительнее ввиду того, что у них максимальный ток на канал 1,6А и 2,4А, и они аппаратно вырубать нагрузку будут.
А VNQ5E050AK-E интересная штука, с отслеживанием реального тока, но это городить секцию отслеживания тока в обслуживающем процессоре.
Там тока 0,5 А (12В) на весь блок питания с нагрузкой в виде планшета

skanch
04.04.2017, 19:26
Все правильно. По сути VNQ660SP (твердотельное реле) простой переключатель с управлением от МК и "Статус" работает только при привышении тока (6А) или при коротком замыкании - "там просто появляется логическая единица при превышению по току или напруге". Большего и не надо в простом блоке питания -если на каком-нибудь канале КЗ (или привышение допустимого тока) или перегрев, то контроллер просто отрубает всю микру. Как-то так. Минус в том, что "Статус" общий на все 4-е канала.И если что-то случилось на однолм канале - отрубится вся микра.

Друго дело VNQ5E050AK-E- там отслеживание по каждому каналу в отдельности и в реальном времени, что позволяет в любое время отключить только нужный канал при достижении определенных параметров по току ("но это городить секцию отслеживания тока в обслуживающем процессоре").

oleg707
04.04.2017, 19:37
Все правильно. По сути VNQ660SP простой переключатель с управлением от МК и "Статус" работает при привышении тока (6А) или при коротком замыкании - "там просто появляется логическая единица при превышению по току или напруге". Большего и не надо-если на каком-нибудь канале КЗ (или привышение допустимого тока) или перегрев, то контроллер просто отрубает всю микру. Как-то так.
Друго дело VNQ5E050AK-E- там отслеживание по каждому каналу в отдельности и в реальном времени, что позволяет в любое время отключить только нужный канал при достижении определенных параметров по току ("но это городить секцию отслеживания тока в обслуживающем процессоре").
ну да. Только 6А на канал по 12В - много. Это 14,4А*5В в эквиваленте.
У нас ДС-ДС максимум на 1А загружены, то есть это 0,5 А*12В.
При защите в 6А всё уже выгорит при нештатной ситуации. Поэтому VNQ660SP и VNQ5E050AK на заметку, а в производство its716(724)G.

У VNQ660SP понравился форм фактор и всего один пин статуса.

skanch
04.04.2017, 19:46
...При защите в 6А всё уже выгорит при нештатной ситуации..
Ну, как я понимаю мы говорим о коротком замыкании, а при такой "нештатной ситуации" микра уходит в защиту сразу и по "Статусу" только отключаем управление на все каналы.

oleg707
04.04.2017, 20:09
Ну, как я понимаю мы говорим о коротком замыкании, а при такой "нештатной ситуации" микра уходит в защиту сразу и по "Статусу" только отключаем управление на все каналы.

При чистом КЗ - да. Классическое сваливание в защиту.

А если КЗ - искрящее - провод трется об ребро металла при тряске не кочках ? Тогда или сваливание в защиту, или выбьет микруху.

А еще давай рассмотрим ситуацию, когда закоротил выход ДС-ДС.

У ДС-ДС есть своя защита от КЗ, он будет вырубать канал. Вопрос, насколько качественно.
Вот если ДС-ДС слёг, то тогда в защиту должен стать интеллектуальный ключ, и отрубить ДС-ДС ( я по выходу ДС-ДС пихаю стабилитроны 5,6В, которые и дают ток КЗ при перенапряжении).

Так вот вопрос, что лучше - дс-дс питать напрямую от АКБ или через интелл ключ? :spiteful:

skanch
04.04.2017, 20:22
Полноценный интеллектуальный ключ (например VNQ5E050AK-E) все выше перечисленное может отследить и "правильно" отреагировать на ситуацию, при условии полной обвязки этого ключа и соответствующего пограммного обеспечения. Но разговор идет о простой релюшке с "псевдо- интеллектом" с возможностью простой коммутации напряжения на 4-х каналах и с возможностью реализации временных задержек. Если у DC-DC модулей (https://duino.ru/Bloki-pitaniya.html) есть управление через "En" и есть своя внутренняя защита от КЗ, то зачем тогда еще нужен смарт-ключ? Подключаем напрямую к АКБ и все.


"А если КЗ - искрящее - провод трется об ребро металла при тряске не кочках ?"- это уже другая тема для обсуждения.

jonikus81
05.04.2017, 07:08
а что насчет потребления тока? извиняюсь, я не силен в датащитах

skanch
05.04.2017, 08:44
а что насчет потребления тока? извиняюсь, я не силен в датащитах
Для VNQ660SP

Когда Off State(режим выкл.); VCC = 13.5V; VIN = VOUT = 0V потребление 40 µA

Когда On State(режим вкл.); VCC = 13V; VIN = 3.25V; 9V < VCC < 18V потребление 12mA


Для VNQ5E050AK-E 5 µA и 14mA соответственно.

jonikus81
05.04.2017, 09:32
Спасибо! Получается VNQ5E050AK-E намного вкуснее, кроме удобства пайки. Радует запас по силе тока, который при нагрузке будет выдавать меньше тепмпературы и меньше кушает при простое, я правильно понимаю?

skanch
05.04.2017, 09:38
Спасибо! Получается VNQ5E050AK-E намного вкуснее, кроме удобства пайки. Радует запас по силе тока, который при нагрузке будет выдавать меньше тепмпературы и меньше кушает при простое, я правильно понимаю?

Да - правильно. Нужно не забывать, что микросхемы разные по структуре и сравнивать их возможности не совсем верно.
Вот здесь (http://pccar.ru/showthread.php?t=25468) немного про смарт-ключи.

Niss@noff
06.04.2017, 22:33
Кто нибудь засовывал в один корпус бп ,хаб и Dac конвертер? Хочу сделать моноблок ,чтобы не устраивать в недрах панели залежи плат.Корпус на 3д принтере сваять,размером 1 дин,с тыла будет разъем атх24 к планшету,с фронта 3 разъема usb хаба будут на лицевой панели торчать

PIW2004
07.04.2017, 12:54
Кто нибудь засовывал в один корпус бп ,хаб и Dac конвертер? Хочу сделать моноблок ,чтобы не устраивать в недрах панели залежи плат.Корпус на 3д принтере сваять,размером 1 дин,с тыла будет разъем атх24 к планшету,с фронта 3 разъема usb хаба будут на лицевой панели торчать
Есть вот такое чудо-юдо, USB-хаб на 7 портов, 2 блока KIW, цифровой потенциометр на 50кОм для резистивных кнопок, распайка питания для USB-зарядок, входы выходы ну и управление Ардуинкой. Размер платы рассчитан на крепление на 1din магнитолу.
Правда еще не испытана, пока плата от китайцев едет...
http://www.e1.ru/fun/photo/view_pic.php/o/3e0f56c8ea44ad3219cb0c43e15585ad/view.pic]

oleg707
07.04.2017, 14:08
Есть вот такое чудо-юдо, USB-хаб на 7 портов, 2 блока KIW, цифровой потенциометр на 50кОм для резистивных кнопок, распайка питания для USB-зарядок, входы выходы ну и управление Ардуинкой. Размер платы рассчитан на крепление на 1din магнитолу.
Правда еще не испытана, пока плата от китайцев едет...


а ты испытай, хотя бы месяц:wink2:
Могут вылезти сюрпризы:spiteful:

oleg707
13.04.2017, 00:35
откатал почти месяц на t13 прошивке - отлично. Переношу в статус стабильной.


byte ver = 13;// ( чем больше цифра, тем новее)
// дата правки 18.03.17.1209

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 252)
//СТАБИЛЬНАЯ - с 18.03.17.1209 по 12,04,2017 - отлично.
// скетч проверен и записан на версии ардуино IDE 1,6,12 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например 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
/* _
хотелки


______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, c версии 63 включительно поменяна библиотека вывода на экран. НОВАЯ ВЗЯТА https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше 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 строках.
__________________________________________________ ______________

потребление блока по 12 вольтам, без планшета - при 10В +30 и +15 выключены - 0,02 А
- при 12В +30 и +15 включены - 0,092-0,1 А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает


ПРИМЕЧАЕНИЯ
-> strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
*/
//************************************************** ************************************************** ***********************************************
// Массив режимов работы светодиода
byte modes[] = {
0B00000000, //Светодиод выключен
0B11111111, //Горит постоянно
0B00111111, //Мигание по 0.8 сек
0B00000001, //Короткая вспышка раз в секунду
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)
};

uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;

//************************************************** ************************************************** ***********************************************

#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 дисплей



//LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например

LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347

float UakbONorOFF = 12.1;// в 258 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.4;//11.1 // напряжение порога сработки асс
float U_acc_real = 0; // реальное напряжение +ACC на входе делителя (A0)
float U_akb_real = 0; // реальное напряжение +30 на входе делителя (A1)
int Uacc = 0; //Читаем напругу с делителя ACC R4-R5 0-1024 analogRead(A0);
int Uakb = 0; ////Читаем напругу с делителя R2-R3 0-1024 analogRead(A1);

/*ноги ардуины*/
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 = 10; /*управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или 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


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

/*логические переменные, используемые в коде*/
boolean 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); // значение для калибровки для делителя АКБ

boolean flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long pauseTimeHALL = 140000; /* время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин*/
int timeAfterACC = 5000; /* время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg*/
unsigned long TimerREM = 0; /* отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long timeBeforeRemOff = 1800000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
//unsigned long timeBeforeRemOff = 180000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
unsigned long TIMER = millis();
int H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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 (SLEEP == 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 (OTG == 1) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG

// PORTDregistr - обрабатывем регистры порта D атмеги

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 (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 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 ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~



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



// wdt_disable(); //Отключение таймера watchdog
Serial.begin(115200);
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
if( kalibrovkaACC == 255 ){kalibrovkaACC=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию
if( kalibrovkaAKB == 255 ){kalibrovkaAKB=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию =127

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины

DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; /* PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);
pinMode(A2, INPUT); // пин калибровки
digitalWrite(A2, 1); // подтяжка +5 пина калибровки

// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
// wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

void IntToCharI(int num, char *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 num, char *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 num, char *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 num, char *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 num, char *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 printDISPLAY() //функция формирования информации на дисплей ( точнее на два: 128*64 и 1602)
{
//_____________________________________________ФОРМИ РУЕМ СООБЩЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________

H = (millis()/3600000);
M = ((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 + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)


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



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

if (kalibrovkaNOW >= 1 && 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 111 0.000| 1 строка * вывод времени работы блока H:M * AKB ACC REM * вывод напряжения АСС
|2616 1110 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * OTG HUB POGO HALL * вывод напряжения АКБ


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

//Serial.print("strokaII = "); Serial.println(strokaII);
lcd.setCursor(0, 1); //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 analogReadU (byte averageFactor) //функция усреднённого чтения аналоговых входов (A0 A1)
{//void analogReadU
int newUacc = analogRead(A0); // замер для 5й версии
int newUakb = analogRead(A1); // замер для 5й версии
//int newUacc = analogRead(A1); // замер для 4й версии
//int newUakb = analogRead(A0); // замер для 4й версии
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(A2)== 1 && kalibrovkaNOW < 6) {kalibrovkaNOW ++;}
else // тут достигли 6 касаний точки калибровки и ЗАПУСКАЕМ НЕПОСРЕДСТВЕННО ПРОЦЕСС КАЛИБРОВКИ ( ДЛЯ ЭТОГО ПОДАЁМ РОВНО 12,00В НА БЛОК ПИТАНИЯ ( асс и акб)
{ //else
if (kalibrovkaNOW >= 6)
{//if (kalibrovkaNOW >= 6)
PORTBregistr = 0; // выключили всё
PORTDregistr = 0; // выключили всё
UPRAVLENIE_PINAMI(); // сказали регистрам исполнить " выключили всё ", вызвав функцию
delay (600); // для зарядки кондёров после снятия нагрузки
analogReadU (10); //вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(10)раз
kalibrovkaACC = 1200000/Uacc-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
kalibrovkaAKB = 1200000/Uakb-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
{kalibrovkaNOW ++;}
}//if (kalibrovkaNOW >= 6)
}//else
if ( kalibrovkaNOW == 15 && digitalRead(A2)== 0) //по достижению счета в 254 и ПРИ МАССЕ НА ПИНЕ КАЛИБРОВКИ данные калибровки запишутся в еепром
{
kalibrovkaNOW = 255;
EEPROM.write(0,kalibrovkaACC);
EEPROM.write(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 loop()
{while (1){//для ускорения void loop

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

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

/*
if ( digitalRead(A2)== 1 ) { kalibrovkaNOW = 255 ;} // после 60с калибровку НЕ ДЕЛАЕМ
if (digitalRead(A2)== 0) { if( (727 < Uakb && Uakb < 848) && (727 <= Uacc && Uacc <= 848)) {kalibrovkaNOW ++; rejim_kalibrovki();} }
*/



/* // старое вычисление реального напряжения, без учета значений еепром, по Т11 включительно
U_acc_real = 0.0 + Uacc * 153.7/10000;//(5 / 1023.0 * 3.136); Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления) 0.2-падение на диоде
U_akb_real = Uakb * 153.30/10000;//(5 / 1023.0 * 3.145); Вычисляем реальное напряжение +30 на входе делителя (A1) */

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


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

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 2000;} //выключили зажигание /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 7000; if (U_akb_real <=UakbONorOFF) {flagREM = 3;REM = 0;} }//стартуем /* 5000 0 - заводим машину (стартуем) или сел акб при включенном зажигании.*/ Логика работы REM в 537 строках
if (U_akb_real >= 15.5){timeAfterACC = 0;}
// ввести новую переменную int starting_mode = 1;//стартуем 0 = не_стартуем.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


// ------------========================== блок ACC ========================-----------------------------------------------------------------------------


// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((15.5 > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
//lcd.clear(); //очистка экрана не нужна со строковым выводом
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея
}


if (flagACC ==1 )
{// если flagACC == 1

if (millis() - pauseTimeACC >= 1100 ) /* пауза 1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на Y-OTG (включается звуковая карта) // тестово, для более устойчивого определения перифирии.*/
II_KIW_pin_POGO = 1; //digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
HUB =1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб*/
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета (in2) = этим подаём 12В на KIW3312s. На 1м канале КИВ сразу появляется напряжение (3,8-4,2 - как настроено)*/
//display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
//display2.clearDisplay(); // для 1306 дисплея
//display2.setTextColor(WHITE); // для 1306 дисплея
}


if (millis() - pauseTimeACC >= 1500 )/*через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)*/
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}

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

}

}// если flagACC == 1


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

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



//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------

if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
//REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
//flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)

if (((millis() - pauseTimeACC) >= (timeAfterACC-1000)) ) // тут 1000 это на сколько раньше выключать выход REM перед остальными выключениями
{
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
}

if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 6c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (2500+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (3000+timeAfterACC)) )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
}

if ( ((millis() - pauseTimeACC) >= (7000+timeAfterACC)) )
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
}
}// if (flagACC==0)


// -------------------------========================= блок АКБ ==========================-------------------------------------------------------------------------------


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

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

if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >15.5))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = 11.9;
//lcd.clear(); //очистка экрана
}

if ((millis() - pauseTimeAKB >= 20000) && flagAKB == 0) /* если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)*/
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается*/
//delay (5000); /* задержка для аппаратного выключения*/
}

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

if ((millis() - pauseTimeAKB) >= 172800000 && flagAKB == 1) /* если давно выключили ACC ) (2суток = 172800000)) (самозапитка для регистратора)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (3000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



/*
//******************************************отслежив ания аварийной ситуации ITS716G (превышение по току по выходам out1-4)************************************************ ************************************************** ************************************************** ****************************


//*отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//*отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"

if(SAMOZAPITKA==1 || PlanshBAT ==1 ||REM==1 || REGISTRATOR ==1) // если проц включал любой канал ITS
{


STATEpinI = digitalRead(5); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
STATEpinII = digitalRead(8);
if(STATEpinI == 0) { // и если пин защиты STATEpinI показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты STATEpinII показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI();delay(493); LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 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, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
}

//************************************************** ************************************************** ************************************************** ************************************************** ******************
*/

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

ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}




// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;
printDISPLAY(); // выводим на дисплей раз в 350( запуская фушкцию)
}

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

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

UPRAVLENIE_PINAMI();

//wdt_reset(); /*Сброс таймера watchdog*/

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

plus88
17.04.2017, 15:09
Сама схема и печатная плата все те же? версия 3 и 5 подходят?

oleg707
17.04.2017, 17:56
Сама схема и печатная плата все те же? версия 3 и 5 подходят?

печатка 5 версии ( 53( диод на кив 4,0В) ), можно 4 версию, но 5 получше немного.
3 версия естественно не подходит. там своё железо и, соответственно, прошивка.