Вход

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


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

oleg707
04.07.2016, 14:21
Вообще для подобных БП всегда желателен нормальный регулируемый по напряжению настольный блок питания.
В любом случае программно подстраивать какие либо значения всё равно придётся.
Хотя можно просто резистор подстроечный и мультиметр использовать, но только не на готовой плате, а на макетке.
Дисплей на I2C нафиг не нужен, можно настроить через обычное USB подключение на столе выдавая в сериал данные, а потом уже нести в машину.
Он нужен только для того чтоб самому на него смотреть и переться от гордости за себя :)
Ну и хвастатся перед окружающими какую ты сделал мега штуку.
Хочется крутости- выведи все эти данные на планшет.

Az0m@
На выходы импульсных БП нет смысла ставить большие конденсаторы- только разве для своего успокоения.
Объясню почему:
Частота колебаний стандартных импульсных БП равна нескольким десяткам, а иногда и сотням килогерц. Соответственно не имеет смысл ставить большой конденсатор чтоб сглаживать отсутствие напряжения между импульсами.
У импульсного БП падения напряжения на выходе может быть в пределах нескольких десятых вольта, а дальше происходит фактически срыв генерации и соответственно отсутствие вообще какого либо напряжения.
И вот если такое произошло или происходит, то это означает что мощности БП не хватает. ТОесть есть какие-то импульсные нагрузки превышающие максмальный ток БП. И соответственно надо увеличивать мощность БП.

На входе БП есть смысл поставить банку на 10000uf через диод чтоб в сеть авто не разряжалась.
При максимальной нагрузке это даст запас до обесточивания выходов БП примерно в 1-2 десятые секунды (тоесть напряжение на входе БП упадёт до приблизительно 6,3 вольт при выходном 5).
Спасёт короче от кратковременных пропаданий напряжения. Ну скажем в момент запуска двигателя стартера.

Дисплей на I2C нафиг не нужен... по теории да.
У меня БП катается в бардачке, а дисплей выведен. Интересно смотреть напруги на старте и при работе. + состояния. Убрать его - дело 1 минуты. Но не убираю. При отладке - однозначно нужен, удобнее ЮСБ. (+ по юсб есть ньансы, но писать долго и лень)


На выходы импульсных БП нет смысла ставить большие конденсаторы- только разве для своего успокоения.
на первых 2х БП я ставил 220мФ (вроде), работало. НО если кондёр непропаян или глючный - по на выходе канала начнуть идти импульсы в 12 вольт с частотой 300кГц. Потому у некоторых стабилитроны и горят. :derisive:
1000мФ вообще на материнках россыпью, их и проще ставить.

На входе БП есть смысл поставить банку на 10000uf через диод чтоб в сеть авто не разряжалась.
а СМЫСЛ?! БП работает при напруге 7,7В. ( так как он на основе kiw3312s). Если у вас просадка на старте ниже 9В - проблемы в авто. Причем просадку при старте БП 3,4й и 5й версий обрабатывает и отрабатывает нормально (при просадке до 8 вольт - проверял перед заменой сдохшего акб, описал подробнее в проекте). В скетче всё подробно есть.

T_r_D
05.07.2016, 08:27
На входе БП есть смысл поставить банку на 10000uf через диод чтоб в сеть авто не разряжалась.
а СМЫСЛ?! БП работает при напруге 7,7В. ( так как он на основе kiw3312s). Если у вас просадка на старте ниже 9В - проблемы в авто. Причем просадку при старте БП 3,4й и 5й версий обрабатывает и отрабатывает нормально (при просадке до 8 вольт - проверял перед заменой сдохшего акб, описал подробнее в проекте). В скетче всё подробно есть.[/QUOTE]

А вот тут интересно! Почему 7,7 вольта нужно киву?
Во всех импульсниках пишут разницу в напряжении входа-выхода, и она как правило не привышает двух вольт. Что у кива всё с этим так плохо?
Если на выходе 4,3 вольта, то минимум входа 6,3, если 5, то 7.
А на практике не 6,3, а 5,9 и не 7, а 6,6. Ну по крайней мере у моих БП так.
А 10000 на входе простая перестраховка. По типу- "а вдруг чо?".
Не хотите- не ставьте :)

oleg707
05.07.2016, 12:54
На входе БП есть смысл поставить банку на 10000uf через диод чтоб в сеть авто не разряжалась.
а СМЫСЛ?! БП работает при напруге 7,7В. ( так как он на основе kiw3312s). Если у вас просадка на старте ниже 9В - проблемы в авто. Причем просадку при старте БП 3,4й и 5й версий обрабатывает и отрабатывает нормально (при просадке до 8 вольт - проверял перед заменой сдохшего акб, описал подробнее в проекте). В скетче всё подробно есть.

А вот тут интересно! Почему 7,7 вольта нужно киву?
Во всех импульсниках пишут разницу в напряжении входа-выхода, и она как правило не привышает двух вольт. Что у кива всё с этим так плохо?
Если на выходе 4,3 вольта, то минимум входа 6,3, если 5, то 7.
А на практике не 6,3, а 5,9 и не 7, а 6,6. Ну по крайней мере у моих БП так.
А 10000 на входе простая перестраховка. По типу- "а вдруг чо?".
Не хотите- не ставьте :)
не знаю как насчет кива, у меня проц от недостатка напруги начинает дурить раньше, чем кив недодавать. Вообще, минимальное рабочее напряжение блоков в авто = 9В. Если меньше - 60% машин не заведутся. можно же и от 5 вольт сделать рабочий блок, но ЗАЧЕМ?!
http://img1.joyreactor.cc/pics/post/%D1%85%D0%BB%D0%B5%D0%B1-%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D0%B9%D0%B1%D 1%83%D1%81-linux-%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80-1849381.jpeg

oleg707
07.07.2016, 00:27
вышла новая версия diptrace. (3,02 + есть русская локализация 3,0)
http://diptrace.com/download-diptrace/

oleg707
09.07.2016, 22:13
после 3 недель простоя здохла батарея. (или ушла в защиту - лень разбирать планшет).
Планшет стал забывать дату.
И самое неприятное - при старте перестал включаться режим отг. При этом масса на 4 конт юсб постоянно идёт.
Поэтому был поставлен долго ждущий сего радостного сообытия хаб.
Питание хаба взято с контакта +5v hub (Vout2), питание хаба через юсб перерезано. Это не помогло решить отваливание юсб, поэтому переписалась логика БП. ( при включении зажигания ждём 0,8 сек и подаём массу на 4 конт юсб, при выключении зажигания - убираем.

Заодно перекинул включение усилителя звука на REMout30.

Получившийся скетч. ( планшет без батареи)
//ver9.07.16.2111 ( чем больше цифра, тем новее)
// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1)
//ТЕСТОВАЯ!!!
/*
_______Сделано____________________________________ ______________
вывод информации на внешний дисплей по I2C,
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом,
усреднение завмеров по напряжению ACC и AKB.
Оптимизирован для планшета без батареи.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с).
__________________________________________________ ______________
потребление блока по 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>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
float UakbONorOFF = 12.01;// в 155 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 10;//11.1 // напряжение порога сработки асс

/*ноги ардуины*/
int SAMOZAPITKApin = 9; //управление самозапиткой блока питания IN4
//1 = есть самозапитка; 0 = нет самозапитки
int PlanshBATpin = 6; // включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin
//0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
int II_KIW_pin_POGOpin = 2; // включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка
//0 = нет 5V на POGO; 1 = есть 5V на POGO
int OTGpin = 12; //управление транзюком OTG Q1
//1 = есть масса на OTG; 0 = нет массы на OTG
int SLEEPpin = 10; //управление транзюком сна VT4 (на датчик холла))
//1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
int HUBpin = 11; //управление транзюком питания хаба
// 0-есть питание, 1 - нет питания
int REMpin = 7; // выход сигнала REM (+12v) (IN3), на плате распаяно.
//0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
int REGISTRATORpin = 4; //выход 12В для работы видеорегистратора (D4 -IN1)
//пины состояния ITS
int STATEpinI = 5; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = норма
int STATEpinII = 8; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.

/*логические переменные, используемые в коде*/
int flagACC = 0; //признак включенного зажигания
int flagAKB = 0; // признак заряженной батареи
int flagHALL = 0; //флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = 0;
unsigned long pauseTimeAKB = 0;
unsigned long pauseDisplay = 0; // таймер для обновления информации на дисплее, чтобы не мерцал
unsigned long pauseTimeHALL = 120000; // время паузы перед морганием экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин
int timeAfterACC = 5000; // время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg


void setup() //настройки
{
// Serial.begin(115200);
//*************************test*************
wdt_disable(); //Отключение таймера watchdog

lcd.init(); // initialize the lcd занимает почти секунду
pinMode(STATEpinI, INPUT);
pinMode(STATEpinII, INPUT);
pinMode(PlanshBATpin, OUTPUT);
pinMode(SAMOZAPITKApin, OUTPUT);
pinMode(OTGpin, OUTPUT);
pinMode(SLEEPpin, OUTPUT);
pinMode(II_KIW_pin_POGOpin, OUTPUT);
pinMode(HUBpin, OUTPUT);
pinMode(13, OUTPUT); //светодиодик на плате ардуины
pinMode(REMpin, OUTPUT);
pinMode(REGISTRATORpin, OUTPUT);

digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
pauseTimeAKB = millis();

wdt_enable (WDTO_8S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка.
/* Возможные значения для константы
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S
*/
}


void loop()
{



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






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)
//Serial.println(U_akb_real); // вывод напруги АКБ в ком порт для калибровки.

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

if ((U_akb_real - U_acc_real) >4 )//проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем)
{timeAfterACC = 500;} // 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.
else {timeAfterACC = 5000;} // 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 (millis() - pauseTimeACC >= 500 && flagACC == 1) // пауза 0,5c после включения ACC и потом делать следующ(пока включено ACC):
{
digitalWrite(PlanshBATpin, 1); //включаем питание на батарею планшета (in2)

}

if (millis() - pauseTimeACC >= 800 && flagACC == 1) // пауза 0.8c после включения ACC и потом делать следующ(пока включено ACC): //через 0,8с после включения ACC включаем экран, включаем питание на видеорегистратор.
{
digitalWrite(II_KIW_pin_POGOpin, 1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
digitalWrite(OTGpin, 1); //включаем минус на Y-OTG (включается звуковая карта)
digitalWrite(REGISTRATORpin, 1); // включаем питание на видеорегистратор
}

if (millis() - pauseTimeACC >= 2000 && flagACC == 1)//через 1с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)
{
digitalWrite(SLEEPpin, 0); //включаем экран = вЫключаем минус на упр SLEEP
digitalWrite(HUBpin, 0); //Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб
if (U_akb_real >= 12 && flagACC == 1)//если напруга батареи больше 12В, то включаем еще и усилитель звука (выход REM)
{
digitalWrite(REMpin, 1); // включаем выход REM
}
}



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

if (U_acc_real < UaccONorOFF && flagACC == 1)
{
flagACC = 0; //Выключили зажигание
digitalWrite(REMpin, 0); // выключаем выход REM
pauseTimeACC = millis();
pauseTimeAKB = millis();
lcd.clear(); //очистка экрана\

}

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

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

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


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

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

if (millis() - pauseTimeAKB >= 20000 && flagAKB == 0) // если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.
{
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 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ч)
{
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)//(батарея планшета))
}

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









//*
//******************************************отслежив ания аварийной ситуации ITS716G******************************************* ************************************************** ************************************************** *********************************


//отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"
if(SAMOZAPITKApin==1 || PlanshBATpin==1 ||REMpin==1 || REGISTRATORpin ==1) // если проц включал любой канал ITS
{
if(STATEpinI == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(493); digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 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) ) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
blink_loop++;
}




// Событие срабатывающее каждые 250 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;
//_____________________________________________СООБЩ ЕНИЕ НА ДИСПЛЕЙ___________________________________________ _________________



int H = (millis()/3600000);
int M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка экрана


if (flagACC == 1){lcd.backlight();}//}else {lcd.noBacklight();}
//lcd.backlight();

//вывод времени работы
lcd.setCursor(0, 0);
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ)
lcd.setCursor(9, 0);
lcd.print(flagACC); // вывод флага АСС
lcd.setCursor(11, 0);
lcd.print(U_acc_real); // вывод напряжения АСС

//lcd.setCursor(5,1);
//-------------------2 строка---------------------------------
lcd.setCursor(0, 1);
unsigned long TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
lcd.print(TIMER);
lcd.setCursor(9, 1);
lcd.print(flagAKB); // вывод флага АКБ
lcd.setCursor(11, 1);
lcd.print(U_akb_real); // вывод напряжения АКБ

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

================
|1 0 0.00 | 1 строка * вывод кол-ва минут работы блока * флаг АСС * вывод напряжения АСС
|616 1 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * флаг АКБ * вывод напряжения АКБ

*///__________________________________________________ __________________________________________________ ______________________
}





// blink_mode = modes[3];

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 выключено.
*/
//************************************************** ************************************************** ******


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


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

//

T_r_D
09.07.2016, 22:50
oleg707
Вот и ты дошёл до убирания батареи.
Только всётаки разбери и перепаяй терморезистор на обычный, а то в жару это о себе даст знать.
Ну и теперь ты применяешь логику примерно как у меня :)
Походу скоро дойдёшь до моего кода убрав половину лишнего из своего :)

А, да! С 24 числа БП вместе с планшетом работает в машине и пока всё окей.
Езжю каждый день на работу и обратно.

oleg707
10.07.2016, 12:34
oleg707
Вот и ты дошёл до убирания батареи. Не дождалась меня из отпуска:dntknw:
Только всётаки разбери и перепаяй терморезистор на обычный, а то в жару это о себе даст знать.
Ну и теперь ты применяешь логику примерно как у меня :)
Походу скоро дойдёшь до моего кода убрав половину лишнего из своего :)

А, да! С 24 числа БП вместе с планшетом работает в машине и пока всё окей.
Езжю каждый день на работу и обратно.

Я не дошел, она сама ))
Без батареи жесть - с холодного старта даты нету и времени, по гпс не подхватывает - интернет подавай.

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

С 24... ну как тебе сказать. Вот годик поездишь, тогда и статистика будет. Я некоторые ньюансы месяцами вылавливал:spiteful:

T_r_D
10.07.2016, 14:50
Не делай холодный старт. Питай планшет всегда. Не на столько он и БП с ардуиной и жрёт в слипе.
Можно вместо ардуины тиньку и тогда будет жрать ещё меньше.

А по поводу статистики- это про то, что ты писал что ардуина у тебя виснет несколько раз в месяц. Так вот уменя пока живёт

oleg707
10.07.2016, 15:14
Не делай холодный старт. Питай планшет всегда. Не на столько он и БП с ардуиной и жрёт в слипе.
Можно вместо ардуины тиньку и тогда будет жрать ещё меньше.

А по поводу статистики- это про то, что ты писал что ардуина у тебя виснет несколько раз в месяц. Так вот уменя пока живёт

за последние 2 месяца - не висла. тинька - ног мало.
по поводу питания всегда - поставил сутки до отрубания планшета. Покатаюсь - посмотрю, насколько удобно.

Вообще щас в качестве развлечения ваяю БП 6 версии. C хабом, звуковой, и кнопками по юсб. На голом проце.

jonikus81
11.07.2016, 09:59
Вообще щас в качестве развлечения ваяю БП 6 версии. C хабом, звуковой, и кнопками по юсб. На голом проце.
Если не секрет, какой проц? Я на ардуино про микро реализовал резистивные кнопки, энкодер, управление питанием хаба, датчиком холла, питание самого планшета с режимом сна (а по окончании второго таймера с полным разрывом сети и потреблением 0.0 А). Планшет без батареи и в данный момент думаю научить ардуину включать планшет (если питание отключилось полностью) по включению зажигания. Гальваническая развязка присутствует. Не могу только научить ардуину "понимать" включен планшет или в слипе. Кстати, огромное спасибо Вам, некоторые Ваши идеи мне просто открыли глаза! :yes2:


---Таки научил ардуину понимать включен планшет или нет---

oleg707
11.07.2016, 20:04
Если не секрет, какой проц? Я на ардуино про микро реализовал резистивные кнопки, энкодер, управление питанием хаба, датчиком холла, питание самого планшета с режимом сна (а по окончании второго таймера с полным разрывом сети и потреблением 0.0 А). Планшет без батареи и в данный момент думаю научить ардуину включать планшет (если питание отключилось полностью) по включению зажигания. Гальваническая развязка присутствует. Не могу только научить ардуину "понимать" включен планшет или в слипе. Кстати, огромное спасибо Вам, некоторые Ваши идеи мне просто открыли глаза! :yes2:

Проц 32u4, пока он за основу. Думаю про стм32, но атмел пока обкатанее.
Пользуйтесь на здоровье.

T_r_D
11.07.2016, 22:24
oleg707 для СТМ32 есть библиотека под arduino IDE :)
Так что можно в привычной среде программировать.
И под это дело СТМ жалко как-то.
Тут реально место какой нить атиньки 84 под твои нужды и 85 под мои.
И скорость у неё ещё сбросить чтоб жрала поменьше.

Но обычно разрабатываешь на том, что есть под рукой и это так и остаётся.
У меня всё это вместе с контроллером КАН шины спаяно на макетке и прекрасно себя чувствует.
Большая борьба идёт ща с программой под андройд, но это уже ни как не касается БП.

oleg707
12.07.2016, 00:14
oleg707 для СТМ32 есть библиотека под arduino IDE :)
Так что можно в привычной среде программировать.
И под это дело СТМ жалко как-то.
Тут реально место какой нить атиньки 84 под твои нужды и 85 под мои.
И скорость у неё ещё сбросить чтоб жрала поменьше.

Но обычно разрабатываешь на том, что есть под рукой и это так и остаётся.
У меня всё это вместе с контроллером КАН шины спаяно на макетке и прекрасно себя чувствует.
Большая борьба идёт ща с программой под андройд, но это уже ни как не касается БП.

32u4 как то денег около 5$ за голый проц китайцы просят, а у стм аппаратных юсб несколько.
Вот хорошая статья: Дешевая STM32 плата + Arduino IDE (https://geektimes.ru/post/277928/). пока всё работает - двигает вперёд только хобби и интерес.

jonikus81
12.07.2016, 10:56
32u4 как то денег около 5$ за голый проц китайцы просят, а у стм аппаратных юсб несколько.
Вот хорошая статья: Дешевая STM32 плата + Arduino IDE (https://geektimes.ru/post/277928/). пока всё работает - двигает вперёд только хобби и интерес.
у STM32 нет eeprom и придется переходить на 3 вольта, Вы готовы? )
Недавно воспользовался EEPROM-ом, очень удобно хранить всякие переменные и управлять ими, всяческие "режимы" можно прикручивать. Матерый микроконтроллерщик мне сказал, что со временем, я упрусь в этот самый EEPROM и буду вынужден его использовать.
А вот 32u4 вкусняшка! и я согласен, что за такой функционал 5 баксов не жалко.

oleg707
12.07.2016, 12:40
у STM32 нет eeprom и придется переходить на 3 вольта, Вы готовы? )
Недавно воспользовался EEPROM-ом, очень удобно хранить всякие переменные и управлять ими, всяческие "режимы" можно прикручивать. Матерый микроконтроллерщик мне сказал, что со временем, я упрусь в этот самый EEPROM и буду вынужден его использовать.
А вот 32u4 вкусняшка! и я согласен, что за такой функционал 5 баксов не жалко.

еепром это да. но можно 24с02 какую прикрутить. Но согласен.
Для начала, сравним основные параметры STM32 платы, и её аналога по цене — Arduino Nano V3.0:

Рабочая частота 72 МГц, против 16 у ардуино;
Объем Flash памяти 64 Кбайта, против 32;
Оперативной памяти, она же RAM(где хранятся переменные), у STM32 целых 20 Кбайт, у ардуинки всего лишь 2;
Быстрый 12-ти битный АЦП, в то время как у Arduino плат, что на базе AVR микроконтроллеров(это как правило большинство) используется 10-ти битный. Это означает, что в случае STM32, функция analogRead(*); будет возвращать 0..4095 против 0..1023, что в первом случае ведёт к более точным измерениям;
16-ти битный аппаратный ШИМ, против 8-ми у Arduino плат, то есть, функция analogWrite(*);pwmWrite(*); может принимать значение 0..65535, против убогих 0..255. Это позволит ещё точнее управлять нашими двигателями, сервами и прочими девайсами, которые рулятся при помощи ШИМ;
Аппаратная работа с USB, чем не может похвастаться не одна Arduino плата стоимостью менее 2 долларов;
Напряжение питания — от 2 до 3.6В(прямо таки заточено под 2 AA батарейки), против 2.7...5В у ардуино плат;
Цены на момент написания статьи — 1.9 доллара против 1.8(алиэкспресс).

пока что опираюсь на 32u4, потом если что перетрассирвать на другой проц можно.

ruzzzteg
14.07.2016, 21:54
Товарищи подскажите... немного не допонял... раньше бля питания nexus 7 12 нужно было 5v 3a
А теперь вроде как 4.8v 3a...
Это так или я что то путаю...
Как я понял нынче нужно...
На контроллер батареи 4.8v 3a
На usb hub 5v 3a
И чуток не допонял сколько подавать на датчик холла...
Сильно не пинайте... поиском не очень удобно с телефона пользоваться... тем более что я вообще ничего не могу в строку поиска что то ввести... она закрывается при клике на нее

Az0m@
15.07.2016, 00:40
Товарищи подскажите... немного не допонял... раньше бля питания nexus 7 12 нужно было 5v 3a
А теперь вроде как 4.8v 3a...
Это так или я что то путаю...
Как я понял нынче нужно...
На контроллер батареи 4.8v 3a
На usb hub 5v 3a
И чуток не допонял сколько подавать на датчик холла...
Сильно не пинайте... поиском не очень удобно с телефона пользоваться... тем более что я вообще ничего не могу в строку поиска что то ввести... она закрывается при клике на нее
ээ.. как бы для питания подается 3.8В, на хаб - 5В. а на датчик холла - "массу"...

oleg707
15.07.2016, 01:19
только 3,8 это напрямую на батарею, если на юсб или на пого пин - тогда 5,0В

oleg707
16.07.2016, 16:12
Az0m@ , попробуй залей это. тут усилок не пукает при выключении и плей-пауза стабильнее.

//ver16.07.16.1506 ( чем больше цифра, тем новее)
// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 136-144)
//ТЕСТОВАЯ!!!
/*
_______Сделано____________________________________ ______________
вывод информации на внешний дисплей по I2C,
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом,
усреднение замеров по напряжению ACC и AKB.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с).
Оптимизирован для планшета без батареи. Подходит для оставленной батареи также.
Управление REM: если напруга батареи больше 11.8 В, то включаем еще и усилитель звука (выход REM) /но включаем его только на 30мин, если не заведены. После заводки счетчик обнуляется.
__________________________________________________ ______________
потребление блока по 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>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
float UakbONorOFF = 12.01;// в 155 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 10;//11.1 // напряжение порога сработки асс

/*ноги ардуины*/
int SAMOZAPITKApin = 9; //управление самозапиткой блока питания IN4
//1 = есть самозапитка; 0 = нет самозапитки
int PlanshBATpin = 6; // включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin
//0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
int II_KIW_pin_POGOpin = 2; // включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка
//0 = нет 5V на POGO; 1 = есть 5V на POGO
int OTGpin = 12; //управление транзюком OTG Q1
//1 = есть масса на OTG; 0 = нет массы на OTG
int SLEEPpin = 10; //управление транзюком сна VT4 (на датчик холла))
//1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
int HUBpin = 11; //управление транзюком питания хаба
// 0-есть питание, 1 - нет питания
int REMpin = 7; // выход сигнала REM (+12v) (IN3), на плате распаяно.
//0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
int REGISTRATORpin = 4; //выход 12В для работы видеорегистратора (D4 -IN1)
//пины состояния ITS
int STATEpinI = 5; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = норма
int STATEpinII = 8; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.

/*логические переменные, используемые в коде*/
int flagACC = 0; //признак включенного зажигания
int flagAKB = 0; // признак заряженной батареи
int flagREM = 0; // признак включенного выхода на усилитель звука (REM)
int flagHALL = 0; //флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = 0;
unsigned long pauseTimeAKB = 0;
unsigned long pauseDisplay = 0; // таймер для обновления информации на дисплее, чтобы не мерцал
unsigned long pauseTimeHALL = 120000; // время паузы перед морганием экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин
int timeAfterACC = 5000; // время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg
unsigned long TimerREM = 0; // отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час
unsigned long timeBeforeRemOff = 1800000; //1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 207 строчка.
void setup() //настройки
{
// Serial.begin(115200);
//*************************test*************
wdt_disable(); //Отключение таймера watchdog

lcd.init(); // initialize the lcd занимает почти секунду
pinMode(STATEpinI, INPUT);
pinMode(STATEpinII, INPUT);
pinMode(PlanshBATpin, OUTPUT);
pinMode(SAMOZAPITKApin, OUTPUT);
pinMode(OTGpin, OUTPUT);
pinMode(SLEEPpin, OUTPUT);
pinMode(II_KIW_pin_POGOpin, OUTPUT);
pinMode(HUBpin, OUTPUT);
pinMode(13, OUTPUT); //светодиодик на плате ардуины
pinMode(REMpin, OUTPUT);
pinMode(REGISTRATORpin, OUTPUT);

digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
pauseTimeAKB = millis();

wdt_enable (WDTO_8S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка.
/* Возможные значения для константы
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S
*/
}


void loop()
{



//int Uacc = analogRead (A0); //Читаем напругу с делителя ACC R4-R5
//int Uakb = analogRead (A1); //Читаем напругу с делителя R2-R3
long Uacc = 0; //Читаем напругу с делителя ACC R4-R5 и вычисляем среднее арифметическое
long Uakb = 0; ////Читаем напругу с делителя R2-R3 и вычисляем среднее арифметическое
for (int i=0; i<100; ++i) { // делаем 100 замеров. 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)
//Serial.println(U_akb_real); // вывод напруги АКБ в ком порт для калибровки.

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

if ((U_akb_real - U_acc_real) >4 )//проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экратном при стартере и быстро тушить экран при выключении зажигания.
{timeAfterACC = 500;} // 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.
else {timeAfterACC = 5000;} // 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 (millis() - pauseTimeACC >= 500 && flagACC == 1) // пауза 0,5c после включения ACC и потом делать следующ(пока включено ACC):
{
digitalWrite(PlanshBATpin, 1); //включаем питание на батарею планшета (in2)

}

if (millis() - pauseTimeACC >= 800 && flagACC == 1) // пауза 0.8c после включения ACC и потом делать следующ(пока включено ACC): //через 0,8с после включения ACC включаем экран, включаем питание на видеорегистратор.
{
digitalWrite(II_KIW_pin_POGOpin, 1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
digitalWrite(OTGpin, 1); //включаем минус на Y-OTG (включается звуковая карта)
digitalWrite(REGISTRATORpin, 1); // включаем питание на видеорегистратор
}

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


}




//----------------------------------------------обработка статуса выхода 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 < 11.8 && flagACC == 1){ flagREM = 2;} //если подсел акб при включенном зажигании - статус рем - 2.
if (U_akb_real >= 11.8 && flagREM == 2 && flagACC == 0){ flagREM = 0;} // если восстановилось напряжение при выключенном зажигании - обнуляем статус РЕМ.


if (U_akb_real > 13.7){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, обнулили обратный отсчет вырубания РЕМ.
if( flagREM == 0 || flagREM == 2){digitalWrite(REMpin, 0);} // выключаем выход REM

//----------------------------------------------конец отработки выхода REM-----------------------------------------------------------


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

if (U_acc_real < UaccONorOFF && flagACC == 1)
{
flagACC = 0; //Выключили зажигание
digitalWrite(REMpin, 0);flagREM = 0; // выключаем флаг выхода REM

pauseTimeACC = millis();
pauseTimeAKB = millis();
flagREM = 0;// выключаем флаг выхода REM
lcd.clear(); //очистка экрана\
lcd.noBacklight(); // тушим подсветку экрана
}

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

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

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


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

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

if (millis() - pauseTimeAKB >= 20000 && flagAKB == 0) // если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.
{
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 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ч)
{
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)//(батарея планшета))
}

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









//*
//******************************************отслежив ания аварийной ситуации ITS716G******************************************* ************************************************** ************************************************** *********************************


//отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"
if(SAMOZAPITKApin==1 || PlanshBATpin==1 ||REMpin==1 || REGISTRATORpin ==1) // если проц включал любой канал ITS
{
if(STATEpinI == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(493); digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 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) ) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
blink_loop++;
}




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

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



int H = (millis()/3600000);
int M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка экрана


if (flagACC == 1){lcd.backlight();}//}else {lcd.noBacklight();}
//lcd.backlight();

//вывод времени работы
lcd.setCursor(0, 0);
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ)

lcd.setCursor(7, 0);
lcd.print(flagAKB); // вывод флага AKB

lcd.setCursor(8, 0);
lcd.print(flagACC); // вывод флага АСС

lcd.setCursor(9, 0);
lcd.print(flagREM); // вывод флага rem
lcd.setCursor(11, 0);
lcd.print(U_acc_real); // вывод напряжения АСС

//lcd.setCursor(5,1);
//-------------------2 строка---------------------------------
lcd.setCursor(0, 1);
unsigned long TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
lcd.print(TIMER);
lcd.setCursor(5, 1);
lcd.print(( millis() - TimerREM )/60000); //
lcd.setCursor(11, 1);
lcd.print(U_akb_real); // вывод напряжения АКБ

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


================
|1 111 0.000| 1 строка * вывод кол-ва минут работы блока *флаг АКБ*флаг АСС*флаг REM* вывод напряжения АСС
|616 10 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * millis() - TimerREM, минут * вывод напряжения АКБ


*///__________________________________________________ __________________________________________________ ______________________
}





// blink_mode = modes[3];

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 выключено.
*/
//************************************************** ************************************************** ******


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


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

//

Az0m@
17.07.2016, 00:54
залил... пока норм. единственное про плей паузу чет не догнал..

oleg707
17.07.2016, 01:41
залил... пока норм. единственное про плей паузу чет не догнал..

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

Az0m@
24.07.2016, 00:29
у меня само начинает играть при включении зажигания с того места, на котором выключилось. Но ты звуковую поставь для начала.

поставил -))) останавливать останавливается... но вот не начинает играть при включении.. если не трудно подскажи где в настройках копаться -))))

Az0m@
04.08.2016, 00:35
вопщем вроде как все у меня начало работать стабильно. авто - kia rio
из изменений: С1 - 220мкФ, с4 - 3200мкФ... плюс в проводке авто поставил перемычку через диод на замке с положения "стартер" на АСС... ибо штатно при включении "стартер" все доп.приборы отключаются, в том числе и ГУ.

и еще совсем чуть чуть изменил код в блоке включения зажигания:
// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
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 (millis() - pauseTimeACC >= 500 && flagACC == 1) // пауза 0,5c после включения ACC и потом делать следующ(пока включено ACC):
{
digitalWrite(PlanshBATpin, 1); //включаем питание на батарею планшета (in2)

}

if (millis() - pauseTimeACC >= 800 && flagACC == 1) // пауза 0.8c после включения ACC и потом делать следующ(пока включено ACC): //через 0,8с после включения ACC включаем экран, включаем питание на видеорегистратор.
{
digitalWrite(II_KIW_pin_POGOpin, 1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
digitalWrite(REGISTRATORpin, 1); // включаем питание на видеорегистратор
}

if (millis() - pauseTimeACC >= 2000 && flagACC == 1)//через 1с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)
{
digitalWrite(OTGpin, 1); //включаем минус на Y-OTG (включается звуковая карта)
digitalWrite(SLEEPpin, 0); //включаем экран = вЫключаем минус на упр SLEEP
digitalWrite(HUBpin, 0); //Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб
if( flagREM == 1 && flagAKB == 1 ){digitalWrite(REMpin, 1);} // включаем выход REM


}


в остальном работает без нареканий. у меня планшет 2012 3г 32гига, стоит прошивка аутодроид 1.2 + пикогапсы + карлаунчер и плеер поверамп.
хаб стоит AirTone ATH-04P... по внешнему виду как тут (http://pccar.ru/showpost.php?p=359845&postcount=272), чип увы не узрел... проверю как смогу. а так работает без нареканий
звуковая стоит на основе PCM2704 (http://ru.aliexpress.com/item/5V-USB-Powered-PCM2704-MINI-USB-Sound-Card-DAC-decoder-board-for-PC-Computer/32224589429.html?spm=2114.13010608.0.100.7bNE5P)

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

jonikus81
04.08.2016, 06:31
Az0m@, вариант с фольгой за планшетом не очень, у меня лично стал хуже ловить GPS, Wifi и 4g. А вот экранирование звуковухи и проводов от нее вполне может полететь.

dzyatel
18.08.2016, 16:42
Oleg707, проверьте личные сообщения, есть интерес кмвашему блоку питания

mercurio
25.08.2016, 01:44
А вы как автор насколько оцениваете сложность переделки схемы для использования вместо одного KIW - два Meanwell nsd15-12?

jonikus81
25.08.2016, 07:12
mercurio, я не автор, но схему нужно будет менять полностью. Не зная тонкостей гальванической развязки я наступил на сотню граблей. Разделение земли имеет огромный плюс и кучу мелких минусов. Плюс, это конечно чистейшее питание и никаких наводок, щелчков, пуков и бзыков по звуку. Минус - это придется "учить" работать ардуину, хаб и планшет без земли, то есть придется внедрять либо реле, либо оптроны, а так же изолировать всю периферию от земли. Хитрая земля может проскочить от любого девайса и тогда эффекта гальванической развязки мы лишаемся. Аналогичной схемы как у Олега но с гальваникой я не встречал и поэтому сам занялся разработкой. Схему Олега считаю самой универсальной, гибкой и многофункциональной, поэтому слежу за его работой и с его позволения беру его наработки. :read:

oleg707
25.08.2016, 12:22
А вы как автор насколько оцениваете сложность переделки схемы для использования вместо одного KIW - два Meanwell nsd15-12?

jonikus81 правильно написал, переделать не сложно, но надо ставить оптроны и перерисовывать всю печатку.
А смысл?! У меня на пцм 2407 щелчков и прочего нет на максимальной громкости усилителя. На уровне ресивера за 1000$. Цена решения = 5$ за зуковуху + хаб прикрутить, если флешка есть.


Чем лучше Meanwell nsd15-12 против KIW3312s ? ( кроме гальваники)


ЗЫ
Я даже больше скажу, я сейчас катаюсь на БП 4й версии с последней прошивкой от 5й - и вот всё просто работает и таак лень ставить 5ю, лежащую на полочке. Ну как лень, сильная нехватка времени, а там работает- не лезь. И это уже с ноунейм хабом, который питается от БП.

jonikus81
25.08.2016, 12:55
oleg707, я вот после всех мучений все таки решил второй собирать на KIWе, у NSD нужно обязательно ставить огромный кондер, так как при включении стартера (просадке ниже 9 вольт) NSDшка тупо выключается. А мой нексус 2013 LTE уж больно придирчив к падениям напруги, да и бывали случаи когда NSDшки - 1шт не хватало одному нексусу, грешу на LTE, где то читал, что даже без симки он ищет сети и усиливает сигнал для поиска, что приводит к увеличению нагрузки на БП.

mercurio
25.08.2016, 14:49
Здесь преимущества meanwell очень простые и они исключительно для меня играют роль - их достать проще. Привезут за день, а KIW может за месяц-два. А если отбросить вопрос стоимости и гальванической развязки и заменить на nsd, то можно будет использовать основную часть схемотехники и прошивки, не перестраивая с использованием оптронов и т.д.?

oleg707
25.08.2016, 19:39
Здесь преимущества meanwell очень простые и они исключительно для меня играют роль - их достать проще. Привезут за день, а KIW может за месяц-два. А если отбросить вопрос стоимости и гальванической развязки и заменить на nsd, то можно будет использовать основную часть схемотехники и прошивки, не перестраивая с использованием оптронов и т.д.?

из китая - 2 недели. и то и то.
По вопросу - конечно нельзя будет использовать основную часть схемотехники и прошивки! Только брать за основу. Потом менять прошивку соответственно железу.
И еще момент: в блоке питания 3,4,5 версий используется 2канала +5,0В и +3,8В, а в нсд - один канал при немаленьких размерах.
Вывод - ну его нафиг:be:

jonikus81
26.08.2016, 10:04
Здесь преимущества meanwell очень простые и они исключительно для меня играют роль - их достать проще. Привезут за день, а KIW может за месяц-два. А если отбросить вопрос стоимости и гальванической развязки и заменить на nsd, то можно будет использовать основную часть схемотехники и прошивки, не перестраивая с использованием оптронов и т.д.?
Если решили все таки на NSD, то рекомендую искать сразу либо релюшки мало потребляющие для ардуины, либо мощные P канальные мосфеты. С мосфетами более сложнее, но эффективнее как по размерам так и по потреблению. Я себе не поленился спаял мелкие ключики на P мосфетах.
Управляет +5 и +12 вольтами, от ардуины и бортовым напряжением соответсвенно, по датащиту мосфета можно пустить около 10А, что для нас даже очень гуд.
http://s14.radikal.ru/i187/1608/41/8c2fdfdc174c.jpg

mercurio
29.08.2016, 05:54
Если решили все таки на NSD
Не осилю переделку. Буду пытаться повторить как есть.

jonikus81
05.09.2016, 12:52
Всем привет, вот еще один минус всех NSDшек, это температура. Оставил я свой бп на панели и под прямыми солнечными лучами нсдшка нагрелась до состояния (рука не держит вообще), Соответвенно пошли глюки по напруге, скачки от 3 до 5 вольт, хотя выставленно 4,7. Планшет загрузиться не смог изза нехватки. Занес домой планшет, думал горячий и тоже глючит, нифига! пашет гад!

oleg707
05.09.2016, 16:01
отсюда http://elchupanibrei.livejournal.com/27443.html
Универсальная библиотека LiquidCrystal_I2C на базе расширителя портов PCF8574 (https://duino.ru/Rasshiritel-portov-PCF8574.html)

Данная библиотека плод месячного курения манула на Hitachi HD4478U и ему подобным контролерам (S6A0069, KS0066U, NT3881D, LC7985, ST7066, SPLC780, WH160xB, AIP31066). Без проблем работает с модулем продаваемом на китайских площадках.


Внешний вид китайского модуля


Принципиальна схема китайского модуля


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

На Github и в сети сплошная копипаста с небольшими вариациями. Даже обычная LiquidCrystal, идущая вместе с Arduino IDE не блещет лаконичностью, и до версии среды 1.6.11 имела баг в функции установки позиции курсора для экранов 20x4. Просто задумайтесь - баг жил в дистрибьютиве 5 лет!!! Чем больше я понимаю в програмировании тем сильнее мое разочарование в Arduino.

Забирать тут.
https://github.com/enjoyneering/LiquidCrystal_I2C
прямая ссылка https://github.com/enjoyneering/LiquidCrystal_I2C/tree/0450ec011781546ea9c6fa3d13c9e24292d5f421
прошил, правда с бубном. работает. потестю - выложу новый скетч.

oleg707
09.09.2016, 18:25
люди, а 32u4 в TQFP бывает вообще?
а всё, нашел (https://ru.aliexpress.com/item/1PCS-lot-ATMEGA32U4-AU-MCU-AVR-32K-FLASH-16MHZ-44-TQFP-32U4-MEGA32U4/32695077432.html?spm=2114.03010208.3.73.9qieNC&ws_ab_test=searchweb201556_0,searchweb201602_1_100 39_10057_10056_10065_10037_10068_10055_10054_10069 _301_10059_10058_10032_10073_10017_10070_10060_100 61_10052_10062_10053_10050_10051,searchweb201603_1&btsid=dbf8cd46-ebed-4127-9d45-8cc5035a7256)ATMEGA32U4-AU 44-TQFP
денег чтот много хотят, проще ардуину купить, так TQFP на ардуинах только 328p видел
44736

oleg707
11.09.2016, 21:54
доработка Бп5 версии
Добавлена подтяжка по I2C
тестово поднял питание до 4,0В на батарее планшета, покатаюсь - посмотрю, потом в схему докину.
Перешел на новую I2C библиотеку (ВЗЯТА https://github.com/enjoyneering/LiquidCrystal_I2C (тут) или в аттаче
Ложить библитоеку как всегда в libraries.
У меня лежит тут d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\

44759 печатка

44758 библиотека, устаревшая, на сайте автора есть новее и стабильнее UDP: Слегка обновил библиотеку (добавил больше коментариев) и слегка оптимизировал главую функцию. Должно быть на пару тактов процессора быстрее. Так же повысил стабильность работы с ESP8266


скетч для новой библиотеки
//ver i72 ( чем больше цифра, тем новее)
// дата правки 16.09.16.109

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 136-144)
//ТЕСТОВАЯ!!!
// скетч проверен и записан на версии ардуино IDE 1,6,11 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\

/* _______Сделано____________________________________ ______________
вывод информации на внешний дисплей по I2C, c версии 63 включительно поменяна библиотека вывода на экран! ВЗЯТА https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом,
усреднение замеров по напряжению ACC и AKB.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с).
Оптимизирован для планшета без батареи. Подходит для оставленной батареи также.
Управление REM: если напруга батареи больше 11.8 В, то включаем еще и усилитель звука (выход REM) /но включаем его только на 30мин, если не заведены. После заводки счетчик обнуляется.
__________________________________________________ ______________
потребление блока по 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>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27

//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.01;// в 155 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.7;//11.1 // напряжение порога сработки асс

/*ноги ардуины*/
int SAMOZAPITKApin = 9; //управление самозапиткой блока питания IN4
//1 = есть самозапитка; 0 = нет самозапитки
int PlanshBATpin = 6; // включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin
//0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
int II_KIW_pin_POGOpin = 2; // включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка
//0 = нет 5V на POGO; 1 = есть 5V на POGO
int OTGpin = 12; //управление транзюком OTG Q1
//1 = есть масса на OTG; 0 = нет массы на OTG
int SLEEPpin = 10; //управление транзюком сна VT4 (на датчик холла))
//1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
int HUBpin = 11; //управление транзюком питания хаба
// 0-есть питание, 1 - нет питания
int REMpin = 7; // выход сигнала REM (+12v) (IN3), на плате распаяно.
//0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
int REGISTRATORpin = 4; //выход 12В для работы видеорегистратора (D4 -IN1)
//пины состояния ITS
int STATEpinI = 5; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = норма
int STATEpinII = 8; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.

/*логические переменные, используемые в коде*/
int flagACC = 0; //признак включенного зажигания
int flagAKB = 0; // признак заряженной батареи
int flagREM = 0; // признак включенного выхода на усилитель звука (REM)
int flagHALL = 0; //флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = 0;
unsigned long pauseTimeAKB = 0;
unsigned long pauseDisplay = 0; // таймер для обновления информации на дисплее, чтобы не мерцал
unsigned long pauseTimeHALL = 120000; // время паузы перед морганием экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин
int timeAfterACC = 5000; // время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg
unsigned long TimerREM = 0; // отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час
unsigned long timeBeforeRemOff = 1800000; //1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 207 строчка.
void setup() //настройки
{
// Serial.begin(115200);
//*************************test*************
wdt_disable(); //Отключение таймера watchdog

//lcd.begin(16, 2); для newE
lcd.init(); // initialize the lcd занимает почти секунду для 0x27


pinMode(STATEpinI, INPUT);
pinMode(STATEpinII, INPUT);
pinMode(PlanshBATpin, OUTPUT);
pinMode(SAMOZAPITKApin, OUTPUT);
pinMode(OTGpin, OUTPUT);
pinMode(SLEEPpin, OUTPUT);
pinMode(II_KIW_pin_POGOpin, OUTPUT);
pinMode(HUBpin, OUTPUT);
pinMode(13, OUTPUT); //светодиодик на плате ардуины
pinMode(REMpin, OUTPUT);
pinMode(REGISTRATORpin, OUTPUT);

digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
pauseTimeAKB = millis();

wdt_enable (WDTO_8S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка.
/* Возможные значения для константы
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S
*/
//delay(100); //для инициализации ЛСД-дисплея, с 13 сент 16 библиотеку пофиксили и это строка не нужна
}













void loop()
{



//int Uacc = analogRead (A0); //Читаем напругу с делителя ACC R4-R5
//int Uakb = analogRead (A1); //Читаем напругу с делителя R2-R3
long Uacc = 0; //Читаем напругу с делителя ACC R4-R5 и вычисляем среднее арифметическое
long Uakb = 0; ////Читаем напругу с делителя R2-R3 и вычисляем среднее арифметическое
for (int i=0; i<100; ++i) { // делаем 100 замеров. 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)
//Serial.println(U_akb_real); // вывод напруги АКБ в ком порт для калибровки.

// кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.
if (millis() > pauseTimeHALL && flagHALL == 0 || millis() > 10000 && flagACC == 1) {
flagHALL = 1; //проверка отсчета при холодном старте при включении и сразу выключении ACC
}
/* проверка, выключили ли мы зажигание или просто стартуем */
if ((U_akb_real - U_acc_real) >5 )//проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.
{timeAfterACC = 500;} // 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.
else {timeAfterACC = 5000;} // 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 (millis() - pauseTimeACC >= 1000 && flagACC == 1) // пауза 1c после включения ACC и потом делать следующ(пока включено ACC):
{
digitalWrite(PlanshBATpin, 1); //включаем питание на батарею планшета (in2)

}

if (millis() - pauseTimeACC >= 1600 && flagACC == 1) // пауза 1,6c после включения ACC и потом делать следующ(пока включено ACC): //через 0,8с после включения ACC включаем экран, включаем питание на видеорегистратор.
{
digitalWrite(II_KIW_pin_POGOpin, 1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
digitalWrite(REGISTRATORpin, 1); // включаем питание на видеорегистратор
}

if (millis() - pauseTimeACC >= 2200 && flagACC == 1)//через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)
{
digitalWrite(SLEEPpin, 0); //включаем экран = вЫключаем минус на упр SLEEP
digitalWrite(OTGpin, 1); //включаем минус на Y-OTG (включается звуковая карта) // тестово, для более устойчивого определения перифирии.
digitalWrite(HUBpin, 0); //Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб
if( flagREM == 1 && flagAKB == 1 ){digitalWrite(REMpin, 1);} // включаем выход REM


}




//----------------------------------------------обработка статуса выхода 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){ (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( flagREM == 0 || flagREM == 2){digitalWrite(REMpin, 0);} // выключаем выход REM

//----------------------------------------------конец отработки выхода REM-----------------------------------------------------------


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

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

lcd.noBacklight();// тушим подсветку экрана для newE и для 0x27
// в 409 строке включение подсветки LCD дисплея

lcd.clear(); //очистка экрана
}

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

if (flagHALL == 1)
{
digitalWrite(SLEEPpin, 1); //включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)
}
else
{
digitalWrite(SLEEPpin, 0);
}
}

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

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


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

if (millis() - pauseTimeAKB >= 20000 && flagAKB == 0) // если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.
{
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 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ч)
{
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)//(батарея планшета))
}

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









//*
//******************************************отслежив ания аварийной ситуации ITS716G******************************************* ************************************************** ************************************************** *********************************


//отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"
if(SAMOZAPITKApin==1 || PlanshBATpin==1 ||REMpin==1 || REGISTRATORpin ==1) // если проц включал любой канал ITS
{
if(STATEpinI == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(493); digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 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) ) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
blink_loop++;
}




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

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



int H = (millis()/3600000);
int M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка экрана


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


//вывод времени работы
lcd.setCursor(0, 0);
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ)

lcd.setCursor(7, 0);
lcd.print(flagAKB); // вывод флага AKB

lcd.setCursor(8, 0);
lcd.print(flagACC); // вывод флага АСС

lcd.setCursor(9, 0);
lcd.print(flagREM); // вывод флага rem
lcd.setCursor(11, 0);
lcd.print(U_acc_real); // вывод напряжения АСС

//lcd.setCursor(5,1);
//-------------------2 строка---------------------------------
lcd.setCursor(0, 1);
unsigned long TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
lcd.print(TIMER);
lcd.setCursor(5, 1);
lcd.print(( millis() - TimerREM )/60000); //
lcd.setCursor(11, 1);
lcd.print(U_akb_real); // вывод напряжения АКБ

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


================
|1 111 0.000| 1 строка * вывод кол-ва минут работы блока *флаг АКБ*флаг АСС*флаг REM* вывод напряжения АСС
|616 10 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * millis() - TimerREM, минут * вывод напряжения АКБ


*///__________________________________________________ __________________________________________________ ______________________
}





// blink_mode = modes[3];

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 выключено.
*/
//************************************************** ************************************************** ******


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


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

//


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

oleg707
13.09.2016, 22:51
Microprocessor Reset Circuits
http://www.analog.com/media/en/technical-documentation/data-sheets/ADM1810_1811_1812_1813_1815_1816_1817_1818.pdf

oleg707
03.10.2016, 18:36
последняя на сегодняшний день прошивка для версии 4.

//ver i72 ( чем больше цифра, тем новее)
// дата правки 16.09.16.109

// для 4й версии блока питания
//ТЕСТОВАЯ!!!
// скетч проверен и записан на версии ардуино IDE 1,6,11-win7 и 1,6,3 winXP !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\

/* _______Сделано____________________________________ ______________
вывод информации на внешний дисплей по I2C
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом,
усреднение замеров по напряжению ACC и AKB.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с).
Управление REM: если напруга батареи больше 11.8 В, то включаем еще и усилитель звука (выход REM) /но включаем его только на 30мин, если не заведены. После заводки счетчик обнуляется.
__________________________________________________ ______________
потребление блока по 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>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27

//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.01;// в 155 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.7;//11.1 // напряжение порога сработки асс

/*ноги ардуины*/
int SAMOZAPITKApin = 9; //управление самозапиткой блока питания IN4
//1 = есть самозапитка; 0 = нет самозапитки
int PlanshBATpin = 6; // включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin
//0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
int II_KIW_pin_POGOpin = 2; // включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка
//0 = нет 5V на POGO; 1 = есть 5V на POGO
int OTGpin = 12; //управление транзюком OTG Q1
//1 = есть масса на OTG; 0 = нет массы на OTG
int SLEEPpin = 10; //управление транзюком сна VT4 (на датчик холла))
//1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
int HUBpin = 11; //управление транзюком питания хаба
// 0-есть питание, 1 - нет питания
int REMpin = 7; // выход сигнала REM (+12v) (IN3), на плате распаяно.
//0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
int REGISTRATORpin = 4; //выход 12В для работы видеорегистратора (D4 -IN1)
//пины состояния ITS
int STATEpinI = 5; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = норма
int STATEpinII = 8; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.

/*логические переменные, используемые в коде*/
int flagACC = 0; //признак включенного зажигания
int flagAKB = 0; // признак заряженной батареи
int flagREM = 0; // признак включенного выхода на усилитель звука (REM)
int flagHALL = 0; //флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = 0;
unsigned long pauseTimeAKB = 0;
unsigned long pauseDisplay = 0; // таймер для обновления информации на дисплее, чтобы не мерцал
unsigned long pauseTimeHALL = 120000; // время паузы перед морганием экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин
int timeAfterACC = 5000; // время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg
unsigned long TimerREM = 0; // отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час
unsigned long timeBeforeRemOff = 1800000; //1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 207 строчка.
void setup() //настройки
{
// Serial.begin(115200);
//*************************test*************
wdt_disable(); //Отключение таймера watchdog

//lcd.begin(16, 2); для newE
lcd.init(); // initialize the lcd занимает почти секунду для 0x27


pinMode(STATEpinI, INPUT);
pinMode(STATEpinII, INPUT);
pinMode(PlanshBATpin, OUTPUT);
pinMode(SAMOZAPITKApin, OUTPUT);
pinMode(OTGpin, OUTPUT);
pinMode(SLEEPpin, OUTPUT);
pinMode(II_KIW_pin_POGOpin, OUTPUT);
pinMode(HUBpin, OUTPUT);
pinMode(13, OUTPUT); //светодиодик на плате ардуины
pinMode(REMpin, OUTPUT);
pinMode(REGISTRATORpin, OUTPUT);

digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
pauseTimeAKB = millis();

wdt_enable (WDTO_8S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка.
/* Возможные значения для константы
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S
*/

}













void loop()
{




long Uacc = 0; //Читаем напругу с делителя ACC R4-R5 и вычисляем среднее арифметическое
long Uakb = 0; ////Читаем напругу с делителя R2-R3 и вычисляем среднее арифметическое
for (int i=0; i<100; ++i) { // делаем 100 замеров. 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)
//Serial.println(U_akb_real); // вывод напруги АКБ в ком порт для калибровки.

// кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.
if (millis() > pauseTimeHALL && flagHALL == 0 || millis() > 10000 && flagACC == 1) {
flagHALL = 1; //проверка отсчета при холодном старте при включении и сразу выключении ACC
}
/* проверка, выключили ли мы зажигание или просто стартуем */
if ((U_akb_real - U_acc_real) >5 )//проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.
{timeAfterACC = 500;} // 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.
else {timeAfterACC = 5000;} // 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 (millis() - pauseTimeACC >= 1000 && flagACC == 1) // пауза 1c после включения ACC и потом делать следующ(пока включено ACC):
{
digitalWrite(PlanshBATpin, 1); //включаем питание на батарею планшета (in2)

}

if (millis() - pauseTimeACC >= 1600 && flagACC == 1) // пауза 1,6c после включения ACC и потом делать следующ(пока включено ACC): //через 0,8с после включения ACC включаем экран, включаем питание на видеорегистратор.
{
digitalWrite(II_KIW_pin_POGOpin, 1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
digitalWrite(REGISTRATORpin, 1); // включаем питание на видеорегистратор
}

if (millis() - pauseTimeACC >= 2200 && flagACC == 1)//через 2,2с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)
{
digitalWrite(SLEEPpin, 0); //включаем экран = вЫключаем минус на упр SLEEP
digitalWrite(OTGpin, 1); //включаем минус на Y-OTG (включается звуковая карта) // тестово, для более устойчивого определения перифирии.
digitalWrite(HUBpin, 0); //Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб
if( flagREM == 1 && flagAKB == 1 ){digitalWrite(REMpin, 1);} // включаем выход REM


}




//----------------------------------------------обработка статуса выхода 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){ (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( flagREM == 0 || flagREM == 2){digitalWrite(REMpin, 0);} // выключаем выход REM

//----------------------------------------------конец отработки выхода REM-----------------------------------------------------------


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

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

lcd.noBacklight();// тушим подсветку экрана для newE и для 0x27
// в 409 строке включение подсветки LCD дисплея

lcd.clear(); //очистка экрана
}

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

if (flagHALL == 1)
{
digitalWrite(SLEEPpin, 1); //включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)
}
else
{
digitalWrite(SLEEPpin, 0);
}
}

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

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


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

if (millis() - pauseTimeAKB >= 20000 && flagAKB == 0) // если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.
{
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 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ч)
{
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)//(батарея планшета))
}

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









//*
//******************************************отслежив ания аварийной ситуации ITS716G******************************************* ************************************************** ************************************************** *********************************


//отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"
if(SAMOZAPITKApin==1 || PlanshBATpin==1 ||REMpin==1 || REGISTRATORpin ==1) // если проц включал любой канал ITS
{
if(STATEpinI == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(493); digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 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) ) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
blink_loop++;
}




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

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



int H = (millis()/3600000);
int M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка экрана


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


//вывод времени работы
lcd.setCursor(0, 0);
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ)

lcd.setCursor(7, 0);
lcd.print(flagAKB); // вывод флага AKB

lcd.setCursor(8, 0);
lcd.print(flagACC); // вывод флага АСС

lcd.setCursor(9, 0);
lcd.print(flagREM); // вывод флага rem
lcd.setCursor(11, 0);
lcd.print(U_acc_real); // вывод напряжения АСС

//lcd.setCursor(5,1);
//-------------------2 строка---------------------------------
lcd.setCursor(0, 1);
unsigned long TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
lcd.print(TIMER);
lcd.setCursor(5, 1);
lcd.print(( millis() - TimerREM )/60000); //
lcd.setCursor(11, 1);
lcd.print(U_akb_real); // вывод напряжения АКБ

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


================
|1 111 0.000| 1 строка * вывод кол-ва минут работы блока *флаг АКБ*флаг АСС*флаг REM* вывод напряжения АСС
|616 10 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * millis() - TimerREM, минут * вывод напряжения АКБ


*///__________________________________________________ __________________________________________________ ______________________
}





// blink_mode = modes[3];

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 выключено.
*/
//************************************************** ************************************************** ******


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


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

//

Az0m@
04.10.2016, 07:49
Олег.... прошу помощи выявить глюк.
иногда после долгого простоя вторая часть кивки, которая идет для питания хаба, зарядки планшета (вопщем выдающая 5В) не запускается. при этом команда от ардуинки на его включение приходит. при это после подачи АСС вторая часть кивки на доли секунды включается и потом выключается.... такое чувство что срабатывает какая то защита у него. если после этого пару раз передернуть АСС то все нормально начинает работать.

P.S. при этом первая часть ардуинки которая идет на питание батареи все исправно пашед

oleg707
04.10.2016, 14:02
Олег.... прошу помощи выявить глюк.
иногда после долгого простоя вторая часть кивки, которая идет для питания хаба, зарядки планшета (вопщем выдающая 5В) не запускается. при этом команда от ардуинки на его включение приходит. при это после подачи АСС вторая часть кивки на доли секунды включается и потом выключается.... такое чувство что срабатывает какая то защита у него. если после этого пару раз передернуть АСС то все нормально начинает работать.

P.S. при этом первая часть ардуинки которая идет на питание батареи все исправно пашед

хм, нагрузки на второй части нету практически.
Ты заливал последнюю версию i72 ? Там критический и трудноуловимый баг по нижнему напряжению питания устранён.

Az0m@
04.10.2016, 18:49
хм, нагрузки на второй части нету практически.
Ты заливал последнюю версию i72 ? Там критический и трудноуловимый баг по нижнему напряжению питания устранён.

Чет пропустил его...залил его. Пока обкатываю... Глюка этого не наблюдаю

Artemix
09.10.2016, 17:43
недано поймал глюк планшет постоянно нажималась кнопка минус звука , я потушить планшет не мог и выключить тоже , удалось перезагрузить но вышел в меню прошивок.
как с этим бороться?

oleg707
09.10.2016, 20:32
недано поймал глюк планшет постоянно нажималась кнопка минус звука , я потушить планшет не мог и выключить тоже , удалось перезагрузить но вышел в меню прошивок.
как с этим бороться?

а причём здесь блок питания?

Artemix
10.10.2016, 16:56
а причём здесь блок питания?

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

oleg707
10.10.2016, 18:46
из за частот или еще какая помеха в машине?
с lm2596 такая же фигня с залипанием , даже проверял пайку и то нечего не дало
а могут быть сами кнопки с планшета ? были с кем нибудь случаи

у меня не было:secret:

Jigafur
19.10.2016, 23:24
Бредовый наверное вопрос задам - а что если хаб запитать от входа usb любого гу? Будет ли заряжаться nexus? И можно ли будет подключить pcm2704 muse в хаб? Или вообще подключить хаб к yatour

jonikus81
20.10.2016, 07:38
Бредовый наверное вопрос задам - а что если хаб запитать от входа usb любого гу? Будет ли заряжаться nexus? И можно ли будет подключить pcm2704 muse в хаб? Или вообще подключить хаб к yatour
если гу выдает более 2А (я таких не встречал) то возможно

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

пробуй хорошенько промыть спиртом места пайки, у меня было такое с китайской канифолью, она проводила ток как оказалось, после промывки все встало на места


PS. ребят, из уважения к автору, просьба писать в соответствующих темах, спасибо

Furai2014
30.10.2016, 13:35
Здравствуйте, а какие диоды лучше использовать (марка)? Спасибо

vtyns
30.10.2016, 19:38
ребят. случилась проблема. случайно при тесте нексуса 2013 при включении планшета подал питание на кнопку включения 12вольт вместо массы. ну после этого естественно он не включается. что посоветуете? или мать менять?

oleg707
31.10.2016, 02:32
Здравствуйте, а какие диоды лучше использовать (марка)? Спасибо

lubie. glavnoe, chtoby napragenie nemnogo ponizit.

jonikus81
31.10.2016, 06:52
Здравствуйте, а какие диоды лучше использовать (марка)? Спасибо
немног поделюсь опытом по диодам. У меня 2013й LTE и понижал я напругу от НСДшки выставленной на 5,2В. Начал я с 4амперных диодов, итог был плачевен, так как диоды раскалялись до такой степени, что чернел текстолит и плавилось олово на контактах(хотя запитан через них только планшет). Затем я поставил 6 амперные, греются меньше но все равно греются. Сейчас стоят 20ти амперные, на транзистор с ушком под радиатор похожие. Греются слегка. 3 месяца полет нормальный.

oleg707
31.10.2016, 20:39
немног поделюсь опытом по диодам. У меня 2013й LTE и понижал я напругу от НСДшки выставленной на 5,2В. Начал я с 4амперных диодов, итог был плачевен, так как диоды раскалялись до такой степени, что чернел текстолит и плавилось олово на контактах(хотя запитан через них только планшет). Затем я поставил 6 амперные, греются меньше но все равно греются. Сейчас стоят 20ти амперные, на транзистор с ушком под радиатор похожие. Греются слегка. 3 месяца полет нормальный.

net, tam diodi nuzny tolko dlja pitaniya arduino. tok ochen malenkiy. potomu diody lubie. mogno posmotretbna foto.
A esly nado pitat planshet 5,0->4,2, to dlya etogo est dc-dc converter!

jonikus81
01.11.2016, 11:59
net, tam diodi nuzny tolko dlja pitaniya arduino. tok ochen malenkiy. potomu diody lubie. mogno posmotretbna foto.
A esly nado pitat planshet 5,0->4,2, to dlya etogo est dc-dc converter!
Упс, это я не по теме оказывается написал, извиняюсь. Я 5.2 вольта понижал для планшета на одном единствнном ДС-ДС адапторе с гальваникой, второй покупать просто жаба задавила, ценник не просто высок, а неадекватно высок. А по питанию ардуины, pro micro с 3мя последовательно соединенными стабами 5v1 две штуки(ардуины) сгорели, только что поставил L7805CV и забыл о проблеме :spiteful: (стоит копейки с 2мя смд кондерами)

oleg707
01.11.2016, 14:26
Упс, это я не по теме оказывается написал, извиняюсь. Я 5.2 вольта понижал для планшета на одном единствнном ДС-ДС адапторе с гальваникой, второй покупать просто жаба задавила, ценник не просто высок, а неадекватно высок. А по питанию ардуины, pro micro с 3мя последовательно соединенными стабами 5v1 две штуки(ардуины) сгорели, только что поставил L7805CV и забыл о проблеме :spiteful: (стоит копейки с 2мя смд кондерами)

так в нано ams1117-5 и стоит. только по даташиту там можно понижать не более, чем на 7 вольт.
Тогда я высчитывал, получалось около 14и вольт максимума. диоды дают разбежку вольт до 17, по крайней мере я домашний блок питания выставлял на 17, нормально работало и давало +5 на атмегу.
можно ставить для питания КРЕН 9-12, м потом их уже скидывать до 5, но у меня на тот момент были только диоды, слизанные с какой то материнки.

Az0m@
06.11.2016, 18:25
сегодня словил очередную глюк.... с перебоями начал работать выходе REM. причем ситуация такая:
включаю зажигание - всё включается, музон играет
далее завожу двиг - выход REM отключается...
если же после включения зажигания сразу завожу двигатель то усилитель ваще даже не включается. согласно схеме выход REM идет от ITS716G... не ужто он накрывается?

oleg707
06.11.2016, 18:51
сегодня словил очередную глюк.... с перебоями начал работать выходе REM. причем ситуация такая:
включаю зажигание - всё включается, музон играет
далее завожу двиг - выход REM отключается...
если же после включения зажигания сразу завожу двигатель то усилитель ваще даже не включается. согласно схеме выход REM идет от ITS716G... не ужто он накрывается?

не должно.

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

прицепи дисплей, там в середине статус акб, ацц, и рем. после заводки машины должно быть 111.

Az0m@
07.11.2016, 12:42
не должно.

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

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

oleg707
07.11.2016, 15:59
вечером вернут дисплей и посмотрю
а пока заменил арудинку... начало все работать, но появился предыдущий глюк:
если после зажигания сразу завожу, то зарядка вместа с хабом на доли секунды включается и выключается. выход рем и экран планшета работают в штатном режиме
если же после зажигания подождать пока зарядка и хаб включаться и потом только завести двигатель то все норм продолжает работать -)...
блин, не одно..то другое..

скетч попробуй под себя подогнать

avaRi
10.11.2016, 02:37
Приветствую. Подскажите как правильно переделать KIW-3312S?
Верх у меня 3.7 вольт. А вот низ 1.2 вольта.
Побывал разные номиналы резисторов ставить эффекта нет!
Желательно картинку

Az0m@
10.11.2016, 12:29
Приветствую. Подскажите как правильно переделать KIW-3312S?
Верх у меня 3.7 вольт. А вот низ 1.2 вольта.
Побывал разные номиналы резисторов ставить эффекта нет!
Желательно картинку
http://we.easyelectronics.ru/part/sdvoennyy-preobrazovatel-napryazheniya-kiw-3312s-ir3802a.html

oleg707
10.11.2016, 14:27
Приветствую. Подскажите как правильно переделать KIW-3312S?
Верх у меня 3.7 вольт. А вот низ 1.2 вольта.
Побывал разные номиналы резисторов ставить эффекта нет!
Желательно картинку

R2.2 нужно выкинуть. Вверху и внизу.
Обязательно конденсатор по выходам!
И резистор на adj 1-2.

ÍÀÑÒÐÎÉÊÀ kiw3312s

R2.2 è çåðêàëüíûé åìó ðåçàê âûïàèâàåì
çíà÷åíèÿ âûõîäíûõ íàïðÿæåíèé íàñòðàèâàþòñÿ ðåçàêàìè Rx2.2 âåðõ è Rx2.2 íèç.
ÂÅÐÕ: 85k=3.3v
110k=3.8v (ìî¸ çíà÷åíèå) âðîäå áû îíî ñòîèò íà ìåñòå R2.2
115k=4v
139k=4.5v
150k=4.7v
160k=5v

ÍÈÇ: 24k=1.3v
130k=4.0v
150k=4.5v
165k=4.56v (ìî¸ çíà÷åíèå)
170k=5.0v

íà ïëàòå ïî ïèòàíèþ óæå ñòîÿò ñòàáèëèòðîíû (zd1) íà 5.6v, íî ÿ äîáàâèë åùå

Боле подробно в BP 707 bez proca.spl7 ( 3 версия Блока Питания)

avaRi
13.11.2016, 18:48
Доброго Олег! Спасибо за блок питания! Собрал и отладил все отлично работает. Вот сопротивление R10 точно 103? походу там ошибка Поставил 102 все отлично запустилось. по этой причине и не работал второй вывод KIW.
Что бы работал WatchDog шить через программатор?

oleg707
13.11.2016, 21:48
Доброго Олег! Спасибо за блок питания! Собрал и отладил все отлично работает. Вот сопротивление R10 точно 103? походу там ошибка Поставил 102 все отлично запустилось. по этой причине и не работал второй вывод KIW.
Что бы работал WatchDog шить через программатор?

На здоровье!
да 103. НО я R9 не ставлю
Вообще глянул схему - вы правы. Там 1К(r9) подтяжки к земле и 10К(r10) по +5В( с атмеги) то есть если стоИт R9 -управление канала притянуто на землю, соответственно на выходе нет напруги. Я его не паяю, потому как и без него прекрасно работает.

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

Зы Фото что ли выложи.

oleg707
13.11.2016, 22:06
описание подключения
45501
45499
45500

Az0m@
13.11.2016, 22:25
На здоровье!
да 103. НО я R9 не ставлю
Вообще глянул схему - вы правы. Там 1К(r9) подтяжки к земле и 10К(r10) по +5В( с атмеги) то есть если стоИт R9 -управление канала притянуто на землю, соответственно на выходе нет напруги. Я его не паяю, потому как и без него прекрасно работает.

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

oleg707
13.11.2016, 22:43
оо..а вот тут и мне стало инетерсно... у меня тоже второй канал периодически барахлит... надо и у себя так попробывать.. или R9 на место запаять

припаяй по 102 R9 и 10. Поезди - отпишись.
Если будет возможность - на своей попробую.

avaRi
14.11.2016, 07:12
Фото в хорошем качестве по ссылкам ниже
https://content-5.foto.my.mail.ru/list/forexnik/BP/b-1371.jpg
https://content-21.foto.my.mail.ru/list/forexnik/BP/b-1372.jpg

Az0m@
16.11.2016, 11:15
припаяй по 102 R9 и 10. Поезди - отпишись.
Если будет возможность - на своей попробую.

не помогает... даже тока с R10 102. причем по индикации на хабе видно что канал включается на долю секунды и выключается... т.е. светодиода питания хаба успевает моргнуть

oleg707
16.11.2016, 19:31
не помогает... даже тока с R10 102. причем по индикации на хабе видно что канал включается на долю секунды и выключается... т.е. светодиода питания хаба успевает моргнуть

у меня как то были трудновыловимые глюки с микротрещиной по диодам
и непропаем ITS.

oleg707
17.11.2016, 19:37
не помогает... даже тока с R10 102. причем по индикации на хабе видно что канал включается на долю секунды и выключается... т.е. светодиода питания хаба успевает моргнуть

