Датчик включения вентилятора на DS18B20 с индикацией текущей температуры

Автор: | 28.10.2015

Наверняка многие счастливые и не очень, обладатели старых автомобилей марки ВАЗ сталкивались с проблемой выхода из строя вот этого датчика:

1422013-1-0-95eb04a8c8ae1f369cc85d48cee795c4

Устроен он довольно просто два контакта, один выполнен из термочувствительного металла и в процессе нагревания датчика термочувствительный элемент растягивается и когда температура датчика достигает примерно 92 градуса, происходит замыкание контактов. Включается вентилятор и начинается интенсивное охлаждение радиатора и когда температура датчика падает примерно до 87 градусов, контакты размыкаются.

12

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

Вообщем пришла идея сделать электронное управление вентилятором охлаждения, с использованием микроконтроллера Atmega 8, и цифрового датчика DS18B20.

Датчик DS18B20 купил в таком виде:

DFR0198-1_enl

Назначение проводов: Yelow (Данные); Black(Общий или GND); Red(Питание +5V).

Сам датчик находится под металлической оболочкой, и выглядит вот так:

DS18B20

Назначение его выводов с лева на право:

GND (Общий); DQ (Данные); Vdd (Питание +5V).

Как его установить вместо штатного? Да очень просто, берем старый датчик греем его газовой горелкой или на кухонной плите, и выколупываем все содержимое, и сверлим по центру отверстие диаметром примерно 5.5 мм.

 S1510004         S1510007

Вставляем датчик DS18B20 в отверстие так чтобы он выступал из него примерно на 5 мм. После установки DS18B20, замазываем полость вокруг него холодной сваркой.

Принцип работы устройства:

Измеренное датчиком значение температуры сравнивается и выводится на LED дисплей. Если значение температуры больше либо равно 92°C, то на контакте PC3 микроконтроллера устанавливается логическая 1, и контакты реле Rel 1.1 замыкаются включая вентилятор. Когда температура достигает значения ниже либо равно 87°C,  то на PC3 устанавливается логический 0, и контакты реле Rel 1.1 размыкаются выключая вентилятор. Светодиод HL2 служит индикатором состояния реле Rel 1, если на его обмотку подано напряжение то светодиод горит.

Схема

Sheme

Для индикации текущей температуры используется трех разрядный с общим анодом семисегментный индикатор красного цвета, вывод значения на который осуществляется по алгоритму динамической индикации. Напряжение +5В получается с помощью линейного стабилизатора 7805 на 1А в корпусе D2PAK. Питание DS18B20 полноценное, +5V по отдельному проводу. Загрузка прошивки в контроллер производится через разъем ISP CON1. Разъем для прошивки я сделал таким образом чтобы все контакты были задействованы, в отличие от разъема программатора USB ASP.

USBasp-pin

Это распиновка ISP коннектора программатора USB ASP, здесь лишние контакты которые нам не нужны это: 3 6 8 10. В целях экономии ресурса сверла, припоя и двух рядной PLS линейки решил сделать в одно рядную PLS линейку. Для подключения питания 13.5V, контактов реле Rel 1.1, провода данных DQ и питания +5V датчика DS18B20, общего GND провода к плате устройства используется клеммные зажимы.

Печатная плата

55646

44645

Файл проекта печатной платы в DipTrace: Скачать

Использованные детали

Atmega 8 в корпусе TQFP32

LED индикатор LD-3361BS с общим анодом

Реле 833H- 1C-C 12VDC из UPS

Линейный стабилизатор LM7805 в корпусе D2PAC

Транзисторы: BD139(корпус TO-220), 2N5551(корпус TO-92)

Светодиод: 3mm 20mA green

Датчик температуры: DS18B20(корпус TO-92)

 PLS линейка 1 ряд 6 контактов

Конденсаторы электролитические: 10uF 16v

Резисторы SMD типоразмер 1206

Клемник с винтом 2 контакта

Диоды: SM4007

Куда подключить контакты реле Rel 1.1

1451

А подключить необходимо к проводам которые подключались к контактам старого датчика. Получается что контакты реле Rel 1.1 замыкают выводы 30 и 85 силового реле которое включает вентилятор.

Код программы на C в CodeVisionAVR

#include <mega8.h>
#include <ds18x20_v2.h>
#include <stdio.h>
#include <delay.h>



#asm
 .equ __w1_port=0x15 ;//Датчик подключаем к PORTC
 .equ __w1_bit=4 //Датчик подключаем к биту 4
#endasm




#define SEGMENTS PORTB 
#define RELE_ON PORTC.3 = 1
#define RELE_OFF PORTC.3 = 0
#define A1 PORTC.0
#define A2 PORTC.1
#define A3 PORTC.2



#define MAX_DEVICES 8 //Сколько можно подключить датчиков

static flash unsigned char digit[] = {
(0b01000000), // 0 ABCDEFG 
(0b01111001), // 1 0123456
(0b00100100), // 2
(0b00110000), // 3
(0b00011001), // 4
(0b00010010), // 5
(0b00000010), // 6
(0b01111000), // 7
(0b00000000), // 8
(0b00010000), // 9
(0b01111111), // OFF
(0b00111111) // -
};



unsigned char rom_code[MAX_DEVICES][9];//Область памяти (9 байт) для хранения ROM-кода датчиков


unsigned char i, devices, celie, drob, celie1, a, d1, d2, d3, led_on_off;
int temperature ;
unsigned int temp, drob_tmp;
//eeprom unsigned char temp_on_eep, temp_off_eep;


void tem(void)
{
temperature=ds18b20_temperature(&rom_code[i][0]);//Вытаскиваем показания датчика

temp = (unsigned int) temperature;//Присвоим переменной temp значение переменной temperature с явным указанием типа данных
 
 if (temperature<0)temp = ( ~temp ) + 0x0001; // если число отрицательное перевести его в норм.вид 
 
 celie = temp >> 4; // целая часть числа
 
 drob_tmp = temp & 0x000F; // дробная часть числа с точностью 1/16 градуса 
 drob = (unsigned int) ((drob_tmp * 10) / 16); // преобразование дробной части в формате "1/16 градуса" в десятичный формат с точностью 0,1 градуса 
 
 
 
 if(celie >= 92 && drob >= 0){
 RELE_ON;
 }
 
 if(celie <= 87 && drob <= 9){
 RELE_OFF;
 }
 
 
 
 
 if (temperature>=0) {//Если темп. плюсовая или 0
 
 if (celie >= 100){
 d1 = celie/100; 
 d2 = celie/10%10; 
 d3 = celie%10;
 }
 else{
 d1 = 10;
 d2 = celie/10;
 d3 = celie%10;
 } 
 }
 
 
 else{ // Если минусовая то в d1 устанавливается - 
 
 d1 = 11;
 d2 = celie/10;
 d3 = celie%10;
 }
 
} 


// Прерывание по переполнению Timer1 переключение разрядов время горения одного разряда 5ms
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer1 value
TCNT1H=0xEC78 >> 8;
TCNT1L=0xEC78 & 0xff;


 SEGMENTS = 0;
 
 
 switch (a){
 case 1: A1 = 1; A2 = 0; A3 = 0; SEGMENTS = digit[d1]; break;
 case 2: A1 = 0; A2 = 1; A3 = 0; SEGMENTS = digit[d2]; break;
 case 3: A1 = 0; A2 = 0; A3 = 1; SEGMENTS = digit[d3]; a=0; break;
 }
 a++;

}


void main(void)
{
 
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 5 ms
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0xEC;
TCNT1L=0x78;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// // Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<TOIE0);
 



 devices=w1_search(0xf0,rom_code);//Ищем датчики 

 
 
 DDRB= 0b11111111;
 DDRC= 0b00001111;
 #asm("sei")
 

while (1){
 
 delay_ms(1000);
 tem();
 
 
}
 
};

Тактовая частота 4МГц

Hex файл прошивки Скачать

В заключение

Фото уже встроенной платы в панели авто:

S1460001

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

 

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

 

Добавить комментарий