Термистор показывает температуру "Наоборот" (показания уменьшаются при нагреве)

Newby
Offline
Зарегистрирован: 22.03.2014

Добрый день!

Такая проблема - подключаю терморезистор на 100К Ом по схеме делителя, с постоянным резистором на 93К ОМ.

Скетч нашел в сети - примеров много везде принцип один и тот же, получаем сопротивление и переводим его в температуру по формуле Стейнхарта-харта.

Вот простейший найденный скетч который должен выводить сопротивление термистора для дальнейшего вычисления температуры:

// значение 'другого' резистора
#define SERIESRESISTOR 93000
// к какому пину подключается термистор
#define THERMISTORPIN A0
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
float reading;
reading = analogRead(THERMISTORPIN);
Serial.print("Analog reading ");
Serial.println(reading);
// преобразуем полученные значения в сопротивление
reading = (1023 / reading) - 1;
reading = SERIESRESISTOR / reading;
Serial.print("Thermistor resistance ");
Serial.println(reading);
delay(1000);
}

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

Причем термистор точно NTC : при замере сопротивления мультиметром оно падает при нагреве! 

Пробовал подключать датчик не к +5, а к земле, и соотвтественно конец другого плеча (постоянного резистора) - к +5v   - не помогло, выдает чушь.

Проблема очевидно в програмной части, но что-то не пойму где именно..

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Newby пишет:
Проблема очевидно в програмной части, но что-то не пойму где именно..
Я бы даже сказал , что в математике у человека который составлял программу. Видно Вы забыли или прогуляли это.

https://ru.wikipedia.org/wiki/%D0%A3%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD...

nik182
Offline
Зарегистрирован: 04.05.2015

А слабо самому формулу пересчёта вывести? Может тогда в 15 строке будет другое действие?

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

Поменяйте местами термистор и резистор, а потом отпишитесь что получится

Newby
Offline
Зарегистрирован: 22.03.2014

qwone, 

Не совсем понял ссылку, т.к. в скетче нет преобразования сопротивления в температуру - ошибка в самом измерении сопротивления.

Baks

Благодарю! Так заработало с этим скетчем - считает в правильную сторону.

nik182

Спасибо, да действительно, поменял на умножение и заработало. 

Если оставить искодный вариант скетча и поменять местами резисторы, то при мааксимальной температуре, когда на входе будет 1023 - будет происходить деление на ноль, а если поставить умножение - то значение будет обнуляться... видимо нужно будет дописать защиту от этого.
 
Дальше уже дело калибровки, главное что считает в правильную сторону)
svm
Offline
Зарегистрирован: 06.11.2016

http://arduino-diy.com/arduino-thermistor   и теория и пример скетча. У меня на 3D принтере и стол и хотэнд на основе этого работают.

Newby
Offline
Зарегистрирован: 22.03.2014

svm

По этой статье и делал) скетч тот же самый.  

svm
Offline
Зарегистрирован: 06.11.2016

Дальше по тексту статьи есть скетч, который выдает температуру в градусах цельсия. Сравнивал с термопарой, разница показаний от 20 до 250 градусов 1-2 градуса

Newby
Offline
Зарегистрирован: 22.03.2014

попытался откалибровать этот датчик по формуле апроксимации полученной из экселя по 3м точкам (знаю что мало) -

формула получилась такая: y=6E+07х^-1,975

попытался вставить это в код вот в таком виде:

termistor1=pow(termres,1.975);
   termistor1=1/termistor1; 
   Serial.println(termistor1);
   termistor1=6*pow(10,7*termres);
   Serial.print("Termistor temp ");
    Serial.print(termistor1);
    Serial.println(" *C");

termres - это сопротивление резистора, полученное ранее (тип flоat)

termistor1 имеет тип double.

конечный вывод показывает "inf *С"...

думаю проблема в том, что после деления единицы на сопротивление в степени 1,975 (для получения отрицательной степени) - в сериал выдается 0.0 - почему так? нехватает разрядности чтобы вычислить? как быть тогда?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

формула получилась такая: y=6E+07^-1,975

это не формула, это константа. 

Newby
Offline
Зарегистрирован: 22.03.2014

да, пропустил х в уравнении. поправил.

svm
Offline
Зарегистрирован: 06.11.2016



t_sr = 1023 / t_sr - 1;            // конвертируем значение в сопротивление
t_sr = 9820 / t_sr;                // 9820 -реальное значение резистора делителя
t_extr = t_sr / 100000;            // (R/Ro)
t_extr = log(t_extr);              // ln(R/Ro)
t_extr /= 3950;                    // 1/B * ln(R/Ro)
t_extr += 1.0 / 298.15;            // + (1/To)//(25 + 273.15)
t_extr = 1.0 / t_extr;             // инвертируем
t_extr -= 273.15;                  // конвертируем в градусы по Цельсию

if (t_extr < Ust_extr) digitalWrite(2, LOW);//63+187=250
else digitalWrite(2,HIGH );

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

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

Newby
Offline
Зарегистрирован: 22.03.2014

Это расчет по формуле стенхарта-харта, только переменные не такие как в моем примере... 

Вчера тоже вернулся к рассчету по формуле, но использовал не номинальные значения резисторов и В-констранту, а подогнал их под показания датчика ds18b20 (скрутил их изолентой вместе). В итоге в программе учитываются следующие вводные:

Номинал термистора 105 000 Ом (Ro)

Номинальная температура 23С (То)

Резистор-делитель 103000 Ом

В-коэффициент 4020

С этими параметрами, а также с учетом выборки из 50 значений - удалось достичь расхождения с ds18b20 не более 0,3 С - что очень охороший результат для меня. 

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

Хочу подключить 2 Термистора (одинаковых) - подскажите можно ли сделать это через 1 резистор (паралельно подключить, только к разным пинам) или нужно отдельный, на каждый?

svm
Offline
Зарегистрирован: 06.11.2016

Однозначно два резистора. Попробуйте нарисовать схему подключения для Вашего варианта. Если получится - смело патентуйте.