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)

T_r_D 20.06.2016 22:49

Ну в общем-то вот окончательный вариант:
PHP код:

unsigned long time0 0;
unsigned long stage_timer 0;
int in_progress 0;
int stage 0;
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() {
//Измеряем среднее значение напряжения автомобиля.
  
if ((millis() - time0) > 1000){
      if (
accpowercount == 60){
      
accpoweravg accpower 60;
      
accpowercount 0;
      
accpower 0;
      }
      else{
      
accpower accpower analogRead(A7);
      
accpowercount accpowercount 1;
      }
    
time0 millis();
  }

 if (
in_progress == 0){
   if ((
digitalRead(8) == HIGH || digitalRead(9) == HIGH) &&  analogRead(20) < 400mag_car_on(); //Если магнитола или зажигание включено, а питания на подсветке нету.
   
if (digitalRead(8) == LOW && digitalRead(9) == LOW && analogRead(20) > 400power_off();       //Если магнитола выключена и зажигание выключено, но подсветка работает.
   
if (digitalRead(8) == LOW && digitalRead(9) == LOW && accpoweravg 541halt();               //Если магнитола и зажигание выключены и сел акумулятор, а отключение не выполнялось.
 
}
 else {
   if (
in_progress == 1mag_car_on();
   if (
in_progress == 2power_off();
   if (
in_progress == 3halt();
 } 
 
}

void mag_car_on(){
  
in_progress 1;
  
digitalWrite(19LOW);
  
digitalWrite(21LOW);
//Клик кнопкой 300мс, после этого ждём 2с и на стадии 2 проверяем включился ли планшет,
//и если нет, то зажимаем кнопку на 3с, потом ждём 2с.
  
if (stage == 0) {
  
digitalWrite(18HIGH);
  
stage 1;
  
stage_timer millis();
  }
  if (
stage == && (millis() - stage_timer) > 300) {
  
digitalWrite(18LOW);
  
stage 2;
  
stage_timer millis();
  }
  if (
stage == && (millis() - stage_timer) > 2000) {
    if (
analogRead(20) > 400) {
      
stage 0;
      
in_progress 0;
    }
    else {
      
digitalWrite(18HIGH);
      
stage 3;
      
stage_timer millis();
    }
  }  
  if (
stage == && (millis() - stage_timer) > 3000) {
    
digitalWrite(18LOW);
    
stage 4;
    
stage_timer millis();
  }
  if (
stage == && (millis() - stage_timer) > 2000) {
    
stage 0;
    
in_progress 0
  }
}
 
void power_off(){
  
in_progress 2;
  if (
stage == 0) {
    
digitalWrite(18HIGH);
    
stage 1;
    
stage_timer millis();
  }
  if (
stage == && (millis() - stage_timer) > 300) {
    
digitalWrite(18LOW);
    
stage 2;
    
stage_timer millis();
  }
  if (
stage == && (millis() - stage_timer) > 5000) {
    
digitalWrite(19HIGH);
    if (
analogRead(20) < 400){
      
stage 0;
      
in_progress 0;
    }
    else {
      
digitalWrite(10HIGH);
      
stage 3;
      
stage_timer millis();
    }
  }
  if (
stage == && (millis() - stage_timer) > 2000) {
    
digitalWrite(10LOW);
    
stage 4;
    
stage_timer millis();
  } 
  if (
stage == && (millis() - stage_timer) > 30000) {
    
stage 0;
    
in_progress 0;
  }
}
 
void halt(){
  
in_progress 3;
  
digitalWrite(19HIGH);
  
digitalWrite(21HIGH);
  
in_progress 0



plus88 21.06.2016 08:52

А схему последнюю можешь представить :) тоже надо собирать блок питания )

T_r_D 21.06.2016 16:55

А схема не менялась.
Резисторы- входной делитель 20к и 10к на землю, после диода 100к на землю.
Конденсаторы- на подсветку 0,22uF, а остальные по 100uF.
Диоды любые.
Резистор подстройки напряжения на БП для планшета это выпаянный резистор со второй платы БП.

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

SPI и I2C хвосты свободны, так что можете подключать хоть индикаторы, хоть датчики какие либо ещё.
Мне просто всё это украшательство вообще не нужно- всё это будет за планшетом в панеле и видно этого не будет, только лишнюю напругу жрать будет.

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

jonikus81 22.06.2016 16:33

Вопрос, сколько кушает ITS716G? я так понимаю он всегда включен? хотелось бы спрыгнуть с реле и перейти на малютку ITS716G.

Az0m@ 22.06.2016 23:31

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

Алексей L&M 23.06.2016 04:29

Без крышки он пылью забъётся.

jonikus81 23.06.2016 09:06

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

T_r_D 24.06.2016 11:03

Вложений: 2
Вот полная схема под скетч мой, а то на предидущей половину не нарисовал и выход один перепутал.
Ещё после всех тестов на промикре был отпаян светодиод индицирующий питание за ненадобностью.
На схеме Stereo это выход магнитолы Remote.

PS. В машине два раза подряд сгорел KIS.
Поменял на LM7805 и всё работает!
Странно как-то даже!

Короче меня можно поздравить. Citroen C4 обрёл андройд дисплей без потери штатной магнитолы, тоесть выводом информации с неё на андройд, вывод бортового компа на андройд, управление с руля плеером на андройде. Ну и управление питанием.

Есть пару косяков, но они уже чисто программные. Почему-то не работают кнопки на магнитоле в режиме аукса, точнее работают, но только почему-то только ОК который заменён play\pause.
Тоесть с магнитолы плеером планшета не рулится.
И нужно сделать так, чтоб при уходе в слип плеер останавливал воспроизведение.
Это пока на первое время. Потом в свою софтину для дройда допишу плеер.

oleg707 28.06.2016 12:35

Цитата:

Сообщение от T_r_D (Сообщение 363354)
Вот полная схема под скетч мой, а то на предидущей половину не нарисовал и выход один перепутал.
Ещё после всех тестов на промикре был отпаян светодиод индицирующий питание за ненадобностью.
На схеме Stereo это выход магнитолы Remote.

PS. В машине два раза подряд сгорел KIS.
Поменял на LM7805 и всё работает!
Странно как-то даже!

Короче меня можно поздравить. Citroen C4 обрёл андройд дисплей без потери штатной магнитолы, тоесть выводом информации с неё на андройд, вывод бортового компа на андройд, управление с руля плеером на андройде. Ну и управление питанием.

Есть пару косяков, но они уже чисто программные. Почему-то не работают кнопки на магнитоле в режиме аукса, точнее работают, но только почему-то только ОК который заменён play\pause.
Тоесть с магнитолы плеером планшета не рулится.
И нужно сделать так, чтоб при уходе в слип плеер останавливал воспроизведение.
Это пока на первое время. Потом в свою софтину для дройда допишу плеер.

Пиши подробный проект, интересно почитать

T_r_D 28.06.2016 13:15

Да я даже не знаю что там и писать.
Попробую конечно, но попозже.
Вот видео на мою мыльницу.
https://www.dropbox.com/s/kblf9ba908...93347.3gp?dl=0

PS. Сегодня очень жарко, а терморезистор с платы аккумулятора планшета я не заменил на 10Ком постоянных.
Окно с предложением вынуть перегревшеюся батарею меня сначала радовало, а потом запарило.
Так что при удалении аккума перепаивайте и резистор на постоянный.

Artemix 01.07.2016 22:16

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

Az0m@ 01.07.2016 23:31

Я наконецто осилил свою плату... долго же я Олега замучал -)))
Из своего уже опыта выскажу следующие моменты:
1. для теста на столе обязательно нужен качественный источник питания
2. на выходе на обоих каналах надо ставить кондеры по 2200мкФ...
3. если прикрутите I2C дисплей то сэкономите кучу времени...
4. иметь большое терпение....

сегодня почти целый день катался с платой...и вроде все как надо работает.

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

Алексей L&M 02.07.2016 08:15

Цитата:

Сообщение от Artemix (Сообщение 363867)
вопрос по KIW3312 он мне выдает на акум 3.7 , но иногда запускаю планшет а он мне батарея разряжена фиг тебе, покатаюсь немного и он запуститься, потом отрубиться типа села батарея , как можно избежать данный нюанс, надо ли повышать напряжение и до скольки?

Подними напряжение до 4,3-4,7в

Цитата:

Сообщение от Az0m@ (Сообщение 363870)
Я наконецто осилил свою плату... долго же я Олега замучал -)))

