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

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

Rage2 24.05.2016 18:26

Цитата:

Сообщение от T_r_D (Сообщение 361115)
Спасибо. Попробую 11,9.

а что, ели будет кратковременная просадка до 11в.?

у мну в БП вроде так...

1. выше 12.4 -BAT Оk!
2. если просело ниже 11.5, ждем N секунд, если статично или убывает...отрубаем линию питания хаба, ждем N секунд, если продолжает падать, отрубаем все нафиг.
3. если 9.8в то вырубаем все сразу.

oleg707 24.05.2016 18:48

Цитата:

Сообщение от xDriver (Сообщение 361216)
На АЛИ есть готовые
http://ru.aliexpress.com/item/AVR-IS...b-74715e15bca1

дада, видел. По стоимости программатора.
я отрезал хвост, идущий в комплекте прогера и напрямую к плате припаял.

oleg707 24.05.2016 18:53

Цитата:

Сообщение от Rage2 (Сообщение 361227)
а что, ели будет кратковременная просадка до 11в.?

у мну в БП вроде так...

1. выше 12.4 -BAT Оk!
2. если просело ниже 11.5, ждем N секунд, если статично или убывает...отрубаем линию питания хаба, ждем N секунд, если продолжает падать, отрубаем все нафиг.
3. если 9.8в то вырубаем все сразу.

на старте зимой легко до 9 просядет. Уже предусмотрено. 2 степени обработки.
если зажигание включено, проседание до 11.5 допустимо, если выключено - 11,9.
if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}

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

T_r_D 24.05.2016 18:55

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

Домой приеду- скетч дам свой и станет всё понятно

oleg707 24.05.2016 23:01

на будущее
еще думаю прикрутить

Arduino watchdog или автоматический RESET в случае зависания
пусть лежит.

oleg707 24.05.2016 23:07

Цитата:

Сообщение от T_r_D (Сообщение 361234)
Я пошёл дальше. Я каждую секунду в течении минуты собираю показания, а потом усредняю и если меньше заданного порога, то делаю отключениен
Монитор питание только на выключенном зажигании

Домой приеду- скетч дам свой и станет всё понятно

выкладывай, почитаем.

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

oleg707 24.05.2016 23:43

Последняя версия скетча, которую можно загружать через ЮСб - для 4 и 5 версии
 
Вложений: 1
Поскольку я пихаю watchdog или автоматический RESET в случае зависания в блок питания 5 версии, то ардуину можно будет программировать только через ISP порт. Заливка скетча через юсб может привести к цикличной перезагрузке и невозможности залить новый скетч через юсб. Через isp - можно и нужно.


Почему watchdog не работает на большинстве современных плат Arduino

Дело в том, что после перезагрузки, которая была вызвана watchdog, контроллеры последних выпусков оставляют включенным watchdog на минимальный период, т.е. 15ms. Это нужно для того, чтобы программа как-то узнавала, что предыдущая перезагрузка была по watchdog. Поэтому первоочередная задача загрузчика (или вашей программы, если она запускается первой) — сохранить информацию о том, что перезагрузка была «неожиданной» и сразу же выключить watchdog. Если этого не сделать, то система уйдет в bootloop, т.е. будет вечно перегружаться.
Как известно, в Arduino есть специальный загрузчик, который выполняется в первую очередь после перезагрузки системы. И, к огромному сожалению, стандартный загрузчик не сбрасывает watchdog! Таким образом, система заходит в жестокий bootloop (состояние «crazy led», при котором светодиод на 13-м пине мигает как сумасшедший). вот так


Если всё таки сильно надо писать скетч через ЮСБ - тут описание и модифиц. загрузчик.


Поэтому последняя версия скетча, которую можно загружать через ЮСб - для 4 и 5 версии блоков.Вложение 43859

yuriy m 25.05.2016 13:08

Цитата:

Сообщение от oleg707 (Сообщение 361263)
Поскольку я пихаю watchdog или автоматический RESET в случае зависания в блок питания 5 версии, то ардуину можно будет программировать только через ISP порт. Заливка скетча через юсб может привести к цикличной перезагрузке и невозможности залить новый скетч через юсб. Через isp - можно и нужно.


Почему watchdog не работает на большинстве современных плат Arduino

Дело в том, что после перезагрузки, которая была вызвана watchdog, контроллеры последних выпусков оставляют включенным watchdog на минимальный период, т.е. 15ms. Это нужно для того, чтобы программа как-то узнавала, что предыдущая перезагрузка была по watchdog. Поэтому первоочередная задача загрузчика (или вашей программы, если она запускается первой) — сохранить информацию о том, что перезагрузка была «неожиданной» и сразу же выключить watchdog. Если этого не сделать, то система уйдет в bootloop, т.е. будет вечно перегружаться.
Как известно, в Arduino есть специальный загрузчик, который выполняется в первую очередь после перезагрузки системы. И, к огромному сожалению, стандартный загрузчик не сбрасывает watchdog! Таким образом, система заходит в жестокий bootloop (состояние «crazy led», при котором светодиод на 13-м пине мигает как сумасшедший). вот так


Если всё таки сильно надо писать скетч через ЮСБ - тут описание и модифиц. загрузчик.


Поэтому последняя версия скетча, которую можно загружать через ЮСб - для 4 и 5 версии блоков.Вложение 43859

Из само долго играющего у меня ,сделано освещение в ванной и туалете + ночной режим в туалете(это когда свет процентов 10-20 от своей мощности светит) естественно часы реального времени + защита от протечек ( стоят датчики в ванной ,туалете и на кухне ) в случае протечки закрываются вводные шаровые краны. + вентилятор который запускается - либо высокая влажность в ванной либо сидим с серьезными:big: намерениями в туалете. Все это работает в автоматическом режиме и естественно выключателей нет. Если человек находится внутри помещения ,то свет будет гореть все время ,хоть даже притворится ,что ты "камень".. Но если не кого нет ,через несколько секунд свет плавно выключается. Вся эта борода,работает 4+ года. И не было ни одного зависания контроллера. Все это собрано на атмеги 8 или 16 не помню.

oleg707 25.05.2016 13:36

Цитата:

Сообщение от yuriy m (Сообщение 361312)
Из само долго играющего у меня ,сделано освещение в ванной и туалете + ночной режим в туалете(это когда свет процентов 10-20 от своей мощности светит) естественно часы реального времени + защита от протечек ( стоят датчики в ванной ,туалете и на кухне ) в случае протечки закрываются вводные шаровые краны. + вентилятор который запускается - либо высокая влажность в ванной либо сидим с серьезными:big: намерениями в туалете. Все это работает в автоматическом режиме и естественно выключателей нет. Если человек находится внутри помещения ,то свет будет гореть все время ,хоть даже притворится ,что ты "камень".. Но если не кого нет ,через несколько секунд свет плавно выключается. Вся эта борода,работает 4+ года. И не было ни одного зависания контроллера. Все это собрано на атмеги 8 или 16 не помню.

просто ты пальцем кварц не мацаешь )))

oleg707 25.05.2016 14:57

Вложений: 1
хм, не получается. прописал вотчдог, блок работает как и работал.
Корочу слюнявым пальцем кварц - виснет. Жду - ничего, висит.
Нажимаю РЕСЕТ - висит дальше!
передёргиваю питание - тогда работает.

вотчдог прописан так:
#include
wdt_disable();
wdt_enable(WDTO_8S);
wdt_reset();

скетч, который тестирую - Вложение 43864, заливаю через ISP напрямую, загрузчика нет давно.
ЕСЛИ корочу кварц иголкой - по просто ресет происходит, даже на старом скетче ( без ватчдога).
Почему не работает? неужели аппаратный мутить?

yuriy m 25.05.2016 15:10

Цитата:

Сообщение от oleg707 (Сообщение 361314)
просто ты пальцем кварц не мацаешь )))

А зачем :shok: ???

oleg707 25.05.2016 15:24

Цитата:

Сообщение от yuriy m (Сообщение 361322)
А зачем :shok: ???

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

yuriy m 25.05.2016 18:25

Цитата:

Сообщение от oleg707 (Сообщение 361323)
иногда, очень редко, раз два в месяц, блок подвисает, на выходах остается то, что было ( открытые входы, включенный планшет).
Причину выловить не могу, так как очень редко (возможно связано с дребезгом замка зажигания, но статистики нет). Правда ресет прекрасно ресетит.
Вот и страдаю фигнёй :secret:

И всетаки ИХМО нужно проверять разводку платы + сама схемотехника... и софт ... не где типа while или for ... не используешь ? Может из за какой нибудь помехи не может из цикла вывалиться....?

oleg707 25.05.2016 22:39

Цитата:

Сообщение от yuriy m (Сообщение 361342)
И всетаки ИХМО нужно проверять разводку платы + сама схемотехника... и софт ... не где типа while или for ... не используешь ? Может из за какой нибудь помехи не может из цикла вывалиться....?

for только в защите. она закомментирована.
схемотехника простая до одури - пришел плюс -включил через делитель its814G- тот подал питалово - включился проц. В цепи кондёр на 47мф после диода (по АСС)
Сам проблему не могу не то что выявить - даже воспроизвести. Настолько редко. Ну раза 3-4 за 7 месяцев была.

Блок может зависнуть, если я его потной рукой лапаю во включенном состоянии, но это понятно.

T_r_D 26.05.2016 01:19

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

А на вопрос про засыпание и пробуждение планшета ответит сам скетч, но оно ни как не зависит от замера напряжения.
Так что вставил ключь или включил магнитолу- всё запустилось, вытащил, кондёр разрядился- всё потухло.
На зажигании 220,0 стоит, на магнитоле 22,0. 220 это примерно 4 секунды задержки.

PHP код:

unsigned long time0 0;
boolean OnceLoPow false;
unsigned int accpower 0;
int accpowercount 0;
int accpoweravg 1023;

void setup() {
  
//Arduino Pro-Micro
  //21 = A3
  //20 = A2
  //19 = A1
  //18 = A0
pinMode(18OUTPUT); //Tablet button
pinMode(19OUTPUT); //HUB power
pinMode(20INPUT);  //Tablet Screen action. Analog! If input >232 then screen on 
pinMode(21OUTPUT); //Tablet power
pinMode(10OUTPUT); //Tablet power supply low if car bat level low

pinMode(A7INPUT);   //Car bat level (In bord PIN 6!!!) 541=11,91 **analogRead(A7) * (1.1 / 1023.0*20.50);
pinMode(8INPUT);   //Radio input
pinMode(9INPUT);   //ACC input

digitalWrite(21LOW);
digitalWrite(19LOW);
digitalWrite(18LOW);
digitalWrite(10LOW);
}

void loop() {
WorkLoop();
  if ((
millis() - time0) > 100){
      if (
accpowercount == 60){
      
accpoweravg accpower 60;
      
accpowercount 0;
      
accpower 0;
      }
      else  
ACCLevel();
    
time0 millis();
  }
}

void WorkLoop(){
//_____________________________ON_______________________________
  
if (digitalRead(8) == HIGH || digitalRead(9) == HIGH){
    
OnceLoPow false;
    
digitalWrite(19LOW);
    
digitalWrite(21LOW);
    if(
analogRead(20) < 400) {
     
BtnClick(300);
      if (
analogRead(20) < 400BtnClick(3000);
    }
  }
//____________________STAND-BY or LO POWER_______________________  
   
else{
    if (
accpoweravg 541){
      
OnceLoPow false;
      if(
analogRead(20) > 400) {
        
BtnClick(300);
        
delay(4000);
      }
     
digitalWrite(19HIGH);
    }
    else{
      if (!
OnceLoPow){
       
digitalWrite(10HIGH);
       
delay(10000);
       
digitalWrite(10LOW);
       
OnceLoPow true;
      }
    
digitalWrite(19HIGH);
    
digitalWrite(21HIGH);  
    }
   }
}

void BtnClick(int Interval) {
    
digitalWrite(18HIGH);
    
delay(Interval);
    
digitalWrite(18LOW);
    
delay(1000);
  }

void ACCLevel() {
  
accpower accpower analogRead(A7);
  
accpowercount accpowercount 1;



oleg707 26.05.2016 16:55

Цитата:

Сообщение от T_r_D (Сообщение 361398)
Итак- вот скетч.
Делеи менять на задержку реального временни желания нет, так как эта ардуина рулит только питанием и ни чем более. Чтоб вы себе долго не ломали голову почему мерию на двух пинах напругу- я контролирую сон и пробуждение планшета по напряжению подсветки экрана.

А на вопрос про засыпание и пробуждение планшета ответит сам скетч, но оно ни как не зависит от замера напряжения.
Так что вставил ключь или включил магнитолу- всё запустилось, вытащил, кондёр разрядился- всё потухло.
На зажигании 220,0 стоит, на магнитоле 22,0. 220 это примерно 4 секунды задержки.

PHP код:

unsigned long time0 0;
boolean OnceLoPow false;
unsigned int accpower 0;
int accpowercount 0;
int accpoweravg 1023;

void setup() {
  
//Arduino Pro-Micro
  //21 = A3
  //20 = A2
  //19 = A1
  //18 = A0
pinMode(18OUTPUT); //Tablet button
pinMode(19OUTPUT); //HUB power
pinMode(20INPUT);  //Tablet Screen action. Analog! If input >232 then screen on 
pinMode(21OUTPUT); //Tablet power
pinMode(10OUTPUT); //Tablet power supply low if car bat level low

pinMode(A7INPUT);   //Car bat level (In bord PIN 6!!!) 541=11,91 **analogRead(A7) * (1.1 / 1023.0*20.50);
pinMode(8INPUT);   //Radio input
pinMode(9INPUT);   //ACC input

digitalWrite(21LOW);
digitalWrite(19LOW);
digitalWrite(18LOW);
digitalWrite(10LOW);
}

void loop() {
WorkLoop();
  if ((
millis() - time0) > 100){
      if (
accpowercount == 60){
      
accpoweravg accpower 60;
      
accpowercount 0;
      
accpower 0;
      }
      else  
ACCLevel();
    
time0 millis();
  }
}

void WorkLoop(){
//_____________________________ON_______________________________
  
if (digitalRead(8) == HIGH || digitalRead(9) == HIGH){
    
OnceLoPow false;
    
digitalWrite(19LOW);
    
digitalWrite(21LOW);
    if(
analogRead(20) < 400) {
     
BtnClick(300);
      if (
analogRead(20) < 400BtnClick(3000);
    }
  }
//____________________STAND-BY or LO POWER_______________________  
   
else{
    if (
accpoweravg 541){
      
OnceLoPow false;
      if(
analogRead(20) > 400) {
        
BtnClick(300);
        
delay(4000);
      }
     
digitalWrite(19HIGH);
    }
    else{
      if (!
OnceLoPow){
       
digitalWrite(10HIGH);
       
delay(10000);
       
digitalWrite(10LOW);
       
OnceLoPow true;
      }
    
digitalWrite(19HIGH);
    
digitalWrite(21HIGH);  
    }
   }
}

void BtnClick(int Interval) {
    
digitalWrite(18HIGH);
    
delay(Interval);
    
digitalWrite(18LOW);
    
delay(1000);
  }

void ACCLevel() {
  
accpower accpower analogRead(A7);
  
accpowercount accpowercount 1;



а зачем void ACCLevel() {
accpower = accpower + analogRead(A7);
accpowercount = accpowercount + 1;
вынесен в отдельную функцию?

PHP код:

WorkLoop(); 
  if ((
millis() - time0) > 100){ 
      if (
accpowercount == 60){ 
      
accpoweravg accpower 60
      
accpowercount 0
      
accpower 0
      } 
      else  { (
accpower accpower analogRead(A7));   (accpowercount accpowercount 1); }; 
    
time0 millis(); 
  } 


А так можно?

Az0m@ 27.05.2016 01:25

Oleg, наконецто собрал полностью плату и вроде как все правильно работает.
подскажите пжлста, выход на датчик холла как подключали: к 3 ноже по фотке?
http://pccar.ru/picture.php?albumid=244&pictureid=1729
сам датчик надо выпаивать?

T_r_D 27.05.2016 01:45

oleg707
Можно и так, просто пока приходил к осознанию того что нужно распихал по функциям отдельные куски.

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

oleg707 27.05.2016 14:05

Цитата:

Сообщение от Az0m@ (Сообщение 361500)
Oleg, наконецто собрал полностью плату и вроде как все правильно работает.
подскажите пжлста, выход на датчик холла как подключали: к 3 ноже по фотке?
http://pccar.ru/picture.php?albumid=244&pictureid=1729
сам датчик надо выпаивать?

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

oleg707 27.05.2016 14:52

PHP код:

//ver27.05.16.1557
// для 5й версии блока питания
//ТЕСТОВАЯ!!!
// активный вотчдог, защита its716G(statepin), умный блинк
//***************************************************************************************************************************************************
// Массив режимов работы светодиода
byte modes[] = {
  
0B00000000//Светодиод выключен
  
0B11111111//Горит постоянно
  
0B00001111//Мигание по 0.5 сек
  
0B00000001//Короткая вспышка раз в секунду 
  
0B00000101//Две короткие вспышки раз в секунду  
  
0B00010101//Три короткие вспышки раз в секунду
  
0B01010101  //Частые короткие вспышки (4 раза в секунду) 
};

uint32_t msms1 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(0x27162); // 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 pauseTimeHALL 120000// время паузы перед морганием экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин
int timeAfterACC 5000// время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg


void setup() //настройки
{
   
//*************************test*************
 
wdt_disable(); //Отключение таймера watchdog
 
  
lcd.init();                      // initialize the lcd занимает почти секунд
  
pinMode(STATEpinIINPUT);
  
pinMode(STATEpinIIINPUT);
  
pinMode(PlanshBATpinOUTPUT);
  
pinMode(SAMOZAPITKApinOUTPUT);
  
pinMode(OTGpinOUTPUT);
  
pinMode(SLEEPpinOUTPUT);
  
pinMode(II_KIW_pin_POGOpinOUTPUT);
  
pinMode(HUBpinOUTPUT);
  
pinMode(13OUTPUT); //светодиодик на плате ардуины
  
pinMode(REMpinOUTPUT);
  
pinMode(REGISTRATORpinOUTPUT);

  
digitalWrite(PlanshBATpin0);  //вЫключаем питание на батарею планшета
  
digitalWrite(SAMOZAPITKApin0);  //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
  
digitalWrite(OTGpin0); //вЫключаем минус на Y-OTG (8 pin PW1)
  
digitalWrite(II_KIW_pin_POGOpin0); //вЫключаем +5V (POGO(USB))
  
digitalWrite(HUBpin1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
  
digitalWrite(REMpin0); // // выключаем выход REM
  
digitalWrite(REGISTRATORpin0); // выключаем питание  на видеорегистратор
  
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
  
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 == || millis() > 10000 && flagACC == 1) {
    
flagHALL 1//проверка отсчета при холодном старте при включении  и сразу выключении ACC
  
}
 
if ((
U_akb_real U_acc_real) >)//проверка, выключили ли мы зажигание или просто стартуем (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 == && flagAKB == //проверка напруги АСС и АКБ при флаге ACC = 0
  
{
    
flagACC 1;
    
pauseTimeACC millis();
    
pauseTimeAKB millis();
    
lcd.clear(); //очистка экрана
  
}




  if (
millis() - pauseTimeACC >= 500 && flagACC == 1// пауза 0,5c после включения ACC и потом делать следующ(пока включено ACC):
  
{
    
digitalWrite(PlanshBATpin1);  //включаем питание на батарею планшета (in2)
    
digitalWrite(OTGpin1); //включаем минус на Y-OTG  (включается  звуковая карта)
  
}
  
  if (
millis() - pauseTimeACC >= 800 && flagACC == 1// пауза 0.8c после включения ACC и потом делать следующ(пока включено ACC): //через 0,8с после включения ACC включаем экран, включаем питание  на видеорегистратор.
  
{
    
digitalWrite(II_KIW_pin_POGOpin1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
    
digitalWrite(REGISTRATORpin1); // включаем питание  на видеорегистратор
  
}
    
  if (
millis() - pauseTimeACC >= 2000 && flagACC == 1)//через 1с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)
  
{
    
digitalWrite(SLEEPpin0); //включаем экран = вЫключаем минус на упр SLEEP
    
digitalWrite(HUBpin0); //Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб
    
if (U_akb_real >= 12 && flagACC == 1)//если напруга батареи больше 12В, то включаем еще и усилитель (выход REM)
    
{
      
digitalWrite(REMpin1); // включаем выход REM
    
}
  }



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

  
if (U_acc_real UaccONorOFF && flagACC == 1)
  {
    
flagACC 0;  //Выключили зажигание
    
digitalWrite(REMpin0); // выключаем выход 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(OTGpin0); //вЫключаем минус на Y-OTG (8 pin PW1)
    
digitalWrite(II_KIW_pin_POGOpin0); //вЫключаем +5V (POGO(USB))
    
digitalWrite(HUBpin1); // ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб
    
lcd.noBacklight(); // тушим подсветку экрана
    
if (flagHALL == 1)
    {
      
digitalWrite(SLEEPpin1); //включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)
    
}
    else
    {
      
digitalWrite(SLEEPpin0);
    }
  }

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

  
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(SAMOZAPITKApin1);  // включаем самозапитку через 2с
    
flagAKB 1;} //подняли флаг батареи
  
}

  if (
millis() - pauseTimeAKB >= 20000 && flagAKB == 0// если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.
  
{
    
digitalWrite(PlanshBATpin0);  //вЫключаем питание на батарею планшета (in2)
    
digitalWrite(OTGpin0); //вЫключаем минус на Y-OTG (8 pin PW1)
    
digitalWrite(II_KIW_pin_POGOpin0); //вЫключаем +5V (POGO(USB))
    
digitalWrite(HUBpin1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
    
digitalWrite(REMpin0); // // выключаем выход REM
    
digitalWrite(REGISTRATORpin0); // выключаем питание  на видеорегистратор
    
digitalWrite(SAMOZAPITKApin0);  //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
    
delay (5000);              // задержка для аппаратного выключения
  
}

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

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

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

 
  
  

  

//*********************************************СООБЩЕНИЕ НА ДИСПЛЕЙ************************************************************



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(00);
  
lcd.print((millis() )/60000);
  
lcd.setCursor(40);
 
//lcd.print((U_akb_real - U_acc_real)); 
  //lcd.print(timeAfterACC);
  //lcd.setCursor(5, 0);
  //lcd.print(":");
  //lcd.setCursor(6, 0);
  //lcd.print(S);
// вывод напряжений   
  //lcd.setCursor(8, 0);
  //lcd.print("A");
  
lcd.setCursor(90);
  
lcd.print(flagACC);
  
lcd.setCursor(110);
  
lcd.print(U_acc_real);
  
  
//lcd.setCursor(5,1);
  //-------------------2 строка---------------------------------
  
lcd.setCursor(01);
  
unsigned long TIMER = (  pauseTimeAKB  37000000 millis()  )/60000;
  
lcd.print(TIMER);
  
lcd.setCursor(51);
  
  
// вывод напряжений   
 //lcd.setCursor(8, 1);
  //lcd.print("B");
  
lcd.setCursor(91);
  
lcd.print(flagAKB);
  
lcd.setCursor(111);
  
lcd.print(U_akb_real);
  
//*********************************************************************************************************

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




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

//******************************************индикация светодиодом********************************************************************************************************************************************************************************
   

ms millis();
  
// Событие срабатывающее каждые 125 мс
  
if ( ( ms ms1 ) > 125 || ms ms1 ) {
    
ms1 ms;
    
// Режим светодиода ищем по битовой маске
    
if (  blink_mode << (blink_loop 0x07) ) digitalWrite(13HIGH);
    else  
digitalWrite(13LOW);
    
blink_loop++;
  }
  
  
// blink_mode = modes[3];
  
  
if (blink_mode != modes[5] || blink_mode != modes[5]) 
  {
  if (
flagAKB == ){blink_mode modes[0];}                 // индикация напруги батареи на ардуинине.- низкое напряжение АКБ авто
  
if (flagAKB == && flagACC == 1) {blink_mode modes[2];} //- нормальное напряжение, включено ACC, рабочий режим.
  
if (flagAKB == && flagACC == 0) {blink_mode modes[6];} //- нормальное напряжение АКБ авто, ACC выключено.       
           
             
             
  

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


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


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

// 


Az0m@ 27.05.2016 15:55

эта уже полностью рабочая с ватчдог?

oleg707 27.05.2016 17:02

Цитата:

Сообщение от Az0m@ (Сообщение 361531)
эта уже полностью рабочая с ватчдог?

эту я сейчас залил в машину, злая псина в теории должна работать, на практике её не видно и не слышно. Не мешает, и ладно.
Заливать можно и через ЮСБ, если проц не поймает нежданчика, будет работать, как обычно.

Az0m@ 28.05.2016 17:48

Цитата:

Сообщение от oleg707 (Сообщение 361538)
эту я сейчас залил в машину, злая псина в теории должна работать, на практике её не видно и не слышно. Не мешает, и ладно.
Заливать можно и через ЮСБ, если проц не поймает нежданчика, будет работать, как обычно.

то бишь модифировать загрузчик не надо?

P.S. словил такой глюк: если подключить питание планшета совместно с АКБ то перестает работать звук (свой штатный)... если же АКБ убрать то все нормуль.... в чем может быть косяк?

oleg707 28.05.2016 21:55

Цитата:

Сообщение от Az0m@ (Сообщение 361582)
то бишь модифировать загрузчик не надо?

P.S. словил такой глюк: если подключить питание планшета совместно с АКБ то перестает работать звук (свой штатный)... если же АКБ убрать то все нормуль.... в чем может быть косяк?

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

oleg707 28.05.2016 23:06

добавил усреднение по замерам U. на столе работает, посмотрим, как в машине будет.
PHP код:

//ver28.05.16.2204 ( чем больше цифра, тем новее)
// для 5й версии блока питания ( для 4й тоже подходит, только нужно поменять местами в программе A0 и A1)
//ТЕСТОВАЯ!!!
/* 
_______Сделано_____________________________
вывод информации на внешний дисплей по I2C,
активный вотчдог,
защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом,
усреднение завмеров по напряжению ACC и AKB.
____________________________________________
*/
//***************************************************************************************************************************************************
// Массив режимов работы светодиода
byte modes[] = {
  
0B00000000//Светодиод выключен
  
0B11111111//Горит постоянно
  
0B00001111//Мигание по 0.5 сек
  
0B00000001//Короткая вспышка раз в секунду 
  
0B00000101//Две короткие вспышки раз в секунду  
  
0B00010101//Три короткие вспышки раз в секунду
  
0B01010101  //Частые короткие вспышки (4 раза в секунду) 
};

uint32_t msms1 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(0x27162); // 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 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(STATEpinIINPUT);
  
pinMode(STATEpinIIINPUT);
  
pinMode(PlanshBATpinOUTPUT);
  
pinMode(SAMOZAPITKApinOUTPUT);
  
pinMode(OTGpinOUTPUT);
  
pinMode(SLEEPpinOUTPUT);
  
pinMode(II_KIW_pin_POGOpinOUTPUT);
  
pinMode(HUBpinOUTPUT);
  
pinMode(13OUTPUT); //светодиодик на плате ардуины
  
pinMode(REMpinOUTPUT);
  
pinMode(REGISTRATORpinOUTPUT);

  
digitalWrite(PlanshBATpin0);  //вЫключаем питание на батарею планшета
  
digitalWrite(SAMOZAPITKApin0);  //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
  
digitalWrite(OTGpin0); //вЫключаем минус на Y-OTG (8 pin PW1)
  
digitalWrite(II_KIW_pin_POGOpin0); //вЫключаем +5V (POGO(USB))
  
digitalWrite(HUBpin1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
  
digitalWrite(REMpin0); // // выключаем выход REM
  
digitalWrite(REGISTRATORpin0); // выключаем питание  на видеорегистратор
  
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=0i<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 == || millis() > 10000 && flagACC == 1) {
    
flagHALL 1//проверка отсчета при холодном старте при включении  и сразу выключении ACC
  
}
 
if ((
U_akb_real U_acc_real) >)//проверка, выключили ли мы зажигание или просто стартуем (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 == && flagAKB == //проверка напруги АСС и АКБ при флаге ACC = 0
  
{
    
flagACC 1;
    
pauseTimeACC millis();
    
pauseTimeAKB millis();
    
lcd.clear(); //очистка экрана
  
}




  if (
millis() - pauseTimeACC >= 500 && flagACC == 1// пауза 0,5c после включения ACC и потом делать следующ(пока включено ACC):
  
{
    
digitalWrite(PlanshBATpin1);  //включаем питание на батарею планшета (in2)
    
digitalWrite(OTGpin1); //включаем минус на Y-OTG  (включается  звуковая карта)
  
}
  
  if (
millis() - pauseTimeACC >= 800 && flagACC == 1// пауза 0.8c после включения ACC и потом делать следующ(пока включено ACC): //через 0,8с после включения ACC включаем экран, включаем питание  на видеорегистратор.
  
{
    
digitalWrite(II_KIW_pin_POGOpin1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
    
digitalWrite(REGISTRATORpin1); // включаем питание  на видеорегистратор
  
}
    
  if (
millis() - pauseTimeACC >= 2000 && flagACC == 1)//через 1с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), выход REM(если больше 12в), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)
  
{
    
digitalWrite(SLEEPpin0); //включаем экран = вЫключаем минус на упр SLEEP
    
digitalWrite(HUBpin0); //Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб
    
if (U_akb_real >= 12 && flagACC == 1)//если напруга батареи больше 12В, то включаем еще и усилитель звука (выход REM)
    
{
      
digitalWrite(REMpin1); // включаем выход REM
    
}
  }



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

  
if (U_acc_real UaccONorOFF && flagACC == 1)
  {
    
flagACC 0;  //Выключили зажигание
    
digitalWrite(REMpin0); // выключаем выход 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(OTGpin0); //вЫключаем минус на Y-OTG (8 pin PW1)
    
digitalWrite(II_KIW_pin_POGOpin0); //вЫключаем +5V (POGO(USB))
    
digitalWrite(HUBpin1); // ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб
    
lcd.noBacklight(); // тушим подсветку экрана
    
if (flagHALL == 1)
    {
      
digitalWrite(SLEEPpin1); //включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)
    
}
    else
    {
      
digitalWrite(SLEEPpin0);
    }
  }

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

  
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(SAMOZAPITKApin1);  // включаем самозапитку через 2с
    
flagAKB 1;} //подняли флаг батареи
  
}

  if (
millis() - pauseTimeAKB >= 20000 && flagAKB == 0// если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.
  
{
    
digitalWrite(PlanshBATpin0);  //вЫключаем питание на батарею планшета (in2)
    
digitalWrite(OTGpin0); //вЫключаем минус на Y-OTG (8 pin PW1)
    
digitalWrite(II_KIW_pin_POGOpin0); //вЫключаем +5V (POGO(USB))
    
digitalWrite(HUBpin1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
    
digitalWrite(REMpin0); // // выключаем выход REM
    
digitalWrite(REGISTRATORpin0); // выключаем питание  на видеорегистратор
    
digitalWrite(SAMOZAPITKApin0);  //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
    
delay (5000);              // задержка для аппаратного выключения
  
}

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

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

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

 
  
  

  

//*********************************************СООБЩЕНИЕ НА ДИСПЛЕЙ************************************************************



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(00);
  
lcd.print((millis() )/60000);
  
lcd.setCursor(40);
 
//lcd.print((U_akb_real - U_acc_real)); 
  //lcd.print(timeAfterACC);
  //lcd.setCursor(5, 0);
  //lcd.print(":");
  //lcd.setCursor(6, 0);
  //lcd.print(S);
// вывод напряжений   
  //lcd.setCursor(8, 0);
  //lcd.print("A");
  
lcd.setCursor(90);
  
lcd.print(flagACC);
  
lcd.setCursor(110);
  
lcd.print(U_acc_real);
  
  
//lcd.setCursor(5,1);
  //-------------------2 строка---------------------------------
  
lcd.setCursor(01);
  
unsigned long TIMER = (  pauseTimeAKB  37000000 millis()  )/60000;
  
lcd.print(TIMER);
  
lcd.setCursor(51);
  
  
// вывод напряжений   
 //lcd.setCursor(8, 1);
  //lcd.print("B");
  
lcd.setCursor(91);
  
lcd.print(flagAKB);
  
lcd.setCursor(111);
  
lcd.print(U_akb_real);
  
//*********************************************************************************************************

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




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

//******************************************индикация светодиодом********************************************************************************************************************************************************************************
   

ms millis();
  
// Событие срабатывающее каждые 125 мс
  
if ( ( ms ms1 ) > 125 || ms ms1 ) {
    
ms1 ms;
    
// Режим светодиода ищем по битовой маске
    
if (  blink_mode << (blink_loop 0x07) ) digitalWrite(13HIGH);
    else  
digitalWrite(13LOW);
    
blink_loop++;
  }
  
  
// blink_mode = modes[3];
  
  
if (blink_mode != modes[5] || blink_mode != modes[5]) 
  {
  if (
flagAKB == ){blink_mode modes[0];}                 // индикация напруги батареи на ардуинине.- низкое напряжение АКБ авто
  
if (flagAKB == && flagACC == 1) {blink_mode modes[2];} //- нормальное напряжение, включено ACC, рабочий режим.
  
if (flagAKB == && flagACC == 0) {blink_mode modes[6];} //- нормальное напряжение АКБ авто, ACC выключено.       
           
             
             
  

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


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


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

// 


Az0m@ 29.05.2016 00:20

Цитата:

Сообщение от oleg707 (Сообщение 361594)
схему рисуй. на пого если питание, он может на док пытаться звук выводить.

подключал так:
1 пин - +АКБ
2 пин - pogo pin 5V (как тут http://pccar.ru/attachment.php?attac...1&d=1459368854)
5 пин - -АКБ
16 пин - датчик холла

пока тестирую работу только самого планшета... то есть к нему ничего не подключено

T_r_D 29.05.2016 02:56

А как ты заставил вачдог работать без модификации загрузчика?
Он же просто за 15мс не успевает грузится чтоб вачдог вырубить.

oleg707 29.05.2016 12:40

Цитата:

Сообщение от T_r_D (Сообщение 361604)
А как ты заставил вачдог работать без модификации загрузчика?
Он же просто за 15мс не успевает грузится чтоб вачдог вырубить.

Я загрузчик не использую, шью напрямую. Так проще и быстрее.

Ватчдог включается в скетче, который запускается после загрузчика. Соответственно, если проц завис, тогда со стандартным загрузчиком вотчдог будет запускаться в цикле и завесит проц, но нам это не страшно, проц то уже завис.
Если снять питание с него, а потом подать снова, тогда сначала запустится загрузчик, а потом скетч с вотчдогом. Вотчдог не срабатывает, если задержка в программе не превышает 8 секунд - в моём случае. Если программа выполняется штатно и delay ( 10000) там никто не дописывал, то наличие дога не заметно.

Игрался на столе с блоком и один раз получилось его повесить. Просто взялся за дисплей рукой. Шнур 4 провода, экранирование к массе не подключено, I2С, около 40см.
Блок завис, картинка на дисплее тоже. Так вот, вотчдог НЕ сработал. И я даже больше скажу, ресет тоже не сработал! То есть жму ресет, а реакции ни какой!
Передёргивание питания творит чудеса:wink2:
Тут 2 вопроса возникают, почему нет реакции на аппаратный ресет?!
И почему вотчдог не сделал этот самый ресет. Думаю, ответ будет один.
Пытался повторить зависание, так не смог - работает, зараза.

oleg707 29.05.2016 12:49

Цитата:

Сообщение от Az0m@ (Сообщение 361600)
подключал так:
1 пин - +АКБ
2 пин - pogo pin 5V (как тут http://pccar.ru/attachment.php?attac...1&d=1459368854)
5 пин - -АКБ
16 пин - датчик холла

пока тестирую работу только самого планшета... то есть к нему ничего не подключено

Прошивка какая? У меня цианоген мод стоял, там выбирается куда звук выводить, когда на док станции стоит. И выход звука я как раз изначально брал с этого же пого - средние пины, напрямую на усилитель. Заодно про максимальную громкость в наушниках не ругалось.
Посмотри в настройках, можно ли звук в режиме дока вывести на динамики?
Или подавай 5вольт не на пого, а на юсб.

T_r_D 29.05.2016 15:53

Короче вывод- нужно делать аппаратный вочдог с ресетом по питанию.
Какая нить ne555 и полевик на питание ардуины.

oleg707 29.05.2016 17:13

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

Az0m@ 29.05.2016 20:57

Цитата:

Сообщение от oleg707 (Сообщение 361622)
Прошивка какая? У меня цианоген мод стоял, там выбирается куда звук выводить, когда на док станции стоит. И выход звука я как раз изначально брал с этого же пого - средние пины, напрямую на усилитель. Заодно про максимальную громкость в наушниках не ругалось.
Посмотри в настройках, можно ли звук в режиме дока вывести на динамики?
Или подавай 5вольт не на пого, а на юсб.

на сегодняшний день у вас этот момент на планшете как подключен?

P.S. перепрошился на аутодроид с ядром даниэля... проблема исчезла. теперь дело осталось за малым.... настроить и автоматизировать основные процессы в системе... -) Надеюсь Oleg и тут подскажет основные моменты за имением уже наработанного опыта в эксплуатации системы

T_r_D 30.05.2016 00:07

oleg707 Фиговый вариант забивать.
На СМД много места не сожрёт, да и не так это критично как разбирать пол салона :)
В моём случае чтоб долезть до платы придётся среднею часть торпеды разобрать, часть тоннеля КПП и вынуть магнитолу.

yuriy m 30.05.2016 01:14

Цитата:

Сообщение от T_r_D (Сообщение 361676)
oleg707 Фиговый вариант забивать.
На СМД много места не сожрёт, да и не так это критично как разбирать пол салона :)
В моём случае чтоб долезть до платы придётся среднею часть торпеды разобрать, часть тоннеля КПП и вынуть магнитолу.

Отключи плюс на несколько секунд

T_r_D 30.05.2016 12:05

Проще псину на 555 собрать

oleg707 30.05.2016 13:38

Цитата:

Сообщение от T_r_D (Сообщение 361721)
Проще псину на 555 собрать

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

Az0m@ 30.05.2016 22:18

Цитата:

Сообщение от oleg707 (Сообщение 361595)
добавил усреднение по замерам U. на столе работает, посмотрим, как в машине будет.

залил данный скетч себе... заливка прошла успешно. но светодиоды никак не регируют на статус работы.

P.S.
я правильно понимаю что выход 4 пина (минус для Y-OTG) нужен когда к планшету подключено только одно устройство... а в случае подключения USB хаба, вместо него сам хаб запитываем через 14 пин (+5В)... а к планшету его подключаем напрямую через обычный OTG

oleg707 30.05.2016 22:57

Цитата:

Сообщение от Az0m@ (Сообщение 361767)
залил данный скетч себе... заливка прошла успешно. но светодиоды никак не регируют на статус работы.

P.S.
я правильно понимаю что выход 4 пина (минус для Y-OTG) нужен когда к планшету подключено только одно устройство... а в случае подключения USB хаба, вместо него сам хаб запитываем через 14 пин (+5В)... а к планшету его подключаем напрямую через обычный OTG

при подаче +30(акб) и асс светик на 13 пине мигает равномерно раз в 0,5 сек
при +30 выше 12 В и асс =0 быстрые вспышки.
при +30 10в светик не горит.

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

4 пин юсб нужно передёргивать для стабильной работы. питание хаба +5в брать с блока, для питания звуковой мне хватает планшета напрямую.

Az0m@ 30.05.2016 23:23

Цитата:

Сообщение от oleg707 (Сообщение 361769)
для контроля можно подключить дисплей по i2c или активировать в скетче монитор ком порта.
померяй вольтметром напряжение на ардуине на А0 и А1 при подаче 12В на схему. около 3В должно приходить.( это с делителя).

увы дисплея пока под рукой нету.. вольтметром на обоих выводах 4.11В
Цитата:

Сообщение от oleg707 (Сообщение 361769)
питание хаба +5в брать с блока, для питания звуковой мне хватает планшета напрямую.

а питание хаба все таки брать с 14пина (+5В) или надо со 2ого пина?

oleg707 30.05.2016 23:56

Вложений: 3
немного подправил БП-5. Чтобы можно было юсб подключать без помех.В 5_43 версии мешает, нужно для отладки. Мне в принципе не надо, но вдруг кому пригодится.
Вложение 43904


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

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