Просмотр полной версии : Блок питания NEXUS7-2012,2013 (или любого другого планшета)
работа готовых DC DC далека от оптимальных значений (https://youtu.be/gcOWf4sMp2Y)
почему я против подачи на планшет напряжения свыше 4,2В
https://youtu.be/5_uAVxXPjAo
https://youtu.be/5_uAVxXPjAo
47243
Привет. есть ли схема по последней версии БП ?
Привет. есть ли схема по последней версии БП ?
нет.
Та схема, что была в процессе разработки так сильно изменилась, что это совершенно разные устройства.
Рисовать схему очень лень, сейчас в глубокой разработке другой проект.
jonikus81
21.04.2017, 07:15
нет.
Та схема, что была в процессе разработки так сильно изменилась, что это совершенно разные устройства.
Рисовать схему очень лень, сейчас в глубокой разработке другой проект.
угости хотя бы куском спойлера)
угости хотя бы куском спойлера)
бп7
встроенный хаб, звуковая pcm2704 ( с цифровым и оптическим выходом) , TDA7442d ( мини звуковой проц для аппаратной регулировки громкости (http://pccar.ru/showthread.php?t=24440)), мосто под изикап, никаких кивов и кисов - только реализация на плате c максимально оптимальными (https://youtu.be/gcOWf4sMp2Y) компонентами.
Таже заморочился снизить и без того низкое собственное потребление в режиме ожидания.
Всё это в нормальном промышленном алюминиевом корпусе 120*100*50мм
Потом по обстоятельствам.
Тупо на запчасти на разработку и эксперименты ушло уже больше 200$.
lavalamp
21.04.2017, 20:29
Добрый день подскажите по 3й версии,а именно каналу Рем, скетч разкоментмровал ардуино нормально управляет,но после того как выключтил асс ардуино на выходе формирует 0 ,но вот на затворе н канального полевика 2в и соответственно он не закрывается и на выходе Рем всегда 12 в. Подскажите что можно тут сделать?
Добрый день подскажите по 3й версии,а именно каналу Рем, скетч разкоментмровал ардуино нормально управляет,но после того как выключтил асс ардуино на выходе формирует 0 ,но вот на затворе н канального полевика 2в и соответственно он не закрывается и на выходе Рем всегда 12 в. Подскажите что можно тут сделать?
кинь ФОТОГРАФИИ собранного блока, схему, прошивку и печатку, по которой ты собираешь. Одним архивом.
По идее на затвор подтяжку просто надо поменьше.
lavalamp
23.04.2017, 08:27
кинь ФОТОГРАФИИ собранного блока, схему, прошивку и печатку, по которой ты собираешь. Одним архивом.
По идее на затвор подтяжку просто надо поменьше.
Собираю все по печатке из вложения в шапке и скетч оттуда же,в понедельник скину
Чтоб у таких балбесов как я, который почти месяц не мог понять почему при включении усилителя у меня ардуина перезагружалась, сообщаю, что тому был виной сам усилитель, а именно, что на входе у него стоит электролит на 10000 мкФ. Подключен усилок парралельно БП (ну куда входят +12) и получается, что когда ардуина щелкает релюхой - идет зарядка электролита и напряжение просаживается - как следствие ардуине не хватает напруги и она выключается. К этому времени кондер зарядился и при последующем включении ардуины (АСС контакт по прежнему висит на +12) - все работает норм. Бороться начал так: 1) добавил 2 диода парралельно при входе +12 на БП, чтоб с него при заряде кондера не стекала напруга - не помогло. Добавил емкость 1000мкФ параллельно питанию ардуины, пока не помогло, наверное мало, схожу сегодня прикуплю еще что-нить в районе 2200мкФ
... как следствие ардуине не хватает напруги и она выключается.
Можно Ардуину питать отдельно через DC-DC (https://duino.ru/Step-Down-mini.html). Под нагрузкой в 2А держит "просадку" до 6 вольт.
jonikus81
24.04.2017, 11:14
Можно Ардуину питать отдельно через DC-DC (https://duino.ru/Step-Down-mini.html). Под нагрузкой в 2А держит "просадку" до 6 вольт.
Тоже пришлось питать именно этим dc-dc, особенно для дизилей даже очень актуально.
Чтоб у таких балбесов как я, который почти месяц не мог понять почему при включении усилителя у меня ардуина перезагружалась, сообщаю, что тому был виной сам усилитель, а именно, что на входе у него стоит электролит на 10000 мкФ. Подключен усилок парралельно БП (ну куда входят +12) и получается, что когда ардуина щелкает релюхой - идет зарядка электролита и напряжение просаживается - как следствие ардуине не хватает напруги и она выключается. К этому времени кондер зарядился и при последующем включении ардуины (АСС контакт по прежнему висит на +12) - все работает норм. Бороться начал так: 1) добавил 2 диода парралельно при входе +12 на БП, чтоб с него при заряде кондера не стекала напруга - не помогло. Добавил емкость 1000мкФ параллельно питанию ардуины, пока не помогло, наверное мало, схожу сегодня прикуплю еще что-нить в районе 2200мкФ
1 - диод на Vin аруины (https://duino.ru/arduino.html).
2 - кондёр на +5 ардуины ( 100-2200 мФ)
3 - в машине стоит УЗЧ под всё сиденье водителя. Прекрасно включется.
4 - смотри мою схему БП 5 версии, работоспособность при просадке до 8В.
1 - диод на Vin аруины (https://duino.ru/arduino.html).
2 - кондёр на +5 ардуины ( 100-2200 мФ)
3 - в машине стоит УЗЧ под всё сиденье водителя. Прекрасно включется.
4 - смотри мою схему БП 5 версии, работоспособность при просадке до 8В.
Всетаки я считаю, что надо ставить мощный диод перед всем БП, ибо все те кондеры, которые есть в схеме (после КИСа не считаются) будут разряжаться обратно в недра машины, чтоб этого не происходило и разряд шел в полезную нагрузку считаю диоды надо добавить.
Просадку померять не могу, ибо мультиметр китайский за 300 руб, он ничего не успевает отловить. И просадка у меня вероятнее всего происходит от того, что тестирование происходит на столе, преобразователь с 220 до 12 у меня 3х амперный от сетевого хранилища, вероятно это он слаб при включении усилка с 10000мкФ он просаживается и скорее всего это не будет происходить на машине с большим аккумом, но факт есть факт ). Ни на что не претендую, просто замечание от обывателя )
lavalamp
25.04.2017, 08:44
Здравствуйте, подскажите можно ли поправить скетч 3й версии и седлать управление рем сразу р-канальным транзистором без н- канального?
Здравствуйте, подскажите можно ли поправить скетч 3й версии и седлать управление рем сразу р-канальным транзистором без н- канального?
нет, там смещение +5В (относительно+12) всё равно открывает транзистор.
Можно, конечно, играться подтяжками и режимом пина ( input или output), но нет необходимого запаса надёжности.
Да и та система, которая есть с 2я транзюками хорошо работает.
( я сначала с одним собирал, а 2й потом на плате навесным монтажём добавлял, потому как сделать управление рем сразу р-канальным транзистором без н- канального не получилось)
Всетаки я считаю, что надо ставить мощный диод перед всем БП, ибо все те кондеры, которые есть в схеме (после КИСа не считаются) будут разряжаться обратно в недра машины, чтоб этого не происходило и разряд шел в полезную нагрузку считаю диоды надо добавить.
Просадку померять не могу, ибо мультиметр китайский за 300 руб, он ничего не успевает отловить. И просадка у меня вероятнее всего происходит от того, что тестирование происходит на столе, преобразователь с 220 до 12 у меня 3х амперный от сетевого хранилища, вероятно это он слаб при включении усилка с 10000мкФ он просаживается и скорее всего это не будет происходить на машине с большим аккумом, но факт есть факт ). Ни на что не претендую, просто замечание от обывателя )
ЕЩЕ раз говорю. Мощности тех кондёров ни на что не хватит. На диоде будет падать напряжение а заодно он будет греться соответственно пропускаемому току. Поэтому отвязан только проц, которому и нужно как раз стабильное питание. И Проц решит уже, что и когда отрубать.
10000 твоих мФ создают Короткое Замыкание при первом включении. Тут ЛЮБОЙ ДС-ДС уйдёт в защиту и будет заряжать эти 10000 заряжать короткими порциями, пока ток не станет допустимым.
lavalamp
25.04.2017, 16:34
нет, там смещение +5В (относительно+12) всё равно открывает транзистор.
Можно, конечно, играться подтяжками и режимом пина ( input или output), но нет необходимого запаса надёжности.
Да и та система, которая есть с 2я транзюками хорошо работает.
( я сначала с одним собирал, а 2й потом на плате навесным монтажём добавлял, потому как сделать управление рем сразу р-канальным транзистором без н- канального не получилось)
Можешь пожалуйста свою схему рем с номиналами нарисовать, у меня совсем никак не работает. Если на н канале ставлю 5.6к на землю то с контроллера вообще 1.5В на выходе получается, если не ставлю,то открывается хорошо но не закрывается.
я ж выкладывал вроде.
БП3 печатка и прошивка красным чтобы не потерялась
47344
lavalamp
26.04.2017, 07:43
я ж выкладывал вроде.
БП3 печатка и прошивка красным чтобы не потерялась
47344
Спасибо, а можешь еще подсказать номинал резистора с д12 дна н-канал который ставится и еще вопрос,нормально ли то что д12 выход просаживается в моих экспериментах до 1.5 вольт, что контроллер не держит 5 вольт там. И можно ли для теста взять какой нибудь другой выход для рем?
lavalamp
26.04.2017, 07:52
Спасибо, а можешь еще подсказать номинал резистора с д12 дна н-канал который ставится и еще вопрос,нормально ли то что д12 выход просаживается в моих экспериментах до 1.5 вольт, что контроллер не держит 5 вольт там. И можно ли для теста взять какой нибудь другой выход для рем?
попробовал повесить рем на д 10 и все отлично заработало,видимо убил выход ардуины, могу я его заменить на какой-нибудь из свободных?
попробовал повесить рем на д 10 и все отлично заработало,видимо убил выход ардуины, могу я его заменить на какой-нибудь из свободных?
конечно. В скетче попавь выход на другой пин и всё.
Спасибо, а можешь еще подсказать номинал резистора с д12 дна н-канал который ставится
12К .
lavalamp
26.04.2017, 15:06
конечно. В скетче попавь выход на другой пин и всё.Спасибо большое все заработало.
Добрый день подскажите по 3й версии,а именно каналу Рем, скетч разкоментмровал ардуино нормально управляет,но после того как выключтил асс ардуино на выходе формирует 0 ,но вот на затворе н канального полевика 2в и соответственно он не закрывается и на выходе Рем всегда 12 в. Подскажите что можно тут сделать?
Не понял (с телефона схему не посмотреть), почему ардуина дает логический ноль, а на затворе +2 вольта. Смею предположить, что резистор с ноги ардуины (если он есть там) надо уменьшить номинал, или увеличить подтягивающий на затворе, не должен он быть приоткрытым при низком уровне ардуины
Сорри, инета не было и не видел, что ответы уже имеются
Олег, подскажите пожалуйста по настройке БП в режиме калибровки
У меня БП, который при надписи на нем 12В выдает 11.3 (и нет такого как у вас с крутилкой). Что мне в скетче поменять, чтоб откалибровать его при питании 11.3? Строчку kalibrovkaACC = 1200000/Uacc-1410; в сетче видел, менял 1200000 на 1130000, что-то ничего путного не вышло ((. Или еще надо в строчке U_acc_real = Uacc * (1410.0+kalibrovkaACC)/100000; что-то тоже менять?
Спасибо
alex_good_kaban
11.05.2017, 13:01
Помогите
alex_good_kaban
11.05.2017, 13:12
Всем привет, наконец то могу писать в теме, (админ все же дал разрешение) Помогите с запуском KIW все не могу запустить его, пока не выпаены резисторы он работает, как только выпаиваю резисторы 2.2 перестает реагировать на резисторы 2.2 находящиеся на плате... На плате стоит на 2 канале резистор 124 на 1ом канале 2шт 334... Что делаю ни так подскажите пожалуйста...
Олег, подскажите пожалуйста по настройке БП в режиме калибровки
У меня БП, который при надписи на нем 12В выдает 11.3 (и нет такого как у вас с крутилкой). Что мне в скетче поменять, чтоб откалибровать его при питании 11.3? Строчку kalibrovkaACC = 1200000/Uacc-1410; в сетче видел, менял 1200000 на 1130000, что-то ничего путного не вышло ((. Или еще надо в строчке U_acc_real = Uacc * (1410.0+kalibrovkaACC)/100000; что-то тоже менять?
Спасибо
там формула была сложная, мозг ломал сутки, как оптимальней регулировку запилить с минимальной погрешностью и использованием одной ячейки еепром (для уменьшения размера программы).
kalibrovkaACC = 1130000 /Uacc-X
U_acc_real = Uacc * (X+kalibrovkaACC)/100000;
А вот X как высчитывать я уже не помню.
Можешь вручную значения kalibrovkaACC править. там всего 255 значений. То есть без записи в еепром, а прямо в скетче. За 30 минут поймаешь :spiteful:
А еще лучше возьми ДС-ДС на базе LM-к (https://duino.ru/product_info.php/info/p2273_Ponizhayushii-preobrazovatel-pitaniya-s-reguliruemym-vyhodnym-napryazheniem.html)и, как у меня, подключи к заведённой машине ( 14,5В), выставь подстроечником на плате 12В и калибруй.
ИЛИ U_acc_real = 1,061946902654867 * Uacc * (1410.0+kalibrovkaACC)/100000; ( по старинке, вручную меняем коэфф делителя)
Всем привет, наконец то могу писать в теме, (админ все же дал разрешение) Помогите с запуском KIW все не могу запустить его, пока не выпаены резисторы он работает, как только выпаиваю резисторы 2.2 перестает реагировать на резисторы 2.2 находящиеся на плате... На плате стоит на 2 канале резистор 124 на 1ом канале 2шт 334... Что делаю ни так подскажите пожалуйста...
Экран I2C к БП подключён? Ес ли да, то что на экране выводит? может у него запрет на работу по низкому напряжению и нужно калибровать?
там всё просто, как валенок. Должно работать. Сними видео с хорошим освещением и выложи на ютуб. сюда ссылку.
alex_good_kaban
11.05.2017, 18:04
l2c нет к сожалению...
l2c нет к сожалению...
там светодиод должен дублировать основные режимы
alex_good_kaban
11.05.2017, 19:32
Моргает с задержкой 0.5-1 сек
На данный момент KIW трещит бросается пакетами. Входной конденсатор 3300мф электролит, керам 10мф, выходной 2шт по 2200мф электролит
Питание подается через стабилизатор 7812
alex_good_kaban
11.05.2017, 19:38
Осталось 2 Kiw новых... https://s8.hostingkartinok.com/uploads/images/2017/05/9f60ce5ac7693b61e680f471e1806425.jpg (https://hostingkartinok.com/show-image.php?id=9f60ce5ac7693b61e680f471e1806425)
Осталось 2 Kiw новых...
дурацкий вопрос. Там, где должна быть металлизация, ты провода просовывал сквозь плату и припаивал?
Разберись с одним каналом кива сначала ( любым). Возможно, у тебя не такие резисторы стоят, соответственно R2.2 нужен другого номинала.
alex_good_kaban
11.05.2017, 21:46
Все пропаено с двух сторон, перемычки все кинуты. Я тоже где то наткнулся на тему что может быть другой номинал резисторов. Пробовал 474 на 2 канал показывало 2.5 v но больше ни как не реагировало на уменьшение или увеличение резаком
Все пропаено с двух сторон, перемычки все кинуты. Я тоже где то наткнулся на тему что может быть другой номинал резисторов. Пробовал 474 на 2 канал показывало 2.5 v но больше ни как не реагировало на уменьшение или увеличение резаком
но больше ни как не реагировало на уменьшение или увеличение резаком - обязано реагировать. протестируй как в этой статье http://we.easyelectronics.ru/part/sdvoennyy-preobrazovatel-napryazheniya-kiw-3312s-ir3802a.html
alex_good_kaban
11.05.2017, 22:14
На нем и пробовал
Большие кондеры с другой стороны
https://s8.hostingkartinok.com/uploads/images/2017/05/2c4ff91e65eef261b0f936dcc1299c57.jpg (https://hostingkartinok.com/show-image.php?id=2c4ff91e65eef261b0f936dcc1299c57)
alex_good_kaban
11.05.2017, 22:17
У меня главный вопрос я точно то выпаял...
alex_good_kaban
11.05.2017, 22:23
Установленный KIW со своими резаками, и откинутой ногой управления 1го канала, с ней 1ый канал не работает.
В таком виде не пищит и не греется
https://s8.hostingkartinok.com/uploads/images/2017/05/3326eaeecc7bcb2c8dd01839da127441.jpg (https://hostingkartinok.com/show-image.php?id=3326eaeecc7bcb2c8dd01839da127441)
https://s8.hostingkartinok.com/uploads/images/2017/05/5835af8e26b0df65e8baec170321dc22.jpg (https://hostingkartinok.com/show-image.php?id=5835af8e26b0df65e8baec170321dc22)
да, то.
теперь не выпаивая r2.2 добавь внешний резистор и посмотри на реакцию.
кондёры по выходу не забудь (100-2200мФ)
Приветствую! Дал схему отцу споять. Сделал он мне на вход "плюс" и "минус". Должно ли быть еще АСС?
Приветствую! Дал схему отцу споять. Сделал он мне на вход "плюс" и "минус". Должно ли быть еще АСС?
обязательно.:yes2:
А нет ли у кого уже готовой печатной платы v5 бп?
Я был бы рад приобрести. Желательно в мск.
Для изготовления 1-2 печатных плат покупать полный набор для ЛУТ, включая принтер, выходит как-то очень накладно :(
А нет ли у кого уже готовой печатной платы v5 бп?
Я был бы рад приобрести. Желательно в мск.
Для изготовления 1-2 печатных плат покупать полный набор для ЛУТ, включая принтер, выходит как-то очень накладно :(
у вас негде взять лазерный принтер? Негде купить медный купорос? или перекись водорода? (https://www.google.by/search?q=%D0%BB%D1%83%D1%82+%D0%BF%D0%B5%D1%80%D0% B5%D0%BA%D0%B8%D1%81%D1%8C+%D0%B2%D0%BE%D0%B4%D0%B E%D1%80%D0%BE%D0%B4%D0%B0&oq=%D0%BB%D1%83%D1%82+%D0%B2%D0%BE%D0%B4%D0%BE&aqs=chrome.1.69i57j0.8384j0j7&sourceid=chrome&ie=UTF-8)
Дома нет утюга? ( жена будет в восторге:shok:)
Жаль...
Для 5 версии печатки я делаю сам. Потому идёт постоянная проверка качества. Но это очень трудоёмко, поэтому запасных не делаю, только на продажу под конкретного человека.
Для 7й (https://youtu.be/43bQhx-ny90) буду заказывать на производстве.
https://habrastorage.org/web/3f7/4e6/3f5/3f74e63f532b4cfc81f7a9490e6e3e88.png
вопрос: какой проц лучше использовать?
Суть вопроса изложил в видео, потому как писать долго, нужно ваше мнение, желательно с аргументами.
https://youtu.be/42q7IF62MF4
Лучше сразу заюзать СТМ. Много ног, периферии и флеша. Я не читал что ты там хочешь использовать в своем блоке, но думаю 32 меги за глаза. Главное изначально пиши оптимальный код (любую задачу можно решить несколькими способами), главное разбираться в самом МК и его устройстве. Если писать будешь на абдурине, то там по большому счету быдло-кот (избыточный), так как пишут кому не лень и а бы как. Также можешь разнести задачи на два проца...один усб...связь и все такое, второй управление. Связь между ними либо уарт, либо spi. Будет проблема лишь с обновлениями по на обоих мк. По сему на втором мк пишешь код, который мало вероятно что изменится, на мк с усб уже то, что может меняться.
ЗЫ. Начинай изучать компиляторы для програмирования непосредственно МК...например от mikroelectronicа(mikroe). Немного избыточный код получается, но есть уже куча готовых библиотек для работы с периферией. Компили поддерживают камни арм(стм), авр, пик, 8051.
jonikus81
22.06.2017, 08:34
При всем уважении, но по моему нет ни одного ответа от awtoap, где бы он не обо$рал все, что связанно с ардуино. Я понимаю, что ардуино для начинающих, но зачем эта агрессия? Не надоело еще?
По теме. ATmega2560 (https://duino.ru/arduino-mega-2560-ne-original.html) за глаза должно хватить даже если "быдлокодить" как написали выше. В связке с сериал менеджером можно реализовать кнопки, а так же обратную связь с андроидом (кнопки, виджеты и тд). Ног вполне достаточно.
При всем уважении, но по моему нет ни одного ответа от awtoap, где бы он не обо$рал все, что связанно с ардуино. Я понимаю, что ардуино для начинающих, но зачем эта агрессия? Не надоело еще?
Але...ты ниче не попутал? Я за нее от силы пару раз упоминал за все время тут.
jonikus81
22.06.2017, 11:33
Але...ты ниче не попутал? Я за нее от силы пару раз упоминал за все время тут.
Видимо спутал. Извиняюсь. Стало неприятно, когда Вы приравняли все счетчи ардуино к быдлокоду. Мне с моим расстройством памяти этот быдлокод дается с огромными усилиями и трудом(поймут единицы). А тут тебя еще и к быдлу ровняют.
код
void UPRAVLENIE_PINAMI() // функция перевода логических параметров в реальные состояния пинов // http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry // https://geektimes.ru/post/255744/ Ускоряем свою Arduino /* http://robotosha.ru/arduino/digitalwrite-optimizing-arduino.html */
{// UPRAVLENIE_PINAMI ~~~//тут мы сначала пишем в переменную регистры, а потом сделаем PORTB = PORTBregistr; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
// PORTBregistr - обрабатывем регистры порта B атмеги
if (LED == 1 ){ PORTBregistr |= 1<<5; } //PORTB |= 1<<5; //установит "1" (сигнал высокого уровня) на выводе PB5. //digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
else { PORTBregistr &= ~(1<<5); } //PORTB &= ~(1<<5); //установит "0" (сигнал низкого уровня) на выводе PB5. //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
if (SAMOZAPITKA == 1){ PORTBregistr |= (1 << 1); } else {PORTBregistr &= ~((1 << 1));} //PB1 управление самозапиткой блока питания IN4///1 = есть самозапитка; 0 = нет самозапитки //http://microsin.net/programming/avr/accessing-avr-ports-with-winavr-gcc.html
if (SLEEP == 1){ PORTBregistr |= (1 << 2); } else {PORTBregistr &= ~((1 << 2));} //byte SLEEPpin = 10; /* PB2 управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
if (HUB == 0) { PORTBregistr |= (1 << 3); } else {PORTBregistr &= ~((1 << 3));} //HUB =0;//byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 1-есть питание, 0 - нет питания
if (OTG == 1) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG
// PORTDregistr - обрабатывем регистры порта D атмеги
if (PlanshBAT == 1){ PORTDregistr |= (1 << 6); } else {PORTDregistr &= ~((1 << 6));} //bool PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
if (REGISTRATOR == 1){ PORTDregistr |= (1 << 4); } else {PORTDregistr &= ~((1 << 4));} //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
if (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
if (REM == 1){ PORTDregistr |= (1 << 7); } else {PORTDregistr &= ~((1 << 7));} //bool REM = 0; //byte REMpin = 7; /* 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3)*/ //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
//Serial.print ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
вот кусок кода из моего ардуино, это оптимальный код?
ATmega2560 за глаза должно хватить... В связке с сериал менеджером можно реализовать кнопки, а так же обратную связь с андроидом (кнопки, виджеты и тд). Ног вполне достаточно.
то есть еще на сериал атмеги2560 вешать тот же ch340g, а с него уже делать выход на юсб(хаб)?
Или лучше прицепить блютуз модуль? ( hc06 тот же)
На планшет, соответственно, сериал менеджер.
jonikus81
22.06.2017, 18:54
то есть еще на сериал атмеги2560 вешать тот же ch340g, а с него уже делать выход на юсб(хаб)?
Или лучше прицепить блютуз модуль? ( hc06 тот же)
На планшет, соответственно, сериал менеджер.
Если делать "народный" БП, что бы каждый мог прошить дома не имея программатора тупо через ЮСБ, то да, ch340g нужно ставить (но бутлоадер все равно придется шить через ISP единожды в начале). Тут МК через CH340G в хаб и все.
Если делать "себе" и шить программатором через ISP (https://duino.ru/usbasp-programmer.html)(юзеры без программатора мимо), то можно подключить HS-05(06) (https://duino.ru/product_info.php/info/p2309_Bluetooth-modul-HC-06.html) и общаться по блютусу, но звук по блютусу уже не пустишь на магнитолу, так как блютус планшета будет занят.
Видимо спутал. Извиняюсь. Стало неприятно, когда Вы приравняли все счетчи ардуино к быдлокоду. Мне с моим расстройством памяти этот быдлокод дается с огромными усилиями и трудом(поймут единицы). А тут тебя еще и к быдлу ровняют.
Не воспринимай так все близко к сердцу...легче по жизни будет. Я тоже не вчера начал программировать и мне это стоило расставания с двумя подругами...это так лирика.
вот кусок кода из моего ардуино, это оптимальный код?
Скорее что нет. Оптимальным будет прямая запись в порт ибо выполняется за одну машинную команду (если память не подводит). Вообще оптимальность по этому куску можешь определить так: как сейчас, откомпилировав и посмотреть размер полученного файла на выходе. Затем заменяешь прямой записью в порт и делаешь тоже самое, что и выше и сравниваешь. В голове у себя откладываешь какой вариант был лучше и пользуешь потом.
ЗЫ. Используй константы пинов, дабы потом не путаться. Типа pinPlanshBAT=6 PortB = | (1 << pinPlanshBAT)...и тд.
то есть еще на сериал атмеги2560 вешать тот же ch340g, а с него уже делать выход на юсб(хаб)?
Или лучше прицепить блютуз модуль? ( hc06 тот же)
На планшет, соответственно, сериал менеджер.
Тыж вроде говорил, что хочешь эмулировать клаву через усб? То мост не подойдет. Если через serialmanager, то можешь и мост прицепить и блюпуп. У нее вроде 2 уарта.
Не воспринимай так все близко к сердцу...легче по жизни будет. Я тоже не вчера начал программировать и мне это стоило расставания с двумя подругами...это так лирика.
Скорее что нет. Оптимальным будет прямая запись в порт ибо выполняется за одну машинную команду (если память не подводит). Вообще оптимальность по этому куску можешь определить так: как сейчас, откомпилировав и посмотреть размер полученного файла на выходе. Затем заменяешь прямой записью в порт и делаешь тоже самое, что и выше и сравниваешь. В голове у себя откладываешь какой вариант был лучше и пользуешь потом.
ЗЫ. Используй константы пинов, дабы потом не путаться. Типа pinPlanshBAT=6 PortB = | (1 << pinPlanshBAT)...и тд.
прямая запись в порт выполняется за одну машинную команду.
прямая запись в 8 портов ( одного регистра) тоже выполняется за одну машинную команду.
значения , пихаемые в порт меняются по всему скетчу, поэтому, чтобы не дергать порт, значение виртуальное(pinPlanshBAT), а перезапись портов выполняется один раз за цикл через вызов функции.
Плюс удобнее портировать на другую платформу - просто переназначить номера портов в функции.
Я бы сказал, что чуть оптимальнее писать напрямую в порт, не пихая в переменную регистров, но экономия пару тактов буквально, потому не я не заморачивался на 2/16000000 секунды (2 такта на 16МГц)
Тыж вроде говорил, что хочешь эмулировать клаву через усб? То мост не подойдет. Если через serialmanager, то можешь и мост прицепить и блюпуп. У нее вроде 2 уарта.
я хочу кнопки на руль, универсальные.
атмега32u4 умеет usb_hid, то есть будет работать без сериал менеджера.
Если сериалменегер решает проблему без дополнительного проца - тогда проще.
У меня и так юсб портов не хватает:
1 - звук карта
2 - изи кап( камера)
3 - на управляющий процессор ( напрямую или через уарт)
4 - для внешней флешки.
Тут вопрос нубский, если я подключу сериал менеджер, то смогут ли одновременно работать звуковая и изикап ?
Тут вопрос нубский, если я подключу сериал менеджер, то смогут ли одновременно работать звуковая и изикап ?
А какие должны быть проблемы? Хотя это ведро и тут трабла может быть в самом не подходящем месте. Вообще можешь поставить эксперимент через внешний хаб и уже точно будешь знать пашет или нет.
Я бы сказал, что чуть оптимальнее писать напрямую в порт, не пихая в переменную регистров, но экономия пару тактов буквально, потому не я не заморачивался на 2/16000000 секунды (2 такта на 16МГц)
Тут не в скорости дело, а в размере кода! У нас стоит задачи впихнуть не впихуемое.
Либо бери жирный проц изначально с усб, либо разнеси на два проца. Скажем управление логикой питальника на меге 48(8) и передачей ей временных параметров по уарт (спи). А на проце с усб вся остальная требуха.
Также размер кода будет зависеть от организации самого алгоритма твоего девайса. Если говоришь, что часто будет использоваться запись в порт, то оформляй повторяющиеся фрагменты кода через процедуры и функции.
А какие должны быть проблемы? Хотя это ведро и тут трабла может быть в самом не подходящем месте. Вообще можешь поставить эксперимент через внешний хаб и уже точно будешь знать пашет или нет.
Тут не в скорости дело, а в размере кода! У нас стоит задачи впихнуть не впихуемое.
Либо бери жирный проц изначально с усб, либо разнеси на два проца. Скажем управление логикой питальника на меге 48(8) и передачей ей временных параметров по уарт (спи). А на проце с усб вся остальная требуха.
Также размер кода будет зависеть от организации самого алгоритма твоего девайса. Если говоришь, что часто будет использоваться запись в порт, то оформляй повторяющиеся фрагменты кода через процедуры и функции.
тогда проще 2560 взять с ch340 и не заморачиваться.
jonikus81
23.06.2017, 10:25
тогда проще 2560 взять с ch340 и не заморачиваться.
И один проц будет проще прошивать, нежели 2 или 3. Согласен с awtoap, нужны эксперименты, а то теория очень часто разнится с практикой. Хаб желательно более 4х портов.
Хаб желательно более 4х портов.
места не хватает ((
и на разъёмы юсб тоже
Alekssandr
24.06.2017, 16:44
oleg707 повесь на управление питанием attiny2313 а основным камнем 32u4, свяжи их UART-ом. На attiny2313 можно установить arduino.
oleg707 повесь на управление питанием attiny2313 а основным камнем 32u4, свяжи их UART-ом. На attiny2313 можно установить arduino.
нее, чем 2313, так уж лучше атмегу8. они у меня есть.
У 32u4 мне памяти мало, 1К против 128К у меги2560. Лучше я еще 3 юсб порта впихну, кому кнопки на 32u4 надо - внешний выведут.
Alekssandr
25.06.2017, 13:40
oleg707 ты идёшь по моему пути) я тоже начинал с 32u4, мне не хватало ног и памяти, потом я думал воткнуть 2560, в итоге воткнул Arduino DUE так как там есть аппаратный USB и соответственно HID и памяти 96 КБ ОЗУ. 512 КБ флеша.
Сейчас же я уже перешёл на STM32.
oleg707 ты идёшь по моему пути) я тоже начинал с 32u4, мне не хватало ног и памяти, потом я думал воткнуть 2560, в итоге воткнул Arduino DUE так как там есть аппаратный USB и соответственно HID и памяти 96 КБ ОЗУ. 512 КБ флеша.
Сейчас же я уже перешёл на STM32.
проблема нехватки ног решаема элементарно - для этого есть микрухи расширения.
Arduino DUE не хочу, так как я проц паяю прямо на плату, там от ардуины только IDE, а у DUE обвязки кат то многовато.
2560 - даже избыточна, что по ногам, что по флешу. Да и озу там есть.
Единственное, чего там нет - это USB HID, но это обходится через сериал менеджер. Заодно через него же можно еще чего замутить - связь то будет.
2 проца не хочу ввиду лишнего геморроя в виде связи и синхронизации, опять же два разных кода синхронизировать. Один общий проц попроще.
СТМ не хочу по одной причине - высокий порог вхождения для повторения или перепрошивки. То есть я то разберусь в итоге, а вот те, кто будет повторять - скорее нет.
Alekssandr
27.06.2017, 23:13
Вот есть такая штука, памяти больше и возможтей тоже https://store.arduino.cc/teensy-lc-usb-development-board
Alekssandr
28.06.2017, 00:00
Teensy 3.2 Во этот вообще шикарен, 64 ножки куча переферии, даже EEPROM 2кб есть что не обычно для ARM но приятно) обвязка простая. USB HID тоже пашет)) полная поддержка arduino.
32 bit ARM Cortex-M4 72 MHz CPU (M4 = DSP extensions)
256K Flash Memory, 64K RAM, 2K EEPROM
21 High Resolution Analog Inputs (13 bits usable, 16 bit hardware)
34 Digital I/O Pins (5V tolerance on Digital Inputs)
12 PWM outputs
7 Timers for intervals/delays, separate from PWM
USB with dedicated DMA memory transfers
3 UARTs (serial ports)
SPI, I2C, I2S,CAN Bus, IR modulator
I2S (for high quality audio interface)
Real Time Clock (with user-added 32.768 crystal and battery)
16 DMA channels (separate from USB)
Touch Sensor Inputs
https://www.sparkfun.com/products/13736
На aliexpress эти камни продают рублей по 300, в общем заказал себе одну платку)) находка прям.
jonikus81
28.06.2017, 08:06
если все это дружит с ардуино IDE и есть библиотеки, то это действительно находка! Что за две микрухи еще на плате?
Один стабилизатор, а второй сопроцессор с минимальным потреблением энергии я так понял для обеспечения спящего режима, в котором оно не есть практически ничего?!
Ох мать, глянул на 3.6 версию и ее возможности и потом на цену ...
Alekssandr
28.06.2017, 08:47
если все это дружит с ардуино IDE и есть библиотеки, то это действительно находка! Что за две микрухи еще на плате?
Один стабилизатор, а второй сопроцессор с минимальным потреблением энергии я так понял для обеспечения спящего режима, в котором оно не есть практически ничего?!
Ох мать, глянул на 3.6 версию и ее возможности и потом на цену ...
ARDUINO поддерживает 100%, его даже на оф сайте ардуино продают.
3.6 Ещё и корпус с БГА)) да ну его.
По поводу микрух, один из них стаб напряжения, а второй какой-то мелкий микроконтроллер и он как-то связан с прошивкой основного проца (заливкой скетча), как?, я пока не понял. Ноги с USB идут напрямую в основной проц, но ножка ресет и ножки 22,24,25 подключены к этому мелкому микроконтроллеру. И у этой штуки как бы нет кнопки RESET а есть кнопка Prog (Program), и на видюхах в ютуб чтоб запрограммировать этот контроллер нужно жмакнуть эту кнопку. В общем нужно с этим разбираться почему так.
Ещё интересен тот факт что здесь за-использована 4-я ножка ID у micro usb разъема, скорее всего чтоб переводить сам МК в режим ХОСТА.
И 13 битное АЦП по моемому рабочее (возможно както ограничено самим arduino IDE), а железом поддерживается до 16 бит. Да даже 13 бит это 8000 значений, точность будет шикарной. Возможно потом и 16 бит реализуют, это вообще 64000 значений АЦП, при таком раскладе там на один канал весь салон кнопками усыпать можно)))
jonikus81
28.06.2017, 09:29
По поводу микрух, один из них стаб напряжения, а второй какой-то мелкий микроконтроллер и он как-то связан с прошивкой основного проца (заливкой скетча), как?, я пока не понял. Ноги с USB идут напрямую в основной проц, но ножка ресет и ножки 22,24,25 подключены к этому мелкому микроконтроллеру. И у этой штуки как бы нет кнопки RESET а есть кнопка Prog, и на видюхах в ютуб чтоб запрограммировать этот контроллер нужно жмакнуть эту кнопку. В общем нужно с этим разбираться почему так.
Вообщем эта микруха хранит бут и переводит основной проц в режим программирования и по окончании перезагружает его. Сама она не хранит прошивки основного проца и вроде как имеет функцию вотч дога. Блин не силен в английском ( но помоему самому реализовать на голых камнях не получится, так как для этого мк опять же нужна прошивка, а в общественном доступе ее нет. Вот тема (https://forum.pjrc.com/threads/32922-Purpose-of-MKL02Z32VFG4)
А так плата даже очень вкусняшка, тоже думаю заказать.
Alekssandr
28.06.2017, 09:50
Да действительно, эта мелкая штуковина хранит в себе прошивку бута USB. Когда нажимаешь кнопку Prog она загружает в основной камень загрузчик и ждёт пока придёт новая прошивка.
В принципе основной проц можно воткнуть куда угодно в ней получается ничего нет, даже загрузчика (херово что они так сделали, памяти у этого камня валом, могли бы выделить чуток места под загрузчик я бы не расстроился:)) ), а из этой мелкой платки сделать программатор и прошивать основной камень уже на месте. Ну это как вариант)
jonikus81
28.06.2017, 14:35
Да действительно, эта мелкая штуковина хранит в себе прошивку бута USB. Когда нажимаешь кнопку Prog она загружает в основной камень загрузчик и ждёт пока придёт новая прошивка.
В принципе основной проц можно воткнуть куда угодно в ней получается ничего нет, даже загрузчика (херово что они так сделали, памяти у этого камня валом, могли бы выделить чуток места под загрузчик я бы не расстроился:)) ), а из этой мелкой платки сделать программатор и прошивать основной камень уже на месте. Ну это как вариант)
Блин, такой проц и такие костыли :sad2:. Не говори Саш, не могли этот бут даже в ущерб памяти вложить в проц и шить напрямую с юсб. Если только использовать саму отладочную плату целиком как у Олега прошлые бп реализованы.
Блин, такой проц и такие костыли :sad2:. Не говори Саш, не могли этот бут даже в ущерб памяти вложить в проц и шить напрямую с юсб. Если только использовать саму отладочную плату целиком как у Олега прошлые бп реализованы.
не вижу проблемы всю плату тинси в плату БП впихнуть. Там разводка даже намного проще становится по сравнению с голым процем.
Исследование алиэкспресса показало, что тинси есть на
11$ 32u4 ( ардуино леонардо),
12$ AT90USB1286 (http://www.atmel.com/images/doc7593.pdf)- 8-bit AVR 128kB Flash – 8K еепром.
16-22$ MK20DX256VLH7 (https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/K20P64M72SF1.pdf) схема (https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/schematic32.jpg)32 bit ARM Cortex-M4 72 MHz CPU
256K Flash
НО исходя из задач проца для управлением блоком питания и мультимедией на нём, ИМХО наиболее подходит AT90USB1286 (алиэкспр (https://ru.aliexpress.com/w/wholesale-at90usb1286.html?spm=2114.03010208.0.0.s9VEeX&site=rus&SearchText=at90usb1286&g=y&SortType=price_asc&groupsort=1&tc=af&initiative_id=SB_20170628033904).)
Только ценник ни разу не гуманный, эдак просто себестоимость БП получается выше 50$ + спаять. Это если брать детали оптом. А если в розницу - прыгает за 100$. Вот нафига мне со своего кармана спонсировать такие разработки - не оценят.
Поэтому скорее всего буду делать на меге 2560+ ch340, которая у меня есть.
Олег подскажи пжлста по такому вопросу: на киве у меня на выходе имеем стабильные 3.85В и 5.05В. но на точках присоединения к АКБ и пого пина имею всего лишь 3.35В и 4.85В.... изза чего так может происходить? вроде причина банальна должна быть: либо контакт плохой или провода херовые... но перепроверил 100 раз, ничего не помогает. что еще смотреть то?
Олег подскажи пжлста по такому вопросу: на киве у меня на выходе имеем стабильные 3.85В и 5.05В. но на точках присоединения к АКБ и пого пина имею всего лишь 3.35В и 4.85В.... изза чего так может происходить? вроде причина банальна должна быть: либо контакт плохой или провода херовые... но перепроверил 100 раз, ничего не помогает. что еще смотреть то?
ну так померяй между двумя точками: между 5,05 и 4,85. если на этом куске у тебя будет 0,2В, то потери идут по проводу.
Аналогично между 3,85 и 3,35.
Еще может быть потеря в фишке.
Какой длинны провода кстати?
nikitoyd
03.07.2017, 10:51
Приветствую.
Хочу повторить данный БП пятой версии.
Вопрос к Автору:
По какой разводке(человеку не совсем "схемотехнику", но успешно повторившему ни один десяток устройств) проще и лучше делать печатку и какую прошивку лить.
Есть просто архив 5.rar, 5 -51 t03.zip, печатка без прошивки 53( диод на кив 4,0В).zip и другие.
Какую делать, я так понял что в печатках минимальны различия, но все же есть.
Я так понимаю во всех разводках все номиналы деталей указаны, верно?
Спасибо.
Приветствую.
Хочу повторить данный БП пятой версии.
Вопрос к Автору:
По какой разводке(человеку не совсем "схемотехнику", но успешно повторившему ни один десяток устройств) проще и лучше делать печатку и какую прошивку лить.
Есть просто архив 5.rar, 5 -51 t03.zip, печатка без прошивки 53( диод на кив 4,0В).zip и другие.
Какую делать, я так понял что в печатках минимальны различия, но все же есть.
Я так понимаю во всех разводках все номиналы деталей указаны, верно?
Спасибо.
чем выше версия, тем новее. Прошивки ВСЕ совместимые, в шапке прошивки указаны изменения.
на сегодня последняя у меня лежит 53( диод на кив 4,0В).dip и T13_REM_EEPROM.ino
nikitoyd
03.07.2017, 22:20
Спасибо, буду пробовать
я в тупике, приму любые советы. вопщем заменил у себя хаб, без доп.питания... но не могу его корректно запустить с БП. вопщем ситуация такая - хаб через ОТГ кабель без проблем запускается. но через БП - не хочет работать. провода все целые...точно проблема не в этом. схему подключения я приложил... что может быть не так?
я в тупике, приму любые советы. вопщем заменил у себя хаб, без доп.питания... но не могу его корректно запустить с БП. вопщем ситуация такая - хаб через ОТГ кабель без проблем запускается. но через БП - не хочет работать. провода все целые...точно проблема не в этом. схему подключения я приложил... что может быть не так?
У Вас двух-канальный БП, как я понял. От одного питаете планшет от второго канала HUB?
У Вас двух-канальный БП, как я понял. От одного питаете планшет от второго канала HUB?
Да, БП от Олега
На мой взгляд - очевидно... Когда "хаб через ОТГ кабель без проблем запускается"-все работает от одного канала БП. Когда раздельно - появляется проблема. Значит дело во втором канале БП... Избавляйтесь от KIW3312.
На мой взгляд - очевидно... Когда "хаб через ОТГ кабель без проблем запускается"-все работает от одного канала БП. Когда раздельно - появляется проблема. Значит дело во втором канале БП... Избавляйтесь от KIW3312.
не гоните на 3312s. Неплохие стабилизаторы, с хорошим запасом по току. Другой вопрос в работоспособности конкретного экземпляра.
кстати дохнут при первом включении без кондёров на выходе.
я в тупике, приму любые советы. вопщем заменил у себя хаб, без доп.питания... но не могу его корректно запустить с БП. вопщем ситуация такая - хаб через ОТГ кабель без проблем запускается. но через БП - не хочет работать. провода все целые...точно проблема не в этом. схему подключения я приложил... что может быть не так?
именно по такой схеме у меня хаб (ноунейм китай) работает. провода метра полтора.
проверяй стабильность +5,0 на хаб, и управление на него. Если можешь - осциллографом.
Еще проверь массу на 4 пине юсб после включения "зажигания".
На крайняк - пиши на скайп.
+5в на хаб приходит, периферия запитывается...но планшет их не видит.
4пин имеется ввиду на разъёме планшета?
не гоните на 3312s. Неплохие стабилизаторы, с хорошим запасом по току. Другой вопрос в работоспособности конкретного экземпляра.
кстати дохнут при первом включении без кондёров на выходе.
По поводу "не гоните на 3312s" - я абсолютно никаких плюсов не нахожу в этих стабилизаторах, но каждый в конечном итоге решает сам, что ему подходит.
+5в на хаб приходит, периферия запитывается...но планшет их не видит.
4пин имеется ввиду на разъёме планшета?
4 пин планшета должен быть закорочен на землю (5 пин), чтоб планшет думал, что к нему подключена периферия (режим ОТГ)
По поводу "не гоните на 3312s" - я абсолютно никаких плюсов не нахожу в этих стабилизаторах, но каждый в конечном итоге решает сам, что ему подходит.
хм, а скажите, которые вас устраивают? ( и почему)
https://youtu.be/gcOWf4sMp2Y
https://youtu.be/Q47IcdawHig
http://we.easyelectronics.ru/part/sdvoennyy-preobrazovatel-napryazheniya-kiw-3312s-ir3802a.html
сейчас разрабатываю БП на основе MP1584EN, только плата своя, по даташитам и рекомендациям производителя, а не как у китайцев. Плюс дросселя по току нормальные, а не 0,5А номинальных.
+5в на хаб приходит, периферия запитывается...но планшет их не видит.
4пин имеется ввиду на разъёме планшета?
да, выход с БП ( выход- Y-OTG кабеля PW1-4pin), который надо припаять к 4 пину юсб, при включении зажигания на нем должна быть масса, если нет - ждать 20с ( только при первом включении)
4 пин планшета должен быть закорочен на землю (5 пин), чтоб планшет думал, что к нему подключена периферия (режим ОТГ)
БП это и делает при включении зажигания.
basurman
11.07.2017, 04:00
не гоните на 3312s. Неплохие стабилизаторы, с хорошим запасом по току.
Если совсем ничего нет, то конечно же не плохой, даже спорить бессмысленно.
сейчас разрабатываю БП на основе MP1584EN, только плата своя, по даташитам и рекомендациям производителя, а не как у китайцев. Плюс дросселя по току нормальные, а не 0,5А номинальных.
Это серьезно сказано или прикол какой?
Если совсем ничего нет, то конечно же не плохой, даже спорить бессмысленно.
Это серьезно сказано или прикол какой?
серьёзно. Пол форума вообще на mini360 ОТЛИЧНО ездит.
Давайте так, если обсираем что либо (3312s), то обоснованно, с предложением своего лучшего решения.
А то получается, что вроде г***о, а альтернативы нет.
MP1584EN умеет
1500кГц частота переключения, можно выбирать
Питание то 4.5V до 28V
внутреннее ограничение по макс току
3А
Enable Input пин.
мизерный ток покоя.
СТОИМОСТЬ.
теплоотвод прямо под микросхемой.
Есть инструмент разработчика, где в программе можно менять каждую деталь из обвязки и смотреть расчетные осциллограммы выхода.
такс... 4пин работает, т.е. после включения зажигания приходит земля. напомните... а при каком моменте он должен заземляться: до или после подачи питания на хаб?
P.S. на АКБ имеем стабильные 3.85В, на 1ом пине усб - 5.01В... и то же самое на питании хаба
basurman
11.07.2017, 19:37
Давайте так, если обсираем что либо
Для начала будет так, во первых выбираем выражения, если мне нельзя писать что захочу, то с чего кто то решил, что ему можно...
Во вторых, я ничего не хаял и не собирался, какое то болезненное самомнение у форумчан. Разве обычный вопрос может так "возбуждать"?(если это не так)
А то получается, что вроде г***о, а альтернативы нет.
Приблизительно так и есть, так как качественные решения не дешевы и это определенный минус. Хотя со временем он окупается.
с предложением своего лучшего решения
Друг мой, каким образом можно что то советовать, если "СТОИМОСТЬ" так важна.
Раз всех устраивает ширпотреб, так я и не против, только за. Ведь каждый сам выбирает себе гемор.
А по поводу моего вопроса, так я просто не ожидал (что эти эээ... ну, язык не поворачивается их назвать БП), кем то серьезно используются.
Для начала будет так, во первых выбираем выражения, если мне нельзя писать что захочу, то с чего кто то решил, что ему можно...
Во вторых, я ничего не хаял и не собирался, какое то болезненное самомнение у форумчан. Разве обычный вопрос может так "возбуждать"?(если это не так)
Приблизительно так и есть, так как качественные решения не дешевы и это определенный минус. Хотя со временем он окупается.
Друг мой, каким образом можно что то советовать, если "СТОИМОСТЬ" так важна.
Раз всех устраивает ширпотреб, так я и не против, только за. Ведь каждый сам выбирает себе гемор.
А по поводу моего вопроса, так я просто не ожидал (что эти эээ... ну, язык не поворачивается их назвать БП), кем то серьезно используются.
такс, начнём сначала.
Мне нужно чем-то питать планшет.
Назвать это что-то грудой запчастей не получается, поэтому это блок питания (БП). Можете называть как угодно, главное, чтобы вас понимали другие.
"СТОИМОСТЬ" идёт после того, как вы что-либо посоветуете, иначе у меня есть конкретная деталь ( или готовый дс-дс) (3312s, MP1584EN), а от вас ( да и от кого -либо еще) я рекомендаций что поставить не услышал и не увидел.
то есть я говорю про конкретику, и готов признать свои ошибки, если вы ( или кто то еще) аргументированно меня переубедите. И я буду рад, что стал опытнее и умнее.
Если совсем ничего нет, то конечно же не плохой, даже спорить бессмысленно. У меня есть КРЕН5, это считается?:big:
зы,
эта тема создана мной для того, чтобы поделиться своей разработкой и послушать умные советы по её улучшению. Так вот советов было совсем немного.
А сделал я эту разработку, потому как не было ( и по сегодня) нет решения, которое мне бы подошло.
И я очень возбуждаюсь, когда меня учат выбирать выражения вместо конкретных советов.
Еще очень возбуждаюсь когда конкретно советуют, прямо радость на душе.:blush:
Но в этой теме не про возбуждение вроде как.
после сего спича можете меня даже забанить, вы же модератор :wink2:
Или посоветовать чего по улучшению или схемотехнике, буду очень рад (а то надоело всё самому разрабатывать) :yes2:
ззы
уфф, выговорился, эк меня попёрло.
такс... 4пин работает, т.е. после включения зажигания приходит земля. напомните... а при каком моменте он должен заземляться: до или после подачи питания на хаб?
P.S. на АКБ имеем стабильные 3.85В, на 1ом пине усб - 5.01В... и то же самое на питании хаба
когда мы вставляем y-otg кабель в планше, то сначала замыкаем 4 пин на массу, а потом планшет запитывает устройство(+5В).
кабель до хаба как? звуковая\ или мышка вместо хаба видятся?
когда мы вставляем y-otg кабель в планше, то сначала замыкаем 4 пин на массу, а потом планшет запитывает устройство(+5В).
кабель до хаба как? звуковая\ или мышка вместо хаба видятся?
через OTG кабель перифирия определяется... как по отдельности напрямую, так и через хаб
через OTG кабель перифирия определяется... как по отдельности напрямую, так и через хаб
вот, вместо ХАБА и воткни перифирию, этим ты проверишь юсб цепи и питание. Еще конденсаторы по питанию в хабе можешь пробовать добавить.
basurman
12.07.2017, 14:54
Олег, у меня нет никакого желания ни спорить, ни что то доказывать. Да я этого и не хотел. Ты хотел высказаться, ты это сделал. То, что большинству по барабану, как и что работает, это их проблемы. Я тебе могу предложить другой вариант. Пару микросхем могу выделить на опыты, как получишь их дам тебе схему подключения. А там сам решишь что лучше или хуже. Еще раз повторю, каждый сам выбирает с чем ему мучаться(или не мучаться).:wink2:
после сего спича можете меня даже забанить, вы же модератор
Это совершенно излишне даже просто писать, мне показалось, что ты достаточно разумен.
Олег, у меня нет никакого желания ни спорить, ни что то доказывать. Да я этого и не хотел. Ты хотел высказаться, ты это сделал. То, что большинству по барабану, как и что работает, это их проблемы. Я тебе могу предложить другой вариант. Пару микросхем могу выделить на опыты, как получишь их дам тебе схему подключения. А там сам решишь что лучше или хуже. Еще раз повторю, каждый сам выбирает с чем ему мучаться(или не мучаться).:wink2:
Это совершенно излишне даже просто писать, мне показалось, что ты достаточно разумен.
Это совершенно излишне даже просто писать, мне показалось, что ты достаточно разумен
Это я троллил, каюсь:blush:
Пару микросхем могу выделить на опыты - я только за! С большим удовольствием.
Что за микросхемы? В личку, скайп или вайбер?
MP1584EN умеет
1500кГц частота переключения, можно выбирать
Питание то 4.5V до 28V
внутреннее ограничение по макс току
3А
Enable Input пин.
мизерный ток покоя.
СТОИМОСТЬ.
теплоотвод прямо под микросхемой.
Есть инструмент разработчика, где в программе можно менять каждую деталь из обвязки и смотреть расчетные осциллограммы выхода.
Нормальный преобразователь ,я на нем свой блок управления разрабатывал но на своей плате.. http://www.pccar.ru/showthread.php?t=24001&page=2 Частота большая ,емкости малые только те что на плате, работает стабильно на динамическую нагрузку,при правильной разводки PCB. Не греется до токов 1,5А. спокойно держит в долгом режиме без радиатора (только печатная плата) 2,5A.У меня все работает,стоит в машине и в холод и в жару.:blush:
А по поводу моего вопроса, так я просто не ожидал (что эти эээ... ну, язык не поворачивается их назвать БП), кем то серьезно используются.
Вставлю своих 5 копеек. Выбор элементной базы ,зависит от поставленной задачи если подходить к этому вопросу с точки зрения конструктора. Простой пример,берем планшет типа нексуса 7 2013, максимальная потребляемая мощность 7W ,что при номинальном напряжении ток потребления = ~1,7A. При полной загрузке проц 100% + сеть с плохим приемом максимум что было - около 2A. при пульсациях MP1584 около 5мВ. Что вполне нормально для планшета. Даже в этом режиме гарантированный запас 30% есть. Но в нормальном режиме планшет потребляет не больше 05 - 1A. Специально нагружал планшет+ феном подымал температуру до 60 градусов. Больше переживал за проц планшета,что сдохнет от большей температуры,но нет все выжило MP1584 себя чувствовал нормально,немного дроссель начал греться,но в моем случае размер имеет значение...:smile1: Даже при просадке в 5,4В выход держит 4,2В , так что еще нужно ?! Если мы делаем сложный измерительный прибор,то да ,там уже требования другие (допустим по пульсациям) и нужна другая элементная база. Если нужен более высокий кпд и другие параметры ,то конечно можно и в сторону решений от Linear Technology пойти. Но в данном случае не вижу смысла...
Все это ИХМО.
Уважаемые жители
Вопрос к знатокам электроники. Есть желание задействовать Pogo контакты (назовём их боковыми) на Нексусе 7 под USB, да так чтобы получить на боковых контактах функционал USB OTG. То есть, возможно ли хитро подключить 4 боковых контакта на приёмную платку разъёма USB? Условие: чтобы внешний вид не пострадал, и чтобы сохранился режим USB-client.
Как я вижу: сигнал перекидывается напрямую с боковых контактов на платку разъёма USB, пятый контакт разъёма подключается к минусу с бокового контакта через диод. Диод стоит так, чтобы при наличии тока с боковых контактов работал режим USB OTG, при отсутствии же - в зависимости от штекера включенного в разъём.
Альтернативно как ещё можно запускать USB OTG с 4-х боковых контактов?
Уважаемые жители
Вопрос к знатокам электроники. Есть желание задействовать Pogo контакты (назовём их боковыми) на Нексусе 7 под USB, да так чтобы получить на боковых контактах функционал USB OTG. То есть, возможно ли хитро подключить 4 боковых контакта на приёмную платку разъёма USB? Условие: чтобы внешний вид не пострадал, и чтобы сохранился режим USB-client.
Как я вижу: сигнал перекидывается напрямую с боковых контактов на платку разъёма USB, пятый контакт разъёма подключается к минусу с бокового контакта через диод. Диод стоит так, чтобы при наличии тока с боковых контактов работал режим USB OTG, при отсутствии же - в зависимости от штекера включенного в разъём.
Альтернативно как ещё можно запускать USB OTG с 4-х боковых контактов?
а выражение "Дифференциальная пара" вам о чём нибудь говорит?
У юсб около 500мГц скорость :acute:
Это не говоря о геморре с 4 пином.
а выражение "Дифференциальная пара" вам о чём нибудь говорит?
У юсб около 500мГц скорость :acute:
Это не говоря о геморре с 4 пином.
К сожалению, не говорит. Так же это выражение не стыкуется у меня с цифрой 500 МГц (или мГц?). :no2:
А вот 4-й пин меня интересует. :wink2:
К сожалению, не говорит. Так же это выражение не стыкуется у меня с цифрой 500 МГц (или мГц?). :no2:
А вот 4-й пин меня интересует. :wink2:
Итак, про Дифференциальную пару понятно. Для этого у меня есть подходящая подложка для шлейфа - каптон. Надо будет сообразить рисунок шлейфа с одинаковой длиной дорожек при постоянном расстоянии между ними. Спасибо за наводку.
С 4-м пином пока затык? Может задействовать магнитный датчик для этого? Мне кажется сигнальщик ОТГ не обязательно перекручивать с чем-то ещё, разве нет?
Итак, про Дифференциальную пару понятно. Для этого у меня есть подходящая подложка для шлейфа - каптон. Надо будет сообразить рисунок шлейфа с одинаковой длиной дорожек при постоянном расстоянии между ними. Спасибо за наводку.
С 4-м пином пока затык? Может задействовать магнитный датчик для этого? Мне кажется сигнальщик ОТГ не обязательно перекручивать с чем-то ещё, разве нет?
с 4 пином - включили зажигание - туда подали массу, выключили зажигание - убрали массу.
Реализуйте как хотите - тут ваша фантазия.
с 4 пином - включили зажигание - туда подали массу, выключили зажигание - убрали массу.
Реализуйте как хотите - тут ваша фантазия.
Извиняюс, уточню в чём стоит вопрос: включение ОТГ при подключении 4 боковых контактов (пого пины), не изменяя внешний вид. Установка должна быть мобильной - при необходимости снимаешь планшет и используешь его традиционно. Именно для этого и пытаюсь задействовать пого пины. Для этой цели, в силу моих никаких знаний электроники, предполагаю либо разрывать контакт диодом, либо каким-то электронным ключом, либо механически, например, с помощью магнита.
Видел ещё похожий вариант, но там чел соорудил 5 контактов прям под задней крышкой контактов. К сожалению, неизвестно как показало себя в эксплуатации и он не отвечает на запросы.
Извиняюс, уточню в чём стоит вопрос: включение ОТГ при подключении 4 боковых контактов (пого пины), не изменяя внешний вид. Установка должна быть мобильной - при необходимости снимаешь планшет и используешь его традиционно. Именно для этого и пытаюсь задействовать пого пины. Для этой цели, в силу моих никаких знаний электроники, предполагаю либо разрывать контакт диодом, либо каким-то электронным ключом, либо механически, например, с помощью магнита.
Видел ещё похожий вариант, но там чел соорудил 5 контактов прям под задней крышкой контактов. К сожалению, неизвестно как показало себя в эксплуатации и он не отвечает на запросы.
по 4м контактам не получится, минимум 5. Поищите мои сообщения, я как то уже объяснял одному товарищу, много текста там.
Олег, есть инфа по новой ревизии БП? когда ожидаешь выкатить девайс?
Олег, есть инфа по новой ревизии БП? когда ожидаешь выкатить девайс?
хз, я тут 5 версию еще не всем собрал :wink2:
тут МНОГО факторов замедляющих -
1- это не из-за денег и не для денег.
2 - есть хорошо работающий БП5, уже установленный в машину.
3 - желание объединить все запросы форумчан в одном блоке - например мультимедиа-кнопки на руле ( резистивные), изикап ( который мне не нужен из-за тормознутости 0,5сек, вследствие чего у меня аппаратное решение.
4 - размеры БП - впихиваю в определённый форм фактор.
5 - время. Его НЕТ. + работа + ремонт дома.
Но процесс идёт, даже почти все детали уже есть. Только its кончились, и кивы :blush:, надо заказывать, опять :big:
https://youtu.be/yX0cdD9lNXw
хз, я тут 5 версию еще не всем собрал :wink2:
Не много вато ли :shok: ? Я еше понимаю ,ну 2 , но 5…
Не много вато ли :shok: ? Я еше понимаю ,ну 2 , но 5…
Так первая была без ардуины,
вторая обрела измененную силовую часть
Третья обрела ардуину и разъём питания, стабильная и надёжная
Четвёртая стала использовать вместо транзисторов интеллектуальный ключ.
Пятая это точно такая же четвёрка, только разводка платы другая.
Шестерка - та же пятёрка, только без Андуины, на голом процессоре. Существует только виртуальной, ввиду нежелания писать программу на проц.
Семёрка - дальнейшее развитие. голый проц, встроенный хаб, встроенное управление изикапом, встроенная звуковая 2704 с оптическим выходом, встроенный звуковой процессор для аппаратной регулировки громкости, дс-дс собираются на плате непосредственно, ввиду моего недовольства.
Ну и естественно, по мере набора опыта корректируется мелкие, но важные ньюансы.
Семёрка - дальнейшее развитие. голый проц, встроенный хаб, встроенное управление изикапом, встроенная звуковая 2704 с оптическим выходом, встроенный звуковой процессор для аппаратной регулировки громкости, дс-дс собираются на плате непосредственно, ввиду моего недовольства.
Ну и естественно, по мере набора опыта корректируется мелкие, но важные ньюансы.
Еще приемник и будит как у меня, но это уже не блок питания...:big:
Еще приемник и будит как у меня, но это уже не блок питания...:big:
эмм, ага, да еще блютуз модуль, тогда это будет неблок_питания_8 :big:
лет через 5 с такой скоростью :spiteful:
эмм, ага, да еще блютуз модуль, тогда это будет неблок_питания_8 :big:
лет через 5 с такой скоростью :spiteful:
А, ну да чуть не забыл про блютуз... У меняменя иногда ощущение ,что через бт играет чуть лучше ,чем через PCM2704 с usb. Уже как несколько месяцев стоит - полет нормальный:smile1:
А, ну да чуть не забыл про блютуз... У меняменя иногда ощущение ,что через бт играет чуть лучше ,чем через PCM2704 с usb. Уже как несколько месяцев стоит - полет нормальный:smile1:
а у меня ощущение, что карточка за 7$ играет очень достойно (по аналогу) в сравнении с ресивером, купленном за 1300$ на одних и тех же колонках ( за ~900$). С одного и того же трека ( флак).
А еще мне нечем принять блютуз звук - магнитола то выкинута.
Разницу капитальных вложений чувствуешь ? :big:
а у меня ощущение, что карточка за 7$ играет очень достойно (по аналогу) в сравнении с ресивером, купленном за 1300$ на одних и тех же колонках ( за ~900$). С одного и того же трека ( флак).
Как ето по русссски.... Не все золото ,что блестит...
Как ето по русссски.... Не все золото ,что блестит...
Нее, на домашней акустике за 2к$ очень даже золото, отчётливо слышна разница между 320 и флаком. Играет на каждый цент.
Я к тому, что дешевая карточка не сильно хуже и смысла покупать звуковую за 30-50 баксов я не вижу.
nikitoyd
28.07.2017, 17:59
Продолжая делать бп по 53( диод на кив 4,0В).dip
Есть вопросы по деталям. Накидал файлик в 3 столбца, первый столбец детали в дип трейсе, второй столбец с вопросами форумчанина, третий столбец - ваш ему ответ.
Я так понимаю, что Все делали на разных версиях печатки вот и разница, которая сбивает с толку.
Собственно, какие форм-фактор и номиналы для 53( диод на кив 4,0В).dip для следующих деталей:
С3 С4 С5 С6 С8 С9 С11
D4 D5 D6 D10
Q1 Q2 Q3 - именно указанные, или можно другие какие?
R6 R13 R14 R15 R19 R20
Rx2.2верх Rx2.2низ их в печатке вообще 3 штуки,верх1, низ и низ1. Я так понял, что в кив я выпаиваю симметрично 2 резистора, а указанные сверху припаиваю на плату, верно? 2 или как в печатке 3. Каких номиналов и по одному или по 2 в параллель?
Очень надеюсь на ответ, спасибо.
Продолжая делать бп по 53( диод на кив 4,0В).dip
Есть вопросы по деталям. Накидал файлик в 3 столбца, первый столбец детали в дип трейсе, второй столбец с вопросами форумчанина, третий столбец - ваш ему ответ.
Я так понимаю, что Все делали на разных версиях печатки вот и разница, которая сбивает с толку.
Собственно, какие форм-фактор и номиналы для 53( диод на кив 4,0В).dip для следующих деталей:
С3 С4 С5 С6 С8 С9 С11
D4 D5 D6 D10
Q1 Q2 Q3 - именно указанные, или можно другие какие?
R6 R13 R14 R15 R19 R20
Rx2.2верх Rx2.2низ их в печатке вообще 3 штуки,верх1, низ и низ1. Я так понял, что в кив я выпаиваю симметрично 2 резистора, а указанные сверху припаиваю на плату, верно? 2 или как в печатке 3. Каких номиналов и по одному или по 2 в параллель?
Очень надеюсь на ответ, спасибо.
если не готова печатка, могу дать более свежую версию. недавно по ней собирал, вроде всё подписано.
недоволен повторяемостью блока.
Вот вариант, который стоит и работает у меня сейчас.
47824
то есть Дачик Холла (ДХ) не выпаян из планшета и работает штатно. К сигнальной линии ДХ припаян провод, подключаемый к БП (Блоку Питания). На нём висит 3,3В с ДХ. Когда мы даём массу, то на проводе ДХ становится 0 вольт и эран тухнет.
Массу даёт N-CH полевик, управляемый с процессора через токоограничивающий резистор.
Так вот при полном выключении БП (например сняли аккум с машины) и оставшемся включенным планшетом ( батарея оставлена) нашим N-CH полевиком некому управлять ( проц то выключен) и транзистор закрывается, убирая массу с ДХ. Экран включается.
Чтобы экран был выключен даже при незапитанном БП я на затвор транзистора подтянул управление с 4,2В ( с батареи планшета) через резистор R15.
Система работает прекрасно, пока включен проц и работает нестабильно при попытке повторить БП.
Чтобы планшет начал тушить экран, нужно подбирать R13 как минимум или R13, R14, R15 как норму.
Начав думать как упростить повторяемость блока и увеличить надёжность пришла на ум такая схема:
47825
Выпаиваем ДХ, вместо него вешаем подтяжку на питание датчика и кондёр от помех ( естественно с микроскопом или хорошей лупой).
Когда подключен обесточенный БП, то опорное напряжение 3,3В с сигнальной ноги ДХ замыкается резистором R2. Экран тухнет.
Когда мы хотим включить экран, то надо подать на сигнальный провод +3,3В. R2 и R3 образуют делитель напряжения, на вход которого мы подаём +5В через P-CH полевик, а на выходе которого получаем +3,3В. Экран включается.
Какие будут ваши мысли\советы ?
Самый простой вариант для управления датчиком Холла - твердотельное реле с нормально замкнутым выходом.
Как вариант CPC1117N (http://www.claremicronix.com/home/pdfs.nsf/www/cpc1117n.pdf/$file/cpc1117n.pdf).
Самый простой вариант для управления датчиком Холла - твердотельное реле с нормально замкнутым выходом.
Как вариант CPC1117N (http://www.claremicronix.com/home/pdfs.nsf/www/cpc1117n.pdf/$file/cpc1117n.pdf).
разжуй один момент. Не пойму принципа действия. Если на управляющие пины не подавать напряжения, то за счет чего реле замкнёт наши 3,3В опорного напряжения? Ведь когда оно их замкнёт, на выходе ДХ должен стать 0В.
Реле в нормальном состоянии (когда на управляющие пины ничего не подано) замкнуто (по схеме на выходе "земля"). Когда подаем напряжение на управляющие пины реле размыкается и на выходе +3.3В.
Можно и так...
Но я коммутирую "землю" напрямую (схема выше). Когда контроллер выключен (или БП обесточен, или по алгоритму на выходе контроллера канала управления Холлом "0") на выходе реле "земля" и планшет "спит". Как только на канале контроллера управления Холлом появляется напряжение, соответственно оно появляется на управляющем пине реле - реле размыкается и планшет "просыпается".
Реле в нормальном состоянии (когда на управляющие пины ничего не подано) замкнуто (по схеме на выходе "земля"). Когда подаем напряжение на управляющие пины реле размыкается и на выходе +3.3В.
Можно и так...
Но я коммутирую "землю" напрямую (схема выше). Когда контроллер выключен (или БП обесточен, или по алгоритму на выходе канала управления Холлом "0") на выходе реле "земля" и планшет "спит". Как только на канале контроллера управления Холлом появляется напряжение, соответственно оно появляется на управляющем пине реле - реле размыкается и планшет "просыпается".
дело в том, что внутри датчика холла есть эта подтяжка на его питание (+3,3В). И эти +3,3В висят на сигнальном проводе ДХ.
Мы их замыкаем, на сигнальном проводе ДХ становится 0В и проц планшета с этим что -то делает (тушит экран).
отвлечёмся.
Я беру батарейку ( 4,5В), и через резистор 200ом соединяю с силовыми выводами твердотельного реле с нормально замкнутым выходом.
Подключаю вольтметр к выводам реле, ЧТО он покажет? 0В, 0,1В, 0,2В ?
Я это к чему, чтобы работала полупроводниковая электроника нужна энергия. А если на замкнутых контактах 0В, и на управляющие мы ничего не подаём, как оно работает?
"CPC1117N является миниатюрным нормально замкнутым однополюсным (1-Form-B) твердотельным реле в 4-контактном SOP-корпусе, который использует оптически связанную MOSFET-технологию для обеспечения изоляции 1500 В перем. Эффективные переключатели MOSFET и фотоэлектрические кристаллы используют запатентованную OptosMOS архитектуру IXYS Integrated Circuits. Оптически связанный выход управляется высокоэффективным инфракрасным светодиодом. Современная вертикальная строительная тара IXYS Integrated Circuits Division делает CPC1117N одним из самых маленьких в мире реле. Он обеспечивает экономию пространства на борту не менее 20% по сравнению с большим 4-контактным реле SOP конкурента." - это перевод из даташита.
Это простой "выключатель, кнопка, рубильник"- хочешь коммутируй "GND", хочешь напряжение до 60В.
аналоги еще подкинешь? на али эти реле по баксу.
ps. Дошло, за счет чего работает. Сопротивление канала, (Ohms) - 16ом. То есть замыкание не полное, а энергия для работы снимается с падения напряжения с этих 16 ом. Пойдёт.
Самый дешевый, что нашел здесь (https://ru.aliexpress.com/item/CPC1117N-CPC1117NTR/32815321667.html?spm=a2g0v.search0104.3.19.S8hshG&ws_ab_test=searchweb0_0,searchweb201602_2_10152_10 065_10151_10068_10209_10307_10301_10137_10060_1015 5_10154_10056_10055_10054_10059_100031_10099_10103 _10102_10169_10052_10053_10142_10107_10050_10051_1 0084_10083_10119_10080_10082_10081_10110_10111_101 12_10113_10114_10310_10311_10312_10078_10079_10210 _10073_10120_10127_10125-10120,searchweb201603_13,ppcSwitch_5&btsid=e5521444-14b9-4766-8ac9-ac571c811f37&algo_expid=338a1307-b6fd-48bb-b926-23a71dbeb946-2&algo_pvid=338a1307-b6fd-48bb-b926-23a71dbeb946).
Есть вариант сдвоенного реле LBA110 (https://ru.aliexpress.com/item/10PCS-LOT-LBA110S-LH1502-LH1502BAC-PLA193S-LBB110S-LBB110-HCNW3120-SOP-8-SOP8/32809674949.html?spm=a2g0s.9042311.0.0.JYoRze) - получится в два раза дешевле.
Самый дешевый, что нашел здесь (https://ru.aliexpress.com/item/CPC1117N-CPC1117NTR/32815321667.html?spm=a2g0v.search0104.3.19.S8hshG&ws_ab_test=searchweb0_0,searchweb201602_2_10152_10 065_10151_10068_10209_10307_10301_10137_10060_1015 5_10154_10056_10055_10054_10059_100031_10099_10103 _10102_10169_10052_10053_10142_10107_10050_10051_1 0084_10083_10119_10080_10082_10081_10110_10111_101 12_10113_10114_10310_10311_10312_10078_10079_10210 _10073_10120_10127_10125-10120,searchweb201603_13,ppcSwitch_5&btsid=e5521444-14b9-4766-8ac9-ac571c811f37&algo_expid=338a1307-b6fd-48bb-b926-23a71dbeb946-2&algo_pvid=338a1307-b6fd-48bb-b926-23a71dbeb946).
Есть вариант сдвоенного реле LBA110 (https://ru.aliexpress.com/item/10PCS-LOT-LBA110S-LH1502-LH1502BAC-PLA193S-LBB110S-LBB110-HCNW3120-SOP-8-SOP8/32809674949.html?spm=a2g0s.9042311.0.0.JYoRze) - получится в два раза дешевле.
а что думаешь насчёт lcb110 (https://ru.aliexpress.com/wholesale?ltype=wholesale&d=y&origin=y&blanktest=0&SearchText=lcb110&tc=af&initiative_id=SB_20170728125847&isViewCP=y&catId=0&aff_platform=aaf&cpt=1501275555062&sk=VnYZvQVf&aff_trace_key=537da53b02734b1198796ad9be3bbdb4-1501275555062-05158-VnYZvQVf)?
Нормальное реле. Цена примерно такая же.
Но лучше все-таки полноценное двухканальное реле - дешевле на порядок и можно комбинировать (NO или NC).
Нормальное реле. Цена примерно такая же.
Но лучше все-таки полноценное двухканальное реле - дешевле на порядок и можно комбинировать (NO или NC).
убедил на LH1502BAC (http://www.farnell.com/datasheets/492772.pdf),
2 канала - NO и NC.
недоволен повторяемостью блока.
Вот вариант, который стоит и работает у меня сейчас.
47824
то есть Дачик Холла (ДХ) не выпаян из планшета и работает штатно. К сигнальной линии ДХ припаян провод, подключаемый к БП (Блоку Питания). На нём висит 3,3В с ДХ. Когда мы даём массу, то на проводе ДХ становится 0 вольт и эран тухнет.
Массу даёт N-CH полевик, управляемый с процессора через токоограничивающий резистор.
Так вот при полном выключении БП (например сняли аккум с машины) и оставшемся включенным планшетом ( батарея оставлена) нашим N-CH полевиком некому управлять ( проц то выключен) и транзистор закрывается, убирая массу с ДХ. Экран включается.
Чтобы экран был выключен даже при незапитанном БП я на затвор транзистора подтянул управление с 4,2В ( с батареи планшета) через резистор R15.
Система работает прекрасно, пока включен проц и работает нестабильно при попытке повторить БП.
Чтобы планшет начал тушить экран, нужно подбирать R13 как минимум или R13, R14, R15 как норму.
Начав думать как упростить повторяемость блока и увеличить надёжность пришла на ум такая схема:
47825
Выпаиваем ДХ, вместо него вешаем подтяжку на питание датчика и кондёр от помех ( естественно с микроскопом или хорошей лупой).
Когда подключен обесточенный БП, то опорное напряжение 3,3В с сигнальной ноги ДХ замыкается резистором R2. Экран тухнет.
Когда мы хотим включить экран, то надо подать на сигнальный провод +3,3В. R2 и R3 образуют делитель напряжения, на вход которого мы подаём +5В через P-CH полевик, а на выходе которого получаем +3,3В. Экран включается.
Какие будут ваши мысли\советы ?
совсем забыл один очевидный вариант. Выпаять ДХ и вместо него впаять резистор подтяжки на питание датчика и кондёр от помех ( естественно с микроскопом или хорошей лупой).
47832
nikitoyd
30.07.2017, 00:46
если не готова печатка, могу дать более свежую версию. недавно по ней собирал, вроде всё подписано.
Уже готова и часть деталюх впаена.
Уже готова и часть деталюх впаена.
тогда берите последнюю версию и смотрите по аналогии. Там чуть детали переместились некоторые и добавлена заливка.
Кстати, пару дней катаюсь ( испытываю новый продажный БП ) с конденсаторами по выходу кива 1000uF*6,3В. На прошлом тоже по 1000. Отлично работает. У кого там только на 3300 стабильно пахало, может дело в том, что я ставлю керамические конденсаторы LOW ESR по выходу?
тогда берите последнюю версию и смотрите по аналогии. Там чуть детали переместились некоторые и добавлена заливка.
Кстати, пару дней катаюсь ( испытываю новый продажный БП ) с конденсаторами по выходу кива 1000uF*6,3В. На прошлом тоже по 1000. Отлично работает. У кого там только на 3300 стабильно пахало, может дело в том, что я ставлю керамические конденсаторы LOW ESR по выходу?
Я вообще удивляюсь,как у меня в общей сложностью в 50мкф по ыходу все работает стабильно не один уже месяц ... :shok::blush: Может проблема не в конденсаторах...?
Я вообще удивляюсь,как у меня в общей сложностью в 50мкф по ыходу все работает стабильно не один уже месяц ... :shok::blush: Может проблема не в конденсаторах...?
просьба к тебе будет.
мне нужно, чтобы ты замерял осциллографом момент старта машины.
5в на клетку - 0,5с развёртка на клетку- на входе постоянного +12В(+30) на твой блок питания.
2в на клетку - 0,5с развёртка на клетку - на входе питания батареи планшета(3,8-4,2В).
у меня с новым АКБ просадка до 7В на 0,2С, потом стартер 10В. потом осциллограммы выложу.
просьба к тебе будет.
мне нужно, чтобы ты замерял осциллографом момент старта машины.
5в на клетку - 0,5с развёртка - на входе постоянного +12В(+30) на твой блок питания.
2в на клетку - 0,5с развёртка - на входе питания батареи планшета(3,8-4,2В).
у меня с новым АКБ просадка до 7В на 0,2С, потом стартер 10В. потом осциллограммы выложу.
Ок будет времечко замерю, сам хотел давно посмотреть...
совсем забыл один очевидный вариант.
Вот человек, как мне кажется, еще проще вариант использовал. Подтяжку делать не к 3.3, а к земле.
http://pccar.ru/showpost.php?p=306355&postcount=87
jonikus81
01.08.2017, 06:28
Олег, объясни мне, зачем выпаивать датчик холла, если можно через малюсенький оптрон и сопротивление сразу управлять с МК, подавая землю на ногу датчика?
----
все нашел - экономим 50 мА во сне
Олег, объясни мне, зачем выпаивать датчик холла, если можно через малюсенький оптрон и сопротивление сразу управлять с МК, подавая землю на ногу датчика?
----
все нашел - экономим 50 мА во сне
Датчик Холла выпаивать не нужно (лишние действия паяльником, как показывает практика планшету только вредят), если использовавать для его управления твердотельное реле (http://www.claremicronix.com/home/pdfs.nsf/www/cpc1117n.pdf/$file/cpc1117n.pdf)(оптореле) с нормальнозамкнутым выходом(см. посты выше). В состоянии покоя, когда питание на реле от МК не подается, выходные контакты (http://pccar.ru/attachment.php?attachmentid=47828&d=1501270062) замкнуты и через них на ноге Холла "земля"-планшет "спит". В этом состоянии потребление "0"(1µA для реле в состоянии покоя ). Подали напряжение от МК на управляющий пин реле-выходные контакты разомкнулись-планшет "проснулся". Проще ничего нет.
Здесь (http://cxem.net/beginner/beginner68.php) немного про оптореле. Здесь (http://www.symmetron.ru/suppliers/commutation/commutation13.pdf) вариант отечественных реле.
jonikus81
01.08.2017, 11:44
Датчик Холла выпаивать не нужно (лишние действия паяльником, как показывает практика планшету только вредят), если использовавать для его управления твердотельное реле (http://www.claremicronix.com/home/pdfs.nsf/www/cpc1117n.pdf/$file/cpc1117n.pdf)(оптореле) с нормальнозамкнутым выходом(см. посты выше). В состоянии покоя, когда питание на реле от МК не подается, выходные контакты (http://pccar.ru/attachment.php?attachmentid=47828&d=1501270062) замкнуты и через них на ноге Холла "земля"-планшет "спит". В этом состоянии потребление "0"(1µA для реле в состоянии покоя ). Подали напряжение от МК на управляющий пин реле-выходные контакты разомкнулись-планшет "проснулся". Проще ничего нет.
Здесь (http://cxem.net/beginner/beginner68.php) немного про оптореле. Здесь (http://www.symmetron.ru/suppliers/commutation/commutation13.pdf) вариант отечественных реле.
Моя практика тоже показывает, что чем меньше в планшет лезешь - тем лучше он работает. Про замкнутые реле в курсе, но не думал, что есть такие миниатюрные еще и с минимальным потреблением. Взял на вооружение. Проще и надежнее даже получается, планшет будет спать не зависимо от того, что происходит с МК (перегрев, мозги поплыли или вообще отключился).
Проще и надежнее даже получается, планшет будет спать не зависимо от того, что происходит с МК (перегрев, мозги поплыли или вообще отключился).
Все верно!
И если ко всему еще в БП реализовать отключение контроллера (полное обесточивание) в режиме "сна"планшета и оставить включенным только один модуль DC-DC (как вариант MP1584), питающий планшет - потребление такого "умного" БП в дежурном режиме снизится в разы.
jonikus81
01.08.2017, 12:44
Все верно!
И если ко всему еще в БП реализовать отключение контроллера (полное обесточивание) в режиме "сна"планшета и оставить включенным только один модуль DC-DC (как вариант MP1584), питающий планшет - потребление такого "умного" БП в дежурном режиме снизится в разы.
Идея хороша, только вот мы лишимся таймера сна. Мой планшет "храпит во сне", то есть все равно ест даже с режимом полета, говорят можно отключать гуговские сервисы и снизить еще потребление, но я пока не дошел до этого.
Идея хороша, только вот мы лишимся таймера сна. Мой планшет "храпит во сне", то есть все равно ест даже с режимом полета, говорят можно отключать гуговские сервисы и снизить еще потребление, но я пока не дошел до этого.
Я уже как-то приводил один из вариантов (http://pccar.ru/showthread.php?t=25712) решения вопроса отслеживания напряжения. Все можно реализовать - было бы желание!
Если действительно необходим "таймер сна", то реализуется, например на NE555 (https://yandex.ru/images/search?text=таймер%20на%20555%20большой%20выдержко й&stype=image&lr=2&noreask=1&source=wiz). Но, по большому счету, главная задача "умного" БП - не дать полностью "высадить" АКБ в режиме "сна" планшета. Достаточно правильно организовать отслеживание такой разрядки АКБ и надобность в "таймере" отключения отпадет.
jonikus81
01.08.2017, 13:26
Я уже как-то приводил один из вариантов (http://pccar.ru/showthread.php?t=25712) решения вопроса отслеживания напряжения. Все можно реализовать - было бы желание!
Если действительно необходим "таймер сна", то реализуется, например на NE555 (https://yandex.ru/images/search?text=таймер%20на%20555%20большой%20выдержко й&stype=image&lr=2&noreask=1&source=wiz). Но, по большому счету, главная задача "умного" БП - не дать полностью "высадить" АКБ в режиме "сна" планшета. Достаточно правильно организовать отслеживание такой разрядки АКБ и надобность в "таймере" отключения отпадет.
Реализовано слежение по напруге, спасибо Олегу! Даже отличает просадки при работе стартера.
Реализовано слежение по напруге, спасибо Олегу! Даже отличает просадки при работе стартера.
Это понятно...
Если говорить о "повторяемости" блока, то в программном отслеживании напряжения необходимо подбирать коэффициент (константу) делителя напряжения, что иногда сильно затрудняеет настройку БП. Причем этот параметр напрямую зависит от индивидуальных конструктивных особенностей каждого авто - внутреннее сопротивление АКБ + время года и состояние самого АКБ, длина и сечение проводов, способ подключения...
На мой взгляд БП должен выполнять две главные задачи:первая - отслеживать одно единственное напряжение на АКБ (как пример нижняя граница - 10.5В) для предотвращения его полного разряда и вторая- коммутировать (включать/выключать) каналы питания планшета и периферии. Но это мое мнение и каждый выбирает оптимальный вариант для себя сам.
jonikus81
01.08.2017, 14:18
Это понятно...
Если говорить о "повторяемости" блока, то в программном отслеживании напряжения необходимо подбирать коэффициент (константу) делителя напряжения, что иногда сильно затрудняеет настройку БП. Причем этот параметр напрямую зависит от индивидуальных конструктивных особенностей каждого авто - внутреннее сопротивление АКБ + время года и состояние самого АКБ, длина и сечение проводов, способ подключения...
На мой взгляд БП должен выполнять две главные задачи:первая - отслеживать одно единственное напряжение на АКБ (как пример нижняя граница - 10.5В) для предотвращения его полного разряда и вторая- коммутировать (включать/выключать) каналы питания планшета и периферии. Но это мое мнение и каждый выбирает оптимальный вариант для себя сам.
У меня напруга измеряется так
резистивный делитель на аналоговом пине (как у Олега)
и формулы
float R1 = 51000.0; //значение резистора R1
float R2 = 20000.0; //значение резистора R2
if (millis() - timer_vlt > 23) {
timer_vlt = millis();
value = (value * 9.0 + + analogRead(pin_volt)) / 10.0; // читаем аналоговый сигнал, с аналог. порта - 0
vout = (value * 5.0) / 1024.0; // не забываем про внесение поправки (5.0 - это идеальный вариант,хотя все возможно)
vin = vout / (R2 / ( R1 + R2 )); // в переменной будет значение входного напряжения
}
Корректировка в виде замеров сопротивления резисторов и изменение в переменных R1 и R2. До десятых измеряет точно со средним значением за период. Правда на практике у меня пока что только один такой бп с месяц катается. Дальше логика такая, если больше 10 сек напруга меньше 10,0 вольт, то полное выключение всего. За период 10 сек если превысило 10,0 вольт, то продолжаем работать штатно (защита от падения напруги при работе стартера). Специально для этого собрал полу лабораторный блок питания с плавной регулировкой напряжения :pleasantry:
Надеюсь не заспамили тему Олега :blush:
Все это конечно хорошо..., но не многие могут программировать контроллеры (Ардуино). Я говорю о "физическом", " аппаратном" отслеживании напряжения на АКБ. Если все сделано правильно (подобраны компоненты), то достаточно один раз на столе потенциометром (отверткой) выставить напряжение "разряженного" АКБ (10.5-10.9В для большенства АКБ) и больше не париться с подгонкой (корректировкой) константы. Думаю, что хозяин темы простит нас за флуд. Позже можно все почистить...
Все это конечно хорошо..., но не многие могут программировать контроллеры (Ардуино)....
Тогда получается, что Ваша схема больше подходит для блоков питания, в которых нет ардуинки.
По сути на стабилитроне напряжение срабатывания выставляется тем же самым резистивными делителем. И тут уже кому что проще - написать пару констант в коде прошивки или добавлять в схему дополнительные элементы.
Тогда получается, что Ваша схема больше подходит для блоков питания, в которых нет ардуинки.
По сути на стабилитроне напряжение срабатывания выставляется тем же самым резистивными делителем. И тут уже кому что проще - написать пару констант в коде прошивки или добавлять в схему дополнительные элементы.
Не совсем так...
Контроллер ("Ардуинка") все равно должен присутствовать - он отвечает за временные задержки включения/выключения каналов, определения наличия "АСС" для запуска/выключения алгоритма работы блока вцелом.
Модуль отслеживания на стабилитроне (один из вариантов) позволяет выставить единовременно необходимое напряжение "севшего" АКБ и на внешние факторы не реагирует (напряжение срабатывания стабилитрона основано на собственном внутреннем опорном напряжении и остается неизменным). Здесь (http://tim4dev.com/arduino-secret-true-voltmeter/) информация об отслеживании напряжения средствами контроллера с "плюсами" и "минусами" такого способа... К тому же "программный" вариант не позволяет полностью обесточить контроллер и всю его "обвязку" для уменьшения общего потребления в режиме "сон".
И "аппаратный" метод гораздо проще в плане написания программы управления - всего два режима, как в скетче с кнопкой: "нажали" -выключено, "отпустили"-включено... или наоборот.
Но Вы заметили верно - каждый решает сам, что ему ближе...
Это понятно...
Если говорить о "повторяемости" блока, то в программном отслеживании напряжения необходимо подбирать коэффициент (константу) делителя напряжения, что иногда сильно затрудняеет настройку БП. Причем этот параметр напрямую зависит от индивидуальных конструктивных особенностей каждого авто - внутреннее сопротивление АКБ + время года и состояние самого АКБ, длина и сечение проводов, способ подключения...
На мой взгляд БП должен выполнять две главные задачи:первая - отслеживать одно единственное напряжение на АКБ (как пример нижняя граница - 10.5В) для предотвращения его полного разряда и вторая- коммутировать (включать/выключать) каналы питания планшета и периферии. Но это мое мнение и каждый выбирает оптимальный вариант для себя сам.
калибровка БП давно программная, с записью в еепром проца. Причём софт смотрит, была ли калибровка. Если была - работаем по ней. Если нет - по значениям делителя.
При падении напряжения ниже 11,4В начинается необратимый процесс сульфатации пластин.
По поводу аппаратных решений - я только ЗА. Но у меня в БП используется несколько пороговых значений напряжений.С гистерезисом и логикой обработки (например, если немного подсел АКБ, то выключаем усилитель звука (REM ) и не включаем до заводки или передёргивания зажигания. при этом планшет остаётся активный. Если делать это на делителе плюс стабилитрон, то детали всё те же, еще и больше, а функционала намного меньше.
ps
Тереть сообщения не надо, если что - сам потру ;)
Олег, объясни мне, зачем выпаивать датчик холла, если можно через малюсенький оптрон и сопротивление сразу управлять с МК, подавая землю на ногу датчика?
----
все нашел - экономим 50 мА во сне
еще стабильность при нагреве. Я выпаял датчик, поставил 100K и 0,1uF параллельно. Позже в проект закину фото.
При падении напряжения ниже 11,4В начинается необратимый процесс сульфатации пластин.
Да,да-опечатался! Имел ввиду нижнюю границу 11.5В...
jonikus81
02.08.2017, 07:55
При падении напряжения ниже 11,4В начинается необратимый процесс сульфатации пластин.
Вот этого не знал, спасибо поправлю в своем скетче :blush:
Как раз хотел в выходные устроить краш тест системе, включить ВСЕ и посмотреть в живую процесс посадки АКБ и реакцию БП.
Не хочется на природе в дали от цивилизации искать "прикуривателя" .
Вот этого не знал, спасибо поправлю в своем скетче :blush:
Как раз хотел в выходные устроить краш тест системе, включить ВСЕ и посмотреть в живую процесс посадки АКБ и реакцию БП.
Не хочется на природе в дали от цивилизации искать "прикуривателя" .
Если свинцовый акб разрядить ниже 11,4, а потом сразу начать заряжать ( малым током), то ничего не будет. Но если прошли сутки или более - потеря ёмкости до 50%.
Для кальциевых АКБ вообще грустно. Кривая разряда почти такая же, а вот кривая заряда... В общем при пониженном напряжении зарядки кальциевый акб здыхает.
просадка акб при старте машины. (http://pccar.ru/showpost.php?p=348955&postcount=4)
Ребята подскажите как подключить питание параллельно батарейке, либо как то сделать через микро релюшки, чтобы при подаче напряжения батарейка отключалась и планшет питался от бортовой сети. Батарейку не вынимаю, так как планшет делаю съемным, на задней части планшета делаю контактную площадку.
SilverSky
02.08.2017, 17:01
Ребята подскажите как подключить питание параллельно батарейке, либо как то сделать через микро релюшки, чтобы при подаче напряжения батарейка отключалась и планшет питался от бортовой сети. Батарейку не вынимаю, так как планшет делаю съемным, на задней части планшета делаю контактную площадку.
Проще купить еще одну батарею, а существующею выкинуть оставив контроллер.
так как планшет делаю съемным, на задней части планшета делаю контактную площадку.
Купите лучше второй ибо цена сейчас смешная, таскать туда сюда не вариант.
Просадка у меня:blush:
хм. дизель, штоль? А, вижу, развёртка 0,2с.
Можешь сделать осциллограмму на выходе дс-дс, который к батарее планшета 4,2В ? ( при старте). У меня на kiw3312s вот что (http://pccar.ru/showpost.php?p=348955&postcount=4)
хм. дизель, штоль? [/URL] :no:неее, свечка... пока не могу, почти выехал с республики...:whistle:
Зы. Моему акб 4 года...
не совсем по теме... но наконец-то чтоб не сглазить и я закончил свой проект. долго мучался я с БП... но все косяки сводились в основном изза непропая контактов или ножек компонентов, ну и подбором кондеров. За этот период 2 раза пересобирал плату, и по одному разу поменял звуковуху и хаб.
не дождался я все таки не супер навороченного БП от Александра, ни следующую ревизию БП от Олега -))))
Теперь это все позади... недавно все собрал воедино и уже установил на авто.
По сему выражаю большую благодарность Олегу и другим пользователям из ветки за всю помощь при отладке.
Более подробно про установку планшета Нексуса 7 2012 на Киа Рио можете прочитать тут (https://www.drive2.ru/l/480199609877004390/)
не совсем по теме... но наконец-то чтоб не сглазить и я закончил свой проект. долго мучался я с БП... но все косяки сводились в основном изза непропая контактов или ножек компонентов, ну и подбором кондеров. За этот период 2 раза пересобирал плату, и по одному разу поменял звуковуху и хаб.
не дождался я все таки не супер навороченного БП от Александра, ни следующую ревизию БП от Олега -))))
Теперь это все позади... недавно все собрал воедино и уже установил на авто.
По сему выражаю большую благодарность Олегу и другим пользователям из ветки за всю помощь при отладке.
Более подробно про установку планшета Нексуса 7 2012 на Киа Рио можете прочитать тут (https://www.drive2.ru/l/480199609877004390/)
почитал твой бортжурнал. Молодец!
ревизия БП7 идёт ускореными темпами, ввиду того, что свой БП5 я пустил на запчасти на заказы. Сейчас езжу на БП3.
НО даже если железо БП7 будет без косяков ( в чём я сомневаюсь, проект очень сложный), то еще есть софт. А там ПОЛЕ непаханное. По аналогии с БП5 я закину базовые вещи, но на отладку может понадобиться до года.
Вон БП5 я еще модернизирую. Даже БП3 изредка. ( читал программу БП3 - в шоке был, как я бы сейчас по другому сделал. Но работает ))
Новая прошивка БП3 (ver32) 47914
Новая прошивка t14. стабильная прошивка t13 и печатная плата БП5 47915
Описание подключения БП5 47916 ( кто захочет отредактировать - пишите в личку дам исходник в диптрейсе)
фото БП5-58 уменьшенные. Кому надо в большом разрешении - пишите, буду думать, куда скинуть.
jonikus81
14.08.2017, 07:34
Олег, пробуй 360 mini. Я месяц откатал все как часики, как говорится "ни единого разрыва с января месяца" :big:
И размеры поменьше. Последний тест показал, что работают даже при 7 вольтах :shok: Единственное неудобство, это придется проводок подпаять к ноге EN микрухи, что бы отключать ее.
Олег, пробуй 360 mini. Я месяц откатал все как часики, как говорится "ни единого разрыва с января месяца" :big:
И размеры поменьше. Последний тест показал, что работают даже при 7 вольтах :shok: Единственное неудобство, это придется проводок подпаять к ноге EN микрухи, что бы отключать ее.
э нееет. У меня на "подходе" БП7 (https://youtu.be/MvT4poh0CS4). Так вот там среди прочего те же микросхемы, что и в 360 mini (mp2307)-340кГц, но получше (mp1584) - 1500кГц. Готовый ДС-ДС не хочу ставить вот почему (видео) (https://youtu.be/gcOWf4sMp2Y).
Потому приходится собирать полностью с нуля, с расчётом требуемых МНЕ параметров.
ps
по поводу проводок подпаять к ноге EN микрухи -- там вообще я бы переделал модуль на твоём месте - вместо подтяжки ноги EN на плюс через резистор ( для постоянно включенного модуля) я бы сделал подтяжку на минус, чтобы без внешнего воздействия модуль был выключен. Если что, по этим микросхемам есть инструмент разработчика - вот сайт (http://www.*******hicpower.com/Design-Support/DC-DC-Designer).
jonikus81
14.08.2017, 15:42
ps
по поводу проводок подпаять к ноге EN микрухи -- там вообще я бы переделал модуль на твоём месте - вместо подтяжки ноги EN на плюс через резистор ( для постоянно включенного модуля) я бы сделал подтяжку на минус, чтобы без внешнего воздействия модуль был выключен. Если что, по этим микросхемам есть инструмент разработчика - вот сайт (http://www.*******hicpower.com/Design-Support/DC-DC-Designer).
я так и сделал :yes2:, по умолчанию он выключен
lavalamp
23.08.2017, 10:07
Добрый день Олег, подскажи пожалуйста по поводу делителя Uacc и Uакб, какие номиналы ставить для корректной работы?3я версия блока питания. Просто если судя по схеме асс 20к к 1к, то на порт а7 придет 12 вольт.
Добрый день Олег, подскажи пожалуйста по поводу делителя Uacc и Uакб, какие номиналы ставить для корректной работы?3я версия блока питания. Просто если судя по схеме асс 20к к 1к, то на порт а7 придет 12 вольт.
так 20к на +12 а 1к на массу. Это делитель 1/20. 0,6В. Фото есть, выкладывал.
lavalamp
23.08.2017, 12:24
так 20к на +12 а 1к на массу. Это делитель 1/20. 0,6В. Фото есть, выкладывал.
То есть все верно? а у Uасс 10к к 1к тоже верно? При этих значениях ардуино корректно отслеживает напряжения акб?
То есть все верно? а у Uасс 10к к 1к тоже верно? При этих значениях ардуино корректно отслеживает напряжения акб?
Там опорка внутренняя используется,1,1В. Точности хватает. По номиналам не помню, смотрите фото.
lavalamp
24.08.2017, 00:18
Там опорка внутренняя используется,1,1В. Точности хватает. По номиналам не помню, смотрите фото.
По фото в шапке непонятны номиналы, все в флюсе, в сплане возможно точные номиналы? И ещё вопрос не должны ли быть вас и АКБ одинаковыми раз одинаковое там напряжение,?
По фото в шапке непонятны номиналы, все в флюсе, в сплане возможно точные номиналы? И ещё вопрос не должны ли быть вас и АКБ одинаковыми раз одинаковое там напряжение,?
странно, вроде фото выкладывал где то. залил еще (http://pccar.ru/showthread.php?p=354535#post354535).
Да, делители одинаковы. Нелогично было бы делать разные.
lavalamp
24.08.2017, 08:41
странно, вроде фото выкладывал где то. залил еще (http://pccar.ru/showthread.php?p=354535#post354535).
Да, делители одинаковы. Нелогично было бы делать разные.
Спасибо большое
Приветствую! Имею крайне упрощенный вариант БП по схеме (nexus 7 2013 -> usb-hab). Все уже подходит к стадии экспериментов. Но тут образовался вопрос. Подпаялся я к контроллеру батареи как на фото (допаял провод от -батареи к конектору (в пэинте чирканул как)) при этом батарея осталась на своем месте. Правильный ли это вариант?
Провода от контроллера (зеленый и синий) не резал
http://savepic.net/9757403.jpg
ps интересно узнать еще, при стоковом андройде какое ядро использовали?
На данный момент стоит 7.1.1 и elementalX. Хочу чтоб работал easycap stk1160, тут и стал вопрос, что из ядер поставить
Друзья, покритикуйте плату, глаз замылился.:hypo:
4800948010
4801148012
и ГДЕ критика? А то я уже на производстве готов заказывать.
и ГДЕ критика?..
Так чтобы тут критиковать надо разобраться для начала :smile1:
ну хотя бы по схемотехнике. я по мелочи подправил там еще и хочу как нибудь для невстроенной 2704 юсб сделать и всё. И так там напихано по самое не могу.
я так понимаю внешний разъем по распиновке делаете как у БП5? взаимозаменяемые?
Естественно. У меня даже с бп3 одинаковые. Только без выхода на y- otg, потому как хаб встроенный, но можно перемычкой будет для тестов припаять.
Alekssandr
29.08.2017, 01:04
oleg707
Я повторюсь. Вы повторяете мой опыт, используя аналоговый аудиопроцессор. От белого шума избавиться не сможете, в итоге плата и потраченное время пойдут в помойку.
oleg707
Я повторюсь. Вы повторяете мой опыт, используя аналоговый аудиопроцессор. От белого шума избавиться не сможете, в итоге плата и потраченное время пойдут в помойку.
Спасибо, Саша, я видел и помню.
Эти процессора ставились в музыкальные центры (например (http://diagramas.diagramasde.com/audio/JVC%20HX-D7%20Sch.pdf)) и магнитолы:secret:.
Белый шум будет в любом устройстве, вопрос тут в соотношении сигнал\шум.
В любом случае прототип я собирал (http://pccar.ru/showthread.php?t=24440), по параметрам сравнивал с ресивером, который я покупал за 1100$ (1300 со скидкой). Неделю слушал дома на колонках за 1000$. Ну НОРМАЛЬНО он играет!
Если звук не устроит, то будет оптический выход и ПЦМ выход. Который можно будет заводить на внешний звуковой аудиопроц (которые стоят от 500$-меня жаба душит) но это ИМХО лишнее для машины 2000 зелени в акустику в авто зарывать. Для дома - другое дело.
Сейчас у меня 2704, аудиовыход которой напрямую! выведен на усилок звука (http://pccar.ru/showpost.php?p=355473&postcount=7). Белый шум очень тихий, а когда в дороге вообще не слышно. Громкость хорошая, слышно снаружи закрытой машины у соседей дома :blush:
Я так понимаю организацию подключения Вашего блока по схеме как на рисунке (для удобства разъем пронумеровал).
Возникает ряд вопросов:
1. При установке питающего провода желательно у аккумулятора поставить предохранитель F1 - какой номинал по максимуму потребления?
2. Для регистратора "+" от 20 ноги разъема, а "-" от чего 17?
3. При формировании OTG (как в посте http://www.pccar.ru/showpost.php?p=390405&postcount=2722) все экранирующие оплетки (общий и данных) соединены с корпусами разъемов micro USB на планшете и USB В на HUB, а дальше на "-" 17 разъема (- планшета) и минус питания HUB или просто "-" АКБ?
4. Где то видел фото как подключиться к Холлу на 7/2013, если не трудно ссылочку плиз, и надо ли экранировать провод к Холлу (вроде читал про наводки)?
5. АКБ и контроллер оставляем в планшете (подключаемся напрямую на провода "+" и "-" после контроллера ) - провода данных (D+ и D-) разрезаем? Если да, то что теряем. И если АКБ оставляем, то насколько он может быть убитым?
6. Где и как лучше подпаяться к клеммам громкости и вкл/выкл.
7. Есть ли смысл использовать внешний GPS приемник?
8. Насколько сильно греется БП? Желателен ли доп вентилятор? (планирую БП, хаб, фм, изикап разместить в корпусе от БП компа, а там можно штатно вентилятор установить)
Я так понимаю организацию подключения Вашего блока по схеме как на рисунке (для удобства разъем пронумеровал).
Возникает ряд вопросов:
1. При установке питающего провода желательно у аккумулятора поставить предохранитель F1 - какой номинал по максимуму потребления?
2. Для регистратора "+" от 20 ноги разъема, а "-" от чего 17?
3. При формировании OTG (как в посте http://www.pccar.ru/showpost.php?p=390405&postcount=2722) все экранирующие оплетки (общий и данных) соединены с корпусами разъемов micro USB на планшете и USB В на HUB, а дальше на "-" 17 разъема (- планшета) и минус питания HUB или просто "-" АКБ?
4. Где то видел фото как подключиться к Холлу на 7/2013, если не трудно ссылочку плиз, и надо ли экранировать провод к Холлу (вроде читал про наводки)?
5. АКБ и контроллер оставляем в планшете (подключаемся напрямую на провода "+" и "-" после контроллера ) - провода данных (D+ и D-) разрезаем? Если да, то что теряем. И если АКБ оставляем, то насколько он может быть убитым?
6. Где и как лучше подпаяться к клеммам громкости и вкл/выкл.
7. Есть ли смысл использовать внешний GPS приемник?
8. Насколько сильно греется БП? Желателен ли доп вентилятор? (планирую БП, хаб, фм, изикап разместить в корпусе от БП компа, а там можно штатно вентилятор установить)
отвечу на часть вопросов.
1 - F1 есть в самом БП5, 5А. (можно 3А)
2 - масса любая с кузова авто или 1,2,3.
3 - я взял обычный micro-USB 2.0. тип В кабель, отрезал микро разъём и припаял точно такой же, купленный. Только на 4 пин этого микро юсб дал провод с блока питания (OTG). Экран для этого провода не делал. Длинна около метра.
Землю на ЮСБ надо брать с ЮСБ!
4 - Провод к холлу не экранирован, наводок нет ( и в теории быть не может). фото нет.
5 - теряем обмен информацией между контроллером батареи и материнской платой ( то есть по сути ничего). В 7-2012 нексусе просто показывает 0%. С ядром Даниэля 100%. В 7-2013 возможен отказ загружаться ( вроде бы), зависит от ядра. У меня 2012, поэтому подробнее не скажу.
6 - ТОЛЬКО шлейф кнопок. В остальных случаях почти всегда повреждение материнской платы ( меня это тоже не обошло)
7 - мне хватает внутреннего.
8 - не сильно, я без радиатора ставлю, проверку жарой на прямом солнце отлично отработал. Планшет вот кипяток - до тача горячо дотрагиваться было.
Изикап у вас подключен неправильно. Лучше резать +5В на питании изикапа при появлении задней передачи.
ИМХО. у меня без всякого экранирования все работает. правда кабель от усб до планшета у меня получился короткий - около 15-20см.
отвечу на часть вопросов.
1 - F1 есть в самом БП5, 5А. (можно 3А)
2 - масса любая с кузова авто или 1,2,3.
3 - я взял обычный micro-USB 2.0. тип В кабель, отрезал микро разъём и припаял точно такой же, купленный. Только на 4 пин этого микро юсб дал провод с блока питания (OTG). Экран для этого провода не делал. Длинна около метра.
Землю на ЮСБ надо брать с ЮСБ!
4 - Провод к холлу не экранирован, наводок нет ( и в теории быть не может). фото нет.
5 - теряем обмен информацией между контроллером батареи и материнской платой ( то есть по сути ничего). В 7-2012 нексусе просто показывает 0%. С ядром Даниэля 100%. В 7-2013 возможен отказ загружаться ( вроде бы), зависит от ядра. У меня 2012, поэтому подробнее не скажу.
6 - ТОЛЬКО шлейф кнопок. В остальных случаях почти всегда повреждение материнской платы ( меня это тоже не обошло)
7 - мне хватает внутреннего.
8 - не сильно, я без радиатора ставлю, проверку жарой на прямом солнце отлично отработал. Планшет вот кипяток - до тача горячо дотрагиваться было.
Изикап у вас подключен неправильно. Лучше резать +5В на питании изикапа при появлении задней передачи.
1. Питание для планшета и всей остальной лабуды тянуть буду свое (провода уже купил) поэтому что бы где-то что-то не коротнуло на корпус буду ставить пред. Вот и пытаюсь рассчитать общий ток на шине. Я так понял 5А на БП достаточно.
3. "+5в" в usb разрываем? Экран по дате и наружный соединяем и на корпуса micro usb и usb b (хаба) и все? Или же еще и GND PLANS туда же?
5. Рвем дату только при работе на даниэле? Я не хочу на 4 перехдить. Для 6 тоже рвем? Или я что то не понимаю? При разрезе даты он вроде уйдет в постоянную перезагрузку или вообще отключиться уже писали об этом.
6. Куда на шлейф? (С 2012 все просто)
7. Я сзади к планшету планирую корпус от БП персоналки прикрутить и туда все калабашки уже монтировать. Боюсь он антеннки прикроет.
8. Да уже мне кто то писал сто очень сильно греется и что нет решения? Ну там дыочек в корпусе насверлить хоть какой то ток воздуха или вентиялтор сзади прикрутить?
Изикап еще гчень далеко...:blush: посто в плане. Дже тему еще не читал....
jonikus81
31.08.2017, 13:50
1. Питание для планшета и всей остальной лабуды тянуть буду свое (провода уже купил) поэтому что бы где-то что-то не коротнуло на корпус буду ставить пред. Вот и пытаюсь рассчитать общий ток на шине. Я так понял 5А на БП достаточно.
3. "+5в" в usb разрываем? Экран по дате и наружный соединяем и на корпуса micro usb и usb b (хаба) и все? Или же еще и GND PLANS туда же?
5. Рвем дату только при работе на даниэле? Я не хочу на 4 перехдить. Для 6 тоже рвем? Или я что то не понимаю? При разрезе даты он вроде уйдет в постоянную перезагрузку или вообще отключиться уже писали об этом.
6. Куда на шлейф? (С 2012 все просто)
7. Я сзади к планшету планирую корпус от БП персоналки прикрутить и туда все калабашки уже монтировать. Боюсь он антеннки прикроет.
8. Да уже мне кто то писал сто очень сильно греется и что нет решения? Ну там дыочек в корпусе насверлить хоть какой то ток воздуха или вентиялтор сзади прикрутить?
Изикап еще гчень далеко...:blush: посто в плане. Дже тему еще не читал....
1. 5А за глаза.
3. в шапке темы 2013го нексуса есть подробнейшая и правильная схема провода юсб.
6.если нет трех пятачков меди сразу за шлейфом, то они скорее всего с другой стороны платы (обычно у wifi версии так).
7. Сплошной металл за крышкой планшета перекроет все антены. Сигнал ослабнет сильно. Как вариант пластиковый корпус и с зазором между планшетом. Ну или костыли с выносной антеной.
8.Сам планшет не боится температур, а вот датчик на контроллере батареи при нагреве будет отключать планшет, лечится выпаиванием датчика и заменой его сопротивлением на 10к (подробнее в шапке темы 2013го нексуса ).
1. 5А за глаза.
3. в шапке темы 2013го нексуса есть подробнейшая и правильная схема провода юсб.
6.если нет трех пятачков меди сразу за шлейфом, то они скорее всего с другой стороны платы (обычно у wifi версии так).
7. Сплошной металл за крышкой планшета перекроет все антены. Сигнал ослабнет сильно. Как вариант пластиковый корпус и с зазором между планшетом. Ну или костыли с выносной антеной.
8.Сам планшет не боится температур, а вот датчик на контроллере батареи при нагреве будет отключать планшет, лечится выпаиванием датчика и заменой его сопротивлением на 10к (подробнее в шапке темы 2013го нексуса ).
с выпаиванием датчика не согласен. Батарея этим защищена от перегрева и критической перегрузки.
jonikus81
31.08.2017, 15:28
с выпаиванием датчика не согласен. Батарея этим защищена от перегрева и критической перегрузки.
Да точно, я и забыл, что батарея оставлена. Тут и карлсоны не помогут в жару на солнце.
1. 5А за глаза.
3. в шапке темы 2013го нексуса есть подробнейшая и правильная схема провода юсб.
6.если нет трех пятачков меди сразу за шлейфом, то они скорее всего с другой стороны платы (обычно у wifi версии так).
7. Сплошной металл за крышкой планшета перекроет все антены. Сигнал ослабнет сильно. Как вариант пластиковый корпус и с зазором между планшетом. Ну или костыли с выносной антеной.
8.Сам планшет не боится температур, а вот датчик на контроллере батареи при нагреве будет отключать планшет, лечится выпаиванием датчика и заменой его сопротивлением на 10к (подробнее в шапке темы 2013го нексуса ).
1.5А а усилитель? Я же говорю что собираюсб новые шины тянуть по 3.5 квадрата через предохранитель. Т.е для бп с хабом 5а достаточно+ усилитель (хочется класса D установить)
2. Оттуда и взят и hdmi провод уже есть.
3. У меня 2013 lte flo а на шлейф сложно? Олег говорит на шлейф надо, планшет будет стоять стационарно.
4,7. У меня за планшетом места навалом там четыре таких блока запихнуть можно. Железную каробку можно и отодвинуть вглубь. Сколько между ней и корпусом планшета надо оставить см 5-10? Просто хочется единую кострукцию вставлять.
А нельзя к контактам которые идут на крышку подпаять провода и вообще крышку в другое место установить? Заодно и вентиляция улучшется? А может проще внешнюю GPS установить?
8. Т.е. летом это чудо будет периодически отключаться? И это исправить никак нельзя? Даже если с воздуховодов подать принудительный обдув?
1.5А а усилитель? Я же говорю что собираюсб новые шины тянуть по 3.5 квадрата через предохранитель. Т.е для бп с хабом 5а достаточно+ усилитель (хочется класса D установить)
2. Оттуда и взят и hdmi провод уже есть.
3. У меня 2013 lte flo а на шлейф сложно? Олег говорит на шлейф надо, планшет будет стоять стационарно.
4,7. У меня за планшетом места навалом там четыре таких блока запихнуть можно. Железную каробку можно и отодвинуть вглубь. Сколько между ней и корпусом планшета надо оставить см 5-10? Просто хочется единую кострукцию вставлять.
А нельзя к контактам которые идут на крышку подпаять провода и вообще крышку в другое место установить? Заодно и вентиляция улучшется? А может проще внешнюю GPS установить?
8. Т.е. летом это чудо будет периодически отключаться? И это исправить никак нельзя? Даже если с воздуховодов подать принудительный обдув?
1 - а усилитель отдельным предом. Никто ж не знает, что там у тебя. У меня 10мм диаметр меди на УЗЧ, два преда по 20А(или больше?) на самом УЗЧ
3 - ТОЛЬКО на шлейф. Иначе повреждают плату. Но можно рискнуть :wink2:
4,7 - не усложняйте. Запустите сначала, потом допилите по ходу.
8 - смотрите мой проект. Летом отлично. Зимой тоже. Просто работает. Иногда глючит, когдя я новые прошивки или блоки питания обкатываю :big: ( всё реже).
Alex67rus
03.09.2017, 22:06
Здравствуйте. Проблема заключается в выводе с усб в хаб. Нексус 2012 вифи. После установки прошивки от Тимура не работает ни какое подключаемое устройство через отг кабель. Помогите пожалуйста. Питание через него подавится. Спасибо
Здравствуйте. Проблема заключается в выводе с усб в хаб. Нексус 2012 вифи. После установки прошивки от Тимура не работает ни какое подключаемое устройство через отг кабель. Помогите пожалуйста. Питание через него подавится. Спасибо
эм, так дело может в прошивке? Сделать бэкап и прошить сток.
проверять на клавиатуре или на мышке.
Дался вам этот Тимур...
ЗЫ
И как этот вопрос связан с блоком питания?
Alex67rus
03.09.2017, 22:21
эм, так дело может в прошивке? Сделать бэкап и прошить сток.
проверять на клавиатуре или на мышке.
Дался вам этот Тимур...
ЗЫ
И как этот вопрос связан с блоком питания?
А что посоветуете поставить?
А что посоветуете поставить?
у меня стоит автодроид 1,2 ( с ядром Даниэля)
э нееет. У меня на "подходе" БП7 (https://youtu.be/MvT4poh0CS4). Так вот там среди прочего те же микросхемы, что и в 360 mini (mp2307)-340кГц, но получше (mp1584) - 1500кГц.
Олег, привет!
Ты тестил mp1584 под нагрузкой 2-3А?
Судя по отзывам он 2А то ели держит и нагревается под 100 градусов через пару минут работы, в отличии от mp2307, который при тех же условиях остается тепленьким.
Олег, привет!
Ты тестил mp1584 под нагрузкой 2-3А?
Судя по отзывам он 2А то ели держит и нагревается под 100 градусов через пару минут работы, в отличии от mp2307, который при тех же условиях остается тепленьким.
Привет.
А разве у нас нагрузка не 1А по +5? (по 12В 0,3А (https://youtu.be/ZXcNYxcIh9U))Платы уже заказаны, вроде даже сделаны. Приедут - буду играться.
Привет.
А разве у нас нагрузка не 1А по +5? (по 12В 0,3А (https://youtu.be/ZXcNYxcIh9U))Платы уже заказаны, вроде даже сделаны. Приедут - буду играться.
Нагрузка динамическая, и зависит от разных факторов.
Попробуй запустить на нем тест geekbench, и будешь приятно удивлен.
Еще версия с симкой жрет примерно на 0.5А больше версии вифи, особенно при поиске сигнала.
Нексус 9 в тесте гигбенч жрет до 4,5А !!! ))) вот был нежданчик для меня.
Нагрузка динамическая, и зависит от разных факторов.
Попробуй запустить на нем тест geekbench, и будешь приятно удивлен.
Еще версия с симкой жрет примерно на 0.5А больше версии вифи, особенно при поиске сигнала.
Нексус 9 в тесте гигбенч жрет до 4,5А !!! ))) вот был нежданчик для меня.
соберу блок - померяю.
Но и те и те микросхемы на 3А макс тока расчитаны, только одна на 340кГц ( и не греется) а вторая на 1500кГц ( и греется?!). Не верю.
Тем более по референсу у них почти одинаковое подключение. ( я на БП7 здоровый полигон для охлаждения про запас выделил, с 2х сторон).
Еще может греться из-за того, что режим микросхемы не соответствует расчётному (https://youtu.be/gcOWf4sMp2Y).
Может, если не лень будет, сделаю осциллограмму ТОКА при отключенной батарее. Но это планшет снимать надо - нет у меня запасного для опытов. А это машину разбирать, что сложнее.
Воткак раз наткнулся на мини обзор mini360 (https://mysku.ru/blog/aliexpress/47974.html).
jonikus81
07.09.2017, 13:35
из личного опыта mini-360
1,8 А не греется вообще
2 А греется, рука терпит
2,4 А греется так, что коснуться нельзя
2,6 - 3,0 срабатывает защита и происходит отключение
Переплюсовка - смерть моментальная.
У меня дизель и просадки по напряжению соответсвующие, при этом ни один модуль за все время не отключился, а их в БП 3. Да, греется тот, что питает планшет, но продолжает пахать гад ) при этом пережил пекло в салоне, а это о многом говорит.
из личного опыта mini-360
1,8 А не греется вообще
2 А греется, рука терпит
2,4 А греется так, что коснуться нельзя
2,6 - 3,0 срабатывает защита и происходит отключение
Переплюсовка - смерть моментальная.
У меня дизель и просадки по напряжению соответсвующие, при этом ни один модуль за все время не отключился, а их в БП 3. Да, греется тот, что питает планшет, но продолжает пахать гад ) при этом пережил пекло в салоне, а это о многом говорит.
рабочая температура электронных компонентов - 60 градусов. 80 - нагрузка. 95 - уже перегрев. Так что полностью согласен, работать будет.
По поводу переплюсовки - подтверждаю :blush:
рабочая температура электронных компонентов - 60 градусов. 80 - нагрузка. 95 - уже перегрев. Так что полностью согласен, работать будет.
По поводу переплюсовки - подтверждаю :blush:
Немного не так ... Operating Temperature .............–20°C to +85°C это температура воздуха где эксплуатируется изделия . Защита микросхемы 150° и гистерезис 15°. Как правило рабочая температура кристалла может быть 100-120° без особых последствий кроме срока эксплуатации... но лучше стремиться к минимальному нагреву.:blush:
ну так поэтому я для себя нагрев до 60 считаю номинальным, в идеале - температура воздуха плюс 5 градусов.
Еще критерий - можно ли держать долго руку.
Жду платы с производства (бп7 и БП5 на мини 360), идут оочень долго. Еще нормальный флюс и паяльную пасту заказал, по идее процесс вообще близко к производству должен стать. Паяльную печь покупать не буду (как некоторые.)
Так что уже руки чешутся:854:, а посылок всё нет :cold:.
jonikus81
29.09.2017, 06:51
ну так поэтому я для себя нагрев до 60 считаю номинальным, в идеале - температура воздуха плюс 5 градусов.
Еще критерий - можно ли держать долго руку.
Жду платы с производства (бп7 и БП5 на мини 360), идут оочень долго. Еще нормальный флюс и паяльную пасту заказал, по идее процесс вообще близко к производству должен стать. Паяльную печь покупать не буду (как некоторые.)
Так что уже руки чешутся:854:, а посылок всё нет :cold:.
Олег привет.
По подробнее где заказывал можно? и про нормальный флюс с пастой поподробее) если не сложно)
Вот придут, потом и расскажу. Пасту и флюc тоже сам испытать хочу сначала.
Мне плохо, что сроки поджимают, через 2,5 недели в отпуск ехать.
А так ещё набрал себе 603 кондёров и резисторов, да и 805 при купил про запас. И ещё электролитов 1000*25В, кои разлетаются, как мухи на ветру.
Зато теперь меньше думать, где взять редкий резистор.
Олег 707 приветствую!!! Подскажи пожалуйста?
В твоём первоклассном блоке реализована функция первого включения, 4pin на землю, с задержкой до окончания загрузки Google? А именно в самом скетче Ардуино есть эта функция. Я не сильно разбираюсь программировании и моё знание на много отстаёт от твоего. Вижу что функция с первым включение REM реализована, а вот 4pin не могу разобраться.
Эта проблема в основном с 2012 3G, именно инициализация EasyCap, если 4pin включить до окончания загрузки Google (секунд 20 у кого как), при первом включении то EasyCap не работает. Именно нужно чтоб 4pin замкнулся на землю только при появлении Bootanimation Nexus то что после Google, тогда Изик нормально срабатывает.
Суть в том, первое включение секунд 20 (когда отключен в связи с простоем или разрывом питания) должно быть долгое, а последующее включения, при условии что устройство было в спящем режиме практически сразу после включения OTG это секунд 5.
Спасибо!!!
Олег 707 приветствую!!! Подскажи пожалуйста?
В твоём первоклассном блоке реализована функция первого включения, 4pin на землю, с задержкой до окончания загрузки Google? А именно в самом скетче Ардуино есть эта функция. Я не сильно разбираюсь программировании и моё знание на много отстаёт от твоего. Вижу что функция с первым включение REM реализована, а вот 4pin не могу разобраться.
Эта проблема в основном с 2012 3G, именно инициализация EasyCap, если 4pin включить до окончания загрузки Google (секунд 20 у кого как), при первом включении то EasyCap не работает. Именно нужно чтоб 4pin замкнулся на землю только при появлении Bootanimation Nexus то что после Google, тогда Изик нормально срабатывает.
Суть в том, первое включение секунд 20 (когда отключен в связи с простоем или разрывом питания) должно быть долгое, а последующее включения, при условии что устройство было в спящем режиме практически сразу после включения OTG это секунд 5.
Спасибо!!!
Нет, насколько я помню, на 4 пин юсб нет другой логики при первом включении. Оно при загрузке само должно опрашивать устройства . изи кап вообще рекомендуется запитывать так: при втыкании задней подавать +5В на питание капа.
Как костыли можешь сделать переменную, равную 1 после того, как миллис будет 20000 ( 20с)
И включать отг при переменной равной 1.
Кстати, пока я сейчас катаюсь на бп3, у меня начал сходить с ума контроллер батареи, часто имею глюки при старте машины. Как раз едет 3фарадный йонистр, вместо батареи подкинуть.
Спасибо.
У меня в разрыв на включение задней скорости был на D- или D+ точно не помню, вроде как быстрее срабатывала. Буду дома, если на долго, то займусь переделкой на включение питания на Изик. Беда в том что если включить 4pin до загрузки Google, то ИЗИК отказывается работать даже если его не было в Хосте, в Хабе, без разницы, остальное работает, жесткий, ауди-карта а вот ИЗИК никак. Очень впечатлен вашей разработкой, нравится именно реализация ардуино как . управлятор всей системой работы блока. Ардуино у меня давно, дома уже ждёт KIW, буду делать по вашей техналогии. Пока работает КарПС на чистой логике реле, но есть нюансы, хочется более технологичного решения.
В планах переработка вашего скетча и немного схемы, хочу добавить, функцию включения задней камеры от сигнала заднего хода, тем самым реализовать подачи питания или D+ на ИЗИК, чем замыкаться или подаваться будет то ли через реле то ли через транзистор управляя базой с ардуино, толи мультиплексер реализовать в схеме. Также имея в машине магнитолу которая может выводить изображение, смотреть DVD на монитор через AV, реализовать переключение ВЧ сигнала между камерой и DVD однотактным переключением ВЧ сигнала с кнопки на панели салона в ИЗИК. Не слишком силён в программировании, мой ум больше расположен найти неисправность в схеме и на плате, чем воссоздать в реальность задуманное, есть наработки есть скетчи в отдельности, есть схемы, в эмуляции всё работает опять же в отдельности. Осталось всё это собрать в единое целое.
Про переменную и думал, какую еще не дошла мысль, но надо было уточнить у вас.
Спасибо за подсказку.
Суть в том, первое включение секунд 20 (когда отключен в связи с простоем или разрывом питания) должно быть долгое, а последующее включения, при условии что устройство было в спящем режиме практически сразу после включения OTG это секунд 5.
Спасибо!!! Свои комментарии по реализации этот алгоритма отправил в личку.
Свои комментарии по реализации этот алгоритма отправил в личку.
а чего в личку, тема то общая. Уже и сюда выкладывай.
Очень впечатлен вашей разработкой
ндаа, что тогда про бп7 (https://youtu.be/MvT4poh0CS4)говорить :big:
dima_dima_dima
02.10.2017, 23:50
Собрал БП по схеме Олега, немного доработав под себя, в итоге получилось как то так, вдруг кому будет интересно:
Плата переходная с внутрянки Нексуса на внешнюю плату:
1 (https://photos.app.goo.gl/YEM8RcWNEDPSXaih2)
Внешняя плата с разъемом DB15:
2 (https://photos.app.goo.gl/msWQBpmQlW6uGwv22)
Плата-расширение для блока питания:
3 (https://photos.app.goo.gl/ADsUIt3q3YW4xbw92)
4 (https://photos.app.goo.gl/2lWxIXrXFHUCDtAh1)
На этой плате разведены кнопки, все нужные подключения к планшетным внутренностям, плюс выход аудио с наушников.
Сам блок питания оставил почти без изменений, немного перерисовал в спринте:
https://photos.app.goo.gl/EAbvIjmyqRQbgTZ63
https://photos.app.goo.gl/rYkYfYHNO0jNEgXP2
Первый запуск на столе с подключенной мышью, жёстким диском, звуковухой и кардридером, полёт отличный:
https://photos.app.goo.gl/GyatmRftiIxTANkk1
Ну и вот так все это выглядит в Субару Форестер:
https://photos.app.goo.gl/quG4OHZlQ5tI2MCW2
https://photos.app.goo.gl/UgMc9W8Trqlpz6yX2
зачёт.
Экран отключи, он тупо для отладки нужен, я около года не пользуюсь ( иногда только). (резисторы подтяжки только оставь).
Питание АКБ откуда брал?
Смотрю на своё творение и не узнаю, я на полгода где-то впереди, уже и платы новые разработаны, и проекты целые.
Если всё норм пройдёт - потом поделюсь.
dima_dima_dima
03.10.2017, 17:36
Экран отключить не получается, после этого все перестаёт работать, ардуина наглухо зависает и не помогает даже ресет, постоянно горит светодиод, но, я заметил, что и кив пищать перестаёт, если его отключить, с чем связано не понимаю(
Питание брал с фишки часов, благо там есть все нужные провода.
Второй день, полёт нормальный!зачёт.
Экран отключи, он тупо для отладки нужен, я около года не пользуюсь ( иногда только). (резисторы подтяжки только оставь).
Питание АКБ откуда брал?
Смотрю на своё творение и не узнаю, я на полгода где-то впереди, уже и платы новые разработаны, и проекты целые.
Если всё норм пройдёт - потом поделюсь.
фотал ночью с фонариком.
4831048311
Обкатываю новую версию БП5, на базе mini360.
Уменьшил крайние значения работоспособности блока, теперь 6В ( мгновенная просадка при старте)
Откатался день. Стабильно. Почти не греется под нагрузкой - даже не тёплая.
Очень доволен.
_______________________
последние 2 БП5mini едут в Украину. Для сборки остальных нужно время и запчасти. Поскольку еду в отпуск, в ближайший месяц заказы не принимаю.
Если успею, выложу прошивку и схему БП5mini.
осциллограммы БП5mini на машине (видео) (https://www.youtube.com/watch?v=qJyoExxWB94&feature=youtu.be)
kazanova
14.10.2017, 20:28
oleg707,
Могу я попросить выложить электрическую схему БП5?
oleg707,
Могу я попросить выложить электрическую схему БП5?
Схемы нет. Вообще нет :be:. Только печатка. Если кто нибудь нарисует - будет хорошо.:yes4:
Друзья, выложил в шапку (http://pccar.ru/showthread.php?t=23236)печатную плату и прошивки для БП5mini, на базе DC-DC преобразователя mini360. Там же ссылки на осциллограммы. Подключение аналогично БП5 - фишки полностью совместимы.
jonikus81
16.10.2017, 09:30
Олег, на звук как то повлияла замена БП? У меня пропал фантомный звон и регулярные ЦЫКИ, но шум ветра при полной громкости остался, звуковуха как у тебя, звук идет в аукс магнитолы.
Олег, на звук как то повлияла замена БП? У меня пропал фантомный звон и регулярные ЦЫКИ, но шум ветра при полной громкости остался, звуковуха как у тебя, звук идет в аукс магнитолы.
Никак не повлияла. Нормальный звук как был, так и остался. Что на 3, что на 4, что на5й, что на 5mini.
Но у более свежих версий улучшены массовые полигоны. Для того, чтобы немного меньше думать установщику куда подключать массовые точки.
Шум ветра - почиай про "белый шум" - это шумят собственные компоненты карты и усилителя. Кстати, обвязка pcm2704 имеет огромное значение, плёночные конденсаторы играют намного лучше, чем керамические ( смд). Слышно только на хороших динамиках и УЗЧ.
Бороться очень просто - на ауксе в настройках магнитолы уменьши чувствительность. Если таких настроек нет, то припаяй на выход звуковой карты резисторы, как у меня в проекте (http://pccar.ru/showthread.php?p=355473#post355473). Или не выкручивай на полную громкость :smile1:
Кстати, на полной громкости белый шум у меня на акустической системе стоимостью около 2000$ ( домашней). Схожий с 2704. Это нормально.
Шумят полупроводники. Если хочется лучше - тогда "тёплый ламповый звук":ar:
sasha_vasilkov
16.10.2017, 16:12
последние 2 БП5mini едут в Украину. Для сборки остальных нужно время и запчасти. Поскольку еду в отпуск, в ближайший месяц заказы не принимаю.
А кто в Украине занимается карпс? соберите мне нексус.....год неполучается...плс.
или может в Белорусии приймут мой планшет под переделку?
А кто в Украине занимается карпс? соберите мне нексус.....год неполучается...плс.
или может в Белорусии приймут мой планшет под переделку?
Так а в чём проблема? Там к датчику холла самое трудное припаяться и к кнопкам ( у меня кнопок сейчас вообще нет).
Если сам не можешь - любой ремонтник телефонов сделает.
Остальное - припаяться к материнке того же планшета, закинув от БП питание на батарею и ВСЁ. Базовая конфигурация ГОТОВА. :wink2:
В штекер наушников кабель и на AUX магнитолы.
Поездишь годик - будешь думать, достаточно ли тебе или хочешь плюшек типа звуковой карты, изикапа, автовключения и прочего. :yes2:
Если что, пиши вайбер или вотсапп плюс37529триста952семь8семь. Текстом писать доолго, проще на словах рассказать.
jonikus81
17.10.2017, 15:25
с наушников в аукс прокатит только с 2012м нексусом, у 2013го звук с наушников просто ужасен(хоть у самого 2013й), из моей практики я не встречал устройств с таким отвратным звуком из наушников. А так да, решить снимать или оставлять батарею и паять, а дальше хотелки начинают расти и заставляют читать форум и познавать неизведанное, ну или платить бабло умельцам.
PS. мой последний БП прошел тесты с камерой обгона и камерой ЗХ одновременно, надо будет запилить видосик)
sasha_vasilkov
17.10.2017, 18:01
Так а в чём проблема? Там к датчику холла самое трудное припаяться и к кнопкам ( у меня кнопок сейчас вообще нет).
Если сам не можешь - любой ремонтник телефонов сделает.
Остальное - припаяться к материнке того же планшета, закинув от БП питание на батарею и ВСЁ. Базовая конфигурация ГОТОВА. :wink2:
В штекер наушников кабель и на AUX магнитолы.
Поездишь годик - будешь думать, достаточно ли тебе или хочешь плюшек типа звуковой карты, изикапа, автовключения и прочего. :yes2:
Если что, пиши вайбер или вотсапп плюс37529триста952семь8семь. Текстом писать доолго, проще на словах рассказать.
Нужен БП нормальный (Ваш), я стенд делал с китайских источников, батарею выбросил - подал питание на контролер, другой источник на юсб.
и тут все началось - не инецилизирует хаб, нужно както с задержкой подключать источник. после засыпания - тоже проблемы. а еще камеру надо обязательно (купил плату захвата на UTV007, но чето нейдет).
Мне нужна помощь комплексная: покупка нормального БП и хаба, сборка планшета / настройка/прошивка нормальной прошивкой, подключение камеры.
А руки кривые и времени никогда нет. потому и тянется год.
Задачи от планшета в общем не сложные, но главное стабильность работы: включения/засыпания/выключения (автоматическое, без кнопок), работа (включение/выключение внутренего жпс, вифи и блутуз), автозапуск пару специальных приложух и поверамп, стабильная работа камеры зх (таккак жена часто ездит, и привыкла к штатной камере, если уберу - капец машине).
падений напряжений нету - так как електромобиль. кнопок руля ненадо. звук по аукс устраивает (нексус 2012).
потому готов заплатить комуто
включения/засыпания/выключения (автоматическое, без кнопок) Что бы не дублировать, в личке.
kazanova
17.10.2017, 22:06
Схемы нет. Вообще нет :be:. Только печатка. Если кто нибудь нарисует - будет хорошо.:yes4:
Как это печатка, а схемы нет?) Я то всегда считал, что печатки по схеме разрабатывают :whistle:
Как это печатка, а схемы нет?) Я то всегда считал, что печатки по схеме разрабатывают :whistle:
схема была на БП3. Потом была модернизация в виде БП4, на том этапе схема была 100 раз поменяна и поэтому... так получилось :wink2:
jonikus81
18.10.2017, 09:44
Как это печатка, а схемы нет?) Я то всегда считал, что печатки по схеме разрабатывают :whistle:
после того как несколько раз модифицируешь те же платы, то перестаешь тратить время на схемы, я вот в последнее время стал проектировать платы сразу в печатном виде, хотя раньше делал по схемам и только по ним и не понимал как люди без схем делают платы :blush: .
после того как несколько раз модифицируешь те же платы, то перестаешь тратить время на схемы, я вот в последнее время стал проектировать платы сразу в печатном виде, хотя раньше делал по схемам и только по ним и не понимал как люди без схем делают платы :blush: .
:yes2: особенно после того, как добавляешь какой нибудь блокировочный конденсатор, и пару ног на процессоре меняешь местами для оптимизации ( всё равно в программе подправишь).
kazanova
02.11.2017, 00:54
oleg707,
Я нарисовал схему по твоей печатке. В электронике я не очень силен, позволь несколько вопросов:
1. Ардуина запитана через Vin от бортсети авто. Вроде как рекомендуемое напряжение питания для нее 7-12В, а в бортсети стандартно около 14В. Да и говорят, что встроенный стабилизатор неэффективен и жрет половину всей потребляемой энергии. Почему было не запитать от стабилизированных 5В?
2. Не измерял ли ток покоя этих китайских стабилизаторов питания? На али они пишут, что эффективность до 96%, но при каких условиях достигается - не ясно. И даташита нет
3. Говорят, эти стабы боятся больших конденсаторов на выходе и могут погореть от высокого тока их зарядки
4. Для чего оптическая развязка с hall и otg? Вроде они просто на массу кладутся. Почему не подключить ардуину напрямую?
5. Каналы коммутатора на ITS716 подключены к цифровым выходам ардуины. Но некоторые через резюки, а некоторые напрямую. В этом есть некий замысел?
6. Полевик, управляющий питанием хаба. Велико ли падение напряжения на нем? Почему бы его не поставить перед стабилизатором U5?
7. Не по БП: сколько хавает nexus 7 во сне? Я думаю о снижении потреблении ардуиной, может это все зря и она хавает копейки в сравнении со спящим планшетом?
oleg707,
Я нарисовал схему по твоей печатке. В электронике я не очень силен, позволь несколько вопросов:
0. Схему кинь, самому интересно.
1. Ардуина запитана через Vin от бортсети авто. Вроде как рекомендуемое напряжение питания для нее 7-12В, а в бортсети стандартно около 14В. Да и говорят, что встроенный стабилизатор неэффективен и жрет половину всей потребляемой энергии. Почему было не запитать от стабилизированных 5В?
2. Не измерял ли ток покоя этих китайских стабилизаторов питания? На али они пишут, что эффективность до 96%, но при каких условиях достигается - не ясно. И даташита нет
3. Говорят, эти стабы боятся больших конденсаторов на выходе и могут погореть от высокого тока их зарядки
4. Для чего оптическая развязка с hall и otg? Вроде они просто на массу кладутся. Почему не подключить ардуину напрямую?
5. Каналы коммутатора на ITS716 подключены к цифровым выходам ардуины. Но некоторые через резюки, а некоторые напрямую. В этом есть некий замысел?
6. Полевик, управляющий питанием хаба. Велико ли падение напряжения на нем? Почему бы его не поставить перед стабилизатором U5?
7. Не по БП: сколько хавает nexus 7 во сне? Я думаю о снижении потреблении ардуиной, может это все зря и она хавает копейки в сравнении со спящим планшетом?
1. 14.5 на заведённой. для ams1117-5 многовато. поэтому я поставил резистор ( в последних версиях 25 ом, в предидущих 75Ом или 3 диода последовательно - всё равно везде всё работает, 18В держит.). Встроенный стаб да, неэффективный. Но токи потребления ардуины (328p+ch340) настолько маленькие, что если ставить на это ДС-ДС, то кпд будет сравнимым( около 50%). плюс линейный стаб даёт намного меньше пульсаций, как бонус.
2. ток покоя мерился, не только мной, и не один раз. Только смысл? Если ДС-ДС не используется, он отключается либо по питанию, либо по управляющему пину.
Даташит есть, не проблема. Только на микросхему. Есть даже инструмент разработчика, где можно загонять свои параметры и смотреть выходные параметры. В общем смысл такой, что кпд тем выше, чем нагрузка ближе к 80% максимальной. Если нагрузка 10-20%, то кпд процентов 50 или ниже.
3.у практически всех микросхем есть софт старт, позволяющий плавно включать нагрузку, плавно повышая напряжение. Также есть режим ограничения максимального тока, защита от короткого замыкания и перегрева. И зачем вам мощные конденсаторы ? Атмосферу греть? Я и так ставлю 2200мФ с десятикратным запасом. У меня лично работало и от 220мФ и от 100мФ!
4. В момент включения ардуины и оставленного загрузчика (1,5с) на выводах атмеги творится чёрт знает что. Либо когда оставлена батарея планшета. Тогда может быть такая ситуация,что бп уже выключился ( по любому из условий), а часть потенциалов висит где попало ( либо нет массы там, где надо).
Твердотельное реле позволяет красиво и грамотно решить эти вопросы. Плюс бонусом оптическая развязка.
5. Конечно. через резисторы подключены выходы состояний нагрузки ITS.
Если подсунуть туда массы, а итс решит выдать там логическую еденицу, то сгорит канал либо проца либо итс. У меня сгорел канал состояния ITS.
Поэтому чтобы программа не могла спалить железо, нужно поставить резисторы.
Выводы же "без резисторов" на самом деле имеют резисторы внутри ( 10К вроде), плюс эти выводы предназначены для управления логической еденицей.
Всё это описано в даташите, даже со схемами.
6. полевик почти не имеет падение напряжения. Но управлять нужно тем же уровнем напряжения, что и выходное.
Например для 12В P-канального транзистора 0В на затворе откроет транз., а 5 В не закроет, потому как разность напряжений всё равно будет 7В.
Тогда нужно добавлять N-канальник. Или проще поставить интеллектуальный ключ. Но зачем?
7. Когда появится возможность, постараюсь померить осциллографом по линии батареи (4,0В) Пока же можно посмотреть на моём ютуб канале видео, где-то на испытаниях были значения тока по +12В.
kazanova
02.11.2017, 17:46
Например для 12В P-канального транзистора 0В на затворе откроет транз., а 5 В не закроет, потому как разность напряжений всё равно будет 7В.
Тогда нужно добавлять N-канальник. Или проще поставить интеллектуальный ключ. Но зачем?
Потому что:
Если ДС-ДС не используется, он отключается либо по питанию, либо по управляющему пину.
Т.е. если ардуина питается за счет внутреннего стабилизатора, планшет сидит на U4 (4,2В), зачем зря кормить U5 (5В)?
Если я правильно понял вопрос, U5 отключается напрямую, подавая на управляющий пин массу и загоняя дс- дс в режим ожидания. Оба дс-дс отключаются через ITS. Смысл в том, что на батарее планшета всё равно должно быть постоянно 4.0В ( кроме нештатной ситуации).
kazanova
03.11.2017, 01:41
Если я правильно понял вопрос, U5 отключается напрямую, подавая на управляющий пин массу и загоняя дс- дс в режим ожидания
Ааа, понял. По плате этого не видно, но на фото увидел проводок, подпаянный к управлению преобразователем. Спасибо, разобрался :drinks:
Промежуточные итоги. Проехал уже около 3500км, кусками по 300-500км. В путешествии уже 3 недели. Выдержал Варшавские и Берлинские пробки. Постоянно запущены навител и плеер ( поверамп в фоне). Оно просто работает. Температура - чуть тёплый даже после 500 км дороги без вообще никакого охлаждения. Интернет получает по вайфай с телефона ( 4G, в деревнях 3G 150гигабайт за 7 евро), до Европы нам ещё далеко :'(
Планшет нексус 7-2012-16gWifi. Как показала практика, производительности планшета не хватает, если запущены Гугл карты, то может подтормозить прямо перед нужной развилкой. НА ТРАССЕ, КАРЛ! И из- за тормозов может отвалиться звуковая карта ( было пару раз).
Я уже даже думаю, что 13 нексуса мне будет мало.
Но, когда запущен навител, то тормозов нет и музыка не отваливалась ни разу. Зато он часть дорог не знает :angry:
Ps.
Автоматизацию выключил ВООБЩЕ. Работает как надо :)
Pps.
Хорошие новости для тех, кто ждёт пока я соберу им блоки питания. Запчасти и комплектующие заказаны, едут. Через пару недель и я и запчасти встретимся дома, и я наконец таки смогу вам их собрать и отправить. Простите за ожидание, не ожидал спрос.
rsoft_andrey
13.11.2017, 09:18
Промежуточные итоги. Проехал уже около 3500км, кусками по 300-500км. В путешествии уже 3 недели. Выдержал Варшавские и Берлинские пробки. Постоянно запущены навител и плеер ( поверамп в фоне). Оно просто работает. Температура - чуть тёплый даже после 500 км дороги без вообще никакого охлаждения. Интернет получает по вайфай с телефона ( 4G, в деревнях 3G 150гигабайт за 7 евро), до Европы нам ещё далеко :'(
Планшет нексус 7-2012-16gWifi. Как показала практика, производительности планшета не хватает, если запущены Гугл карты, то может подтормозить прямо перед нужной развилкой. НА ТРАССЕ, КАРЛ! И из- за тормозов может отвалиться звуковая карта ( было пару раз).
Я уже даже думаю, что 13 нексуса мне будет мало.
Но, когда запущен навител, то тормозов нет и музыка не отваливалась ни разу. Зато он часть дорог не знает :angry:
Ps.
Автоматизацию выключил ВООБЩЕ. Работает как надо :)
Pps.
Хорошие новости для тех, кто ждёт пока я соберу им блоки питания. Запчасти и комплектующие заказаны, едут. Через пару недель и я и запчасти встретимся дома, и я наконец таки смогу вам их собрать и отправить. Простите за ожидание, не ожидал спрос.
хорошо будем ждать когда соберете и дадите нам знать.
это что за дороги, которых навител не знает. может у вас карты старые? сам тоже полстраны объездил с навителом и ни разу не подводила. и да, тоже отмечу что с навителом, музыка и другие приложения не тормозят. хотя гугл картой очень редко пользуюсь
это что за дороги, которых навител не знает. может у вас карты старые? сам тоже полстраны объездил с навителом и ни разу не подводила. и да, тоже отмечу что с навителом, музыка и другие приложения не тормозят. хотя гугл картой очень редко пользуюсь
Польша. Берлин. Новые развязки, новые трассы. Процентов 5-10 не туда ведёт. Или думает что в поле, хотя я на автобане :big:картам год, пиратские.
Гугл мапс и то не всё знает, хотя они онлайн. И пробки нормально показывает. Но тормозит.
для 5 мини, прошивка, которая прошла 4000 км
byte ver = 11;// ( чем больше цифра, тем новее)
// дата правки 13.10.17.2104
// для 5mini версии блока питания.
// скетч проверен и записан на версии ардуино IDE 1,8,1 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/enjoyneering/LiquidCrystal_I2C например
//в версии T04 добавлена поддержка дисплея Adafruit_SSD1306 128*64 Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
/* _
хотелки
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, библиотека вывода на экран https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше 11.8 В, то включаем еще и усилитель звука (выход REM) /но включаем его только на 30-60мин, если не заведены. После заводки счетчик обнуляется.
v92 сделанъ плавный пуск - определяем нужное состояние пинов без их предварительного дергания в начальное нулевое.
v94 сделанъ вывод на экран через переменную, а не напрямую. ЭТО позволило выводить информацию ЕЩЕ И В КОМ ПОРТ!!! <<<<<<<========================================
v94 Сделана задержка включения REM после холодного запуска, 15с. Через 10 с после начала загрузки идёт инициализация звуковой, в этот момент слышен ПУК
t00 новая ветка блока, по факту продолжение старой.
t02 поскольку аптаймблока в машине превысил 9999 минут, то переделан вывод аптайма 000:00 ( часы : минуты)
t03 дисплей тухнет через 3 сек после операции завершения.
t04 добавлена поддержка дисплея Adafruit_SSD1306 128*64 (тестово). Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master
Без 2х библиотек одновременно работать не будет https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
t06 обработка напряжений выше 15,5 ( тушим экран и выключаем усилок)
t07 в войд сетап задержки по 0,1с для инициализации дисплеев. Изменен алгоритм выключения - сначала тушим экран, потом все остальное( для таскера, чтобы паузу ставил и плей жал)
выключен Serial.print. display2.begin(SSD1306_ - перекинута инициализация на включение зажигания - 318 строка
t08- ничего
t09 - перенесена строка проверки заведённой авто, в конец, перед проверкой перезаряда.
t10 - перешел на другую библиотеку для 1602 дисплея( newE) https://github.com/enjoyneering/LiquidCrystal_I2C. 128*64 не проверял.
t11 - в связи с тем, что у меня дребезжит контактная группа в машине, изменён алгоритм выключения выхода REM
t12 - возможность калибровки с записью в еепром, переделан метод вывода на дисплей ( теперь через две функции (формирования строк и непосредственно вывода.), а не в основном цикле), убрн вотчдог, как не имеющий практического смысла( пока что просто заккоментирован).
t13 поправлена Логика работы REM = когда стартуем flagREM = 3 Обработка логики работы REM в 538 строках.
t14 - введена новая переменная timeUntilBATOff = время до выключения питания на батарею планшета после выключения зажигания. 24ч = 86400000 (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч) (2суток = 172800000) (4суток = 345600000)
timeUntilALLOff = время до полного выключение блока, после выключения зажигания (ACC) ((самозапитка для регистратора)- чтобы легче было менять это время в начале скетча.
увеличено время поддержки планшета включённым-timeUntilBATOff ( 2 суток после выкл АСС и еще 2 суток после этого до полного выключения блока)
m01-05 - Новая версия БП5mini. Переход на новые, хорошо себя зарекомендовавшие, дс-дс (mini360). Датчик холла и отг теперь управляются специализированной микросхемой-твердотельным реле. Из-за неё же теперь потеряна совместимость прошивок на БП5 (поскольку на управление холлом теперь нужен инверсный сигнал). Поэтому уже заодно поменял местами пины управления ОТГ и ХОЛЛА (физически). Фишка полностью совместима с БП5, БП4, БП3.
m6 - обработка статуса выхода REM переведена в отдельную функцию
m7 - поменян порядок включения элементов и их тайминги. Тестово. По идее, должно быть стабильнее, либо вообще никак не повлияет. Убраны лишние закомментированны строчки.
m11 - отг включаю сразу.
__________________________________________________ ______________
собственное потребление блока по 12 вольтам, без планшета
- при 10В +30 и +15 выключены = 0,02 А
- при 12В +30 и +15 включены = 0,092-0,1 А
- при 12В +30 включены +15 выключены (при питании батареи) = 0,06А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает
ПРИМЕЧАЕНИЯ
-> strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
*/
//************************************************** ************************************************** ***********************************************
// Массив режимов работы светодиода
byte modes[] = {
0B00000000, //Светодиод выключен
0B11111111, //Горит постоянно
0B00111111, //Мигание по 0.8 сек
0B00000001, //Короткая вспышка раз в секунду
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)
};
uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;
//************************************************** ************************************************** ***********************************************
#include <Wire.h> // для экрана - I2C шина
#include <LiquidCrystal_I2C.h> // библиотека для экрана
#include <EEPROM.h> // для использования ЕЕПРОМ
//#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )
char strokaI[32] = " ";// Массив для вывода 1 строки на дисплей , объявляем длиннее(32символа), чтобы не было глюков с отображением на экране
char strokaII[32] = " ";// Массив для вывода 2 строки на дисплей
// ЭТО нужно для вывода на 128*64 Adafruit_SSD1306 дисплей
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display2(OLED_RESET);
#define XPOS 0
#define YPOS 1
#define DELTAY 2
//ЗАЧЕМ ????
// конец настройки для вывода на 128*64 Adafruit_SSD1306 дисплей
//LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например
LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347
float UakbONorOFF = 12.1;// в 258 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.4;//11.1 // напряжение порога сработки асс
float U_acc_real = 0; // реальное напряжение +ACC на входе делителя (A0)
float U_akb_real = 0; // реальное напряжение +30 на входе делителя (A1)
int Uacc = 0; //Читаем напругу с делителя ACC R4-R5 0-1024 analogRead(A0);
int Uakb = 0; ////Читаем напругу с делителя R2-R3 0-1024 analogRead(A1);
/*ноги ардуины*/
uint8_t PORTBregistr = 0; // Если у нас есть 8-битная переменная PORTBregistr, то мы можем присвоить её значение регистру PORTx, и тем самым установить ножки микроконтроллера в состояние, соответствующее значению переменной PORTBregistr
boolean SAMOZAPITKA = 0; // byte SAMOZAPITKApin = 9; /*управление самозапиткой блока питания IN4*///1 = есть самозапитка; 0 = нет самозапитки
boolean LED = 0; // Светодиод 1 = светит; 0 = не светит
boolean SLEEP=0; //byte SLEEPpin = 10; //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; //1 = есть масса на OTG; 0 = нет массы на OTG
uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
boolean REM = 0; //byte REMpin = 7; /* 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3)*/ //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
//пины состояния ITS
boolean STATEpinI = 1; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = авария*/
boolean STATEpinII = 1; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.*/
/*логические переменные, используемые в коде*/
boolean flagACC = 0; /*признак включенного зажигания*/
byte flagAKB = 0; /* признак заряженной батареи*/
byte flagREM = 0; /* признак включенного выхода на усилитель звука (REM) 0 1 2*/
byte kalibrovkaNOW = 0; // признак того, что сейчас происходит калибровка встроенного вольтметра по АСС и АКБ.
byte kalibrovkaACC = EEPROM.read(0); // значение для калибровки для делителя АСС
byte kalibrovkaAKB = EEPROM.read(1); // значение для калибровки для делителя АКБ
boolean flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
/*счётчики времени*/
const unsigned long timeUntilBATOff = 172800000; // время до выключения питания на батарею планшета после выключения зажигания., если прошло 24 (86400000) часа, как выключили ACC // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)
const unsigned long timeUntilALLOff = 172800000 + timeUntilBATOff; //время до полного выключение блока, после выключения зажигания (ACC)и после того, как выключится питание на батарею ) (2суток = 172800000)) (4суток = 345600000)
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long pauseTimeHALL = 140000; /* время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин*/
int timeAfterACC = 5000; /* время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg*/
unsigned long TimerREM = 0; /* отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long timeBeforeRemOff = 1800000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. 209 строчка.*/
unsigned long TIMER = millis();
int H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void UPRAVLENIE_PINAMI() // функция перевода логических параметров в реальные состояния пинов // http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry // https://geektimes.ru/post/255744/ Ускоряем свою Arduino /* http://robotosha.ru/arduino/digitalwrite-optimizing-arduino.html */
{// UPRAVLENIE_PINAMI ~~~//тут мы сначала пишем в переменную регистры, а потом сделаем PORTB = PORTBregistr; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
// PORTBregistr - обрабатывем регистры порта B атмеги
if (LED == 1 ){ PORTBregistr |= 1<<5; } //PORTB |= 1<<5; //установит "1" (сигнал высокого уровня) на выводе PB5. //digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
else { PORTBregistr &= ~(1<<5); } //PORTB &= ~(1<<5); //установит "0" (сигнал низкого уровня) на выводе PB5. //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
if (SAMOZAPITKA == 1){ PORTBregistr |= (1 << 1); } else {PORTBregistr &= ~((1 << 1));} //PB1 управление самозапиткой блока питания IN4///1 = есть самозапитка; 0 = нет самозапитки //http://microsin.net/programming/avr/accessing-avr-ports-with-winavr-gcc.html
if (OTG == 1){ PORTBregistr |= (1 << 2); } else {PORTBregistr &= ~((1 << 2));} //byte SLEEPpin = 10; /* PB2 управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
if (HUB == 0) { PORTBregistr |= (1 << 3); } else {PORTBregistr &= ~((1 << 3));} //HUB =0;//byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 1-есть питание, 0 - нет питания
if (SLEEP == 0) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG
// PORTDregistr - обрабатывем регистры порта D атмеги
if (PlanshBAT == 1){ PORTDregistr |= (1 << 6); } else {PORTDregistr &= ~((1 << 6));} //bool PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
if (REGISTRATOR == 1){ PORTDregistr |= (1 << 4); } else {PORTDregistr &= ~((1 << 4));} //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
if (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
if (REM == 1){ PORTDregistr |= (1 << 7); } else {PORTDregistr &= ~((1 << 7));} //bool REM = 0; //byte REMpin = 7; /* 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3)*/ //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
//Serial.print ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
void setup() //настройки
{
// wdt_disable(); //Отключение таймера watchdog
Serial.begin(115200);
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
if( kalibrovkaACC == 255 ){kalibrovkaACC=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию
if( kalibrovkaAKB == 255 ){kalibrovkaAKB=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию =127
// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины
DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; /* PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);
pinMode(A2, INPUT); // пин калибровки
digitalWrite(A2, 1); // подтяжка +5 пина калибровки
// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
// wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void IntToCharI(int num, char *text)//функция, возвращающая число в текстовый вид 0 1
{
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
//text[1] = ((num/10)%10) + '0';// второе значение __0
text[2] = (num%10) + '0'; // третее значение ___
}
void IntToCharII(int num, char *text)//функция, возвращающая число в текстовый вид 00 11
{
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[0] = ((num/10)%10) + '0';// второе значение __0
text[1] = (num%10) + '0'; // третее значение ___
}
void IntToCharIII(int num, char *text)//функция, возвращающая число в текстовый вид 00 11
{
text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[1] = ((num/10)%10) + '0';// второе значение __0
text[2] = (num%10) + '0'; // третее значение ___
}
void IntToCharIIII(int num, char *text)//функция, возвращающая число в текстовый вид 0000 1111
{
text[0] = (num/1000) + '0';//0 знач
text[1] = (num/100)%10 + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[2] = ((num/10)%10) + '0';// второе значение __0
text[3] = (num%10) + '0'; // третее значение ___
}
void FloatToCharIIIII(float num, char *text)//функция, возвращающая число в текстовый вид 00.00 11.11
{
int Int = num*100;
text[0] = (Int/1000) + '0';//0 знач 7896
text[1] = (Int/100)%10 + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[2] = '.';
text[3] = ((Int/10)%10) + '0';// второе значение __0
text[4] = (Int%10) + '0'; // третее значение ___
}
void printDISPLAY() //функция формирования информации на дисплей ( точнее на два: 128*64 и 1602)
{
//_____________________________________________ФОРМИ РУЕМ СООБЩЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________
H = (millis()/3600000);
M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
//if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка экрана
//int M = (millis()/60000); //минуты
if (flagACC == 1){lcd.backlight();}// для newE и для 0x27
// в 256 строке выключение подсветки LCD дисплея
//пример: sprintf( strokaII,"SETUP volume on ");
//обработка 1й строки_________AKB ACC REM_______________________________________________ __________________________________________________ __________________________________________________ __________________
sprintf(strokaI," ") ;
//IntToCharIIII((millis()/60000), &strokaI[0]); // вывод минут 0000 4 цифры СЕКУНД // если превысит 9999, то будут кроказябры!!! вида ;0129
IntToCharIII(H, &strokaI[0]); // вывод часов 000
strokaI[3] = ':'; // вывод двоеточия
IntToCharII(M, &strokaI[4]); // вывод минут 00
strokaI[7]= flagAKB + '0';// вывод флага AKB 5 символ
strokaI[8]= flagACC+ '0';// вывод флага AСС 6 символ
strokaI[9]= REM + '0';// вывод rem 7 символ 1-усилок включен, 0 - выключен
strokaI[10]= flagREM + '0';// вывод флага!!! rem 7 символ 1-усилок включен, 0,2 - выключен
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АСС
//конец обработки 1й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________
//обработка 2й строки____________________________________________ __________________________________________________ __________________________________________________ ______________________________
TIMER = ( pauseTimeAKB + timeUntilALLOff - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)
// _______________________________Первые 30с после вкл -выкл ACC выводим версию блока.____________________________________________ __________________________________________________ __________________________________________________ ____
if ( ( millis()-pauseTimeACC < 30000 )&& flagACC == 1 ){ sprintf(strokaII,"m__ ") ; IntToCharII(ver, &strokaII[1]);} else { sprintf(strokaII,"____ "); IntToCharIIII(TIMER, &strokaII[0]); } //Первые 30с после вкл -выкл ACC выводим версию блока
// __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ _____________________________
//вывод OTG HUB POGO HALL
strokaII[6]= OTG + '0';// вывод флага OTG 5 символ
strokaII[7]= HUB + '0';// вывод флага HUB 6 символ
strokaII[8]= II_KIW_pin_POGO + '0';// вывод флага II_KIW_pin_POGO (ПРИЗНАК ЗАРЯДКИ) 7 символ
strokaII[9]= !SLEEP + '0';// вывод флага flagHALL 8 символ (инверсно) 1-экран включен, 0 - выключен
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
//конец обработки 2й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________
if (kalibrovkaNOW >= 1 && kalibrovkaNOW < 255 )// если активен режим калибровки, то выводим данные для калибровки.
{
sprintf (strokaI," ") ;
IntToCharIII(Uacc, &strokaI[0]);
IntToCharIII(Uakb, &strokaI[4]);
IntToCharIII(kalibrovkaNOW, &strokaI[7]); // вывод РЕЖИМА калибровки
sprintf(strokaII,"c ") ;
IntToCharIII(kalibrovkaACC, &strokaII[1]); // вывод значения калибровки АСС
IntToCharIII(kalibrovkaAKB, &strokaII[5]); // вывод значения калибровки АСС
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АКБ
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
}
//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________
displayDataToDISPLAY(); //>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>
/* так выглядит индикация на дисплее
================
|000:00 111 0.000| 1 строка * вывод времени работы блока H:M * AKB ACC REM * вывод напряжения АСС
|2616 1110 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * OTG HUB POGO HALL * вывод напряжения АКБ
*/
}
void displayDataToDISPLAY()//>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>
{//void displayDataToDISPLAY()
//вывод на 2хстрочный дисплей LCM 1602 с I2C ( на базе расширителя портов PCF8574)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//Serial.print("strokaI = "); Serial.println(strokaI); // раскомментить для вывода информации в ком порт для отладки
lcd.setCursor(0, 0);
lcd.print(strokaI);
//Serial.print("strokaII = "); Serial.println(strokaII); // раскомментить для вывода информации в ком порт для отладки
lcd.setCursor(0, 1); //2строка 0символ
lcd.print(strokaII);
//вывод на 128*64 дисплей (Adafruit_SSD1306) первой строки
display2.clearDisplay(); // очистили буфер
display2.setTextSize(1); // установили размер текста (1-4)
display2.setCursor(0,0); // начальная точка вывода
display2.println(strokaI); // скинули значение I строки в буфер 128*64 дисплея
//вывод на 128*64 дисплей (Adafruit_SSD1306) второй строки
display2.println(strokaII); // скинули значение II строки в буфер 128*64 дисплея
if ( ((millis() - pauseTimeACC) >= (5000+timeAfterACC)) && (flagACC==0) ) // после 5 сек после выключения зажигания буфер будет чиститься перед выводом, соответственно на 128*64 Adafruit_SSD1306 дисплей выводиться ничего не будет Это нужно для того, чтобы ночью экран не светился ( так как пиксели активные и дают свет без подсветки)
{
display2.clearDisplay(); // очистили буфер
}
display2.display(); //эта строка выводит картинку 1306 из буфера на экран!
//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________
}//void displayDataToDISPLAY()
/******************************************конец индикации светодиодом и вывода на дисплей******************************************* ************************************************** ************************************************** *********************************/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void analogReadU (byte averageFactor) //функция усреднённого чтения аналоговых входов (A0 A1)
{//void analogReadU
int newUacc = analogRead(A0); // замер для 5й версии
int newUakb = analogRead(A1); // замер для 5й версии
//int newUacc = analogRead(A1); // замер для 4й версии
//int newUakb = analogRead(A0); // замер для 4й версии
if (averageFactor > 0) // усреднение показаний для устранения "скачков"
{
Uacc = (Uacc * (averageFactor - 1) + newUacc) / averageFactor;
Uakb = (Uakb * (averageFactor - 1) + newUakb) / averageFactor;
// <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5 я тут немного поправил
} else {
Uakb=newUakb; // не делаем усреднений, что прочитали то и считаем выводом
Uacc=newUacc; // не делаем усреднений, что прочитали то и считаем выводом
}
}//void analogReadU
void rejim_kalibrovki() //функция измерения, калибровки и записи полученных значений в еепром
{//void rejim_kalibrovki()
lcd.noBacklight();
delay (50);
lcd.backlight();
delay (250);
if (digitalRead(A2)== 1 && kalibrovkaNOW < 6) {kalibrovkaNOW ++;}
else // тут достигли 6 касаний точки калибровки и ЗАПУСКАЕМ НЕПОСРЕДСТВЕННО ПРОЦЕСС КАЛИБРОВКИ ( ДЛЯ ЭТОГО ПОДАЁМ РОВНО 12,00В НА БЛОК ПИТАНИЯ ( асс и акб)
{ //else
if (kalibrovkaNOW >= 6)
{//if (kalibrovkaNOW >= 6)
PORTBregistr = 0; // выключили всё
PORTDregistr = 0; // выключили всё
UPRAVLENIE_PINAMI(); // сказали регистрам исполнить " выключили всё ", вызвав функцию
delay (600); // для зарядки кондёров после снятия нагрузки
analogReadU (10); //вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(10)раз
kalibrovkaACC = 1200000/Uacc-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
kalibrovkaAKB = 1200000/Uakb-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
{kalibrovkaNOW ++;}
}//if (kalibrovkaNOW >= 6)
}//else
if ( kalibrovkaNOW == 15 && digitalRead(A2)== 0) //по достижению счета в 254 и ПРИ МАССЕ НА ПИНЕ КАЛИБРОВКИ данные калибровки запишутся в еепром
{
kalibrovkaNOW = 255;
EEPROM.write(0,kalibrovkaACC);
EEPROM.write(1,kalibrovkaAKB);
sprintf (strokaI,"end KALIBR. ") ;
sprintf(strokaII,"c ") ;
IntToCharIII(kalibrovkaACC, &strokaII[1]); // вывод значения калибровки АСС
IntToCharIII(kalibrovkaAKB, &strokaII[5]); // вывод значения калибровки АСС
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АКБ
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
displayDataToDISPLAY(); //
delay (10000);
}
}//void rejim_kalibrovki()
void STATUS_REM()
{//void STATUS_REM()
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обр аботка статуса выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~*/
/*если напруга батареи больше 12В, то включаем еще и усилитель звука (выход REM) /но включаем его только на 1 час, если не заведены.*/
if (U_akb_real >= 11.8 && flagACC == 1 && flagREM == 0 ) {flagREM = 1; TimerREM = millis();} //если подзаряжен акб и включили зажигание - ВКЛЮЧАЕМ REM
if (U_akb_real >= 11.8 && flagACC == 1 && ( millis() - TimerREM >= timeBeforeRemOff )) {flagREM = 2 ;} // если кончилось время обратного отсчета - статус рем - 2.
//if (U_akb_real >= 13.7 && flagACC == 1){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= 11.8 && flagREM == 2 && flagACC == 0){ flagREM = 0;} // если восстановилось напряжение при выключенном зажигании - обнуляем статус РЕМ.
if (U_akb_real <= 11.8 && flagACC == 1){ flagREM = 2;} //если подсел акб при включенном зажигании - статус рем - 2.
if (U_akb_real >= 13.7 && flagACC == 1 ){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= 13.7 && flagREM == 3){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= 15.5){flagREM = 2;}// проверка на перезаряд
if( flagREM == 0 || flagREM == 2){REM = 0;} // выключаем выход REM
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~коне ц отработки выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~*/
}//void STATUS_REM()
void loop()
{while (1){//для ускорения void loop
analogReadU (5);//вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(5)раз.
if (kalibrovkaNOW != 255 && digitalRead(A2)== 0){if ( (millis() < 60000) || kalibrovkaNOW >= 6 ) { rejim_kalibrovki();} } // после 60с или если стоит ЗАПРЕТ(255), калибровку НЕ ДЕЛАЕМ
// новое ( с T12 версии) вычисление реального напряжения, с учетом значений калибровки в еепром (0 и 1 адреса)
U_acc_real = Uacc * (1410.0+kalibrovkaACC)/100000;
U_akb_real = Uakb * (1410.0+kalibrovkaAKB)/100000;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( (millis() > pauseTimeHALL && flagHALL == 0 )|| ((millis() > 15000) && flagACC == 1))
{flagHALL = 1;} /*проверка отсчета при холодном старте при включении и сразу выключении ACC*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 2000;} //выключили зажигание /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 7000; if (U_akb_real <=UakbONorOFF) {flagREM = 3;REM = 0;} }//стартуем /* 5000 0 - заводим машину (стартуем) или сел акб при включенном зажигании.*/ Логика работы REM в 537 строках
if (U_akb_real >= 15.5){timeAfterACC = 0;}
// ввести новую переменную int starting_mode = 1;//стартуем 0 = не_стартуем.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// ------------========================== блок ACC ========================-----------------------------------------------------------------------------
// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((15.5 > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
//lcd.clear(); //очистка экрана не нужна со строковым выводом
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея
}
if (flagACC ==1 )
{// если flagACC == 1
if (millis() - pauseTimeACC >= 1100 ) /* пауза 1.1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета = этим подаём 12В на DC-DC. На 1м канале dc-dc сразу появляется напряжение (3,8-4,2 - как настроено)*/
}
if (millis() - pauseTimeACC >= 1400 ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
II_KIW_pin_POGO = 1; //digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
}
if (millis() - pauseTimeACC >= 50 ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на Y-OTG (включается определение перифирии планшетом.)*/
}
if (millis() - pauseTimeACC >= 2100 ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В dc-dc (2вых)на хаб*/
}
if (millis() - pauseTimeACC >= 2500 )/*через 2,2с после включения ACC включаем: */
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}
if (millis() - pauseTimeACC >= 3000 ) // пауза после включения ACC и потом делать следующ(пока включено ACC):
{
SLEEP = 0; //digitalWrite(SLEEPpin, 0); /*включаем экран*/
}
}// если flagACC == 1
STATUS_REM(); //зашли в функцию обработки статуса выхода REM
//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= (timeAfterACC-1000)) ) // тут 1000 это на сколько раньше выключать выход REM перед остальными выключениями
{
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
}
if (((millis() - pauseTimeACC) >= timeAfterACC) ) /*пауза 6c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*тушим экран (если прошло 2 минуты с момента включения блока )*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (2500+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
}
if ( ((millis() - pauseTimeACC) >= (5000+timeAfterACC)) )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V зарядки. (POGO(USB))*/
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (7000+timeAfterACC)) )
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
}
}// if (flagACC==0)
// -------------------------========================= блок АКБ ==========================-------------------------------------------------------------------------------
if (U_acc_real >= UaccONorOFF) {UakbONorOFF = 11.1;} else {UakbONorOFF = 11.9;} /*при включении зажигания напряжение самовырубания станет 11,5 вместо 11,9*/
if ((15.5 > U_akb_real) && ((U_akb_real >= UakbONorOFF) && flagAKB == 0)) /*проверка +30 на перезаряд >15.5В, и больше заданного в 266 строке, и флага акб */
{
if ((millis() - pauseTimeACC >= 100) && flagAKB == 0)
{
SAMOZAPITKA =1;//digitalWrite(SAMOZAPITKApin, 1); /* включаем самозапитку процессора */
flagAKB = 1; /*подняли флаг батареи*/
}
}
if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >15.5))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = 11.9;
//lcd.clear(); //очистка экрана
}
if ((millis() - pauseTimeAKB >= 20000) && flagAKB == 0) /* если севший аккумулятор //через 20с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета */
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG )*/
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
HUB = 0; //digitalWrite(HUBpin, 1); /* подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб*/
REM = 0; //digitalWrite(REMpin, 0); /* выключаем выход REM*/
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается*/
//delay (5000); /* задержка для аппаратного выключения*/
}
if (flagAKB == 1 && flagACC == 0) /*ситуация, когда норм акб и выключено зажигание (ACC)*/
{
if ((millis() - pauseTimeAKB )>= timeUntilBATOff && flagAKB == 1) /* если прошло "timeUntilBATOff" 24 (86400000) часа, как выключили ACC // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)*/
{
PlanshBAT = 0; // digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)//(батарея планшета))*/
}
if ((millis() - pauseTimeAKB) >= timeUntilALLOff && flagAKB == 1) /* если давно выключили ACC ) "timeUntilALLOff" (2суток = 172800000)) (самозапитка для регистратора, процессор БП активен)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (10000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
//******************************************отслежив ания аварийной ситуации ITS716G (превышение по току по выходам out1-4)************************************************ ************************************************** ************************************************** ****************************
//*отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//*отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"
if(SAMOZAPITKA==1 || PlanshBAT ==1 ||REM==1 || REGISTRATOR ==1) // если проц включал любой канал ITS
{
STATEpinI = digitalRead(5); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
STATEpinII = digitalRead(8);
if(STATEpinI == 0) { // и если пин защиты STATEpinI показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты STATEpinII показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI();delay(493); LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB =0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
}
//************************************************** ************************************************** ************************************************** ************************************************** ******************
*/
/******************************************индикаци я светодиодом и задержка вывода на дисплей******************************************* ************************************************** ************************************************** *********************************/
ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}
// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;
printDISPLAY(); // выводим на дисплей раз в 350( запуская фушкцию)
}
/*настраиваем режимы моргания встроенного светодиода ардуины*/
if (blink_mode != modes[5] || blink_mode != modes[5])
{
if (flagAKB == 0 ){blink_mode = modes[3];} // индикация напруги батареи на ардуинине.- низкое напряжение АКБ авто - коротко моргает
if (flagAKB == 1 && flagACC == 0) {blink_mode = modes[6];} //- нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
if (flagAKB == 1 && flagACC == 1) {blink_mode = modes[2];} //- нормальное напряжение, включено ACC, рабочий режим. - медленно моргает
if (kalibrovkaNOW >= 1) {blink_mode = modes[1];} // режим калибровки
}
/* ***********************данные для справки******************************************* *********************
0B00000000, //Светодиод выключен blink_mode = modes[0];
0B11111111, //Горит постоянно blink_mode = modes[1];
0B00111111, //Мигание по 0.8 сек blink_mode = modes[2]; - нормальное напряжение, включено ACC, рабочий режим.
0B00000001, //Короткая вспышка раз в секунду = modes[3]; - низкое напряжение АКБ авто
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)= blink_mode = modes[6]; - нормальное напряжение АКБ авто, ACC выключено.
*/
//************************************************** ************************************************** ******
UPRAVLENIE_PINAMI();
//wdt_reset(); /*Сброс таймера watchdog*/
}} /*конец цикла void loop() и конец while (1)*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
byte ver = 15;// ( чем больше цифра, тем новее)
// дата правки 24.11.17.1556
// для 5mini версии блока питания.
// скетч проверен и записан на версии ардуино IDE 1,8,1 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/enjoyneering/LiquidCrystal_I2C например
//в версии T04 добавлена поддержка дисплея Adafruit_SSD1306 128*64 Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
/* _
хотелки
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, библиотека вывода на экран https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше 11.8 В, то включаем еще и усилитель звука (выход REM) /но включаем его только на 30-60мин, если не заведены. После заводки счетчик обнуляется.
v92 сделанъ плавный пуск - определяем нужное состояние пинов без их предварительного дергания в начальное нулевое.
v94 сделанъ вывод на экран через переменную, а не напрямую. ЭТО позволило выводить информацию ЕЩЕ И В КОМ ПОРТ!!! <<<<<<<========================================
v94 Сделана задержка включения REM после холодного запуска, 15с. Через 10 с после начала загрузки идёт инициализация звуковой, в этот момент слышен ПУК
t00 новая ветка блока, по факту продолжение старой.
t02 поскольку аптаймблока в машине превысил 9999 минут, то переделан вывод аптайма 000:00 ( часы : минуты)
t03 дисплей тухнет через 3 сек после операции завершения.
t04 добавлена поддержка дисплея Adafruit_SSD1306 128*64 (тестово). Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master
Без 2х библиотек одновременно работать не будет https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
t06 обработка напряжений выше 15,5 ( тушим экран и выключаем усилок)
t07 в войд сетап задержки по 0,1с для инициализации дисплеев. Изменен алгоритм выключения - сначала тушим экран, потом все остальное( для таскера, чтобы паузу ставил и плей жал)
выключен Serial.print. display2.begin(SSD1306_ - перекинута инициализация на включение зажигания - 318 строка
t08- ничего
t09 - перенесена строка проверки заведённой авто, в конец, перед проверкой перезаряда.
t10 - перешел на другую библиотеку для 1602 дисплея( newE) https://github.com/enjoyneering/LiquidCrystal_I2C. 128*64 не проверял.
t11 - в связи с тем, что у меня дребезжит контактная группа в машине, изменён алгоритм выключения выхода REM
t12 - возможность калибровки с записью в еепром, переделан метод вывода на дисплей ( теперь через две функции (формирования строк и непосредственно вывода.), а не в основном цикле), убрн вотчдог, как не имеющий практического смысла( пока что просто заккоментирован).
t13 поправлена Логика работы REM = когда стартуем flagREM = 3 Обработка логики работы REM в 538 строках.
t14 - введена новая переменная timeUntilBATOff = время до выключения питания на батарею планшета после выключения зажигания. 24ч = 86400000 (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч) (2суток = 172800000) (4суток = 345600000)
timeUntilALLOff = время до полного выключение блока, после выключения зажигания (ACC) ((самозапитка для регистратора)- чтобы легче было менять это время в начале скетча.
увеличено время поддержки планшета включённым-timeUntilBATOff ( 2 суток после выкл АСС и еще 2 суток после этого до полного выключения блока)
m01-05 - Новая версия БП5mini. Переход на новые, хорошо себя зарекомендовавшие, дс-дс (mini360). Датчик холла и отг теперь управляются специализированной микросхемой-твердотельным реле. Из-за неё же теперь потеряна совместимость прошивок на БП5 (поскольку на управление холлом теперь нужен инверсный сигнал). Поэтому уже заодно поменял местами пины управления ОТГ и ХОЛЛА (физически). Фишка полностью совместима с БП5, БП4, БП3.
m6 - обработка статуса выхода REM переведена в отдельную функцию
m7 - поменян порядок включения элементов и их тайминги. Тестово. По идее, должно быть стабильнее, либо вообще никак не повлияет. Убраны лишние закомментированны строчки.
m11 - отг включаю сразу.
m12 - Сделал все основные тайминги настраиваемыми в начале скетча. Отдельно на включение, отдельно на выключение. Искать по строке ______НАСТРОЙКИ ТАЙМИНГОВ!!!______.
m14 -теперь тайминги в const unsigned long. В настройках скетча можно включить ресет хаба после каждого включения зажигания( reset_HUB_on_power_on )= передёргивать ли хаб при каждом включении зажигания, для решения проблемы с изикапом (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.
m15 добавил тайминг timeWhileAkbLow = 40000; в настройки, увеличил с 20до 40с, для машин с функцией подсветки пути домой. //время, через которое начнётся полное выключение блока когда напряжение на АКБ очень низкое.
__________________________________________________ ______________
собственное потребление блока по 12 вольтам, без планшета
- при 10В +30 и +15 выключены = 0,02 А
- при 12В +30 и +15 включены = 0,092-0,1 А
- при 12В +30 включены +15 выключены (при питании батареи) = 0,06А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает
ПРИМЕЧАЕНИЯ
-> strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
*/
//************************************************** ************************************************** ***********************************************
// Массив режимов работы светодиода
byte modes[] = {
0B00000000, //Светодиод выключен
0B11111111, //Горит постоянно
0B00111111, //Мигание по 0.8 сек
0B00000001, //Короткая вспышка раз в секунду
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)
};
uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;
//************************************************** ************************************************** ***********************************************
#include <Wire.h> // для экрана - I2C шина
#include <LiquidCrystal_I2C.h> // библиотека для экрана
#include <EEPROM.h> // для использования ЕЕПРОМ
//#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )
char strokaI[32] = " ";// Массив для вывода 1 строки на дисплей , объявляем длиннее(32символа), чтобы не было глюков с отображением на экране
char strokaII[32] = " ";// Массив для вывода 2 строки на дисплей
// ЭТО нужно для вывода на 128*64 Adafruit_SSD1306 дисплей
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display2(OLED_RESET);
#define XPOS 0
#define YPOS 1
#define DELTAY 2
// конец настройки для вывода на 128*64 Adafruit_SSD1306 дисплей
//LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например
LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347
float UakbONorOFF = 12.1;// в 258 строке == if ((15.5 > U_acc_real >= UaccONorOFF) && flagACC == 1) {UakbONorOFF = 11.5;} else {UakbONorOFF = 11.9;}
float UaccONorOFF = 11.4;//11.1 // напряжение порога сработки асс
float U_acc_real = 0; // реальное напряжение +ACC на входе делителя (A0)
float U_akb_real = 0; // реальное напряжение +30 на входе делителя (A1)
int Uacc = 0; //Читаем напругу с делителя ACC R4-R5 0-1024 analogRead(A0);
int Uakb = 0; ////Читаем напругу с делителя R2-R3 0-1024 analogRead(A1);
/*ноги ардуины*/
uint8_t PORTBregistr = 0; // Если у нас есть 8-битная переменная PORTBregistr, то мы можем присвоить её значение регистру PORTx, и тем самым установить ножки микроконтроллера в состояние, соответствующее значению переменной PORTBregistr
boolean SAMOZAPITKA = 0; // byte SAMOZAPITKApin = 9; /*управление самозапиткой блока питания IN4*///1 = есть самозапитка; 0 = нет самозапитки
boolean LED = 0; // Светодиод 1 = светит; 0 = не светит
boolean SLEEP=0; //byte SLEEPpin = 10; //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; //1 = есть масса на OTG; 0 = нет массы на OTG
uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
boolean REM = 0; //byte REMpin = 7; /* 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3)*/ //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
//пины состояния ITS
boolean STATEpinI = 1; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = авария*/
boolean STATEpinII = 1; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.*/
/*логические переменные, используемые в коде*/
const boolean reset_HUB_on_power_on = 0; // передёргивать ли хаб при каждом включении зажигания, для решения проблемы с изикапом (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.
boolean flagACC = 0; /*признак включенного зажигания*/
byte flagAKB = 0; /* признак заряженной батареи*/
byte flagREM = 0; /* признак включенного выхода на усилитель звука (REM) 0 1 2*/
byte kalibrovkaNOW = 0; // признак того, что сейчас происходит калибровка встроенного вольтметра по АСС и АКБ.
byte kalibrovkaACC = EEPROM.read(0); // значение для калибровки для делителя АСС
byte kalibrovkaAKB = EEPROM.read(1); // значение для калибровки для делителя АКБ
boolean flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
/*счётчики времени*/
//НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!!
const unsigned long timeUntilBATOff = 345600000; // время до выключения питания на батарею планшета после выключения зажигания., если прошло 48 часов, как выключили ACC // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)
const unsigned long timeUntilALLOff = 172800000 + timeUntilBATOff; //время до полного выключение блока, после выключения зажигания (ACC)и после того, как выключится питание на батарею ) (2суток = 172800000)) (4суток = 345600000)
unsigned long timeBeforeRemOff = 1800000; /*1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. ~209 строчка.*/
int timeAfterACC_starting = 7000; // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время кручения стартером
int timeAfterACC_accOFF = 2000; // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время обычного выключения зажигания
int timeWhileAkbLow = 40000; //время, через которое начнётся полное выключение блока когда напряжение на АКБ очень низкое. /* если севший аккумулятор //через 40с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
//тут настраиваем паузу при включении зажигания ( АСС) и по истечении этого времени активируем/деактивируем
//соответствующий пин блока питания (время независимо друг от друга)
const unsigned long PlanshBAT_timer_pri_vkl_ACC = 1100;// пауза после включения ACC перед включением питания на батарею планшета
const unsigned long II_KIW_pin_POGO_timer_pri_vkl_ACC = 1400;// пауза после включения ACC перед включением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ)
const unsigned long OTG_timer_pri_vkl_ACC = 50;// пауза после включения ACC перед включением минуса на Y-OTG (включается определение ЮСБ перифирии планшетом.)
const unsigned long HUB_timer_pri_vkl_ACC = 2100;// пауза после включения ACC перед подачей питания на хаб. Значение должно быть больше либо равно II_KIW_pin_POGO_timer_pri_vkl_ACC.
const unsigned long REGISTRATOR_timer_pri_vkl_ACC = 2500;// пауза после включения ACC перед включением питания +12В на видеорегистратор
const unsigned long REM_timer_pri_vkl_ACC = 2500;// пауза после включения ACC перед включением питания +12В на REM (включение усилителя звука)
const unsigned long SLEEP_timer_pri_vkl_ACC = 3000; // пауза после включения ACC перед включением экрана
//тут настраиваем паузу при вЫключении зажигания ( АСС) и по истечении этого времени активируем/деактивируем
//соответствующий пин блока питания (время независимо друг от друга)
const unsigned long OTG_timer_pri_vykl_ACC = 2500; // пауза после вЫключения ACC перед вЫключением минуса на Y-OTG (вЫключается определение ЮСБ перифирии планшетом.)
const unsigned long II_KIW_pin_POGO_timer_pri_vykl_ACC = 5000; // пауза после вЫключения ACC перед вЫключением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ)
const unsigned long HUB_timer_pri_vykl_ACC = 5000; // пауза после вЫключения ACC перед убиранием питания с хаба. Значение должно быть меньше либо равно II_KIW_pin_POGO_timer_pri_vykl_ACC.
const unsigned long lcd_noBacklight_timer_pri_vykl_ACC = 7000; // пауза после вЫключения ACC перед убиранием подсветки I2C LSD дисплея (1602)
const unsigned long SLEEP_timer_pri_vykl_ACC = 0; // пауза после вЫключения ACC перед вЫключением экрана
const unsigned long REM_timer_pri_vykl_ACC = 1000;// не может быть больше timeAfterACC_accOFF и timeAfterACC_starting! Пауза после вЫключения ACC перед вЫключением питания +12В на REM (вЫключение усилителя звука), тут 1000 это на сколько раньше выключать выход REM перед остальными выключениями
//конец настроек таймингов.________________________________________ __________________________________________________
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long pauseTimeHALL = 140000; /* время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин*/
unsigned long timeAfterACC = 5000; /* время после выключения зажигания, после истечения которого вырубается экран, хаб, y-otg*/
unsigned long TimerREM = 0; /* отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long TIMER = millis();
int H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void UPRAVLENIE_PINAMI() // функция перевода логических параметров в реальные состояния пинов // http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry // https://geektimes.ru/post/255744/ Ускоряем свою Arduino /* http://robotosha.ru/arduino/digitalwrite-optimizing-arduino.html */
{// UPRAVLENIE_PINAMI ~~~//тут мы сначала пишем в переменную регистры, а потом сделаем PORTB = PORTBregistr; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
// PORTBregistr - обрабатывем регистры порта B атмеги
if (LED == 1 ){ PORTBregistr |= 1<<5; } //PORTB |= 1<<5; //установит "1" (сигнал высокого уровня) на выводе PB5. //digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
else { PORTBregistr &= ~(1<<5); } //PORTB &= ~(1<<5); //установит "0" (сигнал низкого уровня) на выводе PB5. //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
if (SAMOZAPITKA == 1){ PORTBregistr |= (1 << 1); } else {PORTBregistr &= ~((1 << 1));} //PB1 управление самозапиткой блока питания IN4///1 = есть самозапитка; 0 = нет самозапитки //http://microsin.net/programming/avr/accessing-avr-ports-with-winavr-gcc.html
if (OTG == 1){ PORTBregistr |= (1 << 2); } else {PORTBregistr &= ~((1 << 2));} //byte SLEEPpin = 10; /* PB2 управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
if (HUB == 0) { PORTBregistr |= (1 << 3); } else {PORTBregistr &= ~((1 << 3));} //HUB =0;//byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 1-есть питание, 0 - нет питания
if (SLEEP == 0) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG
// PORTDregistr - обрабатывем регистры порта D атмеги
if (PlanshBAT == 1){ PORTDregistr |= (1 << 6); } else {PORTDregistr &= ~((1 << 6));} //bool PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
if (REGISTRATOR == 1){ PORTDregistr |= (1 << 4); } else {PORTDregistr &= ~((1 << 4));} //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
if (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
if (REM == 1){ PORTDregistr |= (1 << 7); } else {PORTDregistr &= ~((1 << 7));} //bool REM = 0; //byte REMpin = 7; /* 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3)*/ //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
//Serial.print ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
void setup() //настройки
{
// wdt_disable(); //Отключение таймера watchdog
Serial.begin(115200);
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
if( kalibrovkaACC == 255 ){kalibrovkaACC=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию
if( kalibrovkaAKB == 255 ){kalibrovkaAKB=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию =127
// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины
DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; // PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);
pinMode(A2, INPUT); // пин калибровки
digitalWrite(A2, 1); // подтяжка +5 пина калибровки
// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
// wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void IntToCharI(int num, char *text)//функция, возвращающая число в текстовый вид 0 1
{
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
//text[1] = ((num/10)%10) + '0';// второе значение __0
text[2] = (num%10) + '0'; // третее значение ___
}
void IntToCharII(int num, char *text)//функция, возвращающая число в текстовый вид 00 11
{
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[0] = ((num/10)%10) + '0';// второе значение __0
text[1] = (num%10) + '0'; // третее значение ___
}
void IntToCharIII(int num, char *text)//функция, возвращающая число в текстовый вид 00 11
{
text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[1] = ((num/10)%10) + '0';// второе значение __0
text[2] = (num%10) + '0'; // третее значение ___
}
void IntToCharIIII(int num, char *text)//функция, возвращающая число в текстовый вид 0000 1111
{
text[0] = (num/1000) + '0';//0 знач
text[1] = (num/100)%10 + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[2] = ((num/10)%10) + '0';// второе значение __0
text[3] = (num%10) + '0'; // третее значение ___
}
void FloatToCharIIIII(float num, char *text)//функция, возвращающая число в текстовый вид 00.00 11.11
{
int Int = num*100;
text[0] = (Int/1000) + '0';//0 знач 7896
text[1] = (Int/100)%10 + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[2] = '.';
text[3] = ((Int/10)%10) + '0';// второе значение __0
text[4] = (Int%10) + '0'; // третее значение ___
}
void printDISPLAY() //функция формирования информации на дисплей ( точнее на два: 128*64 и 1602)
{
//_____________________________________________ФОРМИ РУЕМ СООБЩЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________
H = (millis()/3600000);
M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
//if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка экрана
//int M = (millis()/60000); //минуты
if (flagACC == 1){lcd.backlight();}// для newE и для 0x27
// в 256 строке выключение подсветки LCD дисплея
//пример: sprintf( strokaII,"SETUP volume on ");
//обработка 1й строки_________AKB ACC REM_______________________________________________ __________________________________________________ __________________________________________________ __________________
sprintf(strokaI," ") ;
//IntToCharIIII((millis()/60000), &strokaI[0]); // вывод минут 0000 4 цифры СЕКУНД // если превысит 9999, то будут кроказябры!!! вида ;0129
IntToCharIII(H, &strokaI[0]); // вывод часов 000
strokaI[3] = ':'; // вывод двоеточия
IntToCharII(M, &strokaI[4]); // вывод минут 00
strokaI[7]= flagAKB + '0';// вывод флага AKB 5 символ
strokaI[8]= flagACC+ '0';// вывод флага AСС 6 символ
strokaI[9]= REM + '0';// вывод rem 7 символ 1-усилок включен, 0 - выключен
strokaI[10]= flagREM + '0';// вывод флага!!! rem 7 символ 1-усилок включен, 0,2 - выключен
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АСС
//конец обработки 1й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________
//обработка 2й строки____________________________________________ __________________________________________________ __________________________________________________ ______________________________
TIMER = ( pauseTimeAKB + timeUntilALLOff - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)
// _______________________________Первые 30с после вкл -выкл ACC выводим версию блока.____________________________________________ __________________________________________________ __________________________________________________ ____
if ( ( millis()-pauseTimeACC < 30000 )&& flagACC == 1 ){ sprintf(strokaII,"m__ ") ; IntToCharII(ver, &strokaII[1]);} else { sprintf(strokaII,"____ "); IntToCharIIII(TIMER, &strokaII[0]); } //Первые 30с после вкл -выкл ACC выводим версию блока
// __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ _____________________________
//вывод OTG HUB POGO HALL
strokaII[6]= OTG + '0';// вывод флага OTG 5 символ
strokaII[7]= HUB + '0';// вывод флага HUB 6 символ
strokaII[8]= II_KIW_pin_POGO + '0';// вывод флага II_KIW_pin_POGO (ПРИЗНАК ЗАРЯДКИ) 7 символ
strokaII[9]= !SLEEP + '0';// вывод флага flagHALL 8 символ (инверсно) 1-экран включен, 0 - выключен
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
//конец обработки 2й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________
if (kalibrovkaNOW >= 1 && kalibrovkaNOW < 255 )// если активен режим калибровки, то выводим данные для калибровки.
{
sprintf (strokaI," ") ;
IntToCharIII(Uacc, &strokaI[0]);
IntToCharIII(Uakb, &strokaI[4]);
IntToCharIII(kalibrovkaNOW, &strokaI[7]); // вывод РЕЖИМА калибровки
sprintf(strokaII,"c ") ;
IntToCharIII(kalibrovkaACC, &strokaII[1]); // вывод значения калибровки АСС
IntToCharIII(kalibrovkaAKB, &strokaII[5]); // вывод значения калибровки АСС
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АКБ
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
}
//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________
displayDataToDISPLAY(); //>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>
/* так выглядит индикация на дисплее
================
|000:00 111 0.000| 1 строка * вывод времени работы блока H:M * AKB ACC REM * вывод напряжения АСС
|2616 1110 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * OTG HUB POGO HALL * вывод напряжения АКБ
*/
}
void displayDataToDISPLAY()//>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>
{//void displayDataToDISPLAY()
//вывод на 2хстрочный дисплей LCM 1602 с I2C ( на базе расширителя портов PCF8574)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//Serial.print("strokaI = "); Serial.println(strokaI); // раскомментить для вывода информации в ком порт для отладки
lcd.setCursor(0, 0);
lcd.print(strokaI);
//Serial.print("strokaII = "); Serial.println(strokaII); // раскомментить для вывода информации в ком порт для отладки
lcd.setCursor(0, 1); //2строка 0символ
lcd.print(strokaII);
//вывод на 128*64 дисплей (Adafruit_SSD1306) первой строки
display2.clearDisplay(); // очистили буфер
display2.setTextSize(1); // установили размер текста (1-4)
display2.setCursor(0,0); // начальная точка вывода
display2.println(strokaI); // скинули значение I строки в буфер 128*64 дисплея
//вывод на 128*64 дисплей (Adafruit_SSD1306) второй строки
display2.println(strokaII); // скинули значение II строки в буфер 128*64 дисплея
if ( ((millis() - pauseTimeACC) >= (5000+timeAfterACC)) && (flagACC==0) ) // после 5 сек после выключения зажигания буфер будет чиститься перед выводом, соответственно на 128*64 Adafruit_SSD1306 дисплей выводиться ничего не будет Это нужно для того, чтобы ночью экран не светился ( так как пиксели активные и дают свет без подсветки)
{
display2.clearDisplay(); // очистили буфер
}
display2.display(); //эта строка выводит картинку 1306 из буфера на экран!
//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________
}//void displayDataToDISPLAY()
/******************************************конец индикации светодиодом и вывода на дисплей******************************************* ************************************************** ************************************************** *********************************/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void analogReadU (byte averageFactor) //функция усреднённого чтения аналоговых входов (A0 A1)
{//void analogReadU
int newUacc = analogRead(A0); // замер для 5й версии
int newUakb = analogRead(A1); // замер для 5й версии
//int newUacc = analogRead(A1); // замер для 4й версии
//int newUakb = analogRead(A0); // замер для 4й версии
if (averageFactor > 0) // усреднение показаний для устранения "скачков"
{
Uacc = (Uacc * (averageFactor - 1) + newUacc) / averageFactor;
Uakb = (Uakb * (averageFactor - 1) + newUakb) / averageFactor;
// <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5 я тут немного поправил
} else {
Uakb=newUakb; // не делаем усреднений, что прочитали то и считаем выводом
Uacc=newUacc; // не делаем усреднений, что прочитали то и считаем выводом
}
}//void analogReadU
void rejim_kalibrovki() //функция измерения, калибровки и записи полученных значений в еепром
{//void rejim_kalibrovki()
lcd.noBacklight();
delay (50);
lcd.backlight();
delay (250);
if (digitalRead(A2)== 1 && kalibrovkaNOW < 6) {kalibrovkaNOW ++;}
else // тут достигли 6 касаний точки калибровки и ЗАПУСКАЕМ НЕПОСРЕДСТВЕННО ПРОЦЕСС КАЛИБРОВКИ ( ДЛЯ ЭТОГО ПОДАЁМ РОВНО 12,00В НА БЛОК ПИТАНИЯ ( асс и акб)
{ //else
if (kalibrovkaNOW >= 6)
{//if (kalibrovkaNOW >= 6)
PORTBregistr = 0; // выключили всё
PORTDregistr = 0; // выключили всё
UPRAVLENIE_PINAMI(); // сказали регистрам исполнить " выключили всё ", вызвав функцию
delay (600); // для зарядки кондёров после снятия нагрузки
analogReadU (10); //вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(10)раз
kalibrovkaACC = 1200000/Uacc-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
kalibrovkaAKB = 1200000/Uakb-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
{kalibrovkaNOW ++;}
}//if (kalibrovkaNOW >= 6)
}//else
if ( kalibrovkaNOW == 15 && digitalRead(A2)== 0) //по достижению счета в 254 и ПРИ МАССЕ НА ПИНЕ КАЛИБРОВКИ данные калибровки запишутся в еепром
{
kalibrovkaNOW = 255;
EEPROM.write(0,kalibrovkaACC);
EEPROM.write(1,kalibrovkaAKB);
sprintf (strokaI,"end KALIBR. ") ;
sprintf(strokaII,"c ") ;
IntToCharIII(kalibrovkaACC, &strokaII[1]); // вывод значения калибровки АСС
IntToCharIII(kalibrovkaAKB, &strokaII[5]); // вывод значения калибровки АСС
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АКБ
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
displayDataToDISPLAY(); //
delay (10000);
}
}//void rejim_kalibrovki()
void STATUS_REM()
{//void STATUS_REM()
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обр аботка статуса выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~*/
/*если напруга батареи больше 12В, то включаем еще и усилитель звука (выход REM) /но включаем его только на 1 час, если не заведены.*/
if (U_akb_real >= 11.8 && flagACC == 1 && flagREM == 0 ) {flagREM = 1; TimerREM = millis();} //если подзаряжен акб и включили зажигание - ВКЛЮЧАЕМ REM
if (U_akb_real >= 11.8 && flagACC == 1 && ( millis() - TimerREM >= timeBeforeRemOff )) {flagREM = 2 ;} // если кончилось время обратного отсчета - статус рем - 2.
//if (U_akb_real >= 13.7 && flagACC == 1){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= 11.8 && flagREM == 2 && flagACC == 0){ flagREM = 0;} // если восстановилось напряжение при выключенном зажигании - обнуляем статус РЕМ.
if (U_akb_real <= 11.8 && flagACC == 1){ flagREM = 2;} //если подсел акб при включенном зажигании - статус рем - 2.
if (U_akb_real >= 13.7 && flagACC == 1 ){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= 13.7 && flagREM == 3){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= 15.5){flagREM = 2;}// проверка на перезаряд
if( flagREM == 0 || flagREM == 2){REM = 0;} // выключаем выход REM
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~коне ц отработки выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~*/
}//void STATUS_REM()
void loop()
{while (1){//для ускорения void loop
analogReadU (5);//вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(5)раз.
if (kalibrovkaNOW != 255 && digitalRead(A2)== 0){if ( (millis() < 60000) || kalibrovkaNOW >= 6 ) { rejim_kalibrovki();} } // после 60с или если стоит ЗАПРЕТ(255), калибровку НЕ ДЕЛАЕМ
// новое ( с T12 версии) вычисление реального напряжения, с учетом значений калибровки в еепром (0 и 1 адреса)
U_acc_real = Uacc * (1410.0+kalibrovkaACC)/100000;
U_akb_real = Uakb * (1410.0+kalibrovkaAKB)/100000;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( (millis() > pauseTimeHALL && flagHALL == 0 )|| ((millis() > 15000) && flagACC == 1))
{flagHALL = 1;} /*проверка отсчета при холодном старте при включении и сразу выключении ACC*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = 2000;} //выключили зажигание /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = 7000; if (U_akb_real <=UakbONorOFF) {flagREM = 3;REM = 0;} }//стартуем /* 5000 0 - заводим машину (стартуем) или сел акб при включенном зажигании.*/ Логика работы REM в 537 строках
if (U_akb_real >= 15.5){timeAfterACC = 0;}
// ввести новую переменную int starting_mode = 1;//стартуем 0 = не_стартуем.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// ------------========================== блок ACC ========================-----------------------------------------------------------------------------
// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((15.5 > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
//lcd.clear(); //очистка экрана не нужна со строковым выводом
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея
}
if (flagACC ==1 )
{// если flagACC == 1
if (millis() - pauseTimeACC >= PlanshBAT_timer_pri_vkl_ACC ) /* пауза 1.1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета = этим подаём 12В на DC-DC. На 1м канале dc-dc сразу появляется напряжение (3,8-4,2 - как настроено)*/
}
if (millis() - pauseTimeACC >= II_KIW_pin_POGO_timer_pri_vkl_ACC ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
II_KIW_pin_POGO = 1; //digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
}
if (millis() - pauseTimeACC >= OTG_timer_pri_vkl_ACC ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на Y-OTG (включается определение перифирии планшетом.)*/
}
if (millis() - pauseTimeACC >= HUB_timer_pri_vkl_ACC ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В dc-dc (2вых)на хаб*/
}
if (reset_HUB_on_power_on == 1)
{
if (millis() - pauseTimeACC >= (HUB_timer_pri_vkl_ACC+500) ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 0; //digitalWrite(HUBpin, 1); /*Выключаем хаб*/
}
if (millis() - pauseTimeACC >= (HUB_timer_pri_vkl_ACC+1000) ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В dc-dc (2вых)на хаб*/
}
}
if (millis() - pauseTimeACC >= REGISTRATOR_timer_pri_vkl_ACC )/*через 2,2с после включения ACC включаем: */
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}
if (millis() - pauseTimeACC >= REM_timer_pri_vkl_ACC )/*через 2,2с после включения ACC включаем: */
{
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}
if (millis() - pauseTimeACC >= SLEEP_timer_pri_vkl_ACC ) // пауза после включения ACC и потом делать следующ(пока включено ACC):
{
SLEEP = 0; //digitalWrite(SLEEPpin, 0); /*включаем экран*/
}
}// если flagACC == 1
STATUS_REM(); //зашли в функцию обработки статуса выхода REM
//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= (timeAfterACC-REM_timer_pri_vykl_ACC)) ) // тут REM_timer_pri_vykl_ACC (1000)- это на сколько раньше выключать выход REM перед остальными выключениями
{
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
}
/*пауза 7c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
if (((millis() - pauseTimeACC) >= (timeAfterACC+SLEEP_timer_pri_vykl_ACC)) )
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*тушим экран (если прошло 2 минуты с момента включения блока )*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (OTG_timer_pri_vykl_ACC+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG (8 pin PW1)*/
}
if ( ((millis() - pauseTimeACC) >= (II_KIW_pin_POGO_timer_pri_vykl_ACC+timeAfterACC)) )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V зарядки. (POGO(USB))*/
}
if ( ((millis() - pauseTimeACC) >= (HUB_timer_pri_vykl_ACC+timeAfterACC)) )
{
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (lcd_noBacklight_timer_pri_vykl_ACC+timeAfterACC)) )
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
}
}// if (flagACC==0)
// -------------------------========================= блок АКБ ==========================-------------------------------------------------------------------------------
if (U_acc_real >= UaccONorOFF) {UakbONorOFF = 11.1;} else {UakbONorOFF = 11.9;} /*при включении зажигания напряжение самовырубания станет 11,5 вместо 11,9*/
if ((15.5 > U_akb_real) && ((U_akb_real >= UakbONorOFF) && flagAKB == 0)) /*проверка +30 на перезаряд >15.5В, и больше заданного в 266 строке, и флага акб */
{
if ((millis() - pauseTimeACC >= 100) && flagAKB == 0)
{
SAMOZAPITKA =1;//digitalWrite(SAMOZAPITKApin, 1); /* включаем самозапитку процессора */
flagAKB = 1; /*подняли флаг батареи*/
}
}
if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >15.5))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = 11.9;
//lcd.clear(); //очистка экрана
}
if ((millis() - pauseTimeAKB >= timeWhileAkbLow) && flagAKB == 0) /* если севший аккумулятор //через 40с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета */
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на Y-OTG )*/
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
HUB = 0; //digitalWrite(HUBpin, 1); /* подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб*/
REM = 0; //digitalWrite(REMpin, 0); /* выключаем выход REM*/
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается*/
//delay (5000); /* задержка для аппаратного выключения*/
}
if (flagAKB == 1 && flagACC == 0) /*ситуация, когда норм акб и выключено зажигание (ACC)*/
{
if ((millis() - pauseTimeAKB )>= timeUntilBATOff && flagAKB == 1) /* если прошло "timeUntilBATOff" 24 (86400000) часа, как выключили ACC // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)*/
{
PlanshBAT = 0; // digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)//(батарея планшета))*/
}
if ((millis() - pauseTimeAKB) >= timeUntilALLOff && flagAKB == 1) /* если давно выключили ACC ) "timeUntilALLOff" (2суток = 172800000)) (самозапитка для регистратора, процессор БП активен)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (10000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
// ******************************************отслежив ания аварийной ситуации ITS716G (превышение по току по выходам out1-4)************************************************ ************************************************** ************************************************** ****************************
// *отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
// *отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"
if(SAMOZAPITKA==1 || PlanshBAT ==1 ||REM==1 || REGISTRATOR ==1) // если проц включал любой канал ITS
{
STATEpinI = digitalRead(5); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
STATEpinII = digitalRead(8);
if(STATEpinI == 0) { // и если пин защиты STATEpinI показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты STATEpinII показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI();delay(493); LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB =0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
}
// ************************************************** ************************************************** ************************************************** ************************************************** ******************
*/
/******************************************индикаци я светодиодом и задержка вывода на дисплей******************************************* ************************************************** ************************************************** *********************************/
ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}
// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;
printDISPLAY(); // выводим на дисплей раз в 350( запуская фушкцию)
}
/*настраиваем режимы моргания встроенного светодиода ардуины*/
if (blink_mode != modes[5] || blink_mode != modes[5])
{
if (flagAKB == 0 ){blink_mode = modes[3];} // индикация напруги батареи на ардуинине.- низкое напряжение АКБ авто - коротко моргает
if (flagAKB == 1 && flagACC == 0) {blink_mode = modes[6];} //- нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
if (flagAKB == 1 && flagACC == 1) {blink_mode = modes[2];} //- нормальное напряжение, включено ACC, рабочий режим. - медленно моргает
if (kalibrovkaNOW >= 1) {blink_mode = modes[1];} // режим калибровки
}
/* ***********************данные для справки******************************************* *********************
0B00000000, //Светодиод выключен blink_mode = modes[0];
0B11111111, //Горит постоянно blink_mode = modes[1];
0B00111111, //Мигание по 0.8 сек blink_mode = modes[2]; - нормальное напряжение, включено ACC, рабочий режим.
0B00000001, //Короткая вспышка раз в секунду = modes[3]; - низкое напряжение АКБ авто
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)= blink_mode = modes[6]; - нормальное напряжение АКБ авто, ACC выключено.
*/
//************************************************** ************************************************** ******
UPRAVLENIE_PINAMI();
//wdt_reset(); /*Сброс таймера watchdog*/
}} /*конец цикла void loop() и конец while (1)*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
Las42kuz
26.11.2017, 08:02
Скажите а ядро даниэля отвечает за то что бы планшет показывал всегда 100% батареи? И на какую версию его можно поставить? Заранее спасибо!!!
Скажите а ядро даниэля отвечает за то что бы планшет показывал всегда 100% батареи? И на какую версию его можно поставить? Заранее спасибо!!!
в ядре Даниэля (http://pccar.ru/showpost.php?p=316598&postcount=12) всё расписано.
Стоковое ядро с поддержкой USB-аудио, easycap STK1160 для Android 4.4.4
Стоковое ядро с поддержкой USB-аудио, easycap STK1160 и обходом контроллера батареи для Android 4.4.4
Стоковое ядро с поддержкой USB-аудио, easycap для Android 5.1
и так далее.
Для 7-12 и 7-13 естественно раздельно.
На данный момент я вообще не уверен, стоит ли его менять. На стоке или на любой другой прошивке всё должно работать ( вопрос только в драйверах, чтобы ядро видело периферию)
Скажите а ядро даниэля отвечает за то что бы планшет показывал всегда 100% батареи? И на какую версию его можно поставить? Заранее спасибо!!!
который с обходом батареи показывает всегда 100 процентов
Las42kuz
27.11.2017, 20:20
в ядре Даниэля (http://pccar.ru/showpost.php?p=316598&postcount=12) всё расписано.
Стоковое ядро с поддержкой USB-аудио, easycap STK1160 для Android 4.4.4
Стоковое ядро с поддержкой USB-аудио, easycap STK1160 и обходом контроллера батареи для Android 4.4.4
Стоковое ядро с поддержкой USB-аудио, easycap для Android 5.1
и так далее.
Для 7-12 и 7-13 естественно раздельно.
На данный момент я вообще не уверен, стоит ли его менять. На стоке или на любой другой прошивке всё должно работать ( вопрос только в драйверах, чтобы ядро видело периферию)
Олег спасибо за ответ! У меня вот проблема ни как не могу определить почему Нексус 13 отключается! Подключён через преобразователь kis3r33 без контроллера и батареи, уходит в сон через датчик холла через релейный модуль ! К планшету подключён хаб с питанием от пребразователя lm2596s на у- кабеле убрал + который идёт в планшет, в хаб подключены ардуйно, изикап, pcm2704, и одна флешка! Помогите советом что я не правильно сделал? Почему он вырубается?
Олег спасибо за ответ! У меня вот проблема ни как не могу определить почему Нексус 13 отключается! Подключён через преобразователь kis3r33 без контроллера и батареи, уходит в сон через датчик холла через релейный модуль ! К планшету подключён хаб с питанием от пребразователя lm2596s на у- кабеле убрал + который идёт в планшет, в хаб подключены ардуйно, изикап, pcm2704, и одна флешка! Помогите советом что я не правильно сделал? Почему он вырубается?
Да вроде бы должно работать с первого взгляда; наберите меня в вайбер или whatsApp, голосом обсудим. Будет быстрее, чем писать. +375293девять52семь87.
Las42kuz
27.11.2017, 21:16
Да вроде бы должно работать с первого взгляда; наберите меня в вайбер или whatsApp, голосом обсудим. Будет быстрее, чем писать. +375293девять52семь87.
Можно завтра наберу вечером?
Можно завтра наберу вечером?
ок, напиши и потом созвонимся.
byte ver = 19;// ( чем больше цифра, тем новее)
// дата правки 30.11.17.202
// для 5mini версии блока питания.
// скетч проверен и записан на версии ардуино IDE 1,8,1 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/enjoyneering/LiquidCrystal_I2C например
//в версии T04 добавлена поддержка дисплея Adafruit_SSD1306 128*64 Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
/* _
хотелки
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, библиотека вывода на экран https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше UrabotyREM (11.8 В), то включаем еще и усилитель звука (выход REM) /но включаем его только на 30-60мин, если не заведены. После заводки счетчик обнуляется.
v92 сделанъ плавный пуск - определяем нужное состояние пинов без их предварительного дергания в начальное нулевое.
v94 сделанъ вывод на экран через переменную, а не напрямую. ЭТО позволило выводить информацию ЕЩЕ И В КОМ ПОРТ!!! <<<<<<<========================================
v94 Сделана задержка включения REM после холодного запуска, 15с. Через 10 с после начала загрузки идёт инициализация звуковой, в этот момент слышен ПУК
t00 новая ветка блока, по факту продолжение старой.
t02 поскольку аптаймблока в машине превысил 9999 минут, то переделан вывод аптайма 000:00 ( часы : минуты)
t03 дисплей тухнет через 3 сек после операции завершения.
t04 добавлена поддержка дисплея Adafruit_SSD1306 128*64 (тестово). Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master
Без 2х библиотек одновременно работать не будет https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
t06 обработка напряжений выше 15,5 ( тушим экран и выключаем усилок)
t07 в войд сетап задержки по 0,1с для инициализации дисплеев. Изменен алгоритм выключения - сначала тушим экран, потом все остальное( для таскера, чтобы паузу ставил и плей жал)
выключен Serial.print. display2.begin(SSD1306_ - перекинута инициализация на включение зажигания - 318 строка
t08- ничего
t09 - перенесена строка проверки заведённой авто, в конец, перед проверкой перезаряда.
t10 - перешел на другую библиотеку для 1602 дисплея( newE) https://github.com/enjoyneering/LiquidCrystal_I2C. 128*64 не проверял.
t11 - в связи с тем, что у меня дребезжит контактная группа в машине, изменён алгоритм выключения выхода REM
t12 - возможность калибровки с записью в еепром, переделан метод вывода на дисплей ( теперь через две функции (формирования строк и непосредственно вывода.), а не в основном цикле), убрн вотчдог, как не имеющий практического смысла( пока что просто заккоментирован).
t13 поправлена Логика работы REM = когда стартуем flagREM = 3 Обработка логики работы REM в 538 строках.
t14 - введена новая переменная timeUntilBATOff = время до выключения питания на батарею планшета после выключения зажигания. 24ч = 86400000 (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч) (2суток = 172800000) (4суток = 345600000)
timeUntilALLOff = время до полного выключение блока, после выключения зажигания (ACC) ((самозапитка для регистратора)- чтобы легче было менять это время в начале скетча.
увеличено время поддержки планшета включённым-timeUntilBATOff ( 2 суток после выкл АСС и еще 2 суток после этого до полного выключения блока)
m01-05 - Новая версия БП5mini. Переход на новые, хорошо себя зарекомендовавшие, дс-дс (mini360). Датчик холла и отг теперь управляются специализированной микросхемой-твердотельным реле. Из-за неё же теперь потеряна совместимость прошивок на БП5 (поскольку на управление холлом теперь нужен инверсный сигнал). Поэтому уже заодно поменял местами пины управления ОТГ и ХОЛЛА (физически). Фишка полностью совместима с БП5, БП4, БП3.
m6 - обработка статуса выхода REM переведена в отдельную функцию
m7 - поменян порядок включения элементов и их тайминги. Тестово. По идее, должно быть стабильнее, либо вообще никак не повлияет. Убраны лишние закомментированны строчки.
m11 - отг включаю сразу.
m12 - Сделал все основные тайминги настраиваемыми в начале скетча. Отдельно на включение, отдельно на выключение. Искать по строке ______НАСТРОЙКИ ТАЙМИНГОВ!!!______.
m14 - теперь тайминги в const unsigned long. В настройках скетча можно включить ресет хаба после каждого включения зажигания( reset_HUB_on_power_on )= передёргивать ли хаб при каждом включении зажигания, для решения проблемы с изикапом (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.
m15 - добавил тайминг timeWhileAkbLow = 40000; в настройки, увеличил с 20до 40с, для машин с функцией подсветки пути домой. //время, через которое начнётся полное выключение блока когда напряжение на АКБ очень низкое.
m18 - перевел все основные значения напряжений, таймингов и пинов на переменные. Облегчение портирования на разные аппаратные платформы. Подготовка совместимости с БП7.
m19 - более дружественные комментарии.
__________________________________________________ ______________
собственное потребление блока по 12 вольтам, без планшета
- при 10В +30 и +15 выключены = 0,02 А
- при 12В +30 и +15 включены = 0,092-0,1 А
- при 12В +30 включены +15 выключены (при питании батареи) = 0,06А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает
ПРИМЕЧАЕНИЯ
-> strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
*/
//************************************************** ************************************************** ***********************************************
// Массив режимов работы светодиода
byte modes[] = {
0B00000000, //Светодиод выключен
0B11111111, //Горит постоянно
0B00111111, //Мигание по 0.8 сек
0B00000001, //Короткая вспышка раз в секунду
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)
};
uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;
//************************************************** ************************************************** ***********************************************
#include <Wire.h> // для экрана - I2C шина
#include <LiquidCrystal_I2C.h> // библиотека для экрана
#include <EEPROM.h> // для использования ЕЕПРОМ
//#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )
char strokaI[32] = " ";// Массив для вывода 1 строки на дисплей , объявляем длиннее(32символа), чтобы не было глюков с отображением на экране
char strokaII[32] = " ";// Массив для вывода 2 строки на дисплей
// ЭТО нужно для вывода на 128*64 Adafruit_SSD1306 дисплей
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display2(OLED_RESET);
#define XPOS 0
#define YPOS 1
#define DELTAY 2
// конец настройки для вывода на 128*64 Adafruit_SSD1306 дисплей
//LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка экрана для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например
LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347
float UakbONorOFF = 12.1;// напряжение порога сработки акб
float U_acc_real = 0; // реальное напряжение +ACC на входе делителя (A0)
float U_akb_real = 0; // реальное напряжение +30 на входе делителя (A1)
int Uacc = 0; //Читаем напругу с делителя ACC 0-1024
int Uakb = 0; ////Читаем напругу с делителя АКБ 0-1024
/*ноги ардуины*/
uint8_t PORTBregistr = 0; // Если у нас есть 8-битная переменная PORTBregistr, то мы можем присвоить её значение регистру PORTx, и тем самым установить ножки микроконтроллера в состояние, соответствующее значению переменной PORTBregistr
boolean SAMOZAPITKA = 0; // byte SAMOZAPITKApin = 9; /*управление самозапиткой блока питания IN4*///1 = есть самозапитка; 0 = нет самозапитки
boolean LED = 0; // Светодиод 1 = светит; 0 = не светит
boolean SLEEP=0; //byte SLEEPpin = 10; //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; //1 = есть масса на OTG; 0 = нет массы на OTG
uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
boolean REM = 0; //byte REMpin = 7; /* 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3)*/ //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
int PINrawACC = A0; // замер для 5й версии
int PINrawAKB = A1; // замер для 5й версии
int PINkalibrovki = A2; // замер для 5й версии
//int PINrawACC = A7; // замер для 7й версии
//int PINrawAKB = A8; // замер для 7й версии
//int PINkalibrovki = A3; // замер для 7й версии
//пины состояния ITS
boolean STATEpinI = 1; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = авария*/
boolean STATEpinII = 1; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.*/
/*логические переменные, используемые в коде*/
boolean flagACC = 0; /*признак включенного зажигания*/
byte flagAKB = 0; /* признак заряженной батареи*/
byte flagREM = 0; /* признак включенного выхода на усилитель звука (REM) 0 1 2*/
byte kalibrovkaNOW = 0; // признак того, что сейчас происходит калибровка встроенного вольтметра по АСС и АКБ.
byte kalibrovkaACC = EEPROM.read(0); // значение для калибровки для делителя АСС
byte kalibrovkaAKB = EEPROM.read(1); // значение для калибровки для делителя АКБ
boolean flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
//Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
const boolean reset_HUB_on_power_on = 0; // передёргивать ли хаб при каждом включении зажигания, для решения проблемы с определением изикапа (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.
/*счётчики времени*/
//НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!!
const unsigned long timeUntilBATOff = 345600000; // время до выключения питания на батарею планшета после выключения зажигания., если прошло 48 часов, как выключили ACC // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)
const unsigned long timeUntilALLOff = 172800000 + timeUntilBATOff; // время до полного выключение блока, после выключения зажигания (ACC)и после того, как выключится питание на батарею ) (2суток = 172800000)) (4суток = 345600000)
unsigned long timeBeforeRemOff = 1800000; // 1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. ( то есть сколько времени будет включён усилитель звука, если заглушить машину и просто слушать музыку, при нормальном АКБ)
int timeAfterACC_starting = 7000; // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время кручения стартером
int timeAfterACC_accOFF = 2000; // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время обычного выключения зажигания
int timeWhileAkbLow = 40000; //время, через которое начнётся полное выключение блока когда напряжение на АКБ очень низкое. /* если севший аккумулятор //через 40с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
unsigned long pauseTimeHALL = 140000; // Для первого включения планшета. Раньше этого времени экран не будет тухнуть! Время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин
//НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________
float Uperezariadki = 15.5; //напряжение, выше которого будет считаться, что идёт перезарядка аккумулятора авто.
float UrabotyREM = 11.8; //напряжение, выще которого будет работать усилитель звука, если акб не садился.
float UnevykluczeniaREM = 13.7; // напряжение, когда машина считается заведённой. Тогда, если завели машину, ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
float Uakb_Kogda_ACC_vYkluczeno = 11.9; // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вЫключенном АСС
float Uakb_Kogda_ACC_vkluczeno = 11.1; // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вКлюченном АСС
float UaccONorOFF = 11.4; // напряжение порога сработки асс. Т.е. если на пин блока питания "вход АСС" подать ниже UaccONorOFF (11,4), то зажигание будет считаться выключенным.
//КОНЕЦ НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________
//тут настраиваем паузу при вКлючении зажигания ( АСС) и по истечении этого времени активируем/деактивируем
//соответствующий пин блока питания (время независимо друг от друга)
const unsigned long PlanshBAT_timer_pri_vkl_ACC = 1100;// пауза после включения ACC перед включением питания на батарею планшета
const unsigned long II_KIW_pin_POGO_timer_pri_vkl_ACC = 1400;// пауза после включения ACC перед включением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ)
const unsigned long OTG_timer_pri_vkl_ACC = 50;// пауза после включения ACC перед включением минуса на OTG ( 4й контакт ЮСБ разъема на планшете) (включается определение ЮСБ перифирии планшетом.)
const unsigned long HUB_timer_pri_vkl_ACC = 2100;// пауза после включения ACC перед подачей питания на хаб. Значение должно быть больше либо равно II_KIW_pin_POGO_timer_pri_vkl_ACC.
const unsigned long REGISTRATOR_timer_pri_vkl_ACC = 2500;// пауза после включения ACC перед включением питания +12В на видеорегистратор
const unsigned long REM_timer_pri_vkl_ACC = 2500;// пауза после включения ACC перед включением питания +12В на REM (включение усилителя звука)
const unsigned long SLEEP_timer_pri_vkl_ACC = 3000; // пауза после включения ACC перед включением экрана
//тут настраиваем паузу при вЫключении зажигания ( АСС) и по истечении этого времени активируем/деактивируем
//соответствующий пин блока питания (время независимо друг от друга)
const unsigned long OTG_timer_pri_vykl_ACC = 2500; // пауза после вЫключения ACC перед вЫключением минуса на OTG ( 4й контакт ЮСБ разъема на планшете) (вЫключается определение ЮСБ перифирии планшетом.)
const unsigned long II_KIW_pin_POGO_timer_pri_vykl_ACC = 5000; // пауза после вЫключения ACC перед вЫключением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ)
const unsigned long HUB_timer_pri_vykl_ACC = 5000; // пауза после вЫключения ACC перед убиранием питания с хаба. Значение должно быть меньше либо равно II_KIW_pin_POGO_timer_pri_vykl_ACC.
const unsigned long lcd_noBacklight_timer_pri_vykl_ACC = 7000; // пауза после вЫключения ACC перед убиранием подсветки I2C LSD дисплея (1602)
const unsigned long SLEEP_timer_pri_vykl_ACC = 0; // пауза после вЫключения ACC перед вЫключением экрана
const unsigned long REM_timer_pri_vykl_ACC = 1000;// не может быть больше timeAfterACC_accOFF и timeAfterACC_starting! Пауза после вЫключения ACC перед вЫключением питания +12В на REM (вЫключение усилителя звука), тут 1000 это на сколько раньше выключать выход REM перед остальными выключениями
//конец настроек таймингов.________________________________________ __________________________________________________
//К О Н Е Ц Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// К О Н Е Ц Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// К О Н Е Ц Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// К О Н Е Ц Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long timeAfterACC = 5000; /*базовое (для инициализации) , ни на что не влияет. Меняйте timeAfterACC_accOFF и timeAfterACC_starting ! время после выключения зажигания, после истечения которого вырубается экран, хаб, otg-режим*/
unsigned long TimerREM = 0; /*базовое (для инициализации) , ни на что не влияет. Отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long TIMER = millis(); /*базовое (для инициализации) , ни на что не влияет. */
unsigned long H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void UPRAVLENIE_PINAMI() // функция перевода логических параметров в реальные состояния пинов // http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry // https://geektimes.ru/post/255744/ Ускоряем свою Arduino /* http://robotosha.ru/arduino/digitalwrite-optimizing-arduino.html */
{// UPRAVLENIE_PINAMI ~~~//тут мы сначала пишем в переменную регистры, а потом сделаем PORTB = PORTBregistr; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
// PORTBregistr - обрабатывем регистры порта B атмеги
if (LED == 1 ){ PORTBregistr |= 1<<5; } //PORTB |= 1<<5; //установит "1" (сигнал высокого уровня) на выводе PB5. //digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
else { PORTBregistr &= ~(1<<5); } //PORTB &= ~(1<<5); //установит "0" (сигнал низкого уровня) на выводе PB5. //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
if (SAMOZAPITKA == 1){ PORTBregistr |= (1 << 1); } else {PORTBregistr &= ~((1 << 1));} //PB1 управление самозапиткой блока питания IN4///1 = есть самозапитка; 0 = нет самозапитки //http://microsin.net/programming/avr/accessing-avr-ports-with-winavr-gcc.html
if (OTG == 1){ PORTBregistr |= (1 << 2); } else {PORTBregistr &= ~((1 << 2));} //byte SLEEPpin = 10; /* PB2 управление транзюком сна VT4 (на датчик холла))*/ //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
if (HUB == 0) { PORTBregistr |= (1 << 3); } else {PORTBregistr &= ~((1 << 3));} //HUB =0;//byte HUBpin = 11; /* PB3 управление транзюком питания хаба*/ // 1-есть питание, 0 - нет питания
if (SLEEP == 0) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1*/ //1 = есть масса на OTG; 0 = нет массы на OTG
// PORTDregistr - обрабатывем регистры порта D атмеги
if (PlanshBAT == 1){ PORTDregistr |= (1 << 6); } else {PORTDregistr &= ~((1 << 6));} //bool PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
if (REGISTRATOR == 1){ PORTDregistr |= (1 << 4); } else {PORTDregistr &= ~((1 << 4));} //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
if (II_KIW_pin_POGO == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; /* 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка*/ //0 = нет 5V на POGO; 1 = есть 5V на POGO
if (REM == 1){ PORTDregistr |= (1 << 7); } else {PORTDregistr &= ~((1 << 7));} //bool REM = 0; //byte REMpin = 7; /* 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3)*/ //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
//Serial.print ("PORTBregistr, BIN = " ); Serial.println (PORTBregistr, BIN); // вывели порт B атмеги на монитор порта
//Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
void setup() //настройки
{
Serial.begin(115200);
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
if( kalibrovkaACC == 255 ){kalibrovkaACC=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию
if( kalibrovkaAKB == 255 ){kalibrovkaAKB=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию =127
// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool II_KIW_pin_POGO = 0; //byte II_KIW_pin_POGOpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины
DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; // PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);
pinMode(PINkalibrovki, INPUT); // пин калибровки
digitalWrite(PINkalibrovki, 1); // подтяжка +5 пина калибровки
// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
// wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void IntToCharI(int num, char *text)//функция, возвращающая число в текстовый вид 0 1
{
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
//text[1] = ((num/10)%10) + '0';// второе значение __0
text[2] = (num%10) + '0'; // третее значение ___
}
void IntToCharII(int num, char *text)//функция, возвращающая число в текстовый вид 00 11
{
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[0] = ((num/10)%10) + '0';// второе значение __0
text[1] = (num%10) + '0'; // третее значение ___
}
void IntToCharIII(int num, char *text)//функция, возвращающая число в текстовый вид 00 11
{
text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[1] = ((num/10)%10) + '0';// второе значение __0
text[2] = (num%10) + '0'; // третее значение ___
}
void IntToCharIIII(int num, char *text)//функция, возвращающая число в текстовый вид 0000 1111
{
text[0] = (num/1000) + '0';//0 знач
text[1] = (num/100)%10 + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[2] = ((num/10)%10) + '0';// второе значение __0
text[3] = (num%10) + '0'; // третее значение ___
}
void FloatToCharIIIII(float num, char *text)//функция, возвращающая число в текстовый вид 00.00 11.11
{
int Int = num*100;
text[0] = (Int/1000) + '0';//0 знач 7896
text[1] = (Int/100)%10 + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[2] = '.';
text[3] = ((Int/10)%10) + '0';// второе значение __0
text[4] = (Int%10) + '0'; // третее значение ___
}
void printDISPLAY() //функция формирования информации на дисплей ( точнее на два: 128*64 и 1602)
{
//_____________________________________________ФОРМИ РУЕМ СООБЩЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________
H = (millis()/3600000);
M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
//if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка экрана
//int M = (millis()/60000); //минуты
if (flagACC == 1){lcd.backlight();}// для newE и для 0x27
// в 256 строке выключение подсветки LCD дисплея
//пример: sprintf( strokaII,"SETUP volume on ");
//обработка 1й строки_________AKB ACC REM_______________________________________________ __________________________________________________ __________________________________________________ __________________
sprintf(strokaI," ") ;
//IntToCharIIII((millis()/60000), &strokaI[0]); // вывод минут 0000 4 цифры СЕКУНД // если превысит 9999, то будут кроказябры!!! вида ;0129
IntToCharIII(H, &strokaI[0]); // вывод часов 000
strokaI[3] = ':'; // вывод двоеточия
IntToCharII(M, &strokaI[4]); // вывод минут 00
strokaI[7]= flagAKB + '0';// вывод флага AKB 5 символ
strokaI[8]= flagACC+ '0';// вывод флага AСС 6 символ
strokaI[9]= REM + '0';// вывод rem 7 символ 1-усилок включен, 0 - выключен
strokaI[10]= flagREM + '0';// вывод флага!!! rem 7 символ 1-усилок включен, 0,2 - выключен
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АСС
//конец обработки 1й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________
//обработка 2й строки____________________________________________ __________________________________________________ __________________________________________________ ______________________________
TIMER = ( pauseTimeAKB + timeUntilALLOff - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)
// _______________________________Первые 30с после вкл -выкл ACC выводим версию блока.____________________________________________ __________________________________________________ __________________________________________________ ____
if ( ( millis()-pauseTimeACC < 30000 )&& flagACC == 1 ){ sprintf(strokaII,"m__ ") ; IntToCharII(ver, &strokaII[1]);} else { sprintf(strokaII,"____ "); IntToCharIIII(TIMER, &strokaII[0]); } //Первые 30с после вкл -выкл ACC выводим версию блока
// __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ _____________________________
//вывод OTG HUB POGO HALL
strokaII[6]= OTG + '0';// вывод флага OTG 5 символ
strokaII[7]= HUB + '0';// вывод флага HUB 6 символ
strokaII[8]= II_KIW_pin_POGO + '0';// вывод флага II_KIW_pin_POGO (ПРИЗНАК ЗАРЯДКИ) 7 символ
strokaII[9]= !SLEEP + '0';// вывод флага flagHALL 8 символ (инверсно) 1-экран включен, 0 - выключен
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
//конец обработки 2й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________
if (kalibrovkaNOW >= 1 && kalibrovkaNOW < 255 )// если активен режим калибровки, то выводим данные для калибровки.
{
sprintf (strokaI," ") ;
IntToCharIII(Uacc, &strokaI[0]);
IntToCharIII(Uakb, &strokaI[4]);
IntToCharIII(kalibrovkaNOW, &strokaI[7]); // вывод РЕЖИМА калибровки
sprintf(strokaII,"c ") ;
IntToCharIII(kalibrovkaACC, &strokaII[1]); // вывод значения калибровки АСС
IntToCharIII(kalibrovkaAKB, &strokaII[5]); // вывод значения калибровки АСС
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АКБ
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
}
//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________
displayDataToDISPLAY(); //>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>
/* так выглядит индикация на дисплее
================
|000:00 111 0.000| 1 строка * вывод времени работы блока H:M * AKB ACC REM * вывод напряжения АСС
|2616 1110 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * OTG HUB POGO HALL * вывод напряжения АКБ
*/
}
void displayDataToDISPLAY()//>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>
{//void displayDataToDISPLAY()
//вывод на 2хстрочный дисплей LCM 1602 с I2C ( на базе расширителя портов PCF8574)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//Serial.print("strokaI = "); Serial.println(strokaI); // раскомментить для вывода информации в ком порт для отладки
lcd.setCursor(0, 0);
lcd.print(strokaI);
//Serial.print("strokaII = "); Serial.println(strokaII); // раскомментить для вывода информации в ком порт для отладки
lcd.setCursor(0, 1); //2строка 0символ
lcd.print(strokaII);
//вывод на 128*64 дисплей (Adafruit_SSD1306) первой строки
display2.clearDisplay(); // очистили буфер
display2.setTextSize(1); // установили размер текста (1-4)
display2.setCursor(0,0); // начальная точка вывода
display2.println(strokaI); // скинули значение I строки в буфер 128*64 дисплея
//вывод на 128*64 дисплей (Adafruit_SSD1306) второй строки
display2.println(strokaII); // скинули значение II строки в буфер 128*64 дисплея
if ( ((millis() - pauseTimeACC) >= (5000+timeAfterACC)) && (flagACC==0) ) // после 5 сек после выключения зажигания буфер будет чиститься перед выводом, соответственно на 128*64 Adafruit_SSD1306 дисплей выводиться ничего не будет Это нужно для того, чтобы ночью экран не светился ( так как пиксели активные и дают свет без подсветки)
{
display2.clearDisplay(); // очистили буфер
}
display2.display(); //эта строка выводит картинку 1306 из буфера на экран!
//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________
}//void displayDataToDISPLAY()
/******************************************конец индикации светодиодом и вывода на дисплей******************************************* ************************************************** ************************************************** *********************************/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void analogReadU (byte averageFactor) //функция усреднённого чтения аналоговых входов (A0 A1)
{//void analogReadU
int newUacc = analogRead(PINrawACC);
int newUakb = analogRead(PINrawAKB);
if (averageFactor > 0) // усреднение показаний для устранения "скачков"
{
Uacc = (Uacc * (averageFactor - 1) + newUacc) / averageFactor;
Uakb = (Uakb * (averageFactor - 1) + newUakb) / averageFactor;
// <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5 я тут немного поправил
} else {
Uakb=newUakb; // не делаем усреднений, что прочитали то и считаем выводом
Uacc=newUacc; // не делаем усреднений, что прочитали то и считаем выводом
}
}//void analogReadU
void rejim_kalibrovki() //функция измерения, калибровки и записи полученных значений в еепром
{//void rejim_kalibrovki()
lcd.noBacklight();
delay (50);
lcd.backlight();
delay (250);
if (digitalRead(PINkalibrovki)== 1 && kalibrovkaNOW < 6) {kalibrovkaNOW ++;}
else // тут достигли 6 касаний точки калибровки и ЗАПУСКАЕМ НЕПОСРЕДСТВЕННО ПРОЦЕСС КАЛИБРОВКИ ( ДЛЯ ЭТОГО ПОДАЁМ РОВНО 12,00В НА БЛОК ПИТАНИЯ ( асс и акб)
{ //else
if (kalibrovkaNOW >= 6)
{//if (kalibrovkaNOW >= 6)
PORTBregistr = 0; // выключили всё
PORTDregistr = 0; // выключили всё
UPRAVLENIE_PINAMI(); // сказали регистрам исполнить " выключили всё ", вызвав функцию
delay (600); // для зарядки кондёров после снятия нагрузки
analogReadU (10); //вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(10)раз
kalibrovkaACC = 1200000/Uacc-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
kalibrovkaAKB = 1200000/Uakb-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
{kalibrovkaNOW ++;}
}//if (kalibrovkaNOW >= 6)
}//else
if ( kalibrovkaNOW == 15 && digitalRead(PINkalibrovki)== 0) //по достижению счета в 254 и ПРИ МАССЕ НА ПИНЕ КАЛИБРОВКИ данные калибровки запишутся в еепром
{
kalibrovkaNOW = 255;
EEPROM.write(0,kalibrovkaACC);
EEPROM.write(1,kalibrovkaAKB);
sprintf (strokaI,"end KALIBR. ") ;
sprintf(strokaII,"c ") ;
IntToCharIII(kalibrovkaACC, &strokaII[1]); // вывод значения калибровки АСС
IntToCharIII(kalibrovkaAKB, &strokaII[5]); // вывод значения калибровки АСС
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АКБ
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
displayDataToDISPLAY(); //
delay (10000);
}
}//void rejim_kalibrovki()
void STATUS_REM()
{//void STATUS_REM()
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обр аботка статуса выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~*/
/*если напруга батареи больше 12В, то включаем еще и усилитель звука (выход REM) /но включаем его только на timeBeforeRemOff (30 минут), если не заведены.*/
if (U_akb_real >= UrabotyREM && flagACC == 1 && flagREM == 0 ) {flagREM = 1; TimerREM = millis();} //если подзаряжен акб и включили зажигание - ВКЛЮЧАЕМ REM
if (U_akb_real >= UrabotyREM && flagACC == 1 && ( millis() - TimerREM >= timeBeforeRemOff )) {flagREM = 2 ;} // если кончилось время обратного отсчета - статус рем - 2.
//if (U_akb_real >= UnevykluczeniaREM && flagACC == 1){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= UrabotyREM && flagREM == 2 && flagACC == 0){ flagREM = 0;} // если восстановилось напряжение при выключенном зажигании - обнуляем статус РЕМ.
if (U_akb_real <= UrabotyREM && flagACC == 1){ flagREM = 2;} //если подсел акб при включенном зажигании - статус рем - 2.
if (U_akb_real >= UnevykluczeniaREM && flagACC == 1 ){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= UnevykluczeniaREM && flagREM == 3){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= Uperezariadki){flagREM = 2;}// проверка на перезаряд
if( flagREM == 0 || flagREM == 2){REM = 0;} // выключаем выход REM
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~коне ц отработки выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~*/
}//void STATUS_REM()
void loop()
{while (1){//для ускорения void loop
analogReadU (5);//вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП АКБ и АСС, потом их усреднили(5)раз.
if (kalibrovkaNOW != 255 && digitalRead(PINkalibrovki)== 0){if ( (millis() < 60000) || kalibrovkaNOW >= 6 ) { rejim_kalibrovki();} } // после 60с или если стоит ЗАПРЕТ(255), калибровку НЕ ДЕЛАЕМ
// новое ( с T12 версии) вычисление реального напряжения, с учетом значений калибровки в еепром (0 и 1 адреса)
U_acc_real = Uacc * (1410.0+kalibrovkaACC)/100000;
U_akb_real = Uakb * (1410.0+kalibrovkaAKB)/100000;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( (millis() > pauseTimeHALL && flagHALL == 0 )|| ((millis() > 15000) && flagACC == 1))
{flagHALL = 1;} /*проверка отсчета при холодном старте при включении и сразу выключении ACC*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = timeAfterACC_accOFF;} //выключили зажигание /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = timeAfterACC_starting; if (U_akb_real <=UakbONorOFF) {flagREM = 3;REM = 0;} }//стартуем /* 5000 0 - заводим машину (стартуем) или сел акб при включенном зажигании.*/ Логика работы REM в 537 строках
if (U_akb_real >= Uperezariadki){timeAfterACC = 0;}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// ------------========================== блок ACC ========================-----------------------------------------------------------------------------
// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((Uperezariadki > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
//lcd.clear(); //очистка экрана не нужна со строковым выводом
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея
}
if (flagACC ==1 )
{// если flagACC == 1
if (millis() - pauseTimeACC >= PlanshBAT_timer_pri_vkl_ACC ) /* пауза 1.1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета = этим подаём 12В на DC-DC. На 1м канале dc-dc сразу появляется напряжение (3,8-4,2 - как настроено)*/
}
if (millis() - pauseTimeACC >= II_KIW_pin_POGO_timer_pri_vkl_ACC ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
II_KIW_pin_POGO = 1; //digitalWrite(II_KIW_pin_POGOpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
}
if (millis() - pauseTimeACC >= OTG_timer_pri_vkl_ACC ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на OTG (включается определение перифирии планшетом.)*/
}
if (millis() - pauseTimeACC >= HUB_timer_pri_vkl_ACC ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В dc-dc (2вых)на хаб*/
}
if (reset_HUB_on_power_on == 1)
{
if (millis() - pauseTimeACC >= (HUB_timer_pri_vkl_ACC+500) ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 0; //digitalWrite(HUBpin, 1); /*Выключаем хаб*/
}
if (millis() - pauseTimeACC >= (HUB_timer_pri_vkl_ACC+1000) ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В dc-dc (2вых)на хаб*/
}
}
if (millis() - pauseTimeACC >= REGISTRATOR_timer_pri_vkl_ACC )/*через 2,2с после включения ACC включаем: */
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}
if (millis() - pauseTimeACC >= REM_timer_pri_vkl_ACC )/*через 2,2с после включения ACC включаем: */
{
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}
if (millis() - pauseTimeACC >= SLEEP_timer_pri_vkl_ACC ) // пауза после включения ACC и потом делать следующ(пока включено ACC):
{
SLEEP = 0; //digitalWrite(SLEEPpin, 0); /*включаем экран*/
}
}// если flagACC == 1
STATUS_REM(); //зашли в функцию обработки статуса выхода REM
//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= (timeAfterACC-REM_timer_pri_vykl_ACC)) ) // тут REM_timer_pri_vykl_ACC (1000)- это на сколько раньше выключать выход REM перед остальными выключениями
{
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
}
/*пауза 7c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
if (((millis() - pauseTimeACC) >= (timeAfterACC+SLEEP_timer_pri_vykl_ACC)) )
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*тушим экран (если прошло 2 минуты с момента включения блока )*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (OTG_timer_pri_vykl_ACC+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на OTG (8 pin PW1)*/
}
if ( ((millis() - pauseTimeACC) >= (II_KIW_pin_POGO_timer_pri_vykl_ACC+timeAfterACC)) )
{
II_KIW_pin_POGO = 0;//digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V зарядки. (POGO(USB))*/
}
if ( ((millis() - pauseTimeACC) >= (HUB_timer_pri_vykl_ACC+timeAfterACC)) )
{
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (lcd_noBacklight_timer_pri_vykl_ACC+timeAfterACC)) )
{
lcd.noBacklight();/* тушим подсветку экрана для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
}
}// if (flagACC==0)
// -------------------------========================= блок АКБ ==========================-------------------------------------------------------------------------------
if (U_acc_real >= UaccONorOFF) {UakbONorOFF = Uakb_Kogda_ACC_vkluczeno;} else {UakbONorOFF = Uakb_Kogda_ACC_vYkluczeno;} /*при включении зажигания напряжение самовырубания станет 11,1 вместо 11,9*/
if ((Uperezariadki > U_akb_real) && ((U_akb_real >= UakbONorOFF) && flagAKB == 0)) /*проверка +30 на перезаряд >15.5В, и больше заданного в 266 строке, и флага акб */
{
if ((millis() - pauseTimeACC >= 100) && flagAKB == 0)
{
SAMOZAPITKA =1;//digitalWrite(SAMOZAPITKApin, 1); /* включаем самозапитку процессора */
flagAKB = 1; /*подняли флаг батареи*/
}
}
if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >Uperezariadki))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = Uakb_Kogda_ACC_vYkluczeno;
}
if ((millis() - pauseTimeAKB >= timeWhileAkbLow) && flagAKB == 0) /* если севший аккумулятор //через 40с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета */
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на OTG )*/
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); /*вЫключаем +5V (POGO(USB))*/
HUB = 0; //digitalWrite(HUBpin, 1); /* подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб*/
REM = 0; //digitalWrite(REMpin, 0); /* выключаем выход REM*/
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается*/
//delay (5000); /* задержка для аппаратного выключения*/
}
if (flagAKB == 1 && flagACC == 0) /*ситуация, когда норм акб и выключено зажигание (ACC)*/
{
if ((millis() - pauseTimeAKB )>= timeUntilBATOff && flagAKB == 1) /* если прошло "timeUntilBATOff" 24 (86400000) часа, как выключили ACC // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)*/
{
PlanshBAT = 0; // digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)//(батарея планшета))*/
}
if ((millis() - pauseTimeAKB) >= timeUntilALLOff && flagAKB == 1) /* если давно выключили ACC ) "timeUntilALLOff" (2суток = 172800000)) (самозапитка для регистратора, процессор БП активен)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (10000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
// ******************************************отслежив ания аварийной ситуации ITS716G (превышение по току по выходам out1-4)************************************************ ************************************************** ************************************************** ****************************
// *отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
// *отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"
if(SAMOZAPITKA==1 || PlanshBAT ==1 ||REM==1 || REGISTRATOR ==1) // если проц включал любой канал ITS
{
STATEpinI = digitalRead(5); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!
STATEpinII = digitalRead(8);
if(STATEpinI == 0) { // и если пин защиты STATEpinI показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
if(STATEpinII == 0) { // и если пин защиты STATEpinII показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI();delay(493); LED = 1; UPRAVLENIE_PINAMI(); delay(500); LED = 0; UPRAVLENIE_PINAMI(); delay(1493);
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на OTG (8 pin PW1)
II_KIW_pin_POGO = 0; //digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
HUB =0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
wdt_reset(); //Сброс таймера watchdog
}
} ;
}
// ************************************************** ************************************************** ************************************************** ************************************************** ******************
*/
/******************************************индикаци я светодиодом и задержка вывода на дисплей******************************************* ************************************************** ************************************************** *********************************/
ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}
// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > 350 || ms < pauseDisplay )
{
pauseDisplay = ms;
printDISPLAY(); // выводим на дисплей раз в 350( запуская фушкцию)
}
/*настраиваем режимы моргания встроенного светодиода ардуины*/
if (blink_mode != modes[5] || blink_mode != modes[5])
{
if (flagAKB == 0 ){blink_mode = modes[3];} // индикация напруги батареи на ардуинине.- низкое напряжение АКБ авто - коротко моргает
if (flagAKB == 1 && flagACC == 0) {blink_mode = modes[6];} //- нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
if (flagAKB == 1 && flagACC == 1) {blink_mode = modes[2];} //- нормальное напряжение, включено ACC, рабочий режим. - медленно моргает
if (kalibrovkaNOW >= 1) {blink_mode = modes[1];} // режим калибровки
}
/* ***********************данные для справки******************************************* *********************
0B00000000, //Светодиод выключен blink_mode = modes[0];
0B11111111, //Горит постоянно blink_mode = modes[1];
0B00111111, //Мигание по 0.8 сек blink_mode = modes[2]; - нормальное напряжение, включено ACC, рабочий режим.
0B00000001, //Короткая вспышка раз в секунду = modes[3]; - низкое напряжение АКБ авто
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)= blink_mode = modes[6]; - нормальное напряжение АКБ авто, ACC выключено.
*/
//************************************************** ************************************************** ******
UPRAVLENIE_PINAMI();
//wdt_reset(); /*Сброс таймера watchdog*/
}} /*конец цикла void loop() и конец while (1)*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
Нашел критический баг в программе BP5mini - что-то смещает значение в переменной вывода портов (PORTBregistr) Пропадает последний байт.
Поправил - пока стандартными командами в void UPRAVLENIE_PINAMI - работает, как ожидаемо.
Обнаружил случайно - БП не прошел тест на полное отключение при низком напряжении. Процессор всё равно оставался активным, хотя перифирию аварийно отключал.
На столе работает. На машине - потом отпишусь.
byte ver = 24;// ( чем больше цифра, тем новее)
byte TipBlokaPitania = 255; // 177 - BP7. 255 - BP5mini //выбор типа блока питания.
// дата правки 2.12.17.0028
// для 5mini версии блока питания.
// скетч проверен и записан на версии ардуино IDE 1,8,1 win7, 1.63 xp
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/enjoyneering/LiquidCrystal_I2C например
//в версии T04 добавлена поддержка дисплея Adafruit_SSD1306 128*64 Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
/* _
хотелки
______Сделано_____________________________________ _____________
.
Контроль напряжения АКБ машины.
вывод информации на внешний дисплей по I2C, библиотека вывода на экран https://github.com/enjoyneering/LiquidCrystal_I2C и http://elchupanibrei.livejournal.com/27443.html
если в скетче в названии 0x27, значит библиотека старая.
активный вотчдог,
программная защита its716G(statepin)-тестово,
умное мигание встроенным светодиодом, в зависимости от напряжения АКБ и состояния АСС.
усреднение замеров по напряжению ACC и AKB, по 100 замерам.
информация на дисплее обновляется не постоянно, а каждые 350мс ( 0,35 с), чтобы не мельчешить.
Управление REM: если напруга батареи больше UrabotyREM (11.8 В), то включаем еще и усилитель звука (выход REM) /но включаем его только на 30-60мин, если не заведены. После заводки счетчик обнуляется.
v92 сделанъ плавный пуск - определяем нужное состояние пинов без их предварительного дергания в начальное нулевое.
v94 сделанъ вывод на экран через переменную, а не напрямую. ЭТО позволило выводить информацию ЕЩЕ И В КОМ ПОРТ!!! <<<<<<<========================================
v94 Сделана задержка включения REM после холодного запуска, 15с. Через 10 с после начала загрузки идёт инициализация звуковой, в этот момент слышен ПУК
t00 новая ветка блока, по факту продолжение старой.
t02 поскольку аптаймблока в машине превысил 9999 минут, то переделан вывод аптайма 000:00 ( часы : минуты)
t03 дисплей тухнет через 3 сек после операции завершения.
t04 добавлена поддержка дисплея Adafruit_SSD1306 128*64 (тестово). Библиотеки (2 штуки ): https://codeload.github.com/adafruit/Adafruit_SSD1306/zip/master
Без 2х библиотек одновременно работать не будет https://codeload.github.com/adafruit/Adafruit-GFX-Library/zip/master
t06 обработка напряжений выше 15,5 ( тушим экран и выключаем усилок)
t07 в войд сетап задержки по 0,1с для инициализации дисплеев. Изменен алгоритм выключения - сначала тушим экран, потом все остальное( для таскера, чтобы паузу ставил и плей жал)
выключен Serial.print. display2.begin(SSD1306_ - перекинута инициализация на включение зажигания - 318 строка
t08- ничего
t09 - перенесена строка проверки заведённой авто, в конец, перед проверкой перезаряда.
t10 - перешел на другую библиотеку для 1602 дисплея( newE) https://github.com/enjoyneering/LiquidCrystal_I2C. 128*64 не проверял.
t11 - в связи с тем, что у меня дребезжит контактная группа в машине, изменён алгоритм выключения выхода REM
t12 - возможность калибровки с записью в еепром, переделан метод вывода на дисплей ( теперь через две функции (формирования строк и непосредственно вывода.), а не в основном цикле), убрн вотчдог, как не имеющий практического смысла( пока что просто заккоментирован).
t13 поправлена Логика работы REM = когда стартуем flagREM = 3 Обработка логики работы REM в 538 строках.
t14 - введена новая переменная timeUntilBATOff = время до выключения питания на батарею планшета после выключения зажигания. 24ч = 86400000 (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч) (2суток = 172800000) (4суток = 345600000)
timeUntilALLOff = время до полного выключение блока, после выключения зажигания (ACC) ((самозапитка для регистратора)- чтобы легче было менять это время в начале скетча.
увеличено время поддержки планшета включённым-timeUntilBATOff ( 2 суток после выкл АСС и еще 2 суток после этого до полного выключения блока)
m01-05 - Новая версия БП5mini. Переход на новые, хорошо себя зарекомендовавшие, дс-дс (mini360). Датчик холла и отг теперь управляются специализированной микросхемой-твердотельным реле. Из-за неё же теперь потеряна совместимость прошивок на БП5 (поскольку на управление холлом теперь нужен инверсный сигнал). Поэтому уже заодно поменял местами пины управления ОТГ и ХОЛЛА (физически). Фишка полностью совместима с БП5, БП4, БП3.
m6 - обработка статуса выхода REM переведена в отдельную функцию
m7 - поменян порядок включения элементов и их тайминги. Тестово. По идее, должно быть стабильнее, либо вообще никак не повлияет. Убраны лишние закомментированны строчки.
m11 - отг включаю сразу.
m12 - Сделал все основные тайминги настраиваемыми в начале скетча. Отдельно на включение, отдельно на выключение. Искать по строке ______НАСТРОЙКИ ТАЙМИНГОВ!!!______.
m14 - теперь тайминги в const unsigned long. В настройках скетча можно включить ресет хаба после каждого включения зажигания( reset_HUB_on_power_on )= передёргивать ли хаб при каждом включении зажигания, для решения проблемы с изикапом (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.
m15 - добавил тайминг timeWhileAkbLow = 40000; в настройки, увеличил с 20до 40с, для машин с функцией подсветки пути домой. //время, через которое начнётся полное выключение блока когда напряжение на АКБ очень низкое.
m18 - перевел все основные значения напряжений, таймингов и пинов на переменные. Облегчение портирования на разные аппаратные платформы. ----> Подготовка совместимости с БП7.
m19 - более дружественные комментарии.
m20-22 - переписывание скетча, чтобы не выводить через I2C шину информацию, для экономии энергопотребления и совместимости с БП7. Изменены режимы моргания встроенного светодиода ардуины ( тоже даёт экономию при выключенном зажигании 0,005А). Добавлено время обновления I2C дисплея в настройках пользователя.
m23 - исправлено. не выключалась самозапитка при севшем АКБ! теряется 1 байт в конце PORTBregistr. Поправил - пока стандартными командами в void UPRAVLENIE_PINAMI.
__________________________________________________ ______________
собственное потребление блока по 12 вольтам, без планшета (для БП5mini)
- при 10В +30 и +15 выключены = 0,022 А
- при 12В +30 и +15 включены = 0,06 А
- при 12В +30 включены +15 выключены (при питании батареи) = 0,03А
__________________________________________________ ______________
поведение встроенного светодиода
низкое напряжение АКБ авто - коротко моргает
нормальное напряжение АКБ авто, ACC выключено. - быстро моргает
нормальное напряжение, включено ACC, рабочий режим. - медленно моргает
ПРИМЕЧАЕНИЯ
-> strcpy(strokaIIold,strokaII); // strokaIIold = strokaII; так нельзя!!! надо так: strcpy(strokaIIold,strokaII); // копируем новую строку в старую
*/
//************************************************** ************************************************** ***********************************************
// Массив режимов работы светодиода
byte modes[] = {
0B00000000, //Светодиод выключен
0B11111111, //Горит постоянно
0B00111111, //Мигание по 0.8 сек
0B00000001, //Короткая вспышка раз в секунду
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)
};
uint32_t ms, ms1 = 0;
uint8_t blink_loop = 0;
uint8_t blink_mode = 0;
//************************************************** ************************************************** ***********************************************
#include <Wire.h> // для дисплея - I2C шина
#include <LiquidCrystal_I2C.h> // библиотека для дисплея
#include <EEPROM.h> // для использования ЕЕПРОМ
//#include <avr/wdt.h> //Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку ( https://geektimes.ru/post/255800/ )
char strokaI[32] = " ";// Массив для вывода 1 строки на дисплей , объявляем длиннее(32символа), чтобы не было глюков с отображением на экране
char strokaII[32] = " ";// Массив для вывода 2 строки на дисплей
// ЭТО нужно для вывода на 128*64 Adafruit_SSD1306 дисплей
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display2(OLED_RESET);
#define XPOS 0
#define YPOS 1
#define DELTAY 2
// конец настройки для вывода на 128*64 Adafruit_SSD1306 дисплей
//LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display для 0x27 - настройка дисплея для библиотеки LiquidCrystal_I2C2004V1
//Перед прошивкой скетча убедитесь в наличии нужных библиотек,например d:\777\Soft\arduino\arduino-1.6.11\libraries\LiquidCrystal_I2C\ https://github.com/marcoschwartz/LiquidCrystal_I2C например
LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE); // для newE описание библиотеки http://elchupanibrei.livejournal.com/27443.html#t23347
float UakbONorOFF = 12.1;// напряжение порога сработки акб
float U_acc_real = 0; // реальное напряжение +ACC на входе делителя (A0)
float U_akb_real = 0; // реальное напряжение +30 на входе делителя (A1)
int Uacc = 0; //Читаем напругу с делителя ACC 0-1024
int Uakb = 0; ////Читаем напругу с делителя АКБ 0-1024
//PORTB
const byte SAMOZAPITKA_Pin = 9; // номер пина самозапитки блока
const byte LED_Pin = 13; // номер пина встроенного светодиода индикации
const byte OTG_Pin = 10; // номер пина управляющего микросхемой, управляющей режимом OTG
const byte HUB_Pin = 11; // номер пина управляющего транзистором, управляющего Питанием ХАБа
const byte SLEEP_Pin = 12; // номер пина управляющего микросхемой, которая даёт массу на пин сна ( датчик холла)
//PORTD
const byte PlanshBAT_Pin = 6; // номер пина управляющего микросхемой, управляющей питанием БАТАРЕЕЙ планшета (через управляющую ногу IN2-5pin )0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
const byte REGISTRATOR_Pin = 4; // номер пина управляющего микросхемой управляющей питанием видеорегистратора
const byte FIVE_Volt_OUT_na_POGO_or_USB_Pin = 2; // номер пина управляющего сном 2 преобразователя DC-DC (+5В)
const byte REM_Pin = 7; // номер пина управляющего транзистором, управляющего Питанием ХАБа
/*ноги ардуины логические*/
uint8_t PORTBregistr = 0; // Если у нас есть 8-битная переменная PORTBregistr, то мы можем присвоить её значение регистру PORTx, и тем самым установить ножки микроконтроллера в состояние, соответствующее значению переменной PORTBregistr
boolean SAMOZAPITKA = 0; // byte SAMOZAPITKApin = 9; /*управление самозапиткой блока питания IN4*///1 = есть самозапитка; 0 = нет самозапитки
boolean LED = 0; // Светодиод 1 = светит; 0 = не светит
boolean SLEEP=0; //byte SLEEPpin = 10; //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
boolean HUB = 0; //byte HUBpin = 11; 0-хаб вЫключен, 1 - хаб включен
boolean OTG = 0; //byte OTGpin = 12; //1 = есть масса на OTG; 0 = нет массы на OTG
uint8_t PORTDregistr = 0; // 8-битная переменная PORTDregistr
boolean PlanshBAT = 0; //byte PlanshBATpin = 6; /* 10pin = PD6 = pin D6 PWM ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin*/ //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
boolean REGISTRATOR = 0; //byte REGISTRATORpin = 4; /* 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)*/
boolean FIVE_Volt_OUT_na_POGO_or_USB = 0; //byte FIVE_Volt_OUT_na_POGO_or_USBpin = 2; 32pin = PD2 = pin D2 включить управление SS2 выходом питания +5V на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
boolean REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
int PINrawACC = A0; // замер для 5й версии
int PINrawAKB = A1; // замер для 5й версии
int PINkalibrovki = A2; // замер для 5й версии
//int PINrawACC = A7; // замер для 7й версии
//int PINrawAKB = A8; // замер для 7й версии
//int PINkalibrovki = A3; // замер для 7й версии
//пины состояния ITS
byte STATEpinI = 1; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = авария*/
byte STATEpinII = 1; /*логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.*/
/*логические переменные, используемые в коде*/
byte flagACC = 0; /*признак включенного зажигания*/
byte flagAKB = 0; /* признак заряженной батареи*/
byte flagREM = 0; /* признак включенного выхода на усилитель звука (REM) 0 1 2*/
byte kalibrovkaNOW = 0; // признак того, что сейчас происходит калибровка встроенного вольтметра по АСС и АКБ.
byte kalibrovkaACC = EEPROM.read(0); // значение для калибровки для делителя АСС
byte kalibrovkaAKB = EEPROM.read(1); // значение для калибровки для делителя АКБ
byte rezreszenie_raboty_I_dva_C_sziny = 0; // Разрешили ли мы работать (инициализировали ли) I2C устройствам (дисплеи, звуковой процессор) в текущем цикле. 1 - инициализировали и разрешили, 0 - НЕ инициализировали и запретили
byte flagHALL = 0; /*флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)*/
//Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
const boolean reset_HUB_on_power_on = 1; // передёргивать ли хаб при каждом включении зажигания, для решения проблемы с определением изикапа (STK1160) 1 - после ВКЛ АСС включить хаб, выключить на 0,5с и включить опять. 0 - просто включить хаб.
//НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________
float Uperezariadki = 15.5; // напряжение, выше которого будет считаться, что идёт перезарядка аккумулятора авто.
float UrabotyREM = 11.8; // напряжение, выше которого будет работать усилитель звука, если акб не садился.
float UnevykluczeniaREM = 13.7; // напряжение, когда машина считается заведённой. Тогда, если завели машину, ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
float Uakb_Kogda_ACC_vYkluczeno = 11.9; // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вЫключенном АСС
float Uakb_Kogda_ACC_vkluczeno = 11.1; // напряжение, ниже которого АКБ авто будет считаться разряженным (севшим) при вКлюченном АСС
float UaccONorOFF = 10.1; // напряжение порога сработки асс. Т.е. если на пин блока питания "вход АСС" подать ниже UaccONorOFF (11,1), то зажигание будет считаться выключенным.
//КОНЕЦ НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________НАСТРОЙКИ Пороговых напряжений!!!!!!!!_________
/*счётчики времени*/
//НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!!______НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!! НАСТРОЙКИ ТАЙМИНГОВ!!!
const unsigned long timeUntilBATOff = 345600000; // время до выключения питания на батарею планшета после выключения зажигания., если прошло 48 часов, как выключили ACC // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)
const unsigned long timeUntilALLOff = 172800000 + timeUntilBATOff; // время до полного выключение блока, после выключения зажигания (ACC)и уже после того, как выключится питание на батарею планшета ) (2суток = 172800000)) (4суток = 345600000)
unsigned long timeBeforeRemOff = 1800000; // 1800000=30мин. Время, оставшееся до отключения выхода REM после включения зажигания и незаводки машины. ( то есть сколько времени будет включён усилитель звука, если заглушить машину и просто слушать музыку, при нормальном АКБ)
unsigned long timeAfterACC_starting = 7000; // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время кручения стартером
unsigned long timeAfterACC_accOFF = 2000; // не может быть меньше REM_timer_pri_vykl_ACC! //задержка перед началом процедуры выключения зажигания во время обычного выключения зажигания
unsigned long timeWhileAkbLow = 40000; // 40000 время, через которое начнётся полное выключение блока когда напряжение на АКБ очень низкое. /* если севший аккумулятор //через 40с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
unsigned long pauseTimeHALL = 140000; // Для первого включения планшета. Раньше этого времени экран не будет тухнуть! Время паузы перед морганием-тушением экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин
unsigned long vremia_obnovlenia_displeya = 250; // Время, через которое будет обновляться информация на дисплей I2C (время обновления I2C дисплея)
//тут настраиваем паузу при вКлючении зажигания ( АСС) и по истечении этого времени активируем/деактивируем
//соответствующий пин блока питания (время независимо друг от друга)
const unsigned long PlanshBAT_timer_pri_vkl_ACC = 1100;// пауза после включения ACC перед включением питания на батарею планшета
const unsigned long FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC = 1400;// пауза после включения ACC перед включением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ)
const unsigned long OTG_timer_pri_vkl_ACC = 50;// пауза после включения ACC перед включением минуса на OTG ( 4й контакт ЮСБ разъема на планшете) (включается определение ЮСБ перифирии планшетом.)
const unsigned long HUB_timer_pri_vkl_ACC = 2100;// пауза после включения ACC перед подачей питания на хаб. Значение должно быть больше либо равно FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC.
const unsigned long REGISTRATOR_timer_pri_vkl_ACC = 2500;// пауза после включения ACC перед включением питания +12В на видеорегистратор
const unsigned long REM_timer_pri_vkl_ACC = 2500;// пауза после включения ACC перед включением питания +12В на REM (включение усилителя звука)
const unsigned long SLEEP_timer_pri_vkl_ACC = 3000; // пауза после включения ACC перед включением экрана планшета (масса на Датчик Холла)
const unsigned long I_dva_C_szina_ON_time = 150; //Время, через которое I2C шина включится после вКлючения зажигания - начнётся передача по шине I2C.
//тут настраиваем паузу при вЫключении зажигания ( АСС) и по истечении этого времени активируем/деактивируем
//соответствующий пин блока питания (время независимо друг от друга)
const unsigned long OTG_timer_pri_vykl_ACC = 2500; // пауза после вЫключения ACC перед вЫключением минуса на OTG ( 4й контакт ЮСБ разъема на планшете) (вЫключается определение ЮСБ перифирии планшетом.)
const unsigned long FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC = 5000; // пауза после вЫключения ACC перед вЫключением +5V (POGO(USB) выхода для пина зарядки планшета (+5В пого или ЮСБ)
const unsigned long HUB_timer_pri_vykl_ACC = 5000; // пауза после вЫключения ACC перед убиранием питания с хаба. Значение должно быть меньше либо равно FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC.
const unsigned long SLEEP_timer_pri_vykl_ACC = 0; // пауза после вЫключения ACC перед вЫключением экрана планшета (масса на Датчик Холла)
const unsigned long REM_timer_pri_vykl_ACC = 1000;// не может быть больше timeAfterACC_accOFF и timeAfterACC_starting! Пауза после вЫключения ACC перед вЫключением питания +12В на REM (вЫключение усилителя звука), тут 1000 это на сколько раньше выключать выход REM перед остальными выключениями
const unsigned long lcd_noBacklight_timer_pri_vykl_ACC = 17000; // 7000 пауза после вЫключения ACC перед убиранием подсветки I2C LSD дисплея (1602)
const unsigned long I_dva_C_szina_OFF_time = lcd_noBacklight_timer_pri_vykl_ACC + 3000; //Время, которое I2C шина работает после вЫключения зажигания, потом - закончится передача по шине I2C.
//конец настроек таймингов.________________________________________ __________________________________________________
//К О Н Е Ц Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// К О Н Е Ц Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// К О Н Е Ц Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
// К О Н Е Ц Н А С Т Р О Й К И П О Л Ь З О В А Т Е Л Я П О Д С В О И П О Т Р Е Б Н О С Т И
unsigned long eventTime = 0;
unsigned long pauseTimeACC = millis(); // сброс времени для отсчета отключения самозапитки
unsigned long pauseTimeAKB = millis();
unsigned long pauseDisplay = 0; /* таймер для обновления информации на дисплее, чтобы не мерцал*/
unsigned long timeAfterACC = 5000; /*базовое (для инициализации) , ни на что не влияет. Меняйте timeAfterACC_accOFF и timeAfterACC_starting ! время после выключения зажигания, после истечения которого вырубается экран, хаб, otg-режим*/
unsigned long TimerREM = 0; /*базовое (для инициализации) , ни на что не влияет. Отсчет до выключения выхода REM при заглушенном авто и включенном зажигании.3600000 = час */
unsigned long TIMER = millis(); /*базовое (для инициализации) , ни на что не влияет. */
unsigned long H = (millis()/3600000); // часы
byte M = ((millis()-(H*3600000))/60000); //минуты
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void UPRAVLENIE_PINAMI() // функция перевода логических параметров в реальные состояния пинов // http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry // https://geektimes.ru/post/255744/ Ускоряем свою Arduino /* http://robotosha.ru/arduino/digitalwrite-optimizing-arduino.html */
{// UPRAVLENIE_PINAMI ~~~//тут мы сначала пишем в переменную регистры, а потом сделаем PORTB = PORTBregistr; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
// PORTBregistr - обрабатывем регистры порта B атмеги
/* if (LED == 1 ){ PORTBregistr |= 1<<5; } //PORTB |= 1<<5; //установит "1" (сигнал высокого уровня) на выводе PB5. //digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
else { PORTBregistr &= ~(1<<5); } //PORTB &= ~(1<<5); //установит "0" (сигнал низкого уровня) на выводе PB5. //digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
if (SAMOZAPITKA == 1){ PORTBregistr |= (1 << 1); } else {PORTBregistr &= ~((1 << 1));} //PB1 управление самозапиткой блока питания IN4///1 = есть самозапитка; 0 = нет самозапитки //http://microsin.net/programming/avr/accessing-avr-ports-with-winavr-gcc.html
if (OTG == 1){ PORTBregistr |= (1 << 2); } else {PORTBregistr &= ~((1 << 2));} //byte SLEEPpin = 10; PB2 управление транзюком сна VT4 (на датчик холла)) //1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
if (HUB == 0) { PORTBregistr |= (1 << 3); } else {PORTBregistr &= ~((1 << 3));} //HUB =0;//byte HUBpin = 11; PB3 управление транзюком питания хаба // 1-есть питание, 0 - нет питания
if (SLEEP == 0) { PORTBregistr |= (1 << 4); } else {PORTBregistr &= ~((1 << 4));} //bool OTG = 0; //byte OTGpin = 12; /* 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
*/
digitalWrite(LED_Pin, LED); //управление встроенным светодиодом
digitalWrite(SAMOZAPITKA_Pin, SAMOZAPITKA); // управление самозапиткой блока питания 1 = есть самозапитка; 0 = нет самозапитки //http://microsin.net/programming/avr/accessing-avr-ports-with-winavr-gcc.html
digitalWrite(OTG_Pin, OTG); // управление OTG
digitalWrite(HUB_Pin, !HUB); // управление транзистором питания хаба*/ // 1-есть питание, 0 - нет питания
digitalWrite(SLEEP_Pin, !SLEEP); // управление микросхемой, которая даёт массу на пин сна ( датчик холла)
// PORTDregistr - обрабатывем регистры порта D атмеги
//PORTD
digitalWrite(PlanshBAT_Pin, PlanshBAT); //управление питанием БАТАРЕЕЙ планшета (+4,0)
digitalWrite(REGISTRATOR_Pin, REGISTRATOR); //управление питанием видеорегистратора (+12)
digitalWrite(FIVE_Volt_OUT_na_POGO_or_USB_Pin, FIVE_Volt_OUT_na_POGO_or_USB); //управление вторым преобразователем DC-DC (+5В)
digitalWrite(REM_Pin, REM); //управление выходом REM (+12)
/* if (PlanshBAT == 1){ PORTDregistr |= (1 << 6); } else {PORTDregistr &= ~((1 << 6));} //bool PlanshBAT = 0; //byte PlanshBATpin = 6; 10pin = PD6 = pin D6 PWM включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin //0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
if (REGISTRATOR == 1){ PORTDregistr |= (1 << 4); } else {PORTDregistr &= ~((1 << 4));} //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
if (FIVE_Volt_OUT_na_POGO_or_USB == 1){ PORTDregistr |= (1 << 2); } else {PORTDregistr &= ~((1 << 2));} //bool FIVE_Volt_OUT_na_POGO_or_USB = 0; //byte FIVE_Volt_OUT_na_POGO_or_USBpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
if (REM == 1){ PORTDregistr |= (1 << 7); } else {PORTDregistr &= ~((1 << 7));} //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
// Serial.print ("PORTB, BIN = " ); Serial.println (PORTB, BIN); // вывели порт B атмеги на монитор порта
// Serial.print ("PORTDregistr, BIN = " ); Serial.println (PORTDregistr, BIN); // вывели порт D атмеги на монитор порта
// Serial.print ("SAMOZAPITKA = " ); Serial.println (SAMOZAPITKA);
//PORTD = PORTDregistr; //прописали порту D атмеги в регистры команду на запись нулей и единиц.
//PORTB = PORTBregistr; //прописали порту B атмеги в регистры команду на запись нулей и единиц.
}//конец UPRAVLENIE_PINAMI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
void setup() //настройки
{
Serial.begin(115200);
if( kalibrovkaACC == 255 ){kalibrovkaACC=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию
if( kalibrovkaAKB == 255 ){kalibrovkaAKB=127;} // проверяем , прописана ни калибровка в еепром, если нет( 255), то берём значения по умолчанию =127
// настройки портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
DDRD = 0b11010100; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(2, OUTPUT); //bool FIVE_Volt_OUT_na_POGO_or_USB = 0; //byte FIVE_Volt_OUT_na_POGO_or_USBpin = 2; 32pin = PD2 = pin D2 включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка //0 = нет 5V на POGO; 1 = есть 5V на POGO
pinMode(4, OUTPUT); //bool REGISTRATOR = 0; //byte REGISTRATORpin = 4; 2 pin = PD4 = pin D4 выход 12В для работы видеорегистратора (D4 -IN1)
pinMode(5, INPUT); //pinMode(STATEpinI, INPUT);
pinMode(6, OUTPUT); //pinMode(PlanshBATpin, OUTPUT); 16pin = PB4 = pin D12 MISO
pinMode(7, OUTPUT); //bool REM = 0; //byte REMpin = 7; 11pin = PD7 = pin D7 выход сигнала REM (+12v) (IN3) //0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM
*/
//ПРИМЕР DDRB = 0b00100010;// pinMode(13, OUTPUT); pin9 =OUT //DDRx - регистр направления передачи данных светодиодик на плате ардуины
DDRB = 0b00111110; //работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!
/*
pinMode(8, INPUT); //pinMode(STATEpinII, INPUT);
pinMode(9, OUTPUT); //pinMode(SAMOZAPITKApin, OUTPUT); 13pin = PB1 = pin D9
pinMode(10, OUTPUT); // pinMode(SLEEPpin, OUTPUT);
pinMode(11, OUTPUT); //byte HUBpin = 11; // PB3
pinMode(12, OUTPUT); //bool OTG = 0; //byte OTGpin = 12; 16pin = PB4 = pin D12 MISO управление транзюком OTG Q1 //1 = есть масса на OTG; 0 = нет массы на OTG
pinMode(13, OUTPUT); //светодиодик на плате ардуины
*/
//digitalWrite(5, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPinsdigitalWrite(ENC_PIN1, 1); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
//digitalWrite(8, 1);
pinMode(PINkalibrovki, INPUT); // пин калибровки
digitalWrite(PINkalibrovki, 1); // подтяжка +5 пина калибровки
// конец настроек портов ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
//настройки состояний при подаче питания на БП ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
SAMOZAPITKA = 0; // digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
OTG = 0; //digitalWrite(OTGpin, 0); //вЫключаем минус на OTG (8 pin PW1)
FIVE_Volt_OUT_na_POGO_or_USB = 0; //digitalWrite(FIVE_Volt_OUT_na_POGO_or_USBpin, 0); //вЫключаем +5V (POGO(USB))
HUB = 0; //digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
REM = 0; //digitalWrite(REMpin, 0); // // выключаем выход REM
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
// wdt_enable (WDTO_2S); // Запуск таймера watchdog: Для тестов не рекомендуется устанавливать значение менее 8 сек. Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка. /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S 2 s (WDTO_2S ATMega 8, 168, 328, 1280, 2560) ( wdt_enable (WDTO_8S);) https://geektimes.ru/post/255800/ https://tushev.org/articles/arduino/5/arduino-and-watchdog-timer
//UPRAVLENIE_PINAMI(); //сделать пллавный пуск - определить нужное состояние пинов без их предварительного дергания --- настроили логику и отдали её в функцию UPRAVLENIE_PINAMI.
//конец настроек состояний при подаче питания на БП~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
}
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void IntToCharI(int num, char *text)//функция, возвращающая число в текстовый вид 0 1
{
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
//text[1] = ((num/10)%10) + '0';// второе значение __0
text[2] = (num%10) + '0'; // третее значение ___
}
void IntToCharII(int num, char *text)//функция, возвращающая число в текстовый вид 00 11
{
//text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[0] = ((num/10)%10) + '0';// второе значение __0
text[1] = (num%10) + '0'; // третее значение ___
}
void IntToCharIII(int num, char *text)//функция, возвращающая число в текстовый вид 00 11
{
text[0] = (num/100) + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[1] = ((num/10)%10) + '0';// второе значение __0
text[2] = (num%10) + '0'; // третее значение ___
}
void IntToCharIIII(int num, char *text)//функция, возвращающая число в текстовый вид 0000 1111
{
text[0] = (num/1000) + '0';//0 знач
text[1] = (num/100)%10 + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[2] = ((num/10)%10) + '0';// второе значение __0
text[3] = (num%10) + '0'; // третее значение ___
}
void FloatToCharIIIII(float num, char *text)//функция, возвращающая число в текстовый вид 00.00 11.11
{
int Int = num*100;
text[0] = (Int/1000) + '0';//0 знач 7896
text[1] = (Int/100)%10 + '0'; // первое значение _00 - эта строчка нужна для 3хзначного числа.
text[2] = '.';
text[3] = ((Int/10)%10) + '0';// второе значение __0
text[4] = (Int%10) + '0'; // третее значение ___
}
void printDISPLAY() //функция формирования информации на дисплей ( точнее на два: 128*64 и 1602)
{
//_____________________________________________ФОРМИ РУЕМ СООБЩЕНИЕ НА LCD ДИСПЛЕЙ___________________________________________ _________________
H = (millis()/3600000);
M = ((millis()-(H*3600000))/60000);
//int S = (((millis()/1000)-(H*3600))- (M*60));
//if ((((millis())-(H*3600000))- (M*60000)) < 200 ){lcd.clear(); }//очистка дисплея
//int M = (millis()/60000); //минуты
if (flagACC == 1){lcd.backlight();}// для newE и для 0x27
// в 256 строке выключение подсветки LCD дисплея
//пример: sprintf( strokaII,"SETUP volume on ");
//обработка 1й строки_________AKB ACC REM_______________________________________________ __________________________________________________ __________________________________________________ __________________
sprintf(strokaI," ") ;
//IntToCharIIII((millis()/60000), &strokaI[0]); // вывод минут 0000 4 цифры СЕКУНД // если превысит 9999, то будут кроказябры!!! вида ;0129
IntToCharIII(H, &strokaI[0]); // вывод часов 000
strokaI[3] = ':'; // вывод двоеточия
IntToCharII(M, &strokaI[4]); // вывод минут 00
strokaI[7]= flagAKB + '0';// вывод флага AKB 5 символ
strokaI[8]= flagACC+ '0';// вывод флага AСС 6 символ
strokaI[9]= REM + '0';// вывод rem 7 символ 1-усилок включен, 0 - выключен
strokaI[10]= flagREM + '0';// вывод флага!!! rem 7 символ 1-усилок включен, 0,2 - выключен
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АСС
//конец обработки 1й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________
//обработка 2й строки____________________________________________ __________________________________________________ __________________________________________________ ______________________________
TIMER = ( pauseTimeAKB + timeUntilALLOff - millis() )/60000; // вывод кол-ва минут, оставшиеся до вЫключения блока (когда выключено АСС)
// _______________________________Первые 30с после вкл -выкл ACC выводим версию блока.____________________________________________ __________________________________________________ __________________________________________________ ____
if ( ( millis()-pauseTimeACC < 30000 )&& flagACC == 1 ){ sprintf(strokaII,"m__ ") ; IntToCharII(ver, &strokaII[1]);} else { sprintf(strokaII,"____ "); IntToCharIIII(TIMER, &strokaII[0]); } //Первые 30с после вкл -выкл ACC выводим версию блока
// __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ _____________________________
//вывод OTG HUB POGO HALL
strokaII[6]= OTG + '0';// вывод флага OTG 5 символ
strokaII[7]= HUB + '0';// вывод флага HUB 6 символ
strokaII[8]= FIVE_Volt_OUT_na_POGO_or_USB + '0';// вывод флага FIVE_Volt_OUT_na_POGO_or_USB (ПРИЗНАК ЗАРЯДКИ) 7 символ
strokaII[9]= !SLEEP + '0';// вывод флага flagHALL 8 символ (инверсно) 1-экран включен, 0 - выключен
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
//конец обработки 2й строки __________________________________________________ __________________________________________________ __________________________________________________ ________________________
if (kalibrovkaNOW >= 1 && kalibrovkaNOW < 255 )// если активен режим калибровки, то выводим данные для калибровки.
{
sprintf (strokaI," ") ;
IntToCharIII(Uacc, &strokaI[0]);
IntToCharIII(Uakb, &strokaI[4]);
IntToCharIII(kalibrovkaNOW, &strokaI[7]); // вывод РЕЖИМА калибровки
sprintf(strokaII,"c ") ;
IntToCharIII(kalibrovkaACC, &strokaII[1]); // вывод значения калибровки АСС
IntToCharIII(kalibrovkaAKB, &strokaII[5]); // вывод значения калибровки АСС
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АКБ
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
}
//Вывод строк.____________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________
displayDataToDISPLAY(); //>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>
/* так выглядит индикация на дисплее
================
|000:00 111 0.000| 1 строка * вывод времени работы блока H:M * AKB ACC REM * вывод напряжения АСС
|2616 1110 14.50|
================ 2 строка * кол-во минут, оставшиеся до выключения блока * OTG HUB POGO HALL * вывод напряжения АКБ
*/
}
void displayDataToDISPLAY()//>>>>>>>>>>>>>> Сформировали строки, теперь надо их вывести на дисплеи:>>>>>>>>>>>>>>
{//void displayDataToDISPLAY()
//вывод на 2хстрочный дисплей LCM 1602 с I2C ( на базе расширителя портов PCF8574)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//Serial.print("strokaI = "); Serial.println(strokaI); // раскомментить для вывода информации в ком порт для отладки
lcd.setCursor(0, 0);
lcd.print(strokaI);
//Serial.print("strokaII = "); Serial.println(strokaII); // раскомментить для вывода информации в ком порт для отладки
lcd.setCursor(0, 1); //2строка 0символ
lcd.print(strokaII);
//вывод на 128*64 дисплей (Adafruit_SSD1306) первой строки
display2.clearDisplay(); // очистили буфер
display2.setTextSize(1); // установили размер текста (1-4)
display2.setCursor(0,0); // начальная точка вывода
display2.println(strokaI); // скинули значение I строки в буфер 128*64 дисплея
//вывод на 128*64 дисплей (Adafruit_SSD1306) второй строки
display2.println(strokaII); // скинули значение II строки в буфер 128*64 дисплея
if ( ((millis() - pauseTimeACC) >= (5000+timeAfterACC)) && (flagACC==0) ) // после 5 сек после выключения зажигания буфер будет чиститься перед выводом, соответственно на 128*64 Adafruit_SSD1306 дисплей выводиться ничего не будет Это нужно для того, чтобы ночью экран не светился ( так как пиксели активные и дают свет без подсветки)
{
display2.clearDisplay(); // очистили буфер
}
display2.display(); //эта строка выводит картинку 1306 из буфера на экран!
//Вывод строк окончен.__________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ __________________________________________________ ____________________________________
}//void displayDataToDISPLAY()
/******************************************конец индикации светодиодом и вывода на дисплей******************************************* ************************************************** ************************************************** *********************************/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
void analogReadU (byte averageFactor) //функция усреднённого чтения аналоговых входов (A0 A1)
{//void analogReadU
int newUacc = analogRead(PINrawACC);
int newUakb = analogRead(PINrawAKB);
if (averageFactor > 0) // усреднение показаний для устранения "скачков"
{
Uacc = (Uacc * (averageFactor - 1) + newUacc) / averageFactor;
Uakb = (Uakb * (averageFactor - 1) + newUakb) / averageFactor;
// <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5 я тут немного поправил
} else {
Uakb=newUakb; // не делаем усреднений, что прочитали то и считаем выводом
Uacc=newUacc; // не делаем усреднений, что прочитали то и считаем выводом
}
}//void analogReadU
void rejim_kalibrovki() //функция измерения, калибровки и записи полученных значений в еепром
{//void rejim_kalibrovki()
lcd.noBacklight();
delay (50);
lcd.backlight();
delay (250);
if (digitalRead(PINkalibrovki)== 1 && kalibrovkaNOW < 6) {kalibrovkaNOW ++;}
else // тут достигли 6 касаний точки калибровки и ЗАПУСКАЕМ НЕПОСРЕДСТВЕННО ПРОЦЕСС КАЛИБРОВКИ ( ДЛЯ ЭТОГО ПОДАЁМ РОВНО 12,00В НА БЛОК ПИТАНИЯ ( асс и акб)
{ //else
if (kalibrovkaNOW >= 6)
{//if (kalibrovkaNOW >= 6)
PORTBregistr = 0; // выключили всё
PORTDregistr = 0; // выключили всё
UPRAVLENIE_PINAMI(); // сказали регистрам исполнить " выключили всё ", вызвав функцию
delay (600); // для зарядки кондёров после снятия нагрузки
analogReadU (10); //вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП A0 и А1, потом их усреднили(10)раз
kalibrovkaACC = 1200000/Uacc-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
kalibrovkaAKB = 1200000/Uakb-1410; // вычисляем значение калибровки, подав 12В на вход делителя U ( просто подключив питание к блоку питания)
{kalibrovkaNOW ++;}
}//if (kalibrovkaNOW >= 6)
}//else
if ( kalibrovkaNOW == 15 && digitalRead(PINkalibrovki)== 0) //по достижению счета в 254 и ПРИ МАССЕ НА ПИНЕ КАЛИБРОВКИ данные калибровки запишутся в еепром
{
kalibrovkaNOW = 255;
EEPROM.write(0,kalibrovkaACC);
EEPROM.write(1,kalibrovkaAKB);
sprintf (strokaI,"end KALIBR. ") ;
sprintf(strokaII,"c ") ;
IntToCharIII(kalibrovkaACC, &strokaII[1]); // вывод значения калибровки АСС
IntToCharIII(kalibrovkaAKB, &strokaII[5]); // вывод значения калибровки АСС
FloatToCharIIIII (U_acc_real, &strokaI[11]); // вывод напряжения АКБ
FloatToCharIIIII (U_akb_real, &strokaII[11]); // вывод напряжения АКБ
displayDataToDISPLAY(); //
delay (10000);
}
}//void rejim_kalibrovki()
void STATUS_REM()
{//void STATUS_REM()
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~обр аботка статуса выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~*/
/*если напруга батареи больше 12В, то включаем еще и усилитель звука (выход REM) /но включаем его только на timeBeforeRemOff (30 минут), если не заведены.*/
if (U_akb_real >= UrabotyREM && flagACC == 1 && flagREM == 0 ) {flagREM = 1; TimerREM = millis();} //если подзаряжен акб и включили зажигание - ВКЛЮЧАЕМ REM
if (U_akb_real >= UrabotyREM && flagACC == 1 && ( millis() - TimerREM >= timeBeforeRemOff )) {flagREM = 2 ;} // если кончилось время обратного отсчета - статус рем - 2.
//if (U_akb_real >= UnevykluczeniaREM && flagACC == 1){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= UrabotyREM && flagREM == 2 && flagACC == 0){ flagREM = 0;} // если восстановилось напряжение при выключенном зажигании - обнуляем статус РЕМ.
if (U_akb_real <= UrabotyREM && flagACC == 1){ flagREM = 2;} //если подсел акб при включенном зажигании - статус рем - 2.
if (U_akb_real >= UnevykluczeniaREM && flagACC == 1 ){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= UnevykluczeniaREM && flagREM == 3){ (flagREM = 1);TimerREM = millis();} // если завели машину, - ВКЛЮЧАЕМ REM, и постоянно обнуляем обратный отсчет вырубания РЕМ.
if (U_akb_real >= Uperezariadki){flagREM = 2;}// проверка на перезаряд
if( flagREM == 0 || flagREM == 2){REM = 0;} // выключаем выход REM
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~коне ц отработки выхода REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~*/
}//void STATUS_REM()
void loop()
{while (1){//для ускорения void loop
analogReadU (5);//вызов функции усреднённого чтения аналоговых входов - прочитали сырые данные с АЦП АКБ и АСС, потом их усреднили(5)раз.
if (kalibrovkaNOW != 255 && digitalRead(PINkalibrovki)== 0){if ( (millis() < 60000) || kalibrovkaNOW >= 6 ) { rejim_kalibrovki();} } // после 60с или если стоит ЗАПРЕТ(255), калибровку НЕ ДЕЛАЕМ
// новое ( с T12 версии) вычисление реального напряжения, с учетом значений калибровки в еепром (0 и 1 адреса)
U_acc_real = Uacc * (1410.0+kalibrovkaACC)/100000;
U_akb_real = Uakb * (1410.0+kalibrovkaAKB)/100000;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ( (millis() > pauseTimeHALL && flagHALL == 0 )|| ((millis() > 15000) && flagACC == 1))
{flagHALL = 1;} /*проверка отсчета при холодном старте при включении и сразу выключении ACC*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~проверка, выключили ли мы зажигание или просто стартуем ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if ((U_akb_real - U_acc_real) >=5 )/*проверка, выключили ли мы зажигание или просто стартуем (1 - выключили заж, 0 - стартуем), нужно для того, чтобы не моргать экраном при стартере и быстро тушить экран при выключении зажигания.*/
{timeAfterACC = timeAfterACC_accOFF;} //выключили зажигание /* 1000 1 - выключили зажигание. ЕСЛИ +15 ПРОПАДАЕТ ВО ВРЕМЯ СТАРТА, ТО ВМЕСТО 500 НАДО 5000 или вообще убрать этот блок if-else.*/
else {timeAfterACC = timeAfterACC_starting; if (U_akb_real <=UakbONorOFF) {flagREM = 3;REM = 0;} }//стартуем /* 5000 0 - заводим машину (стартуем) или сел акб при включенном зажигании.*/ Логика работы REM в 537 строках
if (U_akb_real >= Uperezariadki){timeAfterACC = 0;}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// ------------========================== блок ACC ========================-----------------------------------------------------------------------------
// -----------------=========ВКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
if ((Uperezariadki > U_acc_real) && (U_acc_real >= UaccONorOFF) && flagACC == 0 && flagAKB == 1 ) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1;
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (U_acc_real >= UaccONorOFF) //как только включили зажигание ( при любом напряжении батареи)
{
if (millis() - pauseTimeACC >= I_dva_C_szina_ON_time ) /* пауза XXX=I_dva_C_szina_ON_timec после появления напряжения на ACC и потом делать следующ(пока включено ACC):*/
{
if (rezreszenie_raboty_I_dva_C_sziny == 0) // переопрашиваем дисплеи I2C и ставим флаг, чтобы они работали.
{
//lcd.clear(); //очистка дисплея не нужна со строковым выводом
lcd.begin(16, 2); //инициализация дисплея 1602 для newE библиотеки
sprintf(strokaI," INIT OK ") ;
lcd.setCursor(0, 0);
lcd.print(strokaI);
display2.begin(SSD1306_SWITCHCAPVCC, 0x3C); // display 2 or adres 0x3D для 1306 дисплея
display2.clearDisplay(); // для 1306 дисплея
display2.setTextColor(WHITE); // для 1306 дисплея
// ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ТУТ надо будет включать питание на TDA7442 ! ! ! ! ! ! ! ! !
}
rezreszenie_raboty_I_dva_C_sziny = 1; // разрешаем работу шины I2C
}
} // конец как только включили зажигание ( при любом напряжении батареи)
//} не нужна скобка
if (flagACC ==1 )
{// если flagACC == 1
if (millis() - pauseTimeACC >= PlanshBAT_timer_pri_vkl_ACC ) /* пауза 1.1c после включения ACC и потом делать следующ(пока включено ACC):*/
{
PlanshBAT = 1; //digitalWrite(PlanshBATpin, 1); /*включаем питание на батарею планшета = этим подаём 12В на DC-DC. На 1м канале dc-dc сразу появляется напряжение (3,8-4,2 - как настроено)*/
}
if (millis() - pauseTimeACC >= FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vkl_ACC ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
FIVE_Volt_OUT_na_POGO_or_USB = 1; //digitalWrite(FIVE_Volt_OUT_na_POGO_or_USBpin, 1); /*включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)*/
}
if (millis() - pauseTimeACC >= OTG_timer_pri_vkl_ACC ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
OTG = 1; //digitalWrite(OTGpin, 1); /*включаем минус на OTG (включается определение перифирии планшетом.)*/
}
if (millis() - pauseTimeACC >= HUB_timer_pri_vkl_ACC ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В dc-dc (2вых)на хаб*/
}
if (reset_HUB_on_power_on == 1)
{
if (millis() - pauseTimeACC >= (HUB_timer_pri_vkl_ACC+500) ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 0; //digitalWrite(HUBpin, 1); /*Выключаем хаб*/
}
if (millis() - pauseTimeACC >= (HUB_timer_pri_vkl_ACC+1000) ) /* пауза XXX после включения ACC и потом делать следующ(пока включено ACC):*/
{
HUB = 1; //digitalWrite(HUBpin, 0); /*Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В dc-dc (2вых)на хаб*/
}
}
if (millis() - pauseTimeACC >= REGISTRATOR_timer_pri_vkl_ACC )/*через 2,2с после включения ACC включаем: */
{
REGISTRATOR = 1;// digitalWrite(REGISTRATORpin, 1); /* включаем питание на видеорегистратор*/
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}
if (millis() - pauseTimeACC >= REM_timer_pri_vkl_ACC )/*через 2,2с после включения ACC включаем: */
{
if (millis() < 15000) {flagREM =0;} // в первые 15 секунд при холодном пуске держим REM выключенным
if( flagREM == 1 && flagAKB == 1 ){REM = 1;} /* включаем выход REM*/
}
if (millis() - pauseTimeACC >= SLEEP_timer_pri_vkl_ACC ) // пауза после включения ACC и потом делать следующ(пока включено ACC):
{
SLEEP = 0; //digitalWrite(SLEEPpin, 0); /*включаем экран*/
}
}// если flagACC == 1
STATUS_REM(); //зашли в функцию обработки статуса выхода REM
//-----------------=========ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ=============----------------
//if (U_acc_real < UaccONorOFF)
//if ( ((millis() - pauseTimeACC) >= (lcd_noBacklight_timer_pri_vykl_ACC + timeAfterACC)) )
// {
// lcd.noBacklight();/* тушим подсветку дисплея для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея*/
// }
if ((U_acc_real < UaccONorOFF) && flagACC == 1)
{
flagACC = 0; /*Выключили зажигание*/
pauseTimeACC = millis();
pauseTimeAKB = millis();
}
if (flagACC==0)
{// if (flagACC==0)
if (((millis() - pauseTimeACC) >= (timeAfterACC-REM_timer_pri_vykl_ACC)) ) // тут REM_timer_pri_vykl_ACC (1000)- это на сколько раньше выключать выход REM перед остальными выключениями
{
REM = 0; //digitalWrite(REMpin, 0); // сразу выключаем усилитель звука
flagREM = 0; /* выключаем флаг выхода REM*/ // обнуляем статус REM
}
/*пауза 7c или 2c после вЫключения ACC и потом делать следующ://через 5с после выключения зажигания вЫключаем минус на OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)*/
if (((millis() - pauseTimeACC) >= (timeAfterACC+SLEEP_timer_pri_vykl_ACC)) )
{
if (flagHALL == 1)
{
SLEEP = 1;//digitalWrite(SLEEPpin, 1); /*тушим экран (если прошло 2 минуты с момента включения блока )*/
}
else
{SLEEP = 0;}//{digitalWrite(SLEEPpin, 0);}
}
if ( ((millis() - pauseTimeACC) >= (OTG_timer_pri_vykl_ACC+timeAfterACC)) ) /* 3000 пауза 3с чтобы не пукал усилитель*/
{
OTG = 0;//digitalWrite(OTGpin, 0); /*вЫключаем минус на OTG (8 pin PW1)*/
}
if ( ((millis() - pauseTimeACC) >= (FIVE_Volt_OUT_na_POGO_or_USB_timer_pri_vykl_ACC+t imeAfterACC)) )
{
FIVE_Volt_OUT_na_POGO_or_USB = 0;//digitalWrite(FIVE_Volt_OUT_na_POGO_or_USBpin, 0); /*вЫключаем +5V зарядки. (POGO(USB))*/
}
if ( ((millis() - pauseTimeACC) >= (HUB_timer_pri_vykl_ACC+timeAfterACC)) )
{
HUB =0;//digitalWrite(HUBpin, 1); /* ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб*/
}
if ( ((millis() - pauseTimeACC) >= (lcd_noBacklight_timer_pri_vykl_ACC+timeAfterACC)) )
{
lcd.noBacklight();// тушим подсветку дисплея для newE и для 0x27 // в 409 строке включение подсветки LCD дисплея
}
if ( ((millis() - pauseTimeACC) >= (I_dva_C_szina_OFF_time + timeAfterACC )) && (rezreszenie_raboty_I_dva_C_sziny == 1) ) //когда вЫключили зажигание, по истечении времени (I_dva_C_szina_OFF_time) и если разрешение на работу I2C шины всё еще вЫключено - вЫключаем шину I2C
{
lcd.clear(); //очистка дисплея
rezreszenie_raboty_I_dva_C_sziny = 0; //запрещаем работу I2C шины
// ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ТУТ надо будет вЫключать питание на TDA7442 ! ! ! ! ! ! ! ! !
}
}// if (flagACC==0)
// -------------------------========================= блок контроля АКБ ==========================-------------------------------------------------------------------------------
if (U_acc_real >= UaccONorOFF) {UakbONorOFF = Uakb_Kogda_ACC_vkluczeno;} else {UakbONorOFF = Uakb_Kogda_ACC_vYkluczeno;} /*при включении зажигания напряжение самовырубания станет 11,1 вместо 11,9*/
if ((Uperezariadki > U_akb_real) && ((U_akb_real >= UakbONorOFF) && flagAKB == 0)) /*проверка +30 на перезаряд >15.5В, и больше заданного в 266 строке, и флага акб */
{
if ((millis() - pauseTimeACC >= 100) && flagAKB == 0)
{
SAMOZAPITKA =1;//digitalWrite(SAMOZAPITKApin, 1); /* включаем самозапитку процессора */
flagAKB = 1; /*подняли флаг батареи*/
}
}
//Serial.print ("rezreszenie_raboty_I_dva_C_sziny = " ); Serial.println (rezreszenie_raboty_I_dva_C_sziny);
if (((U_akb_real < UakbONorOFF) && flagAKB == 1)||(U_akb_real >Uperezariadki))/* ситуация, когда сел при работе ардуины аккумулятор, либо сел в процессе работы или простоя автомобиля, либо перезарядка > 15.5В*/
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;
pauseTimeACC = millis();
pauseTimeAKB = millis();
UakbONorOFF = Uakb_Kogda_ACC_vYkluczeno;
}
if ((millis() - pauseTimeAKB >= timeWhileAkbLow) && flagAKB == 0) /* если севший аккумулятор //через 40с вЫключаем питание на батарею планшета и вырубаем сам БП.*/
{
PlanshBAT = 0; //digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета */
OTG = 0; //digitalWrite(OTGpin, 0); /*вЫключаем минус на OTG )*/
FIVE_Volt_OUT_na_POGO_or_USB = 0; //digitalWrite(FIVE_Volt_OUT_na_POGO_or_USBpin, 0); /*вЫключаем +5V (POGO(USB))*/
HUB = 0; //digitalWrite(HUBpin, 1); /* подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб*/
REM = 0; //digitalWrite(REMpin, 0); /* выключаем выход REM*/
REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA =0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (5000); /* задержка для аппаратного выключения*/
}
if (flagAKB == 1 && flagACC == 0) /*ситуация, когда норм акб и выключено зажигание (ACC)*/
{
if ((millis() - pauseTimeAKB )>= timeUntilBATOff && flagAKB == 1) /* если прошло "timeUntilBATOff" 24 (86400000) часа, как выключили ACC // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)*/
{
PlanshBAT = 0; // digitalWrite(PlanshBATpin, 0); /*вЫключаем питание на батарею планшета (in2)//(батарея планшета))*/
}
if ((millis() - pauseTimeAKB) >= timeUntilALLOff && flagAKB == 1) /* если давно выключили ACC ) "timeUntilALLOff" (2суток = 172800000)) (самозапитка для регистратора, процессор БП активен)*/
{ REGISTRATOR = 0; //digitalWrite(REGISTRATORpin, 0); /* выключаем питание на видеорегистратор*/
SAMOZAPITKA = 0; //digitalWrite(SAMOZAPITKApin, 0); /*выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается*/
UPRAVLENIE_PINAMI();
delay (10000); /* задержка для аппаратного выключения*/
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~конец блока обработки напряжений АКБ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/******************************************индикаци я светодиодом и задержка вывода на дисплей******************************************* ************************************************** ************************************************** *********************************/
ms = millis();
// Событие срабатывающее каждые 125 мс
if ( ( ms - ms1 ) > 125 || ms < ms1 ) {
ms1 = ms;
// Режим светодиода ищем по битовой маске
if ( blink_mode & 1 << (blink_loop & 0x07) ) {LED = 1;}
else { LED = 0;}
blink_loop++;
}
if (rezreszenie_raboty_I_dva_C_sziny == 1) // если разрешена работа для шины I2C
{
// Событие срабатывающее каждые 350 мс
if ( ( ms - pauseDisplay ) > vremia_obnovlenia_displeya || ms < pauseDisplay )
{
pauseDisplay = ms;
printDISPLAY(); // выводим на дисплей раз в 350( запуская фушкцию)
}
}
/*настраиваем режимы моргания встроенного светодиода ардуины*/
if (blink_mode != modes[5] || blink_mode != modes[5])
{
if (flagAKB == 0 ){blink_mode = modes[4];} // индикация напруги батареи на ардуинине.- низкое напряжение АКБ авто - Две короткие вспышки раз в секунду
if (flagAKB == 1 && flagACC == 0) {blink_mode = modes[3];} //- нормальное напряжение АКБ авто, ACC выключено. - Короткая вспышка раз в секунду
if (flagAKB == 1 && flagACC == 1) {blink_mode = modes[2];} //- нормальное напряжение, включено ACC, рабочий режим. - Мигание по 0.8 сек
if (kalibrovkaNOW >= 1) {blink_mode = modes[1];} // режим калибровки
}
/* ***********************данные для справки******************************************* *********************
0B00000000, //Светодиод выключен blink_mode = modes[0];
0B11111111, //Горит постоянно blink_mode = modes[1];
0B00111111, //Мигание по 0.8 сек blink_mode = modes[2];
0B00000001, //Короткая вспышка раз в секунду = modes[3];
0B00000101, //Две короткие вспышки раз в секунду
0B00010101, //Три короткие вспышки раз в секунду
0B01010101 //Частые короткие вспышки (4 раза в секунду)= blink_mode = modes[6];
*/
//************************************************** ************************************************** ******
//Serial.print ("HUB = " ); Serial.println (HUB);
UPRAVLENIE_PINAMI();
}} /*конец цикла void loop() и конец while (1)*/
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
//================================================== ================================================== ================================================== ================================================== ================================================== =================
на машине - день - полет нормальнй m24
strangle
06.12.2017, 18:26
Не много не по теме. Но подскажите, знатоки KIW-3312S. Как им управлять, если без наворотов. Чтобы 1 канал работал напрямую от АКБ, а второй канал включался только при появлении ACC?
БП автора, без ардуино, по-моему для меня немного избыточен
Не много не по теме. Но подскажите, знатоки KIW-3312S. Как им управлять, если без наворотов. Чтобы 1 канал работал напрямую от АКБ, а второй канал включался только при появлении ACC?
БП автора, без ардуино, по-моему для меня немного избыточен
на KIW-3312S есть выходы ss1 и ss2. Подав на этот выход массу мы выключаем канал.
Дальше объяснять нужно?
Работает на vBulletin® версия 3.8.4. Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot