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
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
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
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).
http://www.st.com/web/en/resource/technical/document/datasheet/DM00116291.pdf
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
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