Měření teploty patří mezi jednodušší příklady, protože přesný teploměr se dá sehnat poměrně snadno. Složitější kalibrace je například u atmosférického tlaku, ale zde se dá využít pravidelných hlášení zpráv o počasí. Mezi složité kalibrace potom patří například kalibrace vlhkostního čidla, kdy je poměrně těžké sehnat přesný vlhkoměr pro porovnání či vyrobit prostředí s definovanou vlhkostí.
Popsaný přístroj umožňuje měření teploty a vlhkosti bez nutnosti kalibrace. Základem je inteligentní čidlo firmy Sensirion SHT11. Jeho blokové schéma je na obr.1. Na jednom čipu jsou umístěny jak vlastní senzory (relativní vlhkost a teplota) tak i digitální část. Její součástí je 14bitový analogově digitální převodník, kalibrační paměť a dvoudrátový interface.
Obr.1. Blokové schéma čidla SHT11.
Základní výhody čidla jsou:
- měří relativní vlhkost a teplotu
- možnost výpočtu rosného bodu
- plně kalibrováno, sériový výstup
- nevyžaduje další externí součástky
- velmi nízká spotřeba
- pouzdro pro povrchovou montáž
- výborná dlouhodobá stabilita
- malé rozměry
- automatický režim snížené spotřeby
Každý senzor je kalibrován v precizní vlhkostní komoře a kalibrační koeficienty jsou uloženy v OTP paměti. Tyto koeficienty jsou použity interně během měření pro přepočítání údajů ze senzorů. Malé rozměry a jednoduchá komunikace přes 2 vodičovou sběrnici pak umožnují jednoduchou aplikaci senzoru v automobilovém průmyslu, průmyslovém měření, lékařských přístrojích, vytápění, klimatizaci apod.
Základní technické údaje čidla
Měření vlhkosti:
Rozlišení: typ. 0.03%RH
Opakovatelnost: +-0.1%RH
Rozsah měření: 0 – 100% RH
Měření teploty:
Rozlišení: 0.01°C
Opakovatelnost: +0.1°C
Rozsah měření: -40 – 123.8°C
Napájecí napětí: 2.4 – 5.5V
Odběr proudu: 550µA (měření) , 28µA (průměrování) , 0.3µA (sleep)
Převod digitálních hodnot na fyzikální hodnoty
Pro kompenzaci nelinearit senzoru výrobce doporučuje použít tento vztah pro výpočet relativní vlhkosti:
RHlineární = c1 + c2*SORH + c3*SORH2
Kde SORH je hodnota RH přečtená z čidla a konstanty se určují z této tabulky:
c1 | c2 | c3 | |
12 bit SORH | -4 | 0.0405 | -2.8E-6 |
14 bit SORH | -4 | 0.648 | -7.2E-4 |
Pro teploty odlišné od 25°C je vhodné relativní vlhkost dále kompenzovat podle vztahu:
Rhsprávný = (TC – 25)*(t1 + t2*SORH) + RHlineární
Kde t1 = 0.01, t2 = 0.00008 (t2 = 0.00128 pro 8bitový SORH)
Teplotní senzor je více lineární, takže i výpočet je jednodušší :
Teplota = d1 + d2 * SOT
Kde koeficienty d1 a d2 :
SOT | d1 | d2 |
14 bit 5V | -40 | 0.01 |
12 bit 5V | -40 | 0.04 |
14 bit 3V | -38.4 | 0.0098 |
12bit 3V | -38.4 | 0.0392 |
Se znalostí teploty a relativní vlhkosti se dá snadno i vypočítat i rosný bod (DP). Zjednodušený vzorec je:
LogEW = 0.66077 + 7.5*T/(237.3+T) + (log10(RH)-2)
DP = ((0.66077 – log EW)*237.3) / (logEW – 8.16077)
Příklad:
RH = 10%, T=25°C … EW = 23.7465, DP = -8.69°C
Vlastní zapojení senzoru v aplikaci je velmi jednoduché, viz obr.2. Mezi piny 1 a 4 se zapojí napájecí napětí 2.4V – 5.5V s blokovacím kapacitorem 100nF. Poté senzor potřebuje 11ms pro „probuzení“ z režimu sleep. Použité pouzdro je poměrně specifické, což odpovídá charakteru součástky. Jeho výkres je na obr.4.
Obr.4. Výkres pouzdra.
Komunikace se senzorem probíhá po 2 vodičové sběrnici, viz obr.3. a je podobná komunikaci po sběrnici I2C. Po startovací podmínce následuje příkaz dle tabulky:
Příkaz | Kód | Popis |
Rezervováno | 0000x | |
Měření teploty | 00011 | Měří teplotu |
Měření vlhkosti | 00101 | Měří vlhkost |
Čtení status registru | 00111 | Přístup do status registru |
Zápis do status registru | 00110 | Přístup do status registru |
Rezervováno | 0101x – 1110x | |
Soft reset | 11110 | Resetuje čip, nastaví registry na základní hodnoty, nutno počkat 11ms s dalším příkazem |
Status registr umožnuje využít několika dalších funkcí integrovaných do čidla.
Bit | Typ | Popis | Výchozí hodnota |
7 | rezervován | 0 | |
6 | R | End of Life | X |
5 | rezervován | 0 | |
4 | rezervován | 0 | |
3 | nepoužívat | 0 | |
2 | R/W | vyhřívání | 0 |
1 | R/W | kalibrace poed měřením | 0 |
0 | R/W | rozlišení měření | 0 |
- vyhřívání – tato funkce zvýší teplotu čipu o 5C při růstu spotřeby o 8mA@5V a může být například využita pro kontrolu správné funkce teplotního senzoru, případně může zabránit kondenzaci vlhkosti v prostředí s vysokou vzdušnou vlhkostí.
- End Of Life – tento bit status registru detektuje pokles napájecího napětí pod 2.45V s přesností +-0.05V
- Kalibrace před měřením – pro zrychlení měření je možné vypnout přehrání kalibračních dat z paměti OTP do pracovní paměti. Měření tak trvá o 8ms méně. Kalibrační data jsou do pracovní paměti přehrána před každým měřením z důvodu jejich možného poškození přepětím či ESD.
- Rozlišení měření – základní rozlišení měření 14bitů (teplota) a 12bitů (vlhkost) může být redukováno na 12 a 8 bitů. Toho se dá využít při potřebě extrémně rychlého měření či nárokům na nízkou spotřebu.
Výpočet kontrolního součtu CRC-8
Pro kontrolu správnosti načtených dat je využíván polynomiální CRC (Cyclic Redundancy Check): x8 + x5 + x4. Metod výpočtu je několik. Aplikační zpráva výrobce zmiňuje metody 2, bitovou a bajtovou. Bitová spočívá v online výpočtu pomocí bitových operací (vhodné pro assembler). Bajtová využívá 256 bajtů dlouhé vyhledávací tabulky (look-up table).
Tolik citace datasheetu výrobce.
Zapojení
Vlastní zapojení přístroje je na obr. 5. Čidlo je připojeno na jeden z portů mikroprocesoru IC1 AT89C52, který zajišťuje načítání dat i další potřebné výpočty. Data jsou zobrazována na displeji IC2 2x16 znaků. Přístroj je koncipován jako ruční, kdy se předpokládá napájení z baterií. V takovýchto případech stačí mít údaj na displeji pár vteřin, než jej stihneme přečíst. Proto jsem zvolil jednoduchou metodu ovládání, kdy tlačítko připojuje napájení celému zařízení. Během této doby se provádí měření a vypočítané údaje jsou zobrazeny na displeji. Samozřejmě při rozpojeném tlačítku má zařízení nulový odběr.
Mikroprocesor je zapojen dle doporučení výrobce a je časován krystalem 11.0592MHz. Tato hodnota je optimální pro generování standardních rychlostí pro přenos na RS232. T1 je jednoduchý převodník TTL > RS232, který se osvědčil už u mého výškoměru.
S displejem procesor komunikuje po 4 vodičové sběrnici. Samozřejmě se dá využít všech pinů procesoru a použít 8mi bitů pro komunikaci, ale snažil jsem se použít již hotové a odzkoušené ovládací rutiny. P1 nastavuje jas displeje. Můžete použít libovolný typ displeje se standardním řadičem. Já jsem osadil kus, který jsem koupil na www.hw.cz za 150Kč. Byl sice použitý, ale je to průmyslový typ s výborným pozorovacím úhlem.
Již vlastní čidlo ve mne vzbuzovalo myšlenku postavit kompletní meteostanici. Na to bohužel nemám čas, ale přístroj jsem rozšířil alespoň o měření tlaku. Použil jsem 12bitový převodník od Texas Instruments ADS7822, protože jsem měl pár vzorků doma. Tento převodník komunikuje s mikroprocesorem po 3 vodičové sběrnici. Tlakové čidlo IC7 je typu MPX4115A. R4 a C6 tvoří dolní propust pro filtraci šumu. Ta je velmi důležitá, viz aplikační zpráva výrobce. Další digitální filtrace probíhá v mikroprocesoru. Stejná metoda měření tlaku je použita i v publikovaném výškoměru k měření výšky a vhodnou kombinací obou metod se dá dosáhnout rozlišení lepší než 1m, viz [5].
Měření tlaku sebou přináší mírnou komplikaci nutné kalibrace offsetu čidla. Z tohoto důvodu jsem rozšířil zapojení o paměť EEPROM IC4, kde jsou kalibrační data uložena. Jumpery JP2 až JP4 slouží k volbě kalibračního módu a k nastavení správného tlaku.
Pro ty, kteří nechtějí investovat do tlakového čidla a převodníku stačí propojit pin 25 procesoru na zem a přístroj přeskočí měření tlaku. Pak není nutné osazovat ani IC4.
Napájení přístroje zajišťuje alkalická baterie 6V, jejíž napětí je stabilizováno regulátorem IC3 MC78LC50HT1. To je regulátor s nízkým úbytkem (220mV při proudu 10mA) v pouzdře SOT-89 od firmy ON Semiconductor. Napětí z baterie je na regulátor přivedeno přes tlačítko TL1. Samozřejmostí je možnost použití externího napájení 5V. Kapacita baterie je kolem 100mA, což při odběru zařízení kolem 15mA vystačí na cca 7 hodin nepřetržitého provozu. Při průměrné délce měření 5sec to představuje cca 4800 měření.
Pokud se Vám nepodaří tento regulátor sehnat, dá se nahradit obdobným typem jiného výrobce. V nouzi se dají použít 2 sériově zapojené diody, ale pak je nutné počítat s nepřesnou hodnotou měření tlaku. SHT11 tak citlivé na napájení není.
Pro zvýšení užitné hodnoty přístroje posílá mikroprocesor naměřená data i po sériové lince. Formát dat je 9600Bd 8N1. K propojení s počítačem stačí jednoduchý kabel dle obr. 6. Data jsou oddělena středníkem a jsou kopií displeje, tzn. včetně mezer.
Obr.6. Propojení s PC.
Jak je u podobných zařízení zvykem, hardware je poměrně jednoduché a „know-how“ se skrývá v software mikroporcesoru. Vzhledem k výpočtům ve formátu s plovoucí desetinnou čárkou (float) jsem se opět rozhodl pro programování v jazyce C. Navíc výrobce čidla [2] publikoval kompletní rutiny pro komunikaci, které jsem modifikoval k obrazu svému.
První příkladem může být startovací podmínka. Ta je jednoduchá a stejně snadno by se realizovala v assembleru.
//----------- void s_transstart(void) //--------------// generuje startovaci podminku // _____ ________ // DDATA: |_______| // ___ ___ // SCK : ___| |___| |______ { DDATA=1; SCK=0; // vychozi podminka _nop_(); // kratke zpozdeni SCK=1; _nop_(); DDATA=0; _nop_(); SCK=0; _nop_();_nop_();_nop_(); SCK=1; _nop_(); DDATA=1; _nop_(); SCK=0; }
Dalším příkladem je rutina pro přečtení jednoho bajtu ze sběrnice:
//--------------------char s_read_byte(unsigned char ack) //--------------------/ cte bajt ze sbernice a dava ACK signal { unsigned char i,val=0; DDATA=1; // uvolni datovy pin for (i=0x80;i>0;i/=2) // rotujici maskovaci bit { SCK=1; //clk for bus if (DDATA) val=(val | i); // nacti bit SCK=0; } DDATA=!ack; // pokud je ACK = 1,
//dej DDATA pin do nuly = potvrzeni ACK SCK=1; // 9. hodinovy impuls pro aktivaci signalu ACK _nop_();_nop_();_nop_(); //puls cca 5 us SCK=0; DDATA=1; // uvolni datovy pin return val; }
Obdobně je zapsána i rutina pro zápis bajtu na sběrnici:
//-------------char s_write_byte(unsigned char Xvalue) //--------------// zapise bajt na sbernici a overi ACK { unsigned char i,error=0; for (i=0x80;i>0;i/=2) // rotujici maskovaci bit { if (i & Xvalue) DDATA=1; // zapis 1 na sbernici else DDATA=0; // zapis 0 na sbernici SCK=1; // hodinovy puls _nop_();_nop_();_nop_(); // cca 5 us puls SCK=0; } DDATA=1; // uvolni datovy pin SCK=1; // 9. puls pro ACK error=DDATA; // kontrola ACK (sensor stahne pin do 0 SCK=0; return error; //error=1 pokud neni ACK }
Vlastní změření dat:
//-----------------------------int s_measure(unsigned char mode) //-----------------------------// zmeri
//vlhkost/teplotu a nacte kontrolni soucet { unsigned error=0; unsigned int i; int Vysledek; s_transstart(); // startovaci podminka switch(mode){
// posle prikaz do senzoru case TEMP : error+=s_write_byte(MEASURE_TEMP); break; case HUMI : error+=s_write_byte(MEASURE_HUMI); break; default : break; } for (i=0;i<65535;i++) if(DDATA==0) break;
// ceka, nez senzor dokonci mereni if(DDATA) error+=1; // nebo nevyprsi timeout 9~2 sec.) Vysledek = (s_read_byte(ACK) & 0xFF); // cte prvni byte (MSB) Vysledek = ((Vysledek << 8) + s_read_byte(ACK));
//cte druhy byte (LSB) checksum =s_read_byte(noACK); // precte kontrolni soucet return Vysledek; }
Přepočet hodnot z čidla na reálné veličiny:
//-----------------------------void calc_sth11(void) //-------------// pocita teplotu [C] a vlhkost [%RH] // vstup : rh (12 bit), t (14 bit) // vystup: rh_true [%RH], t_C [C] { float C1 = -4.0; float C2 = 0.0405; float C3 = -0.0000028; float T1 = -0.01; float T2 = 0.00008; float rh_lin; // rh_lin: Humidity linear t_C=t*0.01 - 40; // vypocet teploty rh_lin=C3*rh*rh + C2*rh + C1; // vypocet vlhkosti rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; // korekce na teplotu }
Výpočet rosného bodu:
//-------------------------- float calc_dewpoint(float rh_true,float t) //-------------------------- { float logEx,dew_point; logEx=0.66077+7.5*t/(237.3+t)+(log10(rh_true)-2); dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx); return dew_point; }
Dovedete si představit takový výpočet napsaný v assembleru???
Stavba a oživení
Celý přístroj je realizován na jednostranné desce plošných spojů, obr. 7. Pro mikroprocesor použijeme objímku, osadíme i další součástky. Displej je nutné propojit dutinkovou lištou či kouskem kabelu. Další mechanické detaily závisí na druhu použité krabičky, já opět čerpal z domácích zásob. Zvláštní pozornost je nutné věnovat zapájení čidla. Použití mikropájky a minimálního množství cínu je hlavní zásada úspěchu. Pro jistotu podložíme čidlo kouskem papíru či jiného izolačního materiálu. U tlakového čidla je nutné zkrátit vývody tak, aby se vešlo do krabičky.
Při oživení použijeme externí napájecí zdroj 6V, který připojíme místo baterie. Odběr proudu nesmí přesáhnout 15mA. Pokud je vše v pořádku, do 3 sec se musí na displeji objevit změření hodnoty. Pokud se objeví až po cca 10ti sekundách, je problém s komunikací s čidlem (timeout). Doporučuji zkontrolovat jeho připájení. Pokud problémy přetrvávají, je nutné zkontrolovat napětí na pinech procesoru, kmitočet oscilátoru apod.
Kalibrační tlaku mód se aktivuje zkratováním JP4 pomocí klasické propojky během zapnutí. Ponechte JP4 zkratován! Na displeji se zobrazí nápis „Pressure calibration“ a tlak 1013hPa. Zkratováním spojek JP3 a JP2 nastavíme správný tlak (například 950hPa) a rozpojíme JP4. Mikroprocesor si přepočítá kalibrační konstanty, uloží je do paměti a zobrazí nápis OK! Po vypnutí a zapnutí je přístroj nachystán pro běžné použití. JP1 slouží k překlenutí spínacího tlačítka během oživování a kalibrace.
Velmi důležitým krokem u SHT11, pokud chceme dosáhnout zaručované přesnosti u měření vlhkosti, je čidlo po zapájení umisítit na minimálně 24 hodin do prostoru s vlhkostí 75% a vyšší teplotou. Důvodem je nutnost regenerace polymeru použitého v čidlu. Ten se během pájení vysuší a je nutné jej znovu navlhčit. Já jsem realizoval malý "skleník" z plastové krabičky s vodou, do které jsem umístil vlhkoměr (ať se nenamočí), zakryl víčkem a umístil na horké topení.
Seznam součástek:
C1, 2 33p
C3 100M/6V
C4 4µ7/6V
C5,6 100n
IC1 AT89C52
IC2 displej 2x16 standardní řadič
IC3 MC78LC50HT1 (ON Semiconductor)
IC4 24LC04
IC5 SHT11 (Sensirion)
IC6 ADS7822U (TI)
IC7 MPX4115A (Motorola)
Q1 11.0592MHz
R1, 8k2
R2,3,4 2k2
P1 10k trimr
T1 BC307
TL1 miniaturní tlačítko
Závěr
Popsaný přístroj je velmi jednoduchý a jeho stavbu zvládne i začátečník. Spojuje výhody inteligentního čidla a jednoduchého mikroprocesoru s LCD displejem. Není nutné trápit se mícháním ledu s vodou pro kalibraci teploměru ani vlhkoměru. Samozřejmě se dá dále rozšiřovat a doplnit o různé další funkce jako jsou minima, maxima hodnot apod. To ale nebylo účelem této konstrukce.
I takto má přístroj velmi široké uplatnění. Lze jej použít ke kontrole vlhkosti v počítačové místnosti, kanceláři, skleníku, obytné místnosti, ve skladu, ve sklepě, knihovně apod. Všude tam, kde nadbytek či nedostatek vlhkosti může způsobit problém.
Veškeré podklady k výrobě jsou k dispozici na [1] zdarma pro nekomerční účely včetně výkresů plošného spoje i řidicího programu. Komerční využití je možné pouze se svolením autora.
Čidlo se dá koupit u Farnell (cca 700Kč), doporučuji také navštívit stránky výrobce [2]. Regulátor se dá získat zdarma na [3], převodník stejným způsobem na [6]. LCD displeje se dají velmi levně koupit na [4], ve výprodeji i za 150Kč. Tlakové čidlo a naprogramovaný procesor si můžete objednat u Petra Sysaly. Doporučuji navštívit jeho stránku http://alti.wz.cz/. Cena čidla je 990Kč, procesor je k mání za 150Kč.
Možná někoho zarazí anglické nápisy na krabičce či v programu. Většinu mých konstrukcí publikuji na své webové stránce a vždy dělám i anglickou verzi.
DOWNLOAD & Odkazy
- [1] http://www.qsl.net/ok2xdx
- [2] http://www.sensirion.ch
- [3] http://www.onsemi.com
- [4] http://obchod.HW.cz
- [5] http://alti.wz.cz
- [6] http://www.ti.com
- Domovská stránka autora - http://www.qsl.net/ok2xdx/