а у тебя хаб к какому контакту подключен?
ко 2 или к 14?

Az0m@
20.11.2016, 22:48
а у тебя хаб к какому контакту подключен?
ко 2 или к 14?
согласно схеме

oleg707
20.11.2016, 23:31
согласно схемы

эм, у тебя нумерация не соответствует моей

Az0m@
21.11.2016, 12:18
эм, у тебя нумерация не соответствует моей
исходя из этой распиновки:
http://pccar.ru/showpost.php?p=374217&postcount=566
то "+" на хаб от вывода "+5 pogo"
а "-" на хаб от вывода "GND Plans"

думаешь "+" лучше попробывать на вывод "HUB" пересадить?

oleg707
21.11.2016, 13:48
исходя из этой распиновки:
http://pccar.ru/showpost.php?p=374217&postcount=566
то "+" на хаб от вывода "+5 pogo"
а "-" на хаб от вывода "GND Plans"

думаешь "+" лучше попробывать на вывод "HUB" пересадить?

:yes4:
попробуй.
у тебя 2 варианта.
я так понял, что пропадает питание на хаб.
В твоём подключении питание на хаб взято напрямую с 2го канала КИВа. Поэтому либо КИВ не выдаёт, либо управление некорректное (плавает).
По поводу КИВа можешь выпаять R9 и R10, этим ты включишь питание 2го канала на постоянную.
В этом режиме поезди, только на ночь не оставляй. Либо блок снимай, либо ресет на ардуине при выключенном зажигании клацай - чтобы самозапитки снять.

Az0m@
21.11.2016, 22:30
:yes4:
попробуй.
у тебя 2 варианта.
я так понял, что пропадает питание на хаб.
В твоём подключении питание на хаб взято напрямую с 2го канала КИВа. Поэтому либо КИВ не выдаёт, либо управление некорректное (плавает).
По поводу КИВа можешь выпаять R9 и R10, этим ты включишь питание 2го канала на постоянную.
В этом режиме поезди, только на ночь не оставляй. Либо блок снимай, либо ресет на ардуине при выключенном зажигании клацай - чтобы самозапитки снять.
в том то и дело что питание взято через транзюк, а не напрямую с КИВа... я же правильно понимаю что +5В ПОГО идет от транзюка... на него у меня и пасажен ха

oleg707
22.11.2016, 22:51
в том то и дело что питание взято через транзюк, а не напрямую с КИВа... я же правильно понимаю что +5В ПОГО идет от транзюка... на него у меня и пасажен ха

запутал ты меня. Давай позже по скайпу лучше.

avaRi
26.11.2016, 17:05
как два дня тестирую блок в машине.
И есть полтергейст со вторым каналом KIW, Когда тачка холодная он не включается. Стоит проехать и прогреть машину примерно через 20 мин все отлично. можно целый день ездить. Включать и отключать зажигание. стартует отлично. Но если тачка остыла все он в отвале! вернее он уходит в защиту. На управляющей ноге есть +2.5v

oleg707
26.11.2016, 17:14
как два дня тестирую блок в машине.
И есть полтергейст со вторым каналом KIW, Когда тачка холодная он не включается. Стоит проехать и прогреть машину примерно через 20 мин все отлично. можно целый день ездить. Включать и отключать зажигание. стартует отлично. Но если тачка остыла все он в отвале! вернее он уходит в защиту. На управляющей ноге есть +2.5v

ок, это уже тенденция, у Азома тоже глюки со 2 каналом.
Давайте разбираться.

Что значит вернее он уходит в защиту.? светодиод на ардуине что отмаргивает? код или равномерно моргает?
Дисплей I2C у вас есть?

R9 и R10 запаяны? какие номиналы?
На холодную на управляющей ноге такое же напряжение?
Если выпаять R9 и R10 , то работает на холодную? ( второй канал без резисторов работать должен постоянно, не реагируя на выключение зажигания, как и первый канал)

Еще фото блока выложите.
сейчас специально проверил напряжения на управляющих пинах КИВА. 3,0В на первом канале( который в воздухе)
и 3,2В при включенном 2м канале (0,2В при выключенном)
R9 у меня не стоит, R10 = 103(10k).



Вот как 45654 выглядит то, на чём я сейчас езжу с этими скетчами: 45655

Furai2014
28.11.2016, 00:50
Здравствуйте, а кив должен щелчки выдавать когда работает?. Rx2.2низ1 и Rx2.2низ ставить 334 или лучше как у Вас на фото 224 и 684?. Спасибо.

Furai2014
28.11.2016, 00:54
Еще такой нюанс случился, хотел померять между пинами "gnd_in" и "батарея планшета" напругу, сгорел конденсатор С4 (у меня 1000мкф 16В) это может быть проблема с кив?

Az0m@
28.11.2016, 08:37
Здравствуйте, а кив должен щелчки выдавать когда работает?. Rx2.2низ1 и Rx2.2низ ставить 334 или лучше как у Вас на фото 224 и 684?. Спасибо.
без разницы... главное чтобы итоговой суммарный номинал сопротивления был аналогичен
P.S. у меня без щелчков работает

Az0m@
28.11.2016, 08:41
ок, это уже тенденция, у Азома тоже глюки со 2 каналом.
Давайте разбираться.

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

jonikus81
28.11.2016, 09:05
у меня один из кивов "звенел", как оказалось коротыш на выходе и конденсатор горел только при переплюсовке. От сопротивлений подтягивающих SS1 и SS2 отказался применив оптроны, но схема пока только на столе, в морозы пока нет возможности проверить.

oleg707
28.11.2016, 13:25
Здравствуйте, а кив должен щелчки выдавать когда работает?. Rx2.2низ1 и Rx2.2низ ставить 334 или лучше как у Вас на фото 224 и 684?. Спасибо.

кив выдаёт щелчки если нет конденсатора на выходе. или неправильно задано напряжение резисторами R2.2.
ИЛИ это уже было и кив успел сгореть. Без R2.2 и кондёров на выходе кив включать запрещено.


зы
2 канал работает нормально, на холод НЕ реагирует.
Единственное, что меня беспокоит, так это при старте есть пиковая просадка на доли секунды до 7,8-8В. Из-за этого может отвалиться звуковая и (или) потухнуть экран (редко, но бывает). Лечится ресетом ардуины или передёргиванием ключа. Попробую поменять алгоритм включения планшета после старта, а там видно будет.

oleg707
28.11.2016, 13:52
у меня один из кивов "звенел", как оказалось коротыш на выходе и конденсатор горел только при переплюсовке. От сопротивлений подтягивающих SS1 и SS2 отказался применив оптроны, но схема пока только на столе, в морозы пока нет возможности проверить.

SS1 в воздухе, a SS2 как вариант через диод и резистор подключить.
Массу диод с проца пропустит (просадив опорное напряжение кива до 0,2), а +5В не пройдут.

oleg707
28.11.2016, 14:45
Ребят, есть еще вопрос.
Периодически мне что-либо приходит в голову и я это реализую (в данном случае речь идёт про код - скетч).
Такой код получает статус тестового. Обычно по прошествии 10-50 дней тест успешно завершается ( иногда неуспешно).
Так вот вопрос: Нужно ли выкладывать самые свежие версии программы, либо ждать и потом выкладывать?

Az0m@
28.11.2016, 16:19
Ребят, есть еще вопрос.
Периодически мне что-либо приходит в голову и я это реализую (в данном случае речь идёт про код - скетч).
Такой код получает статус тестового. Обычно по прошествии 10-50 дней тест успешно завершается ( иногда неуспешно).
Так вот вопрос: Нужно ли выкладывать самые свежие версии программы, либо ждать и потом выкладывать?
выкладывай... ибо чем больше тестировщиков тем больше вероятность найти болячки

oleg707
28.11.2016, 16:26
byte ver =80;// ( чем больше цифра, тем новее)
// дата правки 28.11.16.1336

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 161-164)
//ТЕСТОВАЯ!
// скетч проверен и записан на версии ардуино IDE 1,6,11 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\

/* _______Сделано____________________________________ ______________
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по 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мин, если не заведены. После заводки счетчик обнуляется.
__________________________________________________ ______________
потребление блока по 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>
#include <LiquidCrystal_I2C.h>
#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1

//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.01;// в 258 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.4;//11.1 // напряжение порога сработки асс

/*ноги ардуины*/
byte SAMOZAPITKApin = 9; /*управление самозапиткой блока питания IN4*///1 = есть самозапитка; 0 = нет самозапитки
byte PlanshBATpin = 6; /* включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
byte II_KIW_pin_POGOpin = 2; /* включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
byte OTGpin = 12; /*управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG
byte SLEEPpin = 10; /*управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
byte HUBpin = 11; /*управление транзюком питания хаба*/ // 0-есть питание, 1 - нет питания
byte REMpin = 7; /* выход сигнала REM (+12v) (IN3)*/ //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
byte REGISTRATORpin = 4; /*выход 12В для работы видеорегистратора (D4 -IN1)*/
//пины состояния ITS
byte STATEpinI = 5; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = норма*/
byte STATEpinII = 8; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.*/

/*логические переменные, используемые в коде*/
byte flagACC = 0; /*признак включенного зажигания*/
byte flagAKB = 0; /* признак заряженной батареи*/
byte flagREM = 0; /* признак включенного выхода на усилитель звука (REM)*/
byte 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 строчка.*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

void setup() //настройки
{
// Serial.begin(115200);

wdt_disable(); //Отключение таймера watchdog

//lcd.begin(16, 2); для newE
lcd.init(); /* initialize the lcd занимает почти секунду для 0x27*/

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
pinMode(STATEpinI, INPUT);
pinMode(STATEpinII, INPUT);
pinMode(PlanshBATpin, OUTPUT);
pinMode(SAMOZAPITKApin, OUTPUT);
pinMode(OTGpin, OUTPUT);
pinMode(SLEEPpin, OUTPUT);
pinMode(II_KIW_pin_POGOpin, OUTPUT);
pinMode(HUBpin, OUTPUT);
pinMode(13, OUTPUT); //светодиодик на плате ардуины
pinMode(REMpin, OUTPUT);
pinMode(REGISTRATORpin, OUTPUT);
// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
wdt_enable (WDTO_8S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S ( wdt_enable (WDTO_8S);)
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================












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

void loop()
{

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







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)*/

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

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 300;} /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 300;} /* 5000 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 (millis() - pauseTimeACC >= 300 && flagACC == 1) /* пауза 1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета (in2) = этим подаём 12В на KIW3312s. На 1м канале КИВ сразу появляется напряжение (3,8-4,2 - как настроено)*/
digitalWrite(OTGpin, 1); /*включаем минус на Y-OTG (включается звуковая карта) // тестово, для более устойчивого определения перифирии.*/

}

if (millis() - pauseTimeACC >= 600 && flagACC == 1) /* пауза 1,6c после включения ACC и потом делать следующ(пока включено ACC): //через 01,6с после включения ACC , включаем питание на видеорегистратор.*/
{
digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/

digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
}

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



/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обр аботка статуса выхода 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){ (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( flagREM == 0 || flagREM == 2){digitalWrite(REMpin, 0);} /* выключаем выход REM*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~коне ц отработки выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~*/



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

if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
digitalWrite(REMpin, 0);
flagREM = 0; /* выключаем флаг выхода REM*/
pauseTimeACC = millis();
pauseTimeAKB = millis();
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
lcd.clear(); //очистка экрана
}

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

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

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

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

if ((millis() - pauseTimeAKB >= 20000) && flagAKB == 0) /* если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)*/
digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
digitalWrite(HUBpin, 1); /* подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб*/
digitalWrite(REMpin, 0); /* выключаем выход REM*/
digitalWrite(REGISTRATORpin, 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ч)*/
{
digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)//(батарея планшета))*/
}

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




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


/*отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"*/
/*отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"*/
if(SAMOZAPITKApin==1 || PlanshBATpin==1 ||REMpin==1 || REGISTRATORpin ==1) // если проц включал любой канал ITS
{
if(STATEpinI == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(493); digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 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) ) digitalWrite(13, 1);
else digitalWrite(13, 0);
blink_loop++;
}




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

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

int H = (millis()/3600000);
int M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка экрана


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

if ( ( (millis() / 60000 ) <9 ) ){lcd.setCursor(2, 0); lcd.print("v");lcd.setCursor(3, 0); lcd.print(ver);} /* Вывод версии блока на дисплей. */
//вывод времени работы
lcd.setCursor(0, 0);
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ)

lcd.setCursor(7, 0);
lcd.print(flagAKB); // вывод флага AKB

lcd.setCursor(8, 0);
lcd.print(flagACC); // вывод флага АСС

lcd.setCursor(9, 0);
lcd.print(flagREM); // вывод флага rem
lcd.setCursor(11, 0);
lcd.print(U_acc_real); // вывод напряжения АСС

//lcd.setCursor(5,1);
//-------------------2 строка---------------------------------
lcd.setCursor(0, 1);
unsigned long TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
lcd.print(TIMER);
lcd.setCursor(5, 1);
lcd.print(( millis() - TimerREM )/60000); //
lcd.setCursor(11, 1);
lcd.print(U_akb_real); /* вывод напряжения АКБ*/

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


================
|1 v75 111 0.000| 1 строка * вывод кол-ва минут работы блока *флаг АКБ*флаг АСС*флаг REM* вывод напряжения АСС
|616 10 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * millis() - TimerREM, минут * вывод напряжения АКБ


*/
//__________________________________________________ __________________________________________________ ______________________
}

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

/*настраиваем режимы моргания встроенного светодиода ардуины*/
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 выключено.
*/
//************************************************** ************************************************** ******


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

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

avaRi
28.11.2016, 19:39
как два дня тестирую блок в машине.
И есть полтергейст со вторым каналом KIW, Когда тачка холодная он не включается. Стоит проехать и прогреть машину примерно через 20 мин все отлично. можно целый день ездить. Включать и отключать зажигание. стартует отлично. Но если тачка остыла все он в отвале! вернее он уходит в защиту. На управляющей ноге есть +2.5v
Все ЕСТЬ РЕШЕНИЕ!
Пока пол дня проездил.
Вообщем нужно поставить больше емкость конденсатора на второй канал С4.
Сейчас стоит 2 по 2200mUF. Но и норм работало и на 3300.
R9 и R10 у меня 102
Вообщем все просто. пока машина холодная KIw не мог нормально запустить 2 канал так как емкость была низкая. И как прогревался начинал норм работать! И KIW не уходит в защиту.
А это я проверял просто на управляющей ноге есть 2.5в. а канал включался и гас почти сразу(это видно по светодиоду на хабе).
Либо у меня получалось симулировать на столе просто передернув питание на хабе получали просадку. Канал уходил в защиту.
ДЛЯ справки!
Емкость алюминиевого электролитического конденсатора зависит от температуры. С понижением температуры (особенно ниже 0°C) возрастает вязкость электролита и его удельное электрическое сопротивление, что ведет к уменьшению емкости конденсатора.

avaRi
28.11.2016, 19:48
Ребят, есть еще вопрос.
Периодически мне что-либо приходит в голову и я это реализую (в данном случае речь идёт про код - скетч).
Такой код получает статус тестового. Обычно по прошествии 10-50 дней тест успешно завершается ( иногда неуспешно).
Так вот вопрос: Нужно ли выкладывать самые свежие версии программы, либо ждать и потом выкладывать?
Олег еще раз огромное спасибо за поддержку проекта!
Может возможно скинуть или создать лист изменений в прошивках.
Новая прошивка Реализовал то то или подправил это?

oleg707
28.11.2016, 20:07
Олег еще раз огромное спасибо за поддержку проекта!
Может возможно скинуть или создать лист изменений в прошивках.
Новая прошивка Реализовал то то или подправил это?

там в начале скетча основное описание.
А на каждое изменение кода лист изменений не напишешь.

oleg707
28.11.2016, 20:11
Все ЕСТЬ РЕШЕНИЕ!
Пока пол дня проездил.
Вообщем нужно поставить больше емкость конденсатора на второй канал С4.
Сейчас стоит 2 по 2200mUF. Но и норм работало и на 3300.
R9 и R10 у меня 102
Вообщем все просто. пока машина холодная KIw не мог нормально запустить 2 канал так как емкость была низкая. И как прогревался начинал норм работать! И KIW не уходит в защиту.
А это я проверял просто на управляющей ноге есть 2.5в. а канал включался и гас почти сразу(это видно по светодиоду на хабе).
Либо у меня получалось симулировать на столе просто передернув питание на хабе получали просадку. Канал уходил в защиту.
ДЛЯ справки!
Емкость алюминиевого электролитического конденсатора зависит от температуры. С понижением температуры (особенно ниже 0°C) возрастает вязкость электролита и его удельное электрическое сопротивление, что ведет к уменьшению емкости конденсатора.
Хм, можно воткнуть по 3300 и посмотреть. надо попробовать.
Тут есть ньюанс - на 3й версии БП стояли кондёры по 1500 mF, и отлично работало (ни глюков, ни зависаний - просто сказка)
В чём разница с 5м?!

avaRi
28.11.2016, 23:04
Олег может немного не в тему!
Подскажи как ты отправляешь в сон планшет?
Вернее как у тебя музыка ставится на паузу? У меня Таскер этим рулит по событию Есть питание +5в на порту зарядки или нет. Я не использую датчик Холла. Вот думаю подключить его. Может есть событие по датчику Холла?

oleg707
29.11.2016, 01:06
Олег может немного не в тему!
Подскажи как ты отправляешь в сон планшет?
Вернее как у тебя музыка ставится на паузу? У меня Таскер этим рулит по событию Есть питание +5в на порту зарядки или нет. Я не использую датчик Холла. Вот думаю подключить его. Может есть событие по датчику Холла?

погас экран - сообытие.
Музыка на паузу - отключилась звуковуха - плеер стал на паузу. и запомнил место. Поверамп.
Таскер всё никак лень не даёт поставить, 2 года пользуюсь аутомейтит.

oleg707
29.11.2016, 18:33
снял свой блок с машины.
кондёр на 1м канале 2200*10В
на 2м канале 1000*10В
Иногда (редко) глючит после старта. Но от зажигания запуск всегда 100%.

Заморочился переписать прошивку на блок, выкладывать ли промежуточные куски кода ( для общего развития и понятия схемы) ?


Нашел у себя новые 3300*6,3В (прям 2 штуки) (покупал для ремонта материнок)
Выпаял старые, запаял новые... Проверяю.
Слышу писк, секунд через 10 после включения блока. Ну как писк - не такая работа кив. И ток начал расти. 0,09А, 0,12А, 0,2А, 0,35А. Без нагрузки то!
Ну я вырубил, осматриваю. Вижу, на одном канале кондёр ГОРЯЧИЙ. Думал брак - ан нет, я тупо полярность попутал.
Перепаял правильно - всё норм, завтра в машину воткну.

А вы говорите кив щёлкает, работает громко, запуск неустойчивый, канал отваливается...

Az0m@
29.11.2016, 23:41
Вот как 45654 выглядит то, на чём я сейчас езжу с этими скетчами: 45655
что дает повышенная напруга на батареи? относительно старой версии где 3,8в

oleg707
30.11.2016, 13:30
что дает повышенная напруга на батареи? относительно старой версии где 3,8в

ничего по факту. сделал для эксперимента.



Может кому будет интересно. Прямое управление регистрами на ардуине. Увеличивает скорость раз в 16.

например BLINK

/*
http://myrobot.ru/stepbystep/pr_mcports.php

pin D13 = PB5

*/


// the setup function runs once when you press reset or power the board
void setup() {


DDRB = 0b00100000;// pinMode(13, OUTPUT); //DDRx - регистр направления передачи данных светодиодик на плате ардуины
}

// the loop function runs over and over again forever
void loop() {

PORTB |= 1<<5; //установит "1" (сигнал высокого уровня) на выводе PB5. //digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(2000); // wait for a second


PORTB &= ~(1<<5); //установит "0" (сигнал низкого уровня) на выводе PB5. //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(500); // wait for a second
}

xDriver
30.11.2016, 21:36
ну это и понятно
в угоду универсальности для множества плат
"родной" digitalWrite выглядит ужасно :)
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;

if (port == NOT_A_PIN) return;

// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);

out = portOutputRegister(port);

uint8_t oldSREG = SREG;
cli();

if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}

SREG = oldSREG;
}

oleg707
01.12.2016, 21:31
передалал аппаратно ( эксперементально) управление 2м каналом кива.
Раньше шло через 10К резак, теперь идёт через 100ом резак и диод. То есть на кив пропускает только минус.

Перекроил скетч, поменял порядок и тайминги пинов при включении- выключении зажигания. По образу и подобию 3й версии ( которая работает... просто работает, прямо боюсь сглазить)
Заодно в 3й версии активировал REM. Теперь поиграюсь, блоки поподкидываю - фишки одинаковые и совместимые.
Печатки 5 и 3 версии и скетчи (ТЕСТОВЫЕ) в архиве.

Az0m@
02.12.2016, 01:22
предыдущую печатку малой кровью можно переделать под эту версию?... или пока не стоит рыпаться?

oleg707
02.12.2016, 01:46
предыдущую печатку малой кровью можно переделать под эту версию?... или пока не стоит рыпаться?

да, конечно. разрезать дорожку после R10 и впаять на место разреза диод.
Вместо R10 впаять резак 101( 100 ом, можно 102). Подтяжку к земле 2го канала кива (R9) (если она еще была) -выпаять. Всё. дел на 5 минут. Диод полоской(минусом) к R10.

Смысл этих телодвижений.
Кив при запитке на SS\SD1 и 2 выдаёт слаботочное опорное напряжение 2,95В (так я сегодня намерял)
Если мы подадим туда массу, то канал выключится.

Так вот, когда стоял резак 10К (103), массы, идущей с проца, хватало вырубить канал. (даже через 10 килоом)
А вот если мы хотим канал включить, нам нужно НЕ ТРОГАТЬ опорку 3,0В.

Если мы подавали +5,0 с ардуины, то приходило 3,2В, то есть мы еще додавали чуток напряжения. Имхо это ни на что не влияет, но не по феншую.
Когда мы ставим диод, то подавая массу, SS\SD2 получает массу, ток которой ограничен только R10 (оставил на всякий, для защиты ножки процессора).
А если подать +5В, то диод их не пропустит, и на SS\SD2 будет просто опорка 3,0В.
Так уже по феншую

Эти мысли пришли мне в голову, когда увидел, как кто-то эти управляющие SS\SD2 через оптопару (Месье знает толк в извращениях :-) )
подключает.

oleg707
02.12.2016, 03:10
знающим, вопрос
можно ли управляя напрямую регистрами писать нули в пины кварца, например?
Равнозначны ли эти записи?
DDRD = 0b11010100;
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, INPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);

//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины
DDRB = 0b00111110;
pinMode(8, INPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);


ШПАРГАЛКА
http://myrobot.ru/stepbystep/pr_mcports.php

pin D13 = PB5
// ATMEGA 168 PIN MAPPING (ARDUINO nano3.0)

30pin = PD0 = pin D0 Rx //30пин атмеги 168(328P) = Порт D0 (Д ноль) = D0(на ардуине)
31pin = PD1 = pin D1 Tx
32pin = PD2 = pin D2
1 pin = PD3 = pin D3 PWM
2 pin = PD4 = pin D4
9 pin = PD5 = pin D5 PWM
10pin = PD6 = pin D6 PWM
11pin = PD7 = pin D7

12pin = PB0 = pin D8 // 12пин атмеги 168 = Порт B0 (Д ноль) = D8( digital 8 на ардуине)
13pin = PB1 = pin D9
14pin = PB2 = pin D10
15pin = PB3 = pin D11 MOSI
16pin = PB4 = pin D12 MISO
17pin = PB5 = pin D13 (LED светодиод на плате ардуины)PWM SCK
7 pin = PB6 = кварц
8 pin = PB7 = кварц

23pin = PC0 = pin A0
24pin = PC1 = pin A1
25pin = PC2 = pin A2
26pin = PC3 = pin A3
27pin = PC4 = pin A4 SDA
28pin = PC5 = pin A5 SCL
29pin = PC6 = RESET

19pin = ADC6 = pin A6
22pin = ADC7 = pin A7

jonikus81
02.12.2016, 07:26
[B]

Эти мысли пришли мне в голову, когда увидел, как кто-то эти управляющие SS\SD2 через оптопару (Месье знает толк в извращениях :-) )
подключает.

я так делаю, я лентяй :big:
у меня кстати так и не получилось нормально заводить второй канал с подтяжками сопротивлениями(выключать выключалось, а включаться не хотел второй канал и даже переменными резюками вылавливал эти 2,95 вольта), но у меня и схема немног другая и кивы запустились только с кондерами 3300МкФ и 10мкФ(никак не 0,1).
http://s020.radikal.ru/i701/1612/25/0e1cc60073cet.jpg (http://radikal.ru/big/okmm4fxgv4pdt)
ПС на извращенных оптронах у меня работает :izvrashenec:

oleg707
02.12.2016, 13:00
я так делаю, я лентяй :big:
у меня кстати так и не получилось нормально заводить второй канал с подтяжками сопротивлениями(выключать выключалось, а включаться не хотел второй канал и даже переменными резюками вылавливал эти 2,95 вольта), но у меня и схема немног другая и кивы запустились только с кондерами 3300МкФ и 10мкФ(никак не 0,1).
http://s020.radikal.ru/i701/1612/25/0e1cc60073cet.jpg (http://radikal.ru/big/okmm4fxgv4pdt)
ПС на извращенных оптронах у меня работает :izvrashenec:

а ты можешь попробовать с диодом и резаком ?
10мкФ это куда?


Az0m@
попробуй залей 83 версию, мне понравилось, покатаюсь на ней, хотя уже 86я есть.

oleg707
03.12.2016, 19:33
я тут вотчдог исследую, снова (инфа (https://geektimes.ru/post/255800/))
Так вот что выяснилось. Стандартный загрузчик НАНО таки не поддерживает вотчдог.
Получается, что если всё ОК, то блок работает, как и должен.
А вот если подвис, то сработает вотчдог и сделает аппаратный ресет проца. Но! Пойдёт сначала загрузчик. А стандартный загрузчик не поддерживает watchdog. Здесь даже кнопка сброса не поможет. Для последующей прошивки (или работы) нужно плату отключать от питания.

В любом случае, если подвис проц и нет вотчдога, то нам придётся плату отключать от питания. Так что добавление вотчдога НИЧЕГО не поменяло для тех, кто шьёт ардуину через ЮСБ.


А вот для тех, кто шьётся через ICSP через программатор (как я), вотчдог будет работать так, как надо - то есть сбрасывать проц при зависании и нормально рестартовать, с запуском программы, как будто при первом включении.

Furai2014
04.12.2016, 00:20
Олег спасибо за блок, собрал все работает. Но почему то на LSD дисплее ничего не отображается, просто горит подсветка. Схему собирал 45 с подтяжкой.

oleg707
04.12.2016, 00:42
Олег спасибо за блок, собрал все работает. Но почему то на LSD дисплее ничего не отображается, просто горит подсветка. Схему собирал 45 с подтяжкой.

Контрастность сзади покрути:yes2:

Furai2014
04.12.2016, 01:22
Контрастность сзади покрути:yes2:
Спасибо за ответ, подкрутил на экране изображение как в тестовом режиме 16 прямоугольников

oleg707
04.12.2016, 12:28
Спасибо за ответ, подкрутил на экране изображение как в тестовом режиме 16 прямоугольников

CDA SCL местами поменяй

Furai2014
04.12.2016, 12:55
CDA SCL местами поменяй

Разобрался, перечитал здесь https://arduino-info.wikispaces.com/LCD-Blue-I2C.
Оказывается некоторые LCD имеют адрес не 0x27 a 0x3F исправил в скетче все заработало.
Но присутствует проблема которую Вы описывали с пропаданием подсветки

oleg707
04.12.2016, 20:31
Разобрался, перечитал здесь https://arduino-info.wikispaces.com/LCD-Blue-I2C.
Оказывается некоторые LCD имеют адрес не 0x27 a 0x3F исправил в скетче все заработало.
Но присутствует проблема которую Вы описывали с пропаданием подсветки
Адрес там j1-j3 выставляется.
то есть подсветка не пропадает через 5 сек после выкл зажигания? Можно еще другую библиотеку попробовать, на которой у меня подсветка не гаснет. С скетче раскомментировать и скачать с гитхаба. Старую закомментить. Там вроде в начале и в сетапе только, остальные команды совпадают.


Вот два скетча для проверки работоспособности двух разных библиотек.

первая - такая, как я сейчас использую в блоке питания.
45824 <<====то есть эта
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// написал и проверил лично oleg707 для библиотеки LiquidCrystal_I2C2004V1
LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
lcd.init(); // initialize the lcd занимает почти секунду

for(int i = 0; i < 3; i++) {
lcd.backlight();
delay(250);
lcd.noBacklight();
delay(250);
}
lcd.backlight();




lcd.backlight();
lcd.noBacklight();
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Hello, world!");
lcd.setCursor(0,1);
lcd.print("TEST backlight");
delay(5000);
}


void loop()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("backlight");
lcd.backlight();
delay(2500);


lcd.clear();
lcd.setCursor(0, 0);
lcd.print("noBacklight");
lcd.noBacklight();
delay(2500);
}


/*
7 нога ( P3 )
масса - подсветка вЫключена
напряжение 0,75 В подсветка включена.

Если физически подать на 7 пин массу проводом, то подсветка тухнет.

Подсветка отлично гаснет\включается соответственно скетчу, на старой библиотеке LiquidCrystal_I2C2004V1


прозваниваю pcf8574t на дисплей

нога pcf8574t - нога дисплея
1 (VSS)
3 ---------- 2 (VDD)
---------- 3(VO) КОНТРАСТНОСТЬ
4 ---------- 4 RS
5 ---------- 5 RW
6 ---------- 6 E
7 ---------- подсветка через транзистор на 16
8 GND ----------
9 ---------- 11 D4
10 ---------- 12 D5
11 ---------- 13 D6
12 ---------- 14 D7

*/




вторая библиотека и проверочный скетч к ней
45825 <<====ЭТА ВТОРАЯ
/************************************************** ****************************/
/*
PCF8574 chip uses I2C bus to communicate, 2 pins are required to
interface.

Connect PCF8574 to pins : SDA SCL
Uno, Mini, Pro: A4 A5
Mega2560, Due: 20 21
Leonardo: 2 3
ATtiny85: 0(5) 2/A1(7) (TinyWireM - https://github.com/SpenceKonde/TinyWireM & ATTinyCore - https://github.com/SpenceKonde/ATTinyCore)
ESP8266 ESP-xx: ANY ANY (ESP8266Core - https://github.com/esp8266/Arduino)
NodeMCU 1.0: ANY ANY (D1 & D2 by default)
*/
/************************************************** ****************************/

// написал и проверил лично oleg707 для библиотеки LiquidCrystal_I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE);

void setup()
{

lcd.begin(16, 2);
for(int i = 0; i < 3; i++) {
lcd.backlight();
delay(250);
lcd.noBacklight();
delay(250);
}
lcd.backlight();




lcd.backlight();
lcd.noBacklight();
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Hello, world!");
lcd.setCursor(0,1);
lcd.print("TEST backlight");
delay(5000);
}


void loop()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("backlight");
lcd.backlight();
delay(2500);


lcd.clear();
lcd.setCursor(0, 0);
lcd.print("noBacklight");
lcd.noBacklight();
delay(2500);
}







/*
7 нога ( P3 )
масса - подсветка вЫключена
напряжение 0,75 В подсветка включена.

Если физически подать на 7 пин массу проводом, то подсветка тухнет.

Подсветка отлично гаснет\включается соответственно скетчу, на старой библиотеке LiquidCrystal_I2C2004V1


прозваниваю pcf8574t на дисплей

нога pcf8574t - нога дисплея
1 (VSS)
3 ---------- 2 (VDD)
---------- 3(VO) КОНТРАСТНОСТЬ
4 ---------- 4 RS
5 ---------- 5 RW
6 ---------- 6 E
7 ---------- подсветка через транзистор на 16
8 GND ----------
9 ---------- 11 D4
10 ---------- 12 D5
11 ---------- 13 D6
12 ---------- 14 D7

*/

Но эта библиотека на БП не тушит экран:no: (хотя отдельно скетч нормально отрабатывает, проблема где-то в void LOOP)

Furai2014
05.12.2016, 00:09
Спасибо, попробую. Екран гаснет сам посебе гдето через минуту работы при вклеченном асс, потом мелькает подсветкой с интервалом несколько секунд. Если отключить асс и включить проблема сохраняется.

oleg707
05.12.2016, 04:28
Спасибо, попробую. Екран гаснет сам посебе гдето через минуту работы при вклеченном асс, потом мелькает подсветкой с интервалом несколько секунд. Если отключить асс и включить проблема сохраняется.

Сними видео.

jonikus81
05.12.2016, 07:58
а ты можешь попробовать с диодом и резаком ?
10мкФ это куда?


Теперь только при следующем проекте. Этот БП будет установлен брату в авто с Нексусом 2013 LTE. 10мкФ пришлось поставить вместо 0,1мкФ, да это не по датащиту, но по другому он у меня просто не запускается, про 10мкФ прочитал на каком то форуме, там тоже у людей не запускались KIWы. Потом нашел статью, где человек описывает и сравнивает KIWы, разных годов и они ведут себя по разному, у кого то они на синем, у кого то на зеленом текстолите, у кого то установлены разные по размерам деталюхи и казалось бы схема и принцип одни, но результат таков: оптроны и другие конденсаторы. Скажу без лукавства - я потратил не один день экспериментов, что бы подружить xduino pro micro и kiw (про извращение даже как то обидно) :dntknw:

oleg707
05.12.2016, 15:39
Теперь только при следующем проекте. Этот БП будет установлен брату в авто с Нексусом 2013 LTE. 10мкФ пришлось поставить вместо 0,1мкФ, да это не по датащиту, но по другому он у меня просто не запускается, про 10мкФ прочитал на каком то форуме, там тоже у людей не запускались KIWы. Потом нашел статью, где человек описывает и сравнивает KIWы, разных годов и они ведут себя по разному, у кого то они на синем, у кого то на зеленом текстолите, у кого то установлены разные по размерам деталюхи и казалось бы схема и принцип одни, но результат таков: оптроны и другие конденсаторы. Скажу без лукавства - я потратил не один день экспериментов, что бы подружить xduino pro micro и kiw (про извращение даже как то обидно) :dntknw:

вот кстати схема разная на кивах. В смысле по даташиту одно, а по номиналам другое. Просто собирают из того, что есть.
НО. На кив можно подать +12В, на выхода кондёры 100-1000 мФ мы должны на одном канале получить 1,2В на втором 3,3В (вроде так по дефолту).

Если на SS\SD1.2 подать массу, то канал ДОЛЖЕН выключиться.
Это ДОЛЖНО работать из коробки БЕЗ танцев с бубном и оптронов!
И даже без ардуино и процессора!
Если не работает - менять на рабочее:spiteful:.

oleg707
05.12.2016, 19:26
Нашел у себя видео
https://youtu.be/pHuStnX0lg4
https://youtu.be/JsT8Z9kvKjs

описание блока версии 3 oleg707 https://www.youtube.com/watch?v=R4GJXaBa4e8

вот https://www.youtube.com/channel/UCybr_F-gvEKi0allr15LWtA
ссылка на канал ютуб, иногда могу там чего нибудь выложить.

Az0m@
05.12.2016, 21:41
Залил пока 85ый скетч, хаб перевесил на пин...где напрямую от второго канала кив...и доработал включение второго канала через диод
Второй день катаюсь..пока все норм пашед.

Но появился такой косячок...что при долгой работе иногда подвисает все по usb...

oleg707
05.12.2016, 21:55
Залил пока 85ый скетч, хаб перевесил на пин...где напрямую от второго канала кив...и доработал включение второго канала через диод
Второй день катаюсь..пока все норм пашед.

Но появился такой косячок...что при долгой работе иногда подвисает все по usb...

может верни хаб на хаб-пин обратно? Хотя недельку покатайся...
Поскольку мало катаюсь, статистика нарабатывается медленно
у меня сейчас эта (90) версия.
byte ver =90;// ( чем больше цифра, тем новее)
// дата правки 03.12.16.1547

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 161-164)
//ТЕСТОВАЯ!
// скетч проверен и записан на версии ардуино IDE 1,6,12 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\

/* _______Сделано____________________________________ ______________
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по 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мин, если не заведены. После заводки счетчик обнуляется.
__________________________________________________ ______________
потребление блока по 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/ )

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1

//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-битная переменная PORTBregistr
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; /*признак включенного зажигания*/
boolean 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 строчка.*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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); для newE
lcd.init(); /* initialize the lcd занимает почти секунду для 0x27*/

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
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 loop()
{

long Uacc = 0; //Читаем напругу с делителя ACC R4-R5 и вычисляем среднее арифметическое
long Uakb = 0; ////Читаем напругу с делителя R2-R3 и вычисляем среднее арифметическое
for (int i=0; i<20; ++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/20;
Uakb = Uakb/20;







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)*/

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

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 3200;} /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 3200;} /* 5000 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 (millis() - pauseTimeACC >= 20 && flagACC == 1) /* пауза 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 >= 2000 && flagACC == 1) /* пауза 1,6c после включения ACC и потом делать следующ(пока включено ACC): //через 01,6с после включения ACC , включаем питание на видеорегистратор.*/
{
SLEEP = 0; //digitalWrite(SLEEPpin, 0); /*включаем экран = вЫключаем минус на упр SLEEP*/

}

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



/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обр аботка статуса выхода 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.*/
//ПРОТЕСТИРОВАТЬ REM!!!!!!!!!!!! if (U_akb_real > 13.7){ (flagREM = 1);TimerREM = millis();} /* если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.*/
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( 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*/
pauseTimeACC = millis();
pauseTimeAKB = millis();

lcd.clear(); //очистка экрана
}

if (((millis() - pauseTimeACC) >= timeAfterACC) && flagACC == 0) /*пауза 5c или 0.5c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}

if ( ((millis() - pauseTimeACC) >= (1500+timeAfterACC)) && flagACC == 0 ) /* 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)) && flagACC == 0 )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
}

}

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

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 >= 2000) && 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++;
}




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

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

int H = (millis()/3600000);
int M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка экрана


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

if ( ( (millis() / 60000 ) <9 ) ){lcd.setCursor(2, 0); lcd.print("v");lcd.setCursor(3, 0); lcd.print(ver);} /* Вывод версии блока на дисплей. */
//вывод времени работы
lcd.setCursor(0, 0);
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ)

lcd.setCursor(7, 0);
lcd.print(flagAKB); // вывод флага AKB

lcd.setCursor(8, 0);
lcd.print(flagACC); // вывод флага АСС

lcd.setCursor(9, 0);
lcd.print(flagREM); // вывод флага rem
lcd.setCursor(11, 0);
lcd.print(U_acc_real); // вывод напряжения АСС

//lcd.setCursor(5,1);
//-------------------2 строка---------------------------------
lcd.setCursor(0, 1);
unsigned long TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
lcd.print(TIMER);
lcd.setCursor(5, 1);
lcd.print(( millis() - TimerREM )/60000); //
lcd.setCursor(11, 1);
lcd.print(U_akb_real); /* вывод напряжения АКБ*/

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


================
|1 v86 111 0.000| 1 строка * вывод кол-ва минут работы блока VER86 *флаг АКБ*флаг АСС*флаг REM* вывод напряжения АСС
|616 10 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * millis() - TimerREM, минут * вывод напряжения АКБ
сколько осталось работать сабу

*/
//__________________________________________________ __________________________________________________ ______________________
}

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

/*настраиваем режимы моргания встроенного светодиода ардуины*/
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()*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

jonikus81
06.12.2016, 07:48
вот кстати схема разная на кивах. В смысле по даташиту одно, а по номиналам другое. Просто собирают из того, что есть.
НО. На кив можно подать +12В, на выхода кондёры 100-1000 мФ мы должны на одном канале получить 1,2В на втором 3,3В (вроде так по дефолту).

Если на SS\SD1.2 подать массу, то канал ДОЛЖЕН выключиться.
Это ДОЛЖНО работать из коробки БЕЗ танцев с бубном и оптронов!
И даже без ардуино и процессора!
Если не работает - менять на рабочее:spiteful:.

Олег, при всем уважении, Вы не читаете что я пишу. Все, что Вы написали так и есть. Да если без ничего подать 12в и подключить кондеры, да 3.3 и 1.2в имеем. Но мои 5 KIWов не дружат без оптронов с ардуино(3й раз напишу, каналы не включаются при 1 на пине ардуины, если бы жил хотябы в вашей стране, то с Вашего разрешения приехал бы в гости и продемонстрировал бы все, но слишком далеко :sad2:). Если у Вас оно нормально работает - это не значит, что это есть одна единственная истина во вселенной. Не в коем случае не хочу обидеть, просто у меня не работает то, что работает у Вас и поэтому я использую оптроны.

oleg707
06.12.2016, 14:08
Олег, при всем уважении, Вы не читаете что я пишу. Все, что Вы написали так и есть. Да если без ничего подать 12в и подключить кондеры, да 3.3 и 1.2в имеем. Но мои 5 KIWов не дружат без оптронов с ардуино(3й раз напишу, каналы не включаются при 1 на пине ардуины, если бы жил хотябы в вашей стране, то с Вашего разрешения приехал бы в гости и продемонстрировал бы все, но слишком далеко :sad2:). Если у Вас оно нормально работает - это не значит, что это есть одна единственная истина во вселенной. Не в коем случае не хочу обидеть, просто у меня не работает то, что работает у Вас и поэтому я использую оптроны.

вот теперь дошло.
Было бы интересно померять осциллом, что там на SS\SD2 происходит без оппрона и с ним.
Как вариант, последнее исправление ( там где управление через диод) должно решить. Хотя пробовать надо.

avaRi
06.12.2016, 19:19
вот теперь дошло.
Было бы интересно померять осциллом, что там на SS\SD2 происходит без оппрона и с ним.
Как вариант, последнее исправление ( там где управление через диод) должно решить. Хотя пробовать надо.

Олег переделал на диод. Канал стал работать стабильно.
Но пока рано говорить. Так как появился еще один момент. Сейчас еще денек покатаюсь и напишу.

avaRi
07.12.2016, 18:01
Олег переделал на диод. Канал стал работать стабильно.
Но пока рано говорить. Так как появился еще один момент. Сейчас еще денек покатаюсь и напишу.

Все работает. Раньше были фантомные отключения 2 го канала. Сейчас этого нет.

oleg707
07.12.2016, 18:59
Все работает. Раньше были фантомные отключения 2 го канала. Сейчас этого нет.

номер прошивки?

Furai2014
08.12.2016, 00:00
Чет не могу определить почему так
45910
Тестер подключен к "батарея планшета" и "GND plans"
аккумулятор по тестеру 11,5В.
Может что то коротит? где искать проблему?
Aдрес LCD 0x3F.

oleg707
08.12.2016, 00:29
Чет не могу определить почему так
45910
Тестер подключен к "батарея планшета" и "GND plans"
аккумулятор по тестеру 11,5В.
Может что то коротит? где искать проблему?
Aдрес LCD 0x3F.

выведи в монитор ком порта напряжение и сырые данные с A0 A1

У тебя 111 на экране, то есть блок напругу корректно видит.
Если регулировка напряжения плавная, понизь до 11В(или чуть ниже). Должно стать 000.
Потом верни обратно на 12В. Должно стать 112.

Вообще по ощущению у тебя картинка на дисплее как то сдвинута.

Furai2014
08.12.2016, 00:44
выведи в монитор ком порта напряжение и сырые данные с A0 A1

У тебя 111 на экране, то есть блок напругу корректно видит.
Если регулировка напряжения плавная, понизь до 11В(или чуть ниже). Должно стать 000.
Потом верни обратно на 12В. Должно стать 112.

Вообще по ощущению у тебя картинка на дисплее как то сдвинута.

А почему может показывать 1.74 и 1.72 вместо 11.5?

oleg707
08.12.2016, 01:25
А почему может показывать 1.74 и 1.72 вместо 11.5?

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

Ps
обратите внимание на поведение встроенного светодиода - он тоже отображает состояния.

Снял видео, как должно быть. Через 40 мин зальётся. https://youtu.be/DIQSQF2r4KY
DIQSQF2r4KY
===========
|1 v86 111 0.000|
|616 10 14.50|
===========
1 строка * вывод кол-ва минут работы блока ВЕРСИЯ *флаг АКБ*флаг АСС*флаг REM* вывод напряжения АСС
2 строка * кол-во минут, оставшиеся до выключения блока * millis() - TimerREM, минут * вывод напряжения АКБ

Furai2014
08.12.2016, 02:08
Спасибо посмотрю. Вот что у меня с дисплеем
6ul9_p8rXK0

Включаю, проходит иногда минута иногда несколько секунд и начинаются глюки, потом если АСС отключаю блок в сон не уходит

Furai2014
08.12.2016, 16:41
выведи в монитор ком порта напряжение и сырые данные с A0 A1


Можете подсказать как прописать в скетче?
Почемуто сплошные иероглифы в мониторе порта

Furai2014
08.12.2016, 18:01
Разобрался поставил эту библиотеку все заработало https://github.com/marcoschwartz/LiquidCrystal_I2C

avaRi
08.12.2016, 21:55
номер прошивки?

S85_TECT_DIRECT_PINS__no_serial_0x27.ino.hex

Furai2014
09.12.2016, 00:02
Подсоединил планшет, как у Вас описано. Включаю блок, показывает 14В
Запускается планшет показывает заряд батареи и все. Отсоединяю блок от питания ардуино продолжает работать , я так понимаю от батареи планшета , так должно быть?

oleg707
09.12.2016, 00:58
Подсоединил планшет, как у Вас описано. Включаю блок, показывает 14В
Запускается планшет показывает заряд батареи и все. Отсоединяю блок от питания ардуино продолжает работать , я так понимаю от батареи планшета , так должно быть?

нет, ардуино вообще НИКАК не связана с питанием батареи или ЮСБ. Питание ард. идёт с ITS по 3м диодам.
Питания у Блока два = постоянный плюс 12 и с замка зажигания.
Либо видео в студию, либо 94 версию прошить и логи с ком порта.

oleg707
09.12.2016, 01:05
Запилил конструктивно новый скетч. Полностью переделан вывод на экран.
Сейчас вывод на экран через переменную, а не напрямую. ЭТО позволило выводить информацию ЕЩЕ И В КОМ ПОРТ!!!

Переменил логику во включении и выключении зажигания.

В общем изменений куча, еще НЕ ТЕСТИРОВАЛ.
Тест был только на столе с отдельной nano и выводом в компорт.

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

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 161-164)
//ТЕСТОВАЯ!
// скетч проверен и записан на версии ардуино 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 например

/* _
хотелки

v94 опробовать режим стартую и выключения изажигания

______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по 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 с после начала загрузки идёт инициализация звуковой, в этот момент слышен ПУК
__________________________________________________ ______________
потребление блока по 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 строки на дисплей

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; /*признак включенного зажигания*/
boolean 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 TIMER = millis();
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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*/

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
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[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 = 500;} /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 5000;} /* 5000 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 >= 500 ) /* пауза 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 >= 2000 ) /* пауза 1,6c после включения ACC и потом делать следующ(пока включено ACC): //через 01,6с после включения ACC , включаем питание на видеорегистратор.*/
{
SLEEP = 0; //digitalWrite(SLEEPpin, 0); /*включаем экран = вЫключаем минус на упр SLEEP*/

}

if (millis() - pauseTimeACC >= 1000 )/*через 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*/
}
}// если 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.*/
//ПРОТЕСТИРОВАТЬ REM!!!!!!!!!!!! if (U_akb_real > 13.7){ (flagREM = 1);TimerREM = millis();} /* если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.*/
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( 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*/
pauseTimeACC = millis();
pauseTimeAKB = millis();

lcd.clear(); //очистка экрана
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 5c или 0.5c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
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 (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++;
}




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

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

//int H = (millis()/3600000);
//int 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й строки____________________________________________ __________________________________________________ __________________________________________________ ______________________________
sprintf(strokaI," ") ;
IntToCharIIII((millis()/60000), &strokaI[0]); // вывод минут 0000 4 цифры СЕКУНД // tckb ghtdscbn 9999, то будут кроказябры!!! вида ;0129
strokaI[6]= flagAKB + '0';// вывод флага AKB 5 символ
strokaI[7]= flagACC+ '0';// вывод флага AСС 6 символ
strokaI[8]= flagREM+ '0';// вывод флага rem 7 символ
FloatToCharIIIII (U_acc_real, &strokaI[10]); // вывод напряжения АСС
//конец обработки 1й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________

//обработка 2й строки____________________________________________ __________________________________________________ __________________________________________________ ______________________________

TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)
if ( ( millis() < 30000 ) ){ sprintf(strokaII,"v___ ") ; IntToCharII(ver, &strokaII[0]);} else { sprintf(strokaII,"____ "); IntToCharIIII(TIMER, &strokaII[0]); } // Первые 30с выводим версию блока.
IntToCharII((( millis() - TimerREM )/60000), &strokaII[5]); // вывод минут работы REM без сброса
FloatToCharIIIII (U_akb_real, &strokaII[10]); // вывод напряжения АКБ


//конец обработки 2й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________
Serial.print("strokaI = "); Serial.println(strokaI);
Serial.print("strokaII = "); Serial.println(strokaII);
lcd.setCursor(0, 0);
lcd.print(strokaI);
lcd.setCursor(0, 1); //2строка 0символ
lcd.print(strokaII);


//СТАРЫЙ ВЫВОД ИНФЫ НА ДИСПЛЕЙ - удалить после тестирования
//if ( ( (millis() / 60000 ) <9 ) ){lcd.setCursor(2, 0); lcd.print("v");lcd.setCursor(3, 0); lcd.print(ver);} // Вывод версии блока на дисплей.
//вывод времени работы
/* lcd.setCursor(0, 0);
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ) OK

lcd.setCursor(7, 0);
lcd.print(flagAKB); // вывод флага AKB

lcd.setCursor(8, 0);
lcd.print(flagACC); // вывод флага АСС

lcd.setCursor(9, 0);
lcd.print(flagREM); // вывод флага rem
lcd.setCursor(11, 0);
lcd.print(U_acc_real); // вывод напряжения АСС

//lcd.setCursor(5,1);
//-------------------2 строка---------------------------------
lcd.setCursor(0, 1);
unsigned long TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
lcd.print(TIMER);
lcd.setCursor(5, 1);
lcd.print(( millis() - TimerREM )/60000); //
lcd.setCursor(11, 1);
lcd.print(U_akb_real); // вывод напряжения АКБ
*/
/* так выглядит индикация на дисплее


================
|1 v86 111 0.000| 1 строка * вывод кол-ва минут работы блока VER86 *флаг АКБ*флаг АСС*флаг REM* вывод напряжения АСС
|616 10 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * millis() - TimerREM, минут * вывод напряжения АКБ
сколько осталось работать сабу

*/
//__________________________________________________ __________________________________________________ ______________________
}

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

/*настраиваем режимы моргания встроенного светодиода ардуины*/
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()*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

Furai2014
09.12.2016, 03:14
нет, ардуино вообще НИКАК не связана с питанием батареи или ЮСБ. Питание ард. идёт с по 3м диодам.
Питания у Блока два = постоянный плюс 12 и с замка зажигания.
Либо видео в студию, либо 94 версию прошить и логи с ком порта.
А может быть ITS пробивает?

oleg707
09.12.2016, 04:14
А может быть ITS пробивает?

Может, тестер в руки и проверять. Там 4 канала всего.
Но я так и не понял суть проблемы. Видео можешь выложить? Как должен работать блок, описано и показано у меня на ютубе.

Furai2014
09.12.2016, 13:11
Может, тестер в руки и проверять. Там 4 канала всего.
Но я так и не понял суть проблемы. Видео можешь выложить? Как должен работать блок, описано и показано у меня на ютубе.

Суть проблемы в том, что когда подсоединяю планшет включаю блок, планшет просыпается. Три раза было так, что если отключить блок от 12В и АСС ардуинка продолжает работать пока не отключить GND (последний раз даже зашипело в районе ардуины сразу отключил) Сегодня пробовал снять видео, но все работало норм(попробую еще вечером поексперементировать). Сам блок индикация на LCD и светлодиодами аналогично работает как у Вас на видео.

oleg707
09.12.2016, 13:27
Суть проблемы в том, что когда подсоединяю планшет включаю блок, планшет просыпается. Три раза было так, что если отключить блок от 12В и АСС ардуинка продолжает работать пока не отключить GND (последний раз даже зашипело в районе ардуины сразу отключил) Сегодня пробовал снять видео, но все работало норм(попробую еще вечером поексперементировать). Сам блок индикация на LCD и светлодиодами аналогично работает как у Вас на видео.

если отключить блок от 12В и АСС ардуинка должна вырубиться.
Потому как питание идёт с 3х маленьких диодов. А на диоды уже с 12В через ITS.
Даже если ITS насквозь пробитая, то она рулит питанием от12В, а мы его отключаем!

Furai2014
09.12.2016, 13:42
если отключить блок от 12В и АСС ардуинка должна вырубиться.
Потому как питание идёт с 3х маленьких диодов. А на диоды уже с 12В через ITS.
Даже если ITS насквозь пробитая, то она рулит питанием от12В, а мы его отключаем!

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

oleg707
10.12.2016, 16:20
byte ver =97;// ( чем больше цифра, тем новее)
// дата правки 10.12.16.103

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 161-164)
//ТЕСТОВАЯ!
// скетч проверен и записан на версии ардуино 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 например

/* _
хотелки
strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
v94 опробовать режим стартую и выключения изажигания

______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по 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 с после начала загрузки идёт инициализация звуковой, в этот момент слышен ПУК
__________________________________________________ ______________
потребление блока по 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 строки на дисплей



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; /*признак включенного зажигания*/
boolean 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 TIMER = millis();
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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*/

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
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 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 = 500;} /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 5000;} /* 5000 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 >= 500 ) /* пауза 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 >= 2000 ) /* пауза 1,6c после включения ACC и потом делать следующ(пока включено ACC): //через 01,6с после включения ACC , включаем питание на видеорегистратор.*/
{
SLEEP = 0; //digitalWrite(SLEEPpin, 0); /*включаем экран = вЫключаем минус на упр SLEEP*/

}

if (millis() - pauseTimeACC >= 1000 )/*через 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*/
}
}// если 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.*/
//ПРОТЕСТИРОВАТЬ REM!!!!!!!!!!!! if (U_akb_real > 13.7){ (flagREM = 1);TimerREM = millis();} /* если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.*/
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( 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*/
pauseTimeACC = millis();
pauseTimeAKB = millis();

//lcd.clear(); //очистка экрана не нужна со строковым выводом
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 5c или 0.5c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
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 (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++;
}




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

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

//int H = (millis()/3600000);
//int 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й строки____________________________________________ __________________________________________________ __________________________________________________ ______________________________
sprintf(strokaI," ") ;
IntToCharIIII((millis()/60000), &strokaI[0]); // вывод минут 0000 4 цифры СЕКУНД // tckb ghtdscbn 9999, то будут кроказябры!!! вида ;0129
strokaI[6]= flagAKB + '0';// вывод флага AKB 5 символ
strokaI[7]= flagACC+ '0';// вывод флага AСС 6 символ
strokaI[8]= flagREM+ '0';// вывод флага rem 7 символ
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АСС
//конец обработки 1й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________

//обработка 2й строки____________________________________________ __________________________________________________ __________________________________________________ ______________________________
TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)
if ( ( millis() < 30000 ) ){ sprintf(strokaII,"v__ 30 ") ; IntToCharII(ver, &strokaII[1]);} else { sprintf(strokaII,"____ 99 "); IntToCharIIII(TIMER, &strokaII[0]); } // Первые 30с выводим версию блока.
if (( millis() - TimerREM )<=timeBeforeRemOff) { IntToCharII( (timeBeforeRemOff - (( millis() - TimerREM ))/60000 ), &strokaII[5]); }// вывод минут работы REM без сброса
//для проверки if (( millis() - TimerREM )<=3000) { IntToCharII( (3000 - (( millis() - TimerREM ))/60000 ), &strokaII[5]); }// вывод минут работы REM без сброса
else { strokaII [5] = 'o'; strokaII [6] = 'f'; strokaII [7] = 'f'; }
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
//конец обработки 2й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________



//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________

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);

//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________




//СТАРЫЙ ВЫВОД ИНФЫ НА ДИСПЛЕЙ - удалить после тестирования
//if ( ( (millis() / 60000 ) <9 ) ){lcd.setCursor(2, 0); lcd.print("v");lcd.setCursor(3, 0); lcd.print(ver);} // Вывод версии блока на дисплей.
//вывод времени работы
/* lcd.setCursor(0, 0);
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ) OK

lcd.setCursor(7, 0);
lcd.print(flagAKB); // вывод флага AKB

lcd.setCursor(8, 0);
lcd.print(flagACC); // вывод флага АСС

lcd.setCursor(9, 0);
lcd.print(flagREM); // вывод флага rem
lcd.setCursor(11, 0);
lcd.print(U_acc_real); // вывод напряжения АСС

//lcd.setCursor(5,1);
//-------------------2 строка---------------------------------
lcd.setCursor(0, 1);
unsigned long TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
lcd.print(TIMER);
lcd.setCursor(5, 1);
lcd.print(( millis() - TimerREM )/60000); //
lcd.setCursor(11, 1);
lcd.print(U_akb_real); // вывод напряжения АКБ
*/
/* так выглядит индикация на дисплее


================
|1 v86 111 0.000| 1 строка * вывод кол-ва минут работы блока VER86 *флаг АКБ*флаг АСС*флаг REM* вывод напряжения АСС
|616 10 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * millis() - TimerREM, минут * вывод напряжения АКБ
сколько осталось работать сабу

*/
//__________________________________________________ __________________________________________________ ______________________
}

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

/*настраиваем режимы моргания встроенного светодиода ардуины*/
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()*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

papant
10.12.2016, 19:25
Друзья, мой БП меня слегка одолел, все время выплывают всякие косяки. Хочу повторить БП 5 от Олега. Скажите плиз кто где заказывал мелочевку? Я на али могу конечно найти, но у одного продавана сопротивления, у другого микруху, КИВ вообще не нашел на АЛИ почему-то (может плохо искал конечно). Желательно бы ссыль на один магазин АЛИ или любой другой, где можно все скопом купить. Спасибо

О, лучше придумал ). Быть может кто покупал с АЛИ полосками, а истратили всеравно 2-3 штуки всего. То я бы у вас купил, даже быстрее чем с АЛИ получится )

PS: а почему в БП не предусмотрели резистивные кнопки? странна, ардуина есть, а кнопки обработать забыли...

oleg707
11.12.2016, 00:21
Друзья, мой БП меня слегка одолел, все время выплывают всякие косяки. Хочу повторить БП 5 от Олега. Скажите плиз кто где заказывал мелочевку? Я на али могу конечно найти, но у одного продавана сопротивления, у другого микруху, КИВ вообще не нашел на АЛИ почему-то (может плохо искал конечно). Желательно бы ссыль на один магазин АЛИ или любой другой, где можно все скопом купить. Спасибо

О, лучше придумал ). Быть может кто покупал с АЛИ полосками, а истратили всеравно 2-3 штуки всего. То я бы у вас купил, даже быстрее чем с АЛИ получится )

PS: а почему в БП не предусмотрели резистивные кнопки? странна, ардуина есть, а кнопки обработать забыли...

а для чего блоку питания кнопки?
Я всё брал с али или с неисправнх материнок и мозгов. Ну и полоски заказывал лет 5 назад, они всегда надо...

Az0m@
11.12.2016, 12:10
Oleg не любитель универсальности...оно и правильно. Каждый блок должен отвечать по предназначению...тем более ардуино нано для резистивный кнопок не подходит.

По компонентам: я брал у себя в мире электронике или заказывал в чип и дип. Единственное что брал на Али - это кивы
http://www.aliexpress.com/item/1914811267/1914811267.html
http://www.aliexpress.com/item/1914874895/1914874895.html

avaRi
11.12.2016, 12:51
ITS716G $ 5.51
https://ru.aliexpress.com/item/4pcs-lot-ITS716G/32402478077.html
1602 16x2 Hd44780-символьный ЖК/w IIC/I2C 126,01 руб.
https://ru.aliexpress.com/item/1602-16x2-HD44780-Character-LCD-w-IIC-I2C-Serial-Interface-Adapter-Module/32546958584.html?spm=2114.13010608.0.0.3hTtgv
Nano CH340/ATmega328P MicroUSB 160р.
https://ru.aliexpress.com/item/Nano-CH340-ATmega328P-MicroUSB-Compatible-for-Arduino-Nano-V3/32572612009.html?spm=2114.13010608.0.0.61jlBt&detailNewVersion=&categoryId=400103
10 ШТ. Интегральных Схем 2SJ245 J245 К-252 144,96 руб
https://ru.aliexpress.com/item/10PCS-Integrated-Circuits-2SJ245-J245-TO-252-available/32538374057.html?spm=2114.13010608.0.0.61jlBt
170 Значение 0805 SMD Резистор Комплект 477,92 руб
https://ru.aliexpress.com/item/3400pcs-170-Value-0805-SMD-Resistor-Kit-0R-10MR-1-8W-5-4250-20x-170-pcs/32682143936.html?spm=2114.13010608.0.0.GUHlGr
1 шт./лот Width2.0mm BGA Припоя Проволоки 63,23 руб Оплетка Для удаления олова .
https://ru.aliexpress.com/item/Freeshipping-50-pcs-lot-Width2-0mm-BGA-Desoldering-Wire-Solder-Wick-CP-2015-Length1-5m/1500352954.html?spm=2114.13010608.0.0.GUHlGr
10 шт. KIW-3312S 543,19 руб
https://ru.aliexpress.com/item/10pcs-KIW-3312S-Dual-Way-Output-Power-Module-2-5-21V-Input-0-6-12V-Output/32289865154.html?spm=2114.13010608.0.0.GUHlGr
+Текстолит 377
=2181,5 и деталей хватит на 4 блока минимум.

oleg707
11.12.2016, 12:55
вместо ITS716G можно 724 ставить.
Оплетка Для удаления олова - можно провод зачастить.

papant
11.12.2016, 20:59
Oleg не любитель универсальности...оно и правильно. Каждый блок должен отвечать по предназначению...тем более ардуино нано для резистивный кнопок не подходит.

Не подходит? как так? по-моему какая разница какой ардуиной в порт посылать измеренное значение на аналоговом входе, разве нет? А я хотел еще посылать в порт значения яркости подсветок кнопок (неиспользуемых проводов в разъеме полно).

Вопрос для Олега: не могу найти СМД конденсаторы по разумной цене (все конскими партиями, хоть завод потом по производству БП открывай). можно ли поставить вместо них обычную керамику? в частности С5, С6, С8, С11.

Az0m@
11.12.2016, 21:44
Не подходит? как так? по-моему какая разница какой ардуиной в порт посылать измеренное значение на аналоговом входе, разве нет? А я хотел еще посылать в порт значения яркости подсветок кнопок (неиспользуемых проводов в разъеме полно).

потому как нам надо чтобы арудинка определялось как HIT устройство... то есть эмулировала бы клавиатуру... а это умеет тока арудино про микро и леонардо

papant
11.12.2016, 22:14
потому как нам надо чтобы арудинка определялось как HIT устройство... то есть эмулировала бы клавиатуру... а это умеет тока арудино про микро и леонардо
А вот и не правда ваша. Благодаря данной (http://pccar.ru/showthread.php?t=24120) проге в планшет можно передавать что угодно, хоть яркость, хоть значения резистивных кнопок. я лично передавал включен ли кулер обдува радиатора усилителя, сколько секунд прошло после включения зажигания (таскером после включения через 40 сек проговаривалась погода за бортом и всякие пожелания) и сколько прошло секунд после выключения зажигания (после 10 секунд гасил экран таскером - очень удобно, хоть через сколько секунд можно назначить что хочешь). Так что если ардуина умеет слать в порт (а вроде как умеет), то значит проблемм быть не должно

papant
11.12.2016, 22:16
вместо ITS716G можно 724 ставить.
Оплетка Для удаления олова - можно провод зачастить.
я извиняюсь - а зачем удалять олово (и откуда)?

Az0m@
11.12.2016, 22:20
А вот и не правда ваша. Благодаря данной (http://pccar.ru/showthread.php?t=24120) проге в планшет можно передавать что угодно, хоть яркость, хоть значения резистивных кнопок. я лично передавал включен ли кулер обдува радиатора усилителя, сколько секунд прошло после включения зажигания (таскером после включения через 40 сек проговаривалась погода за бортом и всякие пожелания) и сколько прошло секунд после выключения зажигания (после 10 секунд гасил экран таскером - очень удобно, хоть через сколько секунд можно назначить что хочешь). Так что если ардуина умеет слать в порт (а вроде как умеет), то значит проблемм быть не должно
наверно соглашусь... но используя вышеприведенные ардуинки никаких прог не требуется.... грубо говоря plug&play

oleg707
11.12.2016, 22:40
у меня нет необходимости в аналоговых или еще каких кнопках. Потому и не заморачивался.
Не подходит? как так? по-моему какая разница какой ардуиной в порт посылать измеренное значение на аналоговом входе, разве нет? А я хотел еще посылать в порт значения яркости подсветок кнопок (неиспользуемых проводов в разъеме полно).

Вопрос для Олега: не могу найти СМД конденсаторы по разумной цене (все конскими партиями, хоть завод потом по производству БП открывай). можно ли поставить вместо них обычную керамику? в частности С5, С6, С8, С11.


С5, С6,- керамика (они масенькие и их полно в любой бытовой технике.)
Можно не ставить.
С8, - раньшн стоял электролит.
С11 Можно не ставить.
если ардуина умеет слать в порт (а вроде как умеет), то значит проблемм быть не должно
Ну да, Rx Tx по USB есть, а ядро нексуса содержит драйвер для CH340G ?

я извиняюсь - а зачем удалять олово (и откуда)?
avaRi покупать хочет :dntknw:
1 шт./лот Width2.0mm BGA Припоя Проволоки 63,23 руб Оплетка Для удаления олова .
https://ru.aliexpress.com/item/Frees...608.0.0.GUHlGr
используя вышеприведенные ардуинки никаких прог не требуется.... грубо говоря plug&play
не совсем, они тупо эмулируют мультимедиа клаву.

avaRi
11.12.2016, 22:46
я извиняюсь - а зачем удалять олово (и откуда)?
Во первых ей удобно лудить дорожки на плате.
Во вторых она реально помогает собрать лишнее олово.
В третих с помошью нее легко выпаять запоратую ардуину.
Я по не осторожности на ардуине сжог один раз преобразователь на 5 вольт.

https://www.youtube.com/watch?v=QvCUKVb3DwM

papant
11.12.2016, 22:48
С5, С6,- керамика (они масенькие и их полно в любой бытовой технике.)
Можно не ставить.

Что значит полно? ) Я только 2 дня назад научился определять на плате сопротивления, все остальное наверное конденсаторы. Как только узнать их номинал на бытовой технике? или выпаять любое, что не является сопротивлением и поставить? )

С8, - раньшн стоял электролит.

Ок, тогда тоже электролит поставлю

С11 Можно не ставить.

Так я так и не понял - можно ли эти СМД заменить на керамику (https://www.google.ru/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0ahUKEwjFxvyM5uzQAhUOx2MKHaKaAdIQjRwIBw&url=http%3A%2F%2Fgo-radio.ru%2Fmarking-capacitor.html&psig=AFQjCNH8A-37rAUnWka609kvWDhpddeEuQ&ust=1481568285481796)?

oleg707
11.12.2016, 23:01
Так я так и не понял - можно ли эти СМД заменить на керамику?
можно
Как только узнать их номинал на бытовой технике?
выпаять и померять тестером в режиме измерения ёмкости. ( на дешовых тестерах нету). Напряжение на них еще надо знать, но обычно не ниже 6,3В
В третих с помошью нее легко выпаять запоратую ардуину.
для этого есть отсос = Solder-Sucker- (https://ru.aliexpress.com/item/1pc-Solder-Sucker-Desoldering-Pump-Tool-Removal-Vacuum-Soldering-Iron-Desolder-free-shipping/32531531850.html?spm=2114.13010608.0.0.e0Wnvs&detailNewVersion=&categoryId=708022)

papant
У тебя в соренто 11 года нормальная балалайка по заводу вроде, с камерой заднего и даже с полосками парковки при повороте руля. Если комплектация хорошая.
Зачем тебе планшет?

papant
11.12.2016, 23:49
можно
papant
У тебя в соренто 11 года нормальная балалайка по заводу вроде, с камерой заднего и даже с полосками парковки при повороте руля. Если комплектация хорошая.
Зачем тебе планшет?
у меня самая чмошная комплектация (ручная коробка), очевидно музыка штатная без экрана даже - меня это категорически не устраивает. сейчас, пока издох усилок (едет другой китайский) и решил переделать БП по чертежам Олега - поставил временно обратно штатную балалайку - по звуку она однозначно играет лучше моей предыдущей TDA7850, громче и насыщеней. насыщенность конечно может и от звуковухи зависит (PCM2704), но громче однозначно.

oleg707
12.12.2016, 00:13
у меня самая чмошная комплектация (ручная коробка), очевидно музыка штатная без экрана даже - меня это категорически не устраивает. сейчас, пока издох усилок (едет другой китайский) и решил переделать БП по чертежам Олега - поставил временно обратно штатную балалайку - по звуку она однозначно играет лучше моей предыдущей TDA7850, громче и насыщеней. насыщенность конечно может и от звуковухи зависит (PCM2704), но громче однозначно.

:offtopic2:
громкость не показатель.
На кия 13 года родной усилок - PCM ( это оптика по кабелю)- человек 50$ в Москве нашел ( халява была, но тем не менее)
У PCM2704 есть выход на оптику и PCM.

Furai2014
12.12.2016, 00:50
Здравствуйте, можно уточнить:
1. На фото где нарисовано-Y-OTG припаивать на 4 контакт прям на планшете?
2. Куда припаивать +5 питание хаба, где знак "?" или можно в гнездо питания на втором фото (если так то откуда лучше взять землю GND Plans или GND IN )?
У вас в описании пинов пишет "В хабе отрезать дорожку, которая идет к юсб(вход) и припаять этот провод" - его можно припаять на усб планшета 1 контакт или я ошибаюсь?
Спасибо.

4594045941

oleg707
12.12.2016, 01:48
Здравствуйте, можно уточнить:
1. На фото где нарисовано-Y-OTG припаивать на 4 контакт прям на планшете?
2. Куда припаивать +5 питание хаба, где знак "?" или можно в гнездо питания на втором фото (если так то откуда лучше взять землю GND Plans или GND IN )?
У вас в описании пинов пишет "В хабе отрезать дорожку, которая идет к юсб(вход) и припаять этот провод" - его можно припаять на усб планшета 1 контакт или я ошибаюсь?
Спасибо.

4594045941
Y-OTG необходимо изготовить самому. Для этого берём обычный кабель, отрезаем у него мини-юсб, покупаем такой же мини юсб новый, припаиваем контакты как на старом, а вот к 4 контакту мини-юсб припаиваете провод, который затем пойдёт на контакт OTG блока питания.
Тот шнурок, который у вас Y-OTG выкидываете, потому как внутри него 4 и 5 контакты уже закорочены намертво и залиты.

+5В питания хаба можете припаять как на 2м рисунке( непосредственно к хабу). При этом надо отрезать внутри хаба дорожку , которая идёт на ЮСБ планшета, чтобы хаб не смог питание получить от планшета, а планшет не получал питаня от хаба.

GND Plans - я подпаивался прямо к материнке планшета на минус батареи.


Y-OTG зачем он нужен и как его реализовать (http://pccar.ru/showpost.php?p=384048&postcount=2102)
В кратце и на пальцах, 4й пин в гнезде юсб (а их там 5) соединяется с землей - ОТГ режим включен и планшет начинает понимать, что в юсб порт подключено устройство и с ним нужно начать работать.
Если разорвать связь земли с 4м пином - то режим ОТГ отключается и планшет перестает работать с устройствами по юсб.
В нашем случае, разрыв\соединение делается для новой инициализации устройств, словно их подключили заново и делается это после выхода планшета из сна.

jonikus81
12.12.2016, 07:36
про пайку ардуин - тоже мучался, но потом начал применять гнезда (https://ru.aliexpress.com/item/50-PCS-LOT-single-row-seat-Single-mother-40-pin-1-2-54-mm-needle-base/32636394488.html?spm=2114.30010708.3.361.CYT7Ve&ws_ab_test=searchweb0_0,searchweb201602_6_10065_10 068_10084_10083_10080_10082_10081_10060_10061_1006 2_10056_10055_10037_10054_10033_10059_10032_10099_ 10078_10079_10077_10093_426_10103_10073_10102_1009 6_10052_10050_10051,searchweb201603_6&btsid=4c67d514-73f5-4140-920b-cbed508a0416), даже на тестовых платах, откусил нужную длинну, припаял, вставил ардуину - воркает и стоит не дорого + прошивать можно не отключая всех девайсов, вынули ардуину, прошили, вставили на место.
про резистивные кнопки - существует множество костылей, но все равно это КОСТЫЛИ и поэтому я применяю ардуино про микро из кетая, все это крутится и с энкодером и с резистивными кнопками. К слову энкодер и рез кнопки работают даже на винде и убунте, а с андюшей вообще без проблем. Но это уже совсем другой бп, со своими ошибками и недочетами, на основе бп Олега (за, что ему огромное спасибо и за ответы на мои глупые вопросы в скайпе).

papant
12.12.2016, 09:16
Ну да, Rx Tx по USB есть, а ядро нексуса содержит драйвер для CH340G ?
.
Друзья, у кого есть возможность проверить видно ли в андроиде Нано-ардуину? У меня на руках нету, едет ище с китая, но есть Леонардо. Вопрос увидится ли Нано в сериал порту нексуса 2013 или перерисовывать БП Олега на Леонардо?

avaRi
12.12.2016, 12:52
про пайку ардуин - тоже мучался, но потом начал применять http://qoo.by/KVq,.
Ссылка битая

oleg707
12.12.2016, 13:03
Друзья, у кого есть возможность проверить видно ли в андроиде Нано-ардуину? У меня на руках нету, едет ище с китая, но есть Леонардо. Вопрос увидится ли Нано в сериал порту нексуса 2013 или перерисовывать БП Олега на Леонардо?

на леонардо программу надо переписывать. В последних версиях софта используется прямое управление портами.
Просто повесить A0 на А0 - не факт, что адресация в чипах одинаковая, надо даташиты смотреть.
Если не совпадёт - можно порты попалить.

Ссылка битая

на прямую (https://ru.aliexpress.com/item/50-PCS-LOT-single-row-seat-Single-mother-40-pin-1-2-54-mm-needle-base/32636394488.html?spm=2114.30010708.3.361.Ue2PBE&ws_ab_test=searchweb0_0,searchweb201602_6_10065_10 068_10084_10083_10080_10082_10081_10060_10061_1006 2_10056_10055_10037_10054_10033_10059_10099_10078_ 10079_10093_426_10103_10073_10102_10096_10052_1005 0_10051,searchweb201603_6&btsid=b8bf6a6c-1a1f-478d-94f7-480cfc87c579)

jonikus81, Не давай ссылки через это goo, они рекламу пихают.

i2save
12.12.2016, 13:22
а нет ли общей схемы в большем разрешении (получше качеством)?

jonikus81
12.12.2016, 13:22
Поправил ссылку. Мискюзи.

avaRi
12.12.2016, 16:21
Вчера залил byte ver =97 прошивку. Откатал день. Вроде норм.

SamDon
12.12.2016, 19:30
Здравствуйте, можете кто нибудь перевести печатку бп последней версии в гербер или pcb формат? хочу заказать печатки у китайцев

dees
12.12.2016, 22:04
Друзья, у кого есть возможность проверить видно ли в андроиде Нано-ардуину? У меня на руках нету, едет ище с китая, но есть Леонардо. Вопрос увидится ли Нано в сериал порту нексуса 2013 или перерисовывать БП Олега на Леонардо?


Все прекрасно видится, правда нексус 2012, но и на 13 проблем, наверное, не должно быть.
https://youtu.be/tbuyCGzsNhA

vtyns
12.12.2016, 22:34
ребят стоит следующее расположение элементов блока питания. диод 6А / кондер 10к 25вольт / nsd 3A / планшет. на выходе nsd контакт trim закорочен на плюс = 4.6 вольта. при запуске авто планшет пишет выключение и выключается. бывает при запуске норм а на заведенной выключается при этом он не загружен никакими прогами. куда копать? и сколько должен держать кондер? походу толку нет от него

Furai2014
13.12.2016, 00:06
Y-OTG необходимо изготовить самому. Для этого берём обычный кабель, отрезаем у него мини-юсб, покупаем такой же мини юсб новый, припаиваем контакты как на старом, а вот к 4 контакту мини-юсб припаиваете провод, который затем пойдёт на контакт OTG блока питания.
Тот шнурок, который у вас Y-OTG выкидываете, потому как внутри него 4 и 5 контакты уже закорочены намертво и залиты.

+5В питания хаба можете припаять как на 2м рисунке( непосредственно к хабу). При этом надо отрезать внутри хаба дорожку , которая идёт на ЮСБ планшета, чтобы хаб не смог питание получить от планшета, а планшет не получал питаня от хаба.

GND Plans - я подпаивался прямо к материнке планшета на минус батареи.

Получается такая схема? И +5 на POGO пин в таком исполнении подключать?
45943

oleg707
13.12.2016, 01:30
Получается такая схема? И +5 на POGO пин в таком исполнении подключать?
45943
да.
На Vcc хаба подключить пин HUB (+5V). Он должен по юсб питание раздавать, внутри хаба на все выходы.
+5POGO c БП припаять на +5в пого пина на планшете.
Или на Vcc юсб планшета ( для 13 и для 12).

Для 12 неважно, куда подано питание - на пого или на ЮСБ.

Дорисуй нормально, в фак положу.

oleg707
13.12.2016, 01:33
а нет ли общей схемы в большем разрешении (получше качеством)?

эм, а скачать и открыть в программе, для которой они созданы? Хоть на весь экран каждый резистор увеличивай. ( и в 3й версии именно надо увеличивать, потому как много зарыто доп информации)

oleg707
13.12.2016, 02:02
Здравствуйте, можете кто нибудь перевести печатку бп последней версии в гербер или pcb формат? хочу заказать печатки у китайцев

вообще у китайцев это хорошо. Но 5 версия заточена именно под ручную сборку. И пока я её окончательно не отлажу (в идеал), заказывать массово не хотелось бы.
А заказывать скорее 6 версию блока, которая пока заброшена. То есть блок как питания там уже давно нарисован, а вот хаб, звуковая, аудиопроц как то нет. А 5 и так не проблема сделать.
Экспортировать то можно, не проблема ниразу. прямо в диптрейсе.

vtyns
13.12.2016, 11:29
ребят вот схема, посоветуйте
1/ до скольки понижать напряжение для планшета и чем. (при 4.5 иногда вырубается бывает и без нагрузки)
2/ какие ставить конденсаторы и где. (па прошлом блоке стоял перед nsd на 10000 25вольт после диода. не держит и секунды без питания.) хотелось бы чтоб держало секунды две
3/ чем сделать задержку при включении отг? (чем менее габаритным можно заменить реле типа NE555 с алиэкспресса)я так понимаю отг должно включаться самым последним и выключаться тоже последним.

jonikus81
13.12.2016, 12:49
ребят вот схема, посоветуйте
1/ до скольки понижать напряжение для планшета и чем. (при 4.5 иногда вырубается бывает и без нагрузки)
2/ какие ставить конденсаторы и где. (па прошлом блоке стоял перед nsd на 10000 25вольт после диода. не держит и секунды без питания.) хотелось бы чтоб держало секунды две
3/ чем сделать задержку при включении отг? (чем менее габаритным можно заменить реле типа NE555 с алиэкспресса)я так понимаю отг должно включаться самым последним и выключаться тоже последним.

Снята ли батарея, питание идет через контроллер батареи или на прямую? Какой планшет, 2012 или 2013, Wifi или LTE версия.
По схеме как минимум хабу нужно 5в, а на планшет (в зависимости от модели). НСДшки очень сильно боятся падения напруги, тут только мощный диод и конденсатор минимум 10 000мкФ(чем больше тем лучше) на входе.

vtyns
13.12.2016, 13:15
батареи нет. питание напрямую к двум красным и двум черным (не нашел подсоединения по моему планшету через контроллер и куда паять сопротивление по температуре). нексус7 2013 лте. диод перед кондером стоял 6 ампер кондер 10 000мкф перед nsd стояло все. и не держит

papant
13.12.2016, 22:20
батареи нет. питание напрямую к двум красным и двум черным (не нашел подсоединения по моему планшету через контроллер и куда паять сопротивление по температуре). нексус7 2013 лте. диод перед кондером стоял 6 ампер кондер 10 000мкф перед nsd стояло все. и не держит
Имхо гнаться за емкостью после диода - утопия. тут наверное 1 фарад потребуется (шучу). Надо до НСД толстые провода, после нее тоже, а не лапшу китайскую. Мне кажется дело в этом. По поводу напруги - у меня 2013 нексус работает на 4,7-4,8 В, ниже - перезагрузки фантомные. На 5В не пробовал, страшно )

papant
13.12.2016, 22:37
Для Олега:
Посмотрел твой скрипт, мало что понятно с моими познаниями в программировании, очень помогают хорошие комментарии. Однако, для более читабельного кода вместо конкретных цифр 13.7, 11.8 и т.д. в конструкциях типа
if (U_akb_real > 13.7 && flagACC == 1){ (flagREM = 1);TimerREM = millis();}
if (U_akb_real >= 11.8 && flagREM == 2 && flagACC == 0){ flagREM = 0;}

я бы рекомендовал использовать например
#define LowVoltage 11.8
что повышает читабельность кода и исключит возможные ошибки (когда часто выпускаются новые версии кода и можно просто где-то не досмотреть).

oleg707
13.12.2016, 22:38
у нсд минимальный порог работы - 9В. На старте в машине просадка идёт до 10-9В.
Минус 1В падение на диоде.
итого имеем 9-8 В на нсд. Работать даже в теории не должно.

vtyns
13.12.2016, 23:13
просадка при старте бывает и до 6 вольт. потери на диоде 0.3 вольт. мне необходимо знать что в моей схеме нужно доработать чтоб компенсировать просадку. скока кондеров поставить или еще что нибудь. РАСПИШИТЕ ПОЖАЛУЙСТА ПО ПУНКТАМ КАКИЕ МЕНЯ ИНТЕРЕСУЮТ.

skanch
14.12.2016, 00:01
просадка при старте бывает и до 6 вольт. потери на диоде 0.3 вольт. мне необходимо знать что в моей схеме нужно доработать чтоб компенсировать просадку. скока кондеров поставить или еще что нибудь. РАСПИШИТЕ ПОЖАЛУЙСТА ПО ПУНКТАМ КАКИЕ МЕНЯ ИНТЕРЕСУЮТ.

Запитать NSD через стабилизатор напряжения или через повышающий DC-DC преобразователь (как вариант на XL6009 или MT3608).

Az0m@
14.12.2016, 00:07
я оставлю это тут на всякий
http://i11.pixs.ru/thumbs/5/0/5/Dokument21_2063274_24410505.jpg (http://pixs.ru/showimage/Dokument21_2063274_24410505.jpg)

papant
14.12.2016, 00:16
щас херню спрошу, прошу прощения )
а зачем собственно надо резать плюс между планшетом и хабом? ведь в если режим ОТГ не включен, то планшет не питает никаких устройств, а хаб тоже обесточен... вроде как лишнее это ). было бы актуально, если б 4 пин отвечающий за ОТГ был намертво прикручен к массе, тогда да, планшет будет отдавать 5В в перефирию, нет?

oleg707
14.12.2016, 02:07
я оставлю это тут на всякий
http://i11.pixs.ru/thumbs/5/0/5/Dokument21_2063274_24410505.jpg (http://pixs.ru/showimage/Dokument21_2063274_24410505.jpg)

красава.
только допиши, если сдувать ДХ, то надо резистор подтяжки от сигнальной ноги к питанию датчика (3,3В) припаять.

oleg707
14.12.2016, 02:10
щас херню спрошу, прошу прощения )
а зачем собственно надо резать плюс между планшетом и хабом? ведь в если режим ОТГ не включен, то планшет не питает никаких устройств, а хаб тоже обесточен... вроде как лишнее это ). было бы актуально, если б 4 пин отвечающий за ОТГ был намертво прикручен к массе, тогда да, планшет будет отдавать 5В в перефирию, нет?

уже 100 раз обсасывалось про 4. лень печатать. так НАДО.
И еще если не убирать 4 пин, то планшет будет думать, что он на зарядке, даже если убрать зарядку!

papant
14.12.2016, 07:11
уже 100 раз обсасывалось про 4. лень печатать. так НАДО.
Про 4 пин то понятно, вопрос был про зачем резать +5 при условии размыкания 4 пина и обесточивании хаба

jonikus81
14.12.2016, 07:53
у нсд минимальный порог работы - 9В. На старте в машине просадка идёт до 10-9В.
Минус 1В падение на диоде.
итого имеем 9-8 В на нсд. Работать даже в теории не должно.
Все верно. Выход только в огромном количестве микрофарадов и мощном диоде. Мой самый первый БП был на как раз на на НСДшке, правда 5 амперной. На фото маленький кондер, после испытаний пришлось ставить еще больше, но оно заработало, у меня дизель и там стартер дает просадки ниже 9 вольт. + я так и не победил стабильных 4,8 вольта, вроде бы 5 Ампер(неплохой запас), а при нагрузке напруга падает до 4.4 вольта (на фото видно) Провода вел толстые сабвуферные напрямую с акумулятора через предохранитель. Уж слишком геморойные НСДшки, а про цену вообще молчу(маты, только маты), поэтому перешел на КИВы - ляпота! http://s017.radikal.ru/i424/1612/5e/cff6011d61b6t.jpg (http://radikal.ru/big/hxff68qydjxa3)

jonikus81
14.12.2016, 08:19
Про 4 пин то понятно, вопрос был про зачем резать +5 при условии размыкания 4 пина и обесточивании хаба
Давай подумаем теоретически на пальцах. Что такое +5 на юсб порту. Это как пин зарядки самого планшета так и пин питания всей периферии подключенной к юсб порту. Если мы сняли батарею, что нам заряжать(батарея ведь отсутствует )? Если мы подключаем хаб и нагружаем его девайсами, то он начнет "сосать" ток как раз по этому +5 пину, а на плате у нексуса дорожка с волосок, да и не уверен, что там чип может выдать больше 500мА. (к слову только один жесткий диск ест больше 500мА). По этому рвут этот контакт и питают хаб ОТДЕЛЬНО, а некоторые даже управляют этим самым питанием, да бы при уходе в сон, избежать лишних потреблений тока, а это ведет к хорошей экономии тока, что для акумы и нас очень гуд.
ПС. это как я (чайник) понимаю зачем рвут +5вольт между хабом и планшетом.
ППС. написал это так как всем лень

Az0m@
14.12.2016, 11:24
красава.
только допиши, если сдувать ДХ, то надо резистор подтяжки от сигнальной ноги к питанию датчика (3,3В) припаять.
оо... я про это тока сейчас слышу... каким номиналом резистор желательно и получается его между верхней и нижней контактами припаять?

oleg707
14.12.2016, 14:04
оо... я про это тока сейчас слышу... каким номиналом резистор желательно и получается его между верхней и нижней контактами припаять?

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

oleg707
14.12.2016, 14:11
Про 4 пин то понятно, вопрос был про зачем резать +5 при условии размыкания 4 пина и обесточивании хаба

чтоб хаб и планшет развязать

vtyns
14.12.2016, 15:02
ребят вот схема, посоветуйте
1/ до скольки понижать напряжение для планшета и чем. (при 4.5 иногда вырубается бывает и без нагрузки)
2/ какие ставить конденсаторы и где. (па прошлом блоке стоял перед nsd на 10000 25вольт после диода. не держит и секунды без питания.) хотелось бы чтоб держало секунды две
3/ чем сделать задержку при включении отг? (чем менее габаритным можно заменить реле типа NE555 с алиэкспресса)я так понимаю отг должно включаться самым последним и выключаться тоже последним.

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

Denkos
14.12.2016, 15:18
знающие ну дайте дельный совет хотябы по колличеству конденсаторов. не выкидывать же nsd мне. дороговатая вещь
Выкинул три года назад, не жалею.

skanch
14.12.2016, 17:04
знающие ну дайте дельный совет хотябы по колличеству конденсаторов. не выкидывать же nsd мне. дороговатая вещь
Я уже предложил решение для спасения "дороговатой вещи". Цена вопроса 120 (http://roboshop.spb.ru/power/XL6009-board)р или 70р (http://roboshop.spb.ru/power/MT3608).

Denkos
14.12.2016, 17:10
Я уже предложил решение для спасения "дороговатой вещи". Цена вопроса 120 (http://roboshop.spb.ru/power/XL6009-board)р или 70р (http://roboshop.spb.ru/power/MT3608).

Двойное преобразование, моразм.:be:

skanch
14.12.2016, 17:14
Двойное преобразование, моразм.:be:

Маразм-использовать NSD при просадках напряжения.

oleg707
14.12.2016, 18:06
согласен с 2 последними.

vtyns
14.12.2016, 18:41
так получается моразм читать этот форум. все было собрано не из головы а из форума. и опять тупик. те кто делает на нсд както же обошли эту ситуацию. на кройняк есть дешовый преобразователь в качестве стабилизатора для нсд

oleg707
14.12.2016, 19:19
так получается моразм читать этот форум. все было собрано не из головы а из форума. и опять тупик. те кто делает на нсд както же обошли эту ситуацию. на кройняк есть дешовый преобразователь в качестве стабилизатора для нсд

Ты находишься в теме, которую создал я, которая посвящена одной вещи: блоку питания моей разработки для нексуса. (но фактически любого планшета).

Когда то я начитался этого форума, в том числе по НСД,
и сделал выводы.
Что рабочего решения, которое меня устроило бы НЕТ. :shok:
И мне практически с нуля пришлось изобретать велосипед.:spiteful:
И заодно этим велосипедом еще и поделился, нахаляву!

Тот же KIW3312S я рискнул и первый купил и поставил за свои деньги, поскольку нсд меня не устроило в том числе и по цене. А KIS (который все советовали) не устроил габаритами.
Я выложил РАБОЧЕЕ решение с ОТКРЫТЫМИ исходнками, ОЧЕНЬ подробно прокомментироваными, чтобы его могли повторить.
Возможно, решение не идеально, но оно работает.

Так что твоё личное дело, читать или не читать, повторять или не повторять.:dntknw:

vtyns
14.12.2016, 19:29
может и буду повторять твою тему. просто вдруг чем нибудь еще можно спасти мой блок). кондеров может 50 000мкф помогут или еще что нибудь кроме еще одного dc

oleg707
14.12.2016, 19:37
может и буду повторять твою тему. просто вдруг чем нибудь еще можно спасти мой блок). кондеров может 50 000мкф помогут или еще что нибудь кроме еще одного dc

батарею верни в нексус:yes2:

vtyns
14.12.2016, 19:41
батарею верни в нексус:yes2:

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

oleg707
14.12.2016, 20:09
думал про это. ну а как бороться с морозами и жарой. и возможен ли перезаряд с последующим раздутием батареи от постоянно включенного блока питания напрямую к контактам платы?

этим должен управлять контроллер :secret:
2 года - полёт нормальный.

Az0m@
14.12.2016, 20:09
http://i12.pixs.ru/thumbs/9/7/1/Dokument21_4881377_24419971.jpg (http://pixs.ru/showimage/Dokument21_4881377_24419971.jpg)
инфу про резюк взял с этого поста: http://pccar.ru/showpost.php?p=306355&postcount=87

vtyns
14.12.2016, 20:20
этим должен управлять контроллер :secret:
2 года - полёт нормальный.

а можно схему куда именно подавать питание и какое напряжение? через юсб не получится у меня. только паять

oleg707
14.12.2016, 22:39
а можно схему куда именно подавать питание и какое напряжение? через юсб не получится у меня. только паять

в проекте есть

oleg707
14.12.2016, 22:43
http://i12.pixs.ru/thumbs/9/7/1/Dokument21_4881377_24419971.jpg (http://pixs.ru/showimage/Dokument21_4881377_24419971.jpg)
инфу про резюк взял с этого поста: http://pccar.ru/showpost.php?p=306355&postcount=87

не . неправильно
он там датчик выпаял, вместо него на 1 и 3 ногу впаял R5 = 1кОм. При подаче через R4 4.1к напряжения на 3 ногу, планшет просыпается, при пропадании - засыпает.
то есть он на массу подтянул
А нам надо на Vcc датчика

jonikus81
15.12.2016, 10:05
знающие ну дайте дельный совет хотябы по колличеству конденсаторов. не выкидывать же nsd мне. дороговатая вещь
Как вариант, собрать БП Олега (обкатанно, стабильно, да еще и поддержка самого автора в этой ветке), а потом на досуге экспериментировать с гальваническими развязками. Вообще считаю НСДшные БП сугубо аудиофильскими, где приоритет не функционал, а качество звука. Поверьте, НСД БП без качественной аудиосистемы это как по мухам из пушки. Скажу Вам больше, любой контакт, провод или еще чего, контактирующее с землей "корпусом авто" убивает ту самую гальваническую развязку и НСДшка начинает работать как самый дешевый кетайский преобразователь напряжения за пару баксов(а то и хуже). У самого лежат 2 НСДшки без дела.

oleg707
15.12.2016, 13:12
2 дня обкатал- мороз -10 норм.
byte ver =99;// ( чем больше цифра, тем новее)
// дата правки 11.12.16.1358

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 161-164)
//ТЕСТОВАЯ! пока норм.
// скетч проверен и записан на версии ардуино 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 например

/* _
хотелки
strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
v94 опробовать режим стартую и выключения изажигания
вывести статусы отг и 2 канала
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по 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 с после начала загрузки идёт инициализация звуковой, в этот момент слышен ПУК
__________________________________________________ ______________
потребление блока по 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 строки на дисплей



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; /*признак включенного зажигания*/
boolean 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();
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================




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*/

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
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 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 - заводим машину (стартуем).*/
// ввести новую переменную 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 ) /* пауза 1,6c после включения ACC и потом делать следующ(пока включено ACC): //через 01,6с после включения 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.*/
//ПРОТЕСТИРОВАТЬ REM!!!!!!!!!!!! if (U_akb_real > 13.7){ (flagREM = 1);TimerREM = millis();} /* если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.*/
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( 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*/
pauseTimeACC = millis();
pauseTimeAKB = millis();

//lcd.clear(); //очистка экрана не нужна со строковым выводом
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 5c или 0.5c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
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 (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++;
}




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

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

//int H = (millis()/3600000);
//int 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й строки____________________________________________ __________________________________________________ __________________________________________________ ______________________________
sprintf(strokaI," ") ;
IntToCharIIII((millis()/60000), &strokaI[0]); // вывод минут 0000 4 цифры СЕКУНД // tckb ghtdscbn 9999, то будут кроказябры!!! вида ;0129
strokaI[5]= flagAKB + '0';// вывод флага AKB 5 символ
strokaI[6]= flagACC+ '0';// вывод флага AСС 6 символ
strokaI[7]= flagREM+ '0';// вывод флага rem 7 символ
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АСС
//конец обработки 1й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________

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

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

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

//if (( millis() - TimerREM )<=timeBeforeRemOff) { IntToCharII( (timeBeforeRemOff - (( millis() - TimerREM ))/60000 ), &strokaII[7]); }// вывод минут работы REM без сброса
//для проверки if (( millis() - TimerREM )<=3000) { IntToCharII( (3000 - (( millis() - TimerREM ))/60000 ), &strokaII[7]); }// вывод минут работы REM без сброса

/* // _______________________________вывод состояния 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] = '.';
}
// __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ______________________________________________
*/

//вывод OTG HUB POGO__________________________________
strokaII[5]= OTG + '0';// вывод флага OTG 5 символ
strokaII[6]= HUB+ '0';// вывод флага HUB 6 символ
strokaII[7]= II_KIW_pin_POGO+ '0';// вывод флага II_KIW_pin_POGO (ПРИЗНАК ЗАРЯДКИ) 7 символ



// __________________________________________________ ________________
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
//конец обработки 2й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________



//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________

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);

//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________




//СТАРЫЙ ВЫВОД ИНФЫ НА ДИСПЛЕЙ - удалить после тестирования
//if ( ( (millis() / 60000 ) <9 ) ){lcd.setCursor(2, 0); lcd.print("v");lcd.setCursor(3, 0); lcd.print(ver);} // Вывод версии блока на дисплей.
//вывод времени работы
/* lcd.setCursor(0, 0);
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ) OK

lcd.setCursor(7, 0);
lcd.print(flagAKB); // вывод флага AKB

lcd.setCursor(8, 0);
lcd.print(flagACC); // вывод флага АСС

lcd.setCursor(9, 0);
lcd.print(flagREM); // вывод флага rem
lcd.setCursor(11, 0);
lcd.print(U_acc_real); // вывод напряжения АСС

//lcd.setCursor(5,1);
//-------------------2 строка---------------------------------
lcd.setCursor(0, 1);
unsigned long TIMER = ( pauseTimeAKB + 172800000 - millis() )/60000; // вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
lcd.print(TIMER);
lcd.setCursor(5, 1);
lcd.print(( millis() - TimerREM )/60000); //
lcd.setCursor(11, 1);
lcd.print(U_akb_real); // вывод напряжения АКБ
*/
/* так выглядит индикация на дисплее


================
|1 v86 111 0.000| 1 строка * вывод кол-ва минут работы блока VER86 *флаг АКБ*флаг АСС*флаг REM* вывод напряжения АСС
|616 10 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * millis() - TimerREM, минут * вывод напряжения АКБ
сколько осталось работать сабу

*/
//__________________________________________________ __________________________________________________ ______________________
}

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

/*настраиваем режимы моргания встроенного светодиода ардуины*/
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()*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

Az0m@
16.12.2016, 01:03
не . неправильно
он там датчик выпаял, вместо него на 1 и 3 ногу впаял R5 = 1кОм. При подаче через R4 4.1к напряжения на 3 ногу, планшет просыпается, при пропадании - засыпает.
то есть он на массу подтянул
А нам надо на Vcc датчика
http://i12.pixs.ru/thumbs/0/9/7/Dokument21_1245571_24436097.jpg (http://pixs.ru/showimage/Dokument21_1245571_24436097.jpg)

oleg707
16.12.2016, 01:58
http://i12.pixs.ru/thumbs/0/9/7/Dokument21_1245571_24436097.jpg (http://pixs.ru/showimage/Dokument21_1245571_24436097.jpg)

теперь вроде то :yes4:
добавил в шапку

Furai2014
18.12.2016, 00:37
А что если расширить блок и добавить Si4703 FM
45989
Подключить ардуино через юсб к планшету, тогда программно управлять
Si4703 FM с планшета, и можно данные о состоянии блока также выводить на виджет. Или нано не потянет?

oleg707
18.12.2016, 01:09
А что если расширить блок и добавить Si4703 FM
45989
Подключить ардуино через юсб к планшету, тогда программно управлять
Si4703 FM с планшета, и можно данные о состоянии блока также выводить на виджет. Или нано не потянет?

добавлять только если сюда http://pccar.ru/showthread.php?t=24440
Как у неё приём?

ИМХО БП должен быть БП БЕЗ связи по юсб.
А если пробьёт атмегу (кив здохнет, например). Что, единственного юсб лишаться?!

А вообще я радио не слушаю. ( еще и телевизор не смотрю, уже больше 10 лет.)

Az0m@
19.12.2016, 09:23
А что если расширить блок и добавить Si4703 FM
45989
Подключить ардуино через юсб к планшету, тогда программно управлять
Si4703 FM с планшета, и можно данные о состоянии блока также выводить на виджет. Или нано не потянет?

https://www.youtube.com/watch?v=gt2V-EzE5Gk

papant
19.12.2016, 22:44
https://www.youtube.com/watch?v=gt2V-EzE5Gk

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

Furai2014
19.12.2016, 23:02
Херь мне кажется это.Вот если бы с нее звук гнать на звуковуху, то ладно еще, а тут надо с планшета звук гнать по юсб на звуковуху и потом в усилок, с этой приблуды видимо только во второй вход усилка если он есть. И потом между ними как то переключаться. Имхо баловство все это, пользую интернет радио и вам советую )
Снее можно напрямую на звуковую, с планшета только управление по юсб или через блютуз

oleg707
19.12.2016, 23:05
Херь мне кажется это.Вот если бы с нее звук гнать на звуковуху, то ладно еще, а тут надо с планшета звук гнать по юсб на звуковуху и потом в усилок, с этой приблуды видимо только во второй вход усилка если он есть. И потом между ними как то переключаться. Имхо баловство все это, пользую интернет радио и вам советую )

не, там есть линейный аудиовыход. Управление по I2C.
Но не на блок питания радио вешать. :spiteful:

vtyns
23.12.2016, 22:22
ребят собрал блок на нсд. вроде все получилось, но. напряжение при выключенном планшете 4.7в. при включенном - напряжение 3.4в. с 5.2в до 4.7в. понижал двумя диодами. просадку напряжения 1.3в. дают именно эти два диода(до диодов просадок нет,мерил). как избавиться от этой просадки? может есть специальные диоды для понижения без просадки(сейчас стоят 5А написано HER)? или еще чем понизить без програмирования? (планшет n7 без батареи запитан к клемам материнки)

oleg707
24.12.2016, 00:37
ребят собрал блок на нсд. вроде все получилось, но. напряжение при выключенном планшете 4.7в. при включенном - напряжение 3.4в. с 5.2в до 4.7в. понижал двумя диодами. просадку напряжения 1.3в. дают именно эти два диода(до диодов просадок нет,мерил). как избавиться от этой просадки? может есть специальные диоды для понижения без просадки(сейчас стоят 5А написано HER)? или еще чем понизить без програмирования? (планшет n7 без батареи запитан к клемам материнки)

вам явно не в эту тему. Для вашего случая надо DC-DC степ даун преобразователь (еще один)

vtyns
24.12.2016, 22:57
я с этой темы слизывал примеры блоков питания. просто народ пишет что ставит диоды а какие не пишет, я и поставил)) а походу надо конкретные диоды. типа шотки или еще что

oleg707
25.12.2016, 01:43
я с этой темы слизывал примеры блоков питания. просто народ пишет что ставит диоды а какие не пишет, я и поставил)) а походу надо конкретные диоды. типа шотки или еще что

в шапке темы только то, что собрал и оттестил лично я. Если вы видели чьи-то другие схемы, стучитесь к ним напрямую.
На нсд я не собирал ввиду дороговизны и здоровых размеров. И НСД не работает при просадке ниже 9В ( бывает при старте).
kis-3r33s и kiw3312s вам в помощь, только там гальванической развязки нет.

jonikus81
26.12.2016, 09:47
ребят собрал блок на нсд. вроде все получилось, но. напряжение при выключенном планшете 4.7в. при включенном - напряжение 3.4в. с 5.2в до 4.7в. понижал двумя диодами. просадку напряжения 1.3в. дают именно эти два диода(до диодов просадок нет,мерил). как избавиться от этой просадки? может есть специальные диоды для понижения без просадки(сейчас стоят 5А написано HER)? или еще чем понизить без програмирования? (планшет n7 без батареи запитан к клемам материнки)

в этом и весь геморой НСДшек. Я ставил диоды 25А(в транзисторном корпусе), тк 5, 10, 20 грелись чуть ли не до красна, но у меня и НСДшка 5Амперная и от нее питалось все (дабы получить развязку). Я уже писал косяки НСДшек раньше в этой теме и не раз. По этому перешел на KIWы, все четко.

ЗЫ А бороться с просадками устанавливая огромные кондеры и доп DC-DC преобразователи - болото, так как растут размеры и доп баги. Цена вообще отдельный разговор.
ЗЫЗЫ Тема автора действительно никак не относится к НСД.

oleg707
26.12.2016, 13:52
обзор-электрических-конденсаторов-материнских-плат-и-видеокарт (http://mycomp.net.ua/%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D 0%B5%D1%81%D0%BA%D0%B8%D1%85-%D0%BA%D0%BE%D0%BD%D0%B4%D0%B5%D0%BD%D1%81%D0%B0%D 1%82%D0%BE%D1%80%D0%BE%D0%B2-%D0%BC%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D1%81%D 0%BA%D0%B8%D1%85-%D0%BF%D0%BB%D0%B0%D1%82-%D0%B8-%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D0%BA%D0%B0%D1%80%D 1%82)

vtyns
26.12.2016, 14:38
обзор-электрических-конденсаторов-материнских-плат-и-видеокарт (http://mycomp.net.ua/%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D 0%B5%D1%81%D0%BA%D0%B8%D1%85-%D0%BA%D0%BE%D0%BD%D0%B4%D0%B5%D0%BD%D1%81%D0%B0%D 1%82%D0%BE%D1%80%D0%BE%D0%B2-%D0%BC%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D1%81%D 0%BA%D0%B8%D1%85-%D0%BF%D0%BB%D0%B0%D1%82-%D0%B8-%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D0%BA%D0%B0%D1%80%D 1%82)

не понял к чему это? мозг не думает в правильном направлении)

Denkos
26.12.2016, 14:40
не понял к чему это? мозг не думает в правильном направлении)

Для профору, мозг взорвать :big:

oleg707
26.12.2016, 15:39
Для профору, мозг взорвать :big:

дада :rofl:

papant
28.12.2016, 08:02
Олег!
Можно поподробней про доработку КИВа? Тему прочитал с начала до 20 страницы и последние 20 страниц, что дорабатывать не увидел )

Denkos
28.12.2016, 08:10
Олег!
Можно поподробней про доработку КИВа? Тему прочитал с начала до 20 страницы и последние 20 страниц, что дорабатывать не увидел )
Все есть на схеме

oleg707
28.12.2016, 14:37
Олег!
Можно поподробней про доработку КИВа? Тему прочитал с начала до 20 страницы и последние 20 страниц, что дорабатывать не увидел )

откройте схему 3 версии БП, там увеличьте, всё подробно с картинками.
Добавил фото в шапку
http://pccar.ru/attachment.php?attachmentid=46113&d=1482922359http://pccar.ru/attachment.php?attachmentid=46113&d=1482922359

jonikus81
29.12.2016, 10:18
oleg707, о спасибо, а то постоянно приходилось гуглить о доработке кива. Шапка прям формируется в хорошую базу знаний :good:

oleg707
29.12.2016, 18:52
oleg707, о спасибо, а то постоянно приходилось гуглить о доработке кива. Шапка прям формируется в хорошую базу знаний :good:

я стараюсь

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

// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1 в строках 161-164)
//ТЕСТОВАЯ! пока норм.
// скетч проверен и записан на версии ардуино 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 например

/* _
хотелки
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 сек после операции завершения.
__________________________________________________ ______________

потребление блока по 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 строки на дисплей



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; /*признак включенного зажигания*/
boolean 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*/

// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
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 - заводим машину (стартуем).*/
// ввести новую переменную 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 ) /* пауза 1,6c после включения ACC и потом делать следующ(пока включено ACC): //через 01,6с после включения 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.*/
//ПРОТЕСТИРОВАТЬ REM!!!!!!!!!!!! if (U_akb_real > 13.7){ (flagREM = 1);TimerREM = millis();} /* если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.*/
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( 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++;
}




// Событие срабатывающее каждые 250 мс
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]= flagREM+ '0';// вывод флага rem 7 символ
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 символ
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
//конец обработки 2й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________



//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________

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);

//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________




//СТАРЫЙ ВЫВОД ИНФЫ НА ДИСПЛЕЙ - удалить после тестирования




/* // _______________________________вывод состояния 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] = '.';
}
// __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ______________________________________________
*/

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


================
|1 111 0.000| 1 строка * вывод кол-ва минут работы блока VER86 * AKB ACC REM * вывод напряжения АСС
|616 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()*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================

SuperLSD
04.01.2017, 20:52
Господа, прошу прощения заранее, что влажу в эту ветку, но ранее был опубликован БП http://pccar.ru/showpost.php?p=361007&postcount=393, и наконец я его спаял, но трудность в коде ардуинки, прошу помощи в разбирательстве проблемы и возможного нахождения ответа 46174 при компиляции вылезают ошибки и не закачивается на ардуино микро

oleg707
04.01.2017, 22:06
Господа, прошу прощения заранее, что влажу в эту ветку, но ранее был опубликован БП http://pccar.ru/showpost.php?p=361007&postcount=393, и наконец я его спаял, но трудность в коде ардуинки, прошу помощи в разбирательстве проблемы и возможного нахождения ответа 46174 при компиляции вылезают ошибки и не закачивается на ардуино микро

к автору стучите
что за #include <AH_MCP41xxx.h> ? на него и ругается.

SuperLSD
04.01.2017, 22:23
Проблема в том, что автору стучался, видимо НГ празднует, по ссылке http://pccar.ru/showpost.php?p=361007&postcount=393 есть библиотека для него http://www.chipdip.ru/product/mcp41100-i-p-ic-digital-pot-100k-1ch-spi/

lavalamp
06.01.2017, 12:19
https://pp.vk.me/c636016/v636016674/4586f/QHVGUZHeqRI.jpg
Решил спаять ваш блок питания для своей схемы,
Подскажите подойдет ли блок для моей схемы и где можно купить kiw на Али посмотрел не много кто продает и нет отзывов,кто где покупает?

oleg707
06.01.2017, 13:35
Решил спаять ваш блок питания для своей схемы,
Подскажите подойдет ли блок для моей схемы и где можно купить kiw на Али посмотрел не много кто продает и нет отзывов,кто где покупает?

https://ru.aliexpress.com/wholesale?catId=0&initiative_id=SB_20170106013014&SearchText=IRF3802A+
Вместо LM можно использовать второй канал кива.

Az0m@
10.01.2017, 01:50
Всех с прошедшими. и так тьфу тьфу дабы не сглазить все таки добился относительной стабильности работы во всех режимах. На днях повторно собрал плату со всеми изменениями в последней ревизии, что было выложено Олегом, лишь с заменой кондера на выходе второго канала на 4400нФ. Все это складно работало, пока я не решил подключить очередное устройство...а именно усб 4г свисток. После чего периодически зависало усб..именно зависало, а не пропадало. Зависало при этом с отвалом всех устройств на хабе. Думал что проблема в хабе...но без модема все работало стабильно. И тут мне посоветовали посмотреть что творится с напругой по усб. Как оказалось без модема стаб под нагрузкой (звук + ардуино про мини) выдавал чтото около 4.85В, а после подключения модема просаживался до 4.7... а это оказалось край для усб в режиме фул спид. После небольшой дискуссии с Олегом решил попробывать повысить напругу на втором канале... вместо смд 334 поставил 394... в итоге имеем теперь без нагрузки около 5.06В, а с нагрузкой и модемом чуть больше 4.9В и уже пару дней тестов показало что теперь все стабильно пашед. Поэтому если что имейте ввиду....

morzik45
11.01.2017, 17:09
Собрался собирать(забавное словосочетание получилось =)) БП по вашей схеме, пол дня потратил по чтение всех 74х страниц темы... вроде многое (или не многое =) ) я понял, пока много каши в голове от большого количества новой информации..... ... сейчас смотрю длинное видео на вашем канале с обзором 3ей версии. Нашёл схему в dch и скетч для пятой версии в шапке. Дак вот собственно: в шапке последний версия именно схемы, используемых деталей и тд? или можно заново прилепить полную схему пятой версии, со всеми доработками, исправлениями на 2017 год =) про скетчи я уже разобрался =)

oleg707
11.01.2017, 17:31
Собрался собирать(забавное словосочетание получилось =)) БП по вашей схеме, пол дня потратил по чтение всех 74х страниц темы... вроде многое (или не многое =) ) я понял, пока много каши в голове от большого количества новой информации..... ... сейчас смотрю длинное видео на вашем канале с обзором 3ей версии. Нашёл схему в dch и скетч для пятой версии в шапке. Дак вот собственно: в шапке последний версия именно схемы, используемых деталей и тд? или можно заново прилепить полную схему пятой версии, со всеми доработками, исправлениями на 2017 год =) про скетчи я уже разобрался =)

сейчас выложу последнее

oleg707
11.01.2017, 17:33
печатка + софт последней на данный момент версии для 5 БП.
46262

morzik45
11.01.2017, 17:59
печатка + софт последней на данный момент версии для 5 БП.
46257

Нашёл там распиновку контакта, и 2 версии печатной платы, скетч. Больше интересует сама схема, с маркировками(номиналами) всех деталей, ... надо составить список и отправиться в магазин.

oleg707
11.01.2017, 18:13
Нашёл там распиновку контакта, и 2 версии печатной платы, скетч. Больше интересует сама схема, с маркировками(номиналами) всех деталей, ... надо составить список и отправиться в магазин.

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

morzik45
11.01.2017, 18:20
номиналы деталей в программе посмотреть можно. Схема, которая была изначально, сильно изменилась. Поэтому всё в печатке.


Окей, сейчас буду пялиться в неё... от чёрного фона и кислотных цветов глаза быстро устают что то =)

oleg707
11.01.2017, 18:41
Окей, сейчас буду пялиться в неё... от чёрного фона и кислотных цветов глаза быстро устают что то =)

поменяй в настройках.
Справа внизу - менеджер проекта - компоненты.

morzik45
11.01.2017, 19:04
поменяй в настройках.
Справа внизу - менеджер проекта - компоненты.

Извиняюсь что туплю, а можно ли как нить этот список компанентов выделить и скопировать или экспортировать...чтобы распечатать. и ещё, не указанны номинал у R15.... и с диодами что то туплю, но может ещё разберусь...

oleg707
11.01.2017, 19:14
Извиняюсь что туплю, а можно ли как нить этот список компанентов выделить и скопировать или экспортировать...чтобы распечатать. и ещё, не указанны номинал у R15.... и с диодами что то туплю, но может ещё разберусь...

хз, у меня все компоненты есть, заказывать не надо было. Потому не экспортировал.
Подтянуться другие собиравшие - подскажут.
C 51 версией надо будет экспериментировать, там новая метода закрытия транзистора ( не с батареи, а с +30).
Потому если знаний не хватает - собирайте 49. Она уже давно в машине работает.
Неподписанные и подписанные номиналы смотрите на фотках (где-то выкладывал в теме).

morzik45
11.01.2017, 19:43
Неподписанные и подписанные номиналы смотрите на фотках (где-то выкладывал в теме).

Если имеются ввиду эти (http://pccar.ru/showpost.php?p=354913&postcount=278) фото, то качество не позволяет что то рассмотреть... Может из тех кто собирал кто нить подскажет что ставили...

Az0m@
11.01.2017, 20:31
Если имеются ввиду эти (http://pccar.ru/showpost.php?p=354913&postcount=278) фото, то качество не позволяет что то рассмотреть... Может из тех кто собирал кто нить подскажет что ставили...
http://pccar.ru/showpost.php?p=359629&postcount=375
для 49ой печатки добавить еще один диод и две SMD резистора 223

печатка + софт последней на данный момент версии для 5 БП.
46257
ты хоть расскажи что опять там доделал то -))) а то теперь руки чешутся надо ли допилить существующую или нет -)

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


ты хоть расскажи что опять там доделал то -))) а то теперь руки чешутся надо ли допилить существующую или нет -)

в 51 подтяжка на транзистор ДХ взята с АКБ, а в 49 с батареи планшета.
Дополнена масса на ардуину, на всякий случай.
в 49й же диод добавлен.

Az0m@
11.01.2017, 22:09
в 51 подтяжка на транзистор ДХ взята с АКБ, а в 49 с батареи планшета.

можно разъяснить почему так?