LINUX.ORG.RU

Определение температуры в бане

 , ,


0

2

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

Сейчас хочу просто получить температуру воздуха, с помощью термистора (NTC MF52 10K). Подключаю в аналоговый порт arduino (verba), делаю как написано тут. Подключаю по схеме делителя напряжения

Фото схема (желтый +5, корич. - GRN, зеленый - анал. вход)
https://ibb.co/1ZCS6kK

// к какому аналоговому пину мы подключены
#define THERMISTORPIN A0
// сопротивление при 25 градусах по Цельсию
#define THERMISTORNOMINAL 10000
// temp. для номинального сопротивления (практически всегда равна 25 C)
#define TEMPERATURENOMINAL 25
// сколько показаний используем для определения среднего значения
#define NUMSAMPLES 5
// бета коэффициент термистора (обычно 3000-4000)
#define BCOEFFICIENT 3950
// сопротивление второго резистора
#define SERIESRESISTOR 10000
int samples[NUMSAMPLES];

void setup(void) {

  Serial.begin(9600);
  analogReference(EXTERNAL);

}

void loop(void) {

uint8_t i;
float average;

// сводим показания в вектор с небольшой задержкой между снятием показаний

for (i=0; i< NUMSAMPLES; i++) {

  samples[i] = analogRead(THERMISTORPIN);
  delay(10);

}

// рассчитываем среднее значение

average = 0;

for (i=0; i< NUMSAMPLES; i++) {
  average += samples[i];

}

average /= NUMSAMPLES;
Serial.print("Average analog reading ");
Serial.println(average);
// конвертируем значение в сопротивление
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
Serial.print("Thermistor resistance ");
Serial.println(average);
float steinhart;

steinhart = average / THERMISTORNOMINAL; // (R/Ro)

steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // инвертируем
steinhart -= 273.15; // конвертируем в градусы по Цельсию
Serial.print("Temperature ");
Serial.print(steinhart);
Serial.println(" *C");
delay(1000);

}


Первый баг - температура определялась минусовая, то есть -27..-23 и при нагревании росла к 0, о есть -20..-10. Исправил я это скобочками

вместо
average = 1023 / average - 1;

написал
average = 1023.0f / (average -  1.0);


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

Большая погрешность в температуре, больше на 4 градуса, чем показания спиртового термометра и термопары (почти совпадают). Резистор выпаял со схемы старой, замерял прибор показывает 9.7K, ну номинал 10K. С теристором тоже вроде все ясно 10K. До платы тянется провод метровый, но он не должен влиять на рассчеты вроде как, сопротивления килоомные а провод по замерам 0.5 ома. Подлючал и через 3 вольта AREF(типа убрать шумы от USB питания) и через 5 на результат никак не влияет.

Можно конечно тупо сгладить, вычитанием из результата - 4 градусов, но возможно это не линейно все и вообще...хз

Такими делами впервые занимаюсь, даже не знаю куда копать. Может сам теристор плохого качества, может резистор не тот, провода, сам АЦП, либо в рассчетах ошибка. Вообще может погрешность в 4 гр. это норма? Помогите понять

★★★★

Последнее исправление: gobot (всего исправлений: 1)

Ответ на: комментарий от vasilisk_lo

Спасибо за поддержку!

gobot ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.