15.01.2018

Měření teploty Arduinem a termistorem

Cíl

Potřeboval jsem měřit teploty líhně včelích matek v časových intervalech a pozorovat, jaký vliv má teplota na vývoj včelí matky.

Úvod

Použil jsem Arduino (konkrétně variantu Mini Pro), které má v sobě zabudovaný ADC převodník na analogových pinech. Použití Arduina je oproti např. Raspberry Pi výhodné, protože má v sobě ADC převodník napětí na digitální hodnotu v rozsahu 0 - 1023. Potom postačuje mít obyčejný levný termistor. Jedinou nevýhodou je potom nutnost přepočítat odpor termistoru na °C.

Příprava

Součástky
R1 - Termistor NTC NTC 640-5K - koupeno v gme.cz
R2 - 5K

Vstupní hodnoty

  • R2 = 5000Ω
  • T0 = 25°C
  • R0 = 5000Ω
  • β = 3977 - parametr Beta zjištěn z datasheetu
  • DIGITAL_MAX_VOLTAGE = 1023 - maximální hodnota 10bit ADC převodníku

Výstupní

  • R1 = ?
  • T1 = ?

Realizace

Zapojení

Jedná se o dělič napětí, kde termistor je označen jako R1 a pevný rezistor je R2.
Zapojení

Výpočet

Co je trochu složitejší je výpočet výsledné teploty, protože odpor termistoru se nemění na základě teploty lineárně. Výpočet má 2 části: výpočet odporu R1 z digitální hodnoty 0 - 1023 a na jeho základě výpočet teploty.

Výpočet odporu

float computeR1ResistanceInSerieToR2(float r1DigitalValue, float r2) {
    return r2 * ((float) DIGITAL_MAX_VOLTAGE / r1DigitalValue) - r2;
}

Výpočet teploty

Je možno použít vzorec Steinhart - Hart, který je uveden i ve Wikipedii.
Steinhart
Pokud máte termistor s kvalitní dokumentací jako já, tak můžete tento vzorec zkusit použít protože charakteristiky termistoru a, b, c jsou zde uvedeny.

Já mám ale NTC termistor, takže můžu použít zjednodušený vzorec Steinhart - Hart u kterého je nutné znát jen β (zde velkým beta písmenem Β)
Steinhart
Rozdíl výsledku oproti složitější variantě je naprosto zanedbatelný, takže nakonec jsem použil zjednodušenou variantu vzorce.

float calculateCelsiusBySimplifiedSteinhart(float t0Celsius, float r0Nominal, float bCoefficient,
                                            float r2, float r1DigitalValue) {
    float r1 = computeR1ResistanceInSerieToR2(r1DigitalValue, r2);
    float t0Kelvins = t0Celsius + CELSIUS_TO_KELVINS;
    float reversTKelvins = (1.0f / t0Kelvins) + (1.0f / bCoefficient) 
                            * (float) log(r1 / r0Nominal);
    float tKelvins = 1.0f / reversTKelvins;
    float tCelsius = tKelvins - CELSIUS_TO_KELVINS;
    return tCelsius;
}

kde CELSIUS_TO_KELVINS = 273.15 a bCoefficient je β

Závěr

Kombinace Arduino - termistor mi připadá jako jednoduchý a přímočarý způsob měření. Navíc, moduly jako je DHT 22 jsou poměrně velké a nevhodné pro měření teploty vzduchu uvnitř malé krabičky, nebo teploty samotné krabičky. Takže jiná varianta než s termistorem nepřipadá v úvahu.

Výpočet teploty není složitý. Je ale nutno znát parametry termistoru. Pokud máte v šuplíku termistor, jehož název a tím pádem ani parametry neznáte, tak ten je nepoužitelný, ledaže byste si chtěli udělat laboratorní cvičení jako zde a naměřit všechny možné teploty.

Se znalostí β se dá použít zjednodušená Steinhart - Hartova formule a výslednou teplotu pak máme bez většího úsilí. Dal bych si jen pozor na přesnost rezistoru R2, pokud chcete měřit teplotu s přesností na desetiny.