Как получить температуру от автомобильного датчика ОЖ ?

Nikotin
Offline
Зарегистрирован: 15.10.2015

Здравсвуйте, подскажите каким образом можно перевести показания автомобильного датчика температуры ОЖ в градусы?  

Пример брал отсюда http://greenoakst.blogspot.ru/2012/03/arduino.html

Сам датчик подключен к 3,3В через делитель 2000 Ом

Сопротивление датчика очень не линейное

Для расчета коэффициентов Стейнхарца-Харца сделал три замера

при -15      14000 Ом

при 18       1800   Ом

при 52       840    Ом

 

#include <math.h>    //подключаем свою библиотеку с блэкджэком и логарифмами


double Steinhart(int value) {
  double Temp;                  //в итоге эта переменная станет температурой
  Temp = log((2048000/value-2000));    //считаем логарифм  2000  Ом это сопротивление делителя
//считаем температуру из уравнения Стейнхарта-Харта
  Temp = 1/(0.001768+0.00005719*Temp+0.000001354*Temp*Temp*Temp); 
  Temp = Temp-273.15;//переводим температуру в градусы Цельсия         
  return Temp; //передаем температуру обратно в loop
}

void setup() {
  Serial.begin(9600); //стартуем последовательное соединение
}
void loop() {
//передаем в функцию Steinhart измеренное значение и выводим температуру, которую она вернет
  Serial.println(int(Steinhart(analogRead(0)))); 
  delay(5000);
}

В итоге получил погоду на марсе. 

Каким образом можно привязать сопротивление к градусам?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Я правильно нарисовал схему с ваших слов?

Если да то на вход ардуино пойдет 0,97Вольт.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Если ваша ардуино работаетот 5В(опорное напряжение)

Могу предложить такой простой код, но у меня работает.

Код без оверсемплинга, но думаю для того чтоб понять кипит авто или нет +/-1градус не помешают)))

float T_avto=0;//переменная для хранения температуры.
void setup() {Serial.begin(9600);}

void loop() {
  T_avto = analogRead(A4)*52/198;  //Аналоговый вход указываете свой.
  Serial.println(T_avto);
  delay(1000);
}

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

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

Но это для инкубатора или чего-то требующего погрешность не более 0,1градуса.

Nikotin
Offline
Зарегистрирован: 15.10.2015

Да, схема такая.

За пример спасибо, чуть позже попробую.

uragan
Offline
Зарегистрирован: 23.02.2015

Я, например, сделал калибровку и занес результаты в двумерную матрицу. Между точками линейная апроксимация функцией map.

Nikotin
Offline
Зарегистрирован: 15.10.2015

Этот код у меня на 5 вольтах показывает 180 градусов вместо комнатной.

 

 

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


int analogPin = 7; 
float Vout = 0;
float R2 = 0;
void setup() 
{ 
Serial.begin(9600);
} 
void loop() 
{ 
Vout = (3.3 / 1023.0) * analogRead(analogPin); // Вычисляем напряжение в средней точки делителя (0-3.3)
R2 = 2000 / ((3.3 / Vout) - 1);
Serial.print("Voltage: "); 
Serial.println(Vout); 
Serial.print("R2: ");  
Serial.println(R2); 
delay(3000);
}
C Om
50 870
49 885
48 912
47 942
46 980
45 1015
44 1055
43 1094
42 1140
41 1180
40 1220
39 1267
38 1310
37 1360
36 1410
35 1460
34 1520
33 1585
32 1640
31 1705
30 1765

В  этом диапазоне зависимость достаточно ровная. 

Подскажите как тперь эти данные отразить в коде?

Temp = map(R2, 870, 1765, 50, 30);  это будет корректно работать на всем диапазоне измерений?

uragan
Offline
Зарегистрирован: 23.02.2015

Постройте график по приведеным точкам. Соедините крайние прямой линией и все сами увидите.

Nikotin
Offline
Зарегистрирован: 15.10.2015

Вот кривая измеренная от 3 до 50 градусов. 

uragan, Можно по подробнее про двумерную матрицу? Очень бы хотелось взглянуть на пример кода. Я не программер просто. А то в голове только вариант - Разбивать кривую на мелкие кусочки и  if -ами определять в какой диапазон попало значение а дальше через map ?  Наверняка же есть вменяемые решения ) У математиков еще есть вариант с интерполированием функции но мне он кажется сложным.

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Nikotin пишет:

...) У математиков еще есть вариант с интерполированием функции но мне он кажется сложным.

 

Вот вам формула по вашим данным полиномная для нахождения температуры зная сопротивление.

Степень приближения очень высокая в пределах кривой 0,99 почти единица!!!

Т=0,00001R^2-0.047R+83.10

(формула выведенна только для вашей кривой другим не подойдет!!!!)

uragan
Offline
Зарегистрирован: 23.02.2015

Интерполированием тоже можно. Но кусочками прямых тоже ничего сложного. И если умеешь, то достаточно просто. И точность - проводишь прямые на предложенном графике и все видно. Выложить кусочки кода длч меня сложно. Ни разу не программист.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Вот как считает формула что я вам дал.