А что было то?

T_r_D 02.07.2016 11:48

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

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

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

T_r_D 02.07.2016 13:46

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

PHP код:

 if (in_progress == 0){
   if (
digitalRead(9) == HIGH &&  analogRead(20) < 400mag_car_on(); //Если магнитола или зажигание включено, а питания на подсветке нету.
   
if (digitalRead(9) == LOW && analogRead(20) > 400power_off();       //Если магнитола выключена и зажигание выключено, но подсветка работает.
   
if (digitalRead(9) == LOW && accpoweravg 541halt();               //Если магнитола и зажигание выключены и сел акумулятор, а отключение не выполнялось.
 


И из скетча надо убрать строку
pinMode(8, INPUT); //Radio input

НО- 7 ног задействовано- это много! Ещё одну надо убрать и можно свести плату до контроллера на attiny13. Вот тогда потребление ещё упадёт и размер уменьшится.

PS Чуть не забыл!
Кому нужна задержка включения хаба
в функции void mag_car_on()
нужно перенести строку
digitalWrite(19, LOW);
вот сюда:
if (stage == 2 && (millis() - stage_timer) > 2000) {
if (analogRead(20) > 400) {
digitalWrite(19, LOW);
stage = 0;
in_progress = 0;
и сюда
if (stage == 4 && (millis() - stage_timer) > 2000) {
digitalWrite(19, LOW);
stage = 0;
in_progress = 0;
}

PPS. Пришла идея! Можно ещё одну ногу убрать!
У нас фактически D10 и A0 одновременно не используются и требуют разной полярности!
Тоесть если нужно нажать кнопку планшета- подаём минус:
pinMode(A0, OUTPUT);
digitalWrite(A0, LOW);
если нужно сделать ресет планшета уменьшив питание подаём плюс:
pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);
А вот если ничего, то переведём ногу в третье состояние Z. Это когда на ней ни чего нету:
pinMode(A0, INPUT);

Сам тестить не буду поскольку всё спаял и всё работает, а тем кто хочет повторить стоит задуматься. Скетч поменяется совсем мало от этого.
А вот ссылка ни ибей и плату http://www.ebay.com/itm/272096684238...%3AMEBIDX%3AIT
И на настройки Arduino IDE http://digistump.com/wiki/digispark/...als/connecting

Az0m@ 02.07.2016 23:51

Цитата:

Сообщение от Алексей L&M (Сообщение 363886)
Подними напряжение до 4,3-4,7в

А что было то?

ну вот как и описал выше установкой кондера на 2200мкФ на тот канал, который шел на погопин
Цитата:

Сообщение от T_r_D (Сообщение 363888)
В
Az0m@
На выходы импульсных БП нет смысла ставить большие конденсаторы- только разве для своего успокоения.

возможно... я не силен в электронике... но после этих манипуляций у меня плата заработала как надо
Цитата:

Сообщение от T_r_D (Сообщение 363892)
А вот ссылка ни ибей и плату http://www.ebay.com/itm/272096684238...%3AMEBIDX%3AIT

тогда сразу такую брать:
http://www.ebay.com/itm/Digispark-Ki...3D272096684238

T_r_D 03.07.2016 02:35

тогда сразу такую брать:
http://www.ebay.com/itm/Digispark-Ki...3D272096684238
Такую не удобно. Когда её на плату запаяешь в юсб не воткнёшь
На ту что я дал ссылку это тоже самое, но с микро юсб на плате

Az0m@ 03.07.2016 11:55

Цитата:

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

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

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

T_r_D 04.07.2016 06:48

Цитата:

Сообщение от Az0m@ (Сообщение 363936)
так можно на плате его сместить на один край... и можно всю плату как брелок воткнуть в усб... но это уже так... мелочи.

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

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

oleg707 04.07.2016 14:07

Цитата:

Сообщение от Artemix (Сообщение 363867)
вопрос по KIW3312 он мне выдает на акум 3.7 , но иногда запускаю планшет а он мне батарея разряжена фиг тебе, покатаюсь немного и он запуститься, потом отрубиться типа села батарея , как можно избежать данный нюанс, надо ли повышать напряжение и до скольки?

Если контроллер батареи не отключён, он и дурит. При наличии стабильных 3,7.

oleg707 04.07.2016 14:21

Цитата:

Сообщение от T_r_D (Сообщение 363888)
Вообще для подобных БП всегда желателен нормальный регулируемый по напряжению настольный блок питания.
В любом случае программно подстраивать какие либо значения всё равно придётся.
Хотя можно просто резистор подстроечный и мультиметр использовать, но только не на готовой плате, а на макетке.
Дисплей на 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

Цитата:

Сообщение от T_r_D (Сообщение 364010)
На входе БП есть смысл поставить банку на 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/...0-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.

Получившийся скетч. ( планшет без батареи)
PHP код:

//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 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 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(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)
    
  
}
  
  if (
millis() - pauseTimeACC >= 800 && flagACC == 1// пауза 0.8c после включения ACC и потом делать следующ(пока включено ACC): //через 0,8с после включения ACC включаем экран, включаем питание  на видеорегистратор.
  
{
    
digitalWrite(II_KIW_pin_POGOpin1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
    
digitalWrite(OTGpin1); //включаем минус на Y-OTG  (включается  звуковая карта)
    
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 )>= 86400000 && flagAKB == 1// если прошло 24 часа, как выключили ACC // пауза  (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)
    

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

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

 
  
  

  



 
//*
//******************************************отслеживания аварийной ситуации 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++;
  }
  
  
  
  
   
// Событие срабатывающее каждые 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(00);
  
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ)
  
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  172800000 millis()  )/60000// вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
  
lcd.print(TIMER);
  
lcd.setCursor(91);
  
lcd.print(flagAKB); // вывод флага АКБ
  
lcd.setCursor(111);
  
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 == ){blink_mode modes[3];}                 // индикация напруги батареи на ардуинине.- низкое напряжение АКБ авто - коротко моргает
  
if (flagAKB == && flagACC == 0) {blink_mode modes[6];} //- нормальное напряжение АКБ авто, ACC выключено.                     - быстро моргает
  
if (flagAKB == && 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

Цитата:

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

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

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

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

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

T_r_D 10.07.2016 14:50

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

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

oleg707 10.07.2016 15:14

Цитата:

Сообщение от T_r_D (Сообщение 364294)
Не делай холодный старт. Питай планшет всегда. Не на столько он и БП с ардуиной и жрёт в слипе.
Можно вместо ардуины тиньку и тогда будет жрать ещё меньше.

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

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

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

jonikus81 11.07.2016 09:59

Цитата:

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

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


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

oleg707 11.07.2016 20:04

Цитата:

Сообщение от jonikus81 (Сообщение 364340)
Если не секрет, какой проц? Я на ардуино про микро реализовал резистивные кнопки, энкодер, управление питанием хаба, датчиком холла, питание самого планшета с режимом сна (а по окончании второго таймера с полным разрывом сети и потреблением 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

Цитата:

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

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

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

jonikus81 12.07.2016 10:56

Цитата:

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

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

oleg707 12.07.2016 12:40

Цитата:

Сообщение от jonikus81 (Сообщение 364400)
у 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

Цитата:

Сообщение от ruzzzteg (Сообщение 364655)
Товарищи подскажите... немного не допонял... раньше бля питания 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@ , попробуй залей это. тут усилок не пукает при выключении и плей-пауза стабильнее.

PHP код:

//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 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 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(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 замеров. 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 == || 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)
    
  
}
  
  if (
millis() - pauseTimeACC >= 800 && flagACC == 1// пауза 0.8c после включения ACC и потом делать следующ(пока включено ACC): //через 0,8с после включения ACC включаем экран, включаем питание  на видеорегистратор.
  
{
    
digitalWrite(II_KIW_pin_POGOpin1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
    
digitalWrite(OTGpin1); //включаем минус на Y-OTG  (включается  звуковая карта)
    
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( flagREM == 1  && flagAKB == ){digitalWrite(REMpin1);}    // включаем выход REM

    
  
}
   



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

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


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

  
if (U_acc_real UaccONorOFF && flagACC == 1)
  {
    
flagACC 0;  //Выключили зажигание
    
digitalWrite(REMpin0);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(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 )>= 86400000 && flagAKB == 1// если прошло 24 часа, как выключили ACC // пауза  (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)
    

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

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

 
  
  

  



 
//*
//******************************************отслеживания аварийной ситуации 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++;
  }
  
  
  
  
   
// Событие срабатывающее каждые 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(00);
  
lcd.print((millis() )/60000); // вывод кол-ва минут работы блока ( 1 строка 1 символ)
  
  
lcd.setCursor(70);
  
lcd.print(flagAKB); // вывод флага AKB
  
  
lcd.setCursor(80);
  
lcd.print(flagACC); // вывод флага АСС
  
  
lcd.setCursor(90);
  
lcd.print(flagREM); // вывод флага rem
  
lcd.setCursor(110);
  
lcd.print(U_acc_real); // вывод напряжения АСС
  
  //lcd.setCursor(5,1);
  //-------------------2 строка---------------------------------
  
lcd.setCursor(01);
  
unsigned long TIMER = (  pauseTimeAKB  172800000 millis()  )/60000// вывод кол-ва минут, оставшиеся до выключения блока (когда выключено АСС)
  
lcd.print(TIMER);
  
lcd.setCursor(51);
  
lcd.print(( millis() - TimerREM )/60000); //
  
lcd.setCursor(111);
  
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 == ){blink_mode modes[3];}                 // индикация напруги батареи на ардуинине.- низкое напряжение АКБ авто - коротко моргает
  
if (flagAKB == && flagACC == 0) {blink_mode modes[6];} //- нормальное напряжение АКБ авто, ACC выключено.                     - быстро моргает
  
if (flagAKB == && 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

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


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

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