pátek 19. února 2016

Vlhkoměr ST HTS221

Nejprve si zavedeme potřebné moduly (1-wire je pro porovnání teploty).

insmod w1-gpio-custom bus0=0,14,0

insmod i2c-gpio-custom bus0=0,16,17

Dále vyhledáme dostupné senzory na I2C sběrnici, HTS221 má adresu 0x5f. Následuje vyčtení registru WHO_I_AM a konfigurace senzoru (přechod ze sleep režimu a zapnutí periodického vzorkování, případně změna vzorků pro výpočet jedné hodnoty).

root@AR150:~# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- 5d -- 5f
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- --
70: -- -- -- -- -- -- -- --

root@AR150:~# i2cget -y 0 0x5f 0x0f
0xbc
root@AR150:~# i2cget -y 0 0x5f 0x10
0x3f
root@AR150:~# i2cget -y 0 0x5f 0x28
0x7d
root@AR150:~# i2cget -y 0 0x5f 0x29
0xf4
root@AR150:~# i2cget -y 0 0x5f 0x2a
0xed
root@AR150:~# i2cget -y 0 0x5f 0x2b
0x00
root@AR150:~i2cset -y 0 0 0x5f 0x21 0x00 # disable heater
root@AR150:~# i2cget -y 0 0x5f 0x20 # Read Control Register 1
0x00
root@AR150:~# i2cget -y 0 0x5f 0x20
0x00
root@AR150:~# i2cset -y 0 0x5f 0x10 0x81 # use 2 smaple for Temperature and 4 sample for Humidity
root@AR150:~# #i2cset -y 0 0x5f 0x10 0x20 # use 32 smaples for Temperature and 4 sample for Humidity
root@AR150:~# #i2cset -y 0 0x5f 0x10 0x38 # use 256 smaples for Temperature and 4 sample for Humidity
root@AR150:~# i2cset -y 0 0x5f 0x20 0x81 # start 1 Hz measuring
root@AR150:~# #i2cset -y 0 0x5f 0x20 0x81 # start one conversion

Nebo si můžeme pomocí root@AR150:~# i2cdump -y 0 0x5f vyčíst kompletní obsah paměti čidla včetně kalibrace. 


0
1
2
3
4
5
6
7
8
9
a
b
c
d
e
f
0123456789abcdef
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
bc
...............?
10:
3f
00
97
32
98
be
de
a1
9e
b2
fb
00
08
00
80
82
?.?2???????.?.??
20:
81
00
00
00
00
00
00
03
c7
f6
12
01
dd
f7
0a
01
?......?????????
30:
40
90
a1
0d
00
c4
03
00
f6
02
29
d5
ff
ff
ed
02
@???.??.??)?..??
40:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
50:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
60:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
70:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
80:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
bc
...............?
90:
3f
00
97
32
98
be
de
a1
9e
b2
fb
00
08
00
80
82
?.?2???????.?.??
a0:
81
00
00
00
00
00
00
00
c7
f6
12
01
dd
f7
0a
01
?.......????????
b0:
40
90
a1
0d
00
c4
03
00
f6
02
29
d5
ff
ff
ed
02
@???.??.??)?..??
c0:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
d0:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
e0:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
f0:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................

Kalibrace:
40
90
a1
0d
00
c4
03
00
f6
02
29
d5
ff
ff
ed
02

WHO_I_AM         0xbc
bc

HUMIDITY          0xF6C7
c7
f6

TEMP                    0x0112
12
01

Nejprve je třeba udělat výpočet kalibrační křivky, dle hodnot z registrů kalibrace.
Pro teplotu je třeba vzít desetibitové číslo z adresy 0x32 (představuje dolních 8 bitů) a ještě přidat dva bity z adresy 0x35 a vydělíme osmi. V našem případě získáme čísla T0 = 0010100001b => 161/8 = 20,125 °C a T1 = 0100001101b => 269/8 = 33,625 °C. Těmto dvěma bodům odpovídají T0_OUT a T1_OUT, což jsou dvoubajtové znaménkové hodnoty z adres 0x3C, 0x3D (-1) a 0x3E, 0x3F (749). Znaménko v čísle představuje nejvyšší bit (MSB), pokud není nastaven je číslo kladné a stačí vzít zbytek bytů. V opačném případě je číslo záporné a je třeba od maximálního rozsahu čísla (32768) odečíst zbytek bitů a přičíst jedničku a následně celé číslo vynásobit mínus jednou. Rozsah čísla je tedy -32768 až 32767.

Když máme vyčteny souřadnice dvou kalibračních bodů (-1 - 20,125 a 749 - 33,625), tak si můžeme sestrojit kalibrační přímku. Koeficienty rovnice přímky určíte dosazením do dvou rovnic o dvou neznámých (potřebujeme získat neznámé k a q).

f(x) = k*x + q

20,125 = -k + q /*(-1)
33,625 = 749k + q

-20,125 = k - q
33,625 = 749k + q

13,5 = 750k => k = 13,5/750 = 0,018
20,125 = -0,018 + q => q = 20,125 + 0,018 = 20,143



Výpočet teploty z hodnoty provedeme takto:

T = k * x + q = 0,018 * (0x0112) / 8 + 20,143 = 20,7595 °C.

A porovnání s DS1820?


Stejný výpočet provedeme i pro získání vlhkosti:

H0_rH_x2 = 0x40 / 2 = 32 %, H0_T0_OUT = 0x0003 => 3
H1_rH_x2 = 0x90 / 2 = 72 %, H1_T0_OUT = 0xD529 => 54 569

f(x) = k * x + q

32 = k * 3 + q
72 = k * 54 569 + q /*(-1)

32 = 3 * k + q
-72 = -54 569 * k - q

-40 = - 54 566 k

k = 40/54566 = 7,33 * 10-4
q = 31,9978

H = k * x + q = 7,33E-4 * (0xF6C7) / 2 + 31,9978 = 55.15%.

Vlhkoměr má také zabudované vyhřívání pro odstranění kondenzované vlhkosti, stačí ho zapnou a z grafu je patrné, že vlastní substrát čidla se ohrál na téměř 70 °C. Vyzařované teplo dokonce dokázalo ohřát pět milimetrů vzdálený DS1820, viz následující grafy (teplota čidel a vývoj vlhkosti).



#!/bin/sh

i2cset -y 0 0x5f 0x21 0x00 # disable heater
i2cset -y 0 0x5f 0x20 0x81 # start one conversion

Time=`date +"%m.%d.%Y %T"`

T_l=`i2cget -y 0 0x5f 0x2a` # read T_l
T_h=`i2cget -y 0 0x5f 0x2b` # read T_h


H_l=`i2cget -y 0 0x5f 0x28` # read H_l
H_h=`i2cget -y 0 0x5f 0x29` # read H_h

DS18B20=`cat /sys/devices/w1_bus_master1/28-000001f3830f/w1_slave | tail -1`  # read temperature from DS1820

echo -e "$Time\t$T_l\t$T_h\t$H_l\t$H_h\t$DS18B20" # echo to colsole
echo -e "$Time\t$T_l\t$T_h\t$H_l\t$H_h\t$DS18B20" >> /tmp/data.txt # write to file

chmod +x /usr/bin/measure.sh

*/5 * * * * /usr/bin/measure.sh



http://www.st.com/web/en/resource/technical/document/datasheet/DM00116291.pdf

1 komentář:

  1. https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.st.com/resource/en/technical_note/tn1218-interpreting-humidity-and-temperature-readings-in-the-hts221-digital-humidity-sensor-stmicroelectronics.pdf&ved=2ahUKEwjvt8OTu7r1AhWK6aQKHUQaAWAQFnoECAYQAQ&usg=AOvVaw3-GQ3f5VgUqCNgwe8kxs87

    OdpovědětVymazat