Индикатор внешней температуры и напряжения АКБ для авто.

Индикатор внешней температуры и состояния аккумулятора автомобиля на Ардуино и OLED дисплее.

 

Попросил приятель сделать ему в Nissan Serena показометр температуры за бортом и состояния заряда аккумулятора, всё это дело желательно запилить в приборную панель. Запиливать я не стал, пусть сам с эстетикой разбирается, но само устройство ему спаял.

Arduino Pro Mini у меня закончились, по этому взял микроконтроллер ATmega168PA, которые я заказываю на Али по очень вкусной цене, как их прошивать через Arduino IDE

Схема термометра -- вольтметра.

Схема

 

Компоненты и печатная плата.

  • ATmega168PA в корпусе TQFP.
  • I2C Дисплей 128x64 с чипом SSD1306.
  • Датчик температуры 18b20.
  • Стабилизатор на 5v 78L05.
  • Резисторы 1206, резистор RES 0805.
  • Конденсаторы 0805 и тантал 1210.

 

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

Battery plata

Battery ISP

 

Логика работы.

Вольтметр (2 строка дисплея) всегда показывает напряжение на аккумуляторной батарее.

Принцип контроля состояния акб (3 строка дисплея) состоит в измерении напряжения НРЦ (напряжение разомкнутой цепи), а далее по таблице зависимости заряженности от напряжения выводим в процентах на дисплей. Данный метод усреднённый и работает только тогда, когда в аккумуляторе практически останавливается химическая реакция, например если авто простояло ночь. Надеюсь правильно выразился.

Таблица с сайта Varta.

Testing pb bat

 

В третей строке отображается состояние:

  • Аккумулятор мёртв
  • 50%
  • 60%
  • 70%
  • 80%
  • ОК

 

При зарядке когда напряжение больше 13v, в строке отображается просто марка автомобиля.

Нужно понимать, что заряженность и ёмкость - разные вещи. В 60А/ч батарее из-за деградации и разрушения пластин может оставаться всего 20А при полной зарядке, но показатель заряженности покажет на сколько батарея заряжена, а не какова её ёмкость. Измерить ёмкость можно только разрядом до 12v, по времени. 

Плата сделана так, что измеряемое напряжение берётся непосредственно от питания всего устройства подключённого к замку зажигания в положении 1, при такой конфигурации требуется только 2 провода для подключения к автомобилю.

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

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

 Battery DEAD

Battery50

Battery80

BatteryNS

 

 

Заказываю компоненты у проверенных продавцов.

ATmega168PA

100 руб

OLED дисплей 128x64

125 руб

 

 

 

Код Ардуино.

 

#include <Wire.h>
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
float input_volt = 0.0;
float temp=0.0;
float r1=100000.0; //сопротивление резистора r1
float r2=10090.0; // сопротивление резистора r2
#define DS_PIN 5 // пин 18b20

void setup(){
dallas_requestTemp(DS_PIN); // запрос // delay (2000);

} void loop(){
dallas_requestTemp(DS_PIN); // запрос
delay(1000);
//int value = dallas_getTemp(DS_PIN);

int analogvalue = analogRead(A1);
temp = (analogvalue * 5.0) / 1024.0;
input_volt = temp / (r2/(r1+r2));
if (input_volt < 0.1)
{
input_volt=0.0;
}

u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );

}

void draw(void) {
int t=dallas_getTemp(DS_PIN); if (t<-9){
u8g.setFont(u8g_font_fur14r);
//gdr14
u8g.setPrintPos(0, 15);
u8g.print("OUT");
u8g.setPrintPos(75, 15);
u8g.print(t);
u8g.setPrintPos(115, 15);
u8g.drawCircle(115, 3, 3); }
else
{
u8g.setFont(u8g_font_fur14r);
u8g.setPrintPos(0, 15);
u8g.print("OUT");
u8g.setPrintPos(85, 15);
u8g.print(t);
u8g.setPrintPos(115, 15);
u8g.drawCircle(115, 3, 3);
} u8g.setPrintPos(0, 39);
u8g.print("BAT"); u8g.setPrintPos(65, 39);
u8g.print(input_volt, 1); u8g.setPrintPos(115, 39);
u8g.print("v"); if(input_volt<=12.00){
u8g.setPrintPos(0, 63);
u8g.print("Battery dead!!");
}
if(input_volt>12.00 && input_volt<12.20 ){
u8g.setPrintPos(0, 63);
u8g.print("Battery 50%");
}
if(input_volt>12.20 && input_volt<12.30 ){
u8g.setPrintPos(0, 63);
u8g.print("Battery 60%");
}
if(input_volt>12.30 && input_volt<12.40 ){
u8g.setPrintPos(0, 63);
u8g.print("Battery 70%");
}
if(input_volt>12.40 && input_volt<12.50 ){
u8g.setPrintPos(0, 63);
u8g.print("Battery 80%");
}
if(input_volt>12.50 && input_volt<13.00 ){
u8g.setPrintPos(0, 63);
u8g.print("Battery OK");
}
if(input_volt>=13.00){
u8g.setPrintPos(0, 63);
u8g.print("Nissan Serena");
}
}

// ======= dallas =======
void dallas_begin(uint8_t pin) {
pinMode(pin, INPUT);
digitalWrite(pin, LOW);
}
void dallas_requestTemp(uint8_t pin) {
if (oneWire_reset(pin)) return;
oneWire_write(0xCC, pin);
oneWire_write(0x44, pin);
}
int dallas_getTemp(uint8_t pin) {
uint8_t data[2];
if (oneWire_reset(pin)) return;
oneWire_write(0xCC, pin);
oneWire_write(0xBE, pin);
data[0] = oneWire_read(pin);
data[1] = oneWire_read(pin);
int result = (int)((data[1] << 8) | data[0]) * 0.0625; //>
return result;
}
// ======= 1wire =======
boolean oneWire_reset(byte pin) {
pinMode(pin, 1);
delayMicroseconds(640);
pinMode(pin, 0);
delayMicroseconds(2);
for (uint8_t c = 80; c; c--) {
if (!digitalRead(pin)) {
uint32_t tmr = micros();
while (!digitalRead(pin)) {
if (micros() - tmr > 200) return false;
}
return false;
}
delayMicroseconds(1);
}
return true;
}
void oneWire_write(uint8_t data, byte pin) {
for (uint8_t p = 8; p; p--) {
pinMode(pin, 1);
if (data & 1) {
delayMicroseconds(5);
pinMode(pin, 0);
delayMicroseconds(90);
} else {
delayMicroseconds(90);
pinMode(pin, 0);
delayMicroseconds(5);
}
data >>= 1;
}
}
uint8_t oneWire_read(byte pin) {
uint8_t data = 0;
for (uint8_t p = 8; p; p--) {
data >>= 1;
pinMode(pin, 1);
delayMicroseconds(2);
pinMode(pin, 0);
delayMicroseconds(8);
bool dataBit = digitalRead(pin);
delayMicroseconds(80);
if (dataBit) data |= 0x80;
}
return data;
}

 

Исходники и файлы печатки  СКАЧАТЬ

 

 

 

Плавный розжиг ближнего света фар.

Плавный розжиг галогенных ламп ближнего света с функцией ДХО.

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

Сопротивление холодной нити у автомобильной лампы мощностью 55w около 0,2Ом. По закону Ома по ней протекает ток в 70А, а это 1000w при 14v! При нагреве спирали, сопротивление её растёт, ток начинает падать и при выходе на рабочую температуру составляет около 5А. Со временем, при естественном износе спирали, многократно возрастает вероятность её перегорания при включении.

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

Есть несколько вариантов таких устройств:

 

  • Линейный ограничитель тока
  • Различные релейные схемы
  • Микроконтроллерные ШИМ регуляторы

 

Все варианты имеют право на жизнь. Конструкцию последнего рассмотрим ниже.

 

Плавный розжиг на Attiny13.

 

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

  При подаче питания, микроконтроллер начинает выдавать импульсы, скважность которых плавно нарастает от 0 до 100% за время около 2,5 секунд. Этого времени достаточно, что бы  плавно и равномерно прогреть спираль накаливания не превышая допустимую мощность.

Дополнительно, программно реализован режим дневных ходовых огней. При замыкании контактов ДХО на плате, через выключатель в салоне, плавно уменьшается скважность импульсов со 100 до 80%, тем самым снижая напряжение на лампе, что тоже продлевает срок её службы. Если выключатель включен в момент запуска, то происходит так же плавный розжиг с 0 до 80%.

Вот таблица зависимости срока службы от напряжения.

Срок службы галогенных ламп, таблица.

 

Схема до безобразия простая, по этому даже не рисовал её, а разводил сразу на плату в Sprint-Layout под лампы H7.

Plavny rozghig pechatnaya plata

 

По деталям.

  • Контроллер ATtiny13/ATtiny13A.
  • Транзисторы драйвера любые биполярные разной проводимости.
  • N-канальный MOSFET в корпусе ТО252 с материнки 40v, 60А.
  • SMD резисторы 1206.
  • И только твёрдотельные конденсаторы!

 

 Светодиод и его резистор возле разъёма ДХО ставить не нужно, его мигающие свойства в прошивку не вошли, точнее не влезли.

Собрано четыре таких платы, детали не подбирал, ставил что есть, все запустились правильно и с первого раза. Транзисторы 25 -40V с током 50 - 60А и напряжением открытия 4-5v абсолютно холодные.

Фото готового изделия.

 Plavny rozghig v avto

Plavny rozghig

Plavny rozghig blighnego sveta

 

Можно обойтись одним микроконтроллером, для этого на приложенных печатках имеются дополнительные пятаки и дополнительная плата с МОСФЕТом. Первая плата ставится в одну фару, а вторая во вторую, земля и затворы соединяются витой парой с хорошей изоляцией. С таким вариантом только без функции дхо проездил год, проблем не было. Помех на радио и электронику авто не замечено, частота ШИМ 4,5кГц.

Машины на которых стоит данный твик: Subaru Legacy 2000, Toyota Premio 1997.

 Прошивка занимает всю память тиньки, так как познаний в программировании не много и писал программу в Arduino IDE.

 

 Файлы печатной платы, исходник и прошивка СКАЧАТЬ

 

 

Регулятор скорости вентилятора видеокарты.

Восстановление системы охлаждения видеокарты.

История подопытной видеокарты RX 570 4GB не известна, куплена племянником с рук. Вентиляторы четырёх пиновые, были припаяны напрямую к 12v доп питания, и соответственно выли как самолёт на взлете.

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

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

С вентиляторов выходит 4 провода:

  • Чёрный      -
  • Жёлтый     +
  • Синий        ШИМ
  • Зелёный    Тахометр

 

Так как система родного ШИМ видеокарты убита напрочь, и считать данные о температуре не представлялось возможным, был изготовлен ШИМ регулятор на таймере NE555 по ниже приведённой схеме, только с полевым транзистором.

Регулятор вентилятора видеокарты.

В качестве датчика температуры использовался миниатюрный терморезистор сопротивлением 10кОм из батареи ноутбука . Он очень тонкий и имеет минимальную инерционность.

Терморезистор для регулятора температуры видеокарты.

В начале планировалось управлять оборотами по 12v с помощью MOSFET транзистора, но электроника вентиляторов категорически опротестовала наше решение довольно громкими лозунгами в виде не приятного писка.

Проблема решилась деинсталляцией полевого транзистора и подачей сигнала с выхода микросхемы 555 на синий провод, черный и жёлтый подключены непосредственно к напряжению 12v. Финальная схема выглядит так.

Регулятор вентилятора кулера.

Терморезистор приклеен к трубке выходящей из под процессора на эпоксидный клей "Poxipol". Плата приклеена на двухсторонний скотч к видеокарте. Файл печатки к сожалению не сохранился, но думаю развести плату под свои детали особого труда не составит.

Датчик температуры для видеокарты.

Регулятор оборотов кулера на ne555.

Reguliator dlia culera ne555

Reguliator dlia culera videokarty

 

Настройка.

Настройка до безобразия проста. Требуется подобрать резистор 22кОм по схеме.

  1. 1.  Впаиваем вместо этого резистора переменный на 25 - 50кОм.
  2. 2.  Крутим до начала вращения вентиляторов.
  3. 3.  Запускаем "FurMark" и загружаем видеокарту на 100%.
  4. 4.  В течении 10 - 15 минут подстраиваем скорость, что бы температура на ядре не превышала допустимые пределы.
  5. 5.  Измеряем сопротивление переменного резистора и впаиваем постоянный.

 

В нашем случае потребовался резистор 20кОм. Данная схема прошла все стресс тесты на отлично, обороты растут плавно, температура не превышает 66 - 70 градусов, задержки нет никакой!

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

 

 

 

Прошивка ATmega168PA.

Прошивка ATmega168PA.

 

Заказываю из Китая недорогие чипы ATmega168PA, для замены сгоревших на Arduino Pro Mini и использования отдельно в других проектах. Как оказалось, сигнатура отличается от атмег установленных в ардуино и выглядит так - 0x1e940b. Соответственно сразу прошить через Arduino IDE не получилось.

На форумах некоторые лузеры предлагают править конфигурационные файлы в IDE, что привело к залочке одного из чипов, так делать никому не советую!

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

Открываем Arduino IDE, заходим Файл >> Настройки. Вставляем ссылку на пакет MiniCore https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json в "Дополнительные ссылки для Менеджера плат" и жмём OK.

Ide настройка

 

Далее Инструменты >> Плата >> Менеджер плат. Ищем новое ядро MiniCore, из выпадающего списка выбираем последнюю версию и кликаем - Установка.

Ide менеджер плат

 

Теперь в списке плат, под заголовком MiniCore появились новые пункты, выбираем в "Плата" - ATmega168, а в "Variant:" - 168P/168PA.

Ide MiniCore

 

Ide ATMega168PA

 

Теперь можно выбрать программатор и залить загрузчик. Далее микроконтроллер можно шить через UART.

Использую эти 168 везде, отличий от других атмег не заметил вообще, а цена позволяет их брать пачками и забыть Atmega8. В интернетах пишут, что PA, - экономичнее других в плане энергопотребления, но я это ещё не проверял.

Покупаю данные Атмеги на али, у одного продавца постоянно. Цена самая низкая, обмана ни разу не было, доставку всегда беру с отслеживанием. Ссылка на али:

 

Микроконтроллер ATmega168PA

130 руб

USBASPISP программатор

150 руб

 

USBtiny программатор

230 руб

 

 

 

Понижающий преобразователь на XL4015E1.

Понижающий преобразователь на XL4015E1 своими руками.

 

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

xl4015e1 схема.

 

Большинство деталей в smd корпусах и распаяны со стороны печатных дорожек, сверху располагаются конденсаторы, подстроечные резисторы и дроссель.

xl4015e1 smd монтаж.

 

xl4015e1 плата.

 

Дроссель из компьютерного блока питания, желтое кольцо наружным диаметром 16мм, содержит около 30 витков провода 1мм и имеет индуктивность около 50мкГ. В даташите к микросхеме указано 47мкГ.

Шунт сделал из куска проволоки из советского проволочного резистора 0.6 Ом, просто отрезал нужную длину и впаял.

Диод Шоттки на 5А  не нашёл, за то есть куча 3А диодов ss36, но т.к. брал их за копейки в Китае и корпусе sma, то скорее всего они перемаркированы с 1 или 2А диодов, поставил их 4 штуки в параллель.

Стабилизатор использовал 78L05, по этому питание схемы не должно превышать 30v по даташиту на данную микросхему.

Плата разведена под 78L05, для других типов стабилизатора следует изменить печатную плату.

Все резисторы размера 1206, светодиоды 3мм

 

 

LM358 50шт

70 руб

Набор 1206 резисторов, 2000шт

480 руб

 

 

Печатную плату развёл как смог, две перемычки и два резистора нулевика. Размеры платы 35х80мм.

xl4015e1 печатная плата.

 

Печатная плата в формате LAY6  Скачать

Слой дорожек печатать зеркально, слой шелкографии как есть.