Bogusław Kempny

Pomiar temperatury, DS18B20

×
Autor adres English
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 RFID Grafolog RCP Shutdown Temperatura ....











Kosztowało mnie to maleństwo mniej niż 8 złotych:

Czujnik temperatury DS18B20 z interfejsem 1-wire.

Żeby nie było wątpliwości, to ten "koralik z trzema drucikami" po prawej stronie 🙂 .

Wystarczy podłączyć zasilanie i już można mierzyć temperaturę.

Zakres pomiaru od -55 do 125°C, dokładność ± 0,5°C w zakresie -10 do 85°C.

Jak widzimy, czujnik ten ma trzy wyprowadzenia, masę, zasilanie (3 - 5,5V) i sygnał magistrali 1-Wire.
Z zasilania możemy zrezygnować, czujnik ten potrafi czerpać potrzebną mu energię z linii danych, jednak z pewnymi ograniczeniami, powiemy jeszcze o tym później.

Działania magistrali 1-wire nie będę tu szczegółowo omawiał, akurat na ten temat w internecie jest wiele rzeczowych informacji, powiem tylko o kilku podstawowych rzeczach.

No to koniec zanudzania, podłączamy.

(Numeracja GPIO według BCM)

Uprzedzając, nie wystarczy skorzystanie w wewnętrznych rezystorów pullup pinów GPIO, mają rezystancję 40 kΩ, za dużo dla magistrali 1-wire. Jeśli bardzo nam przeszkadza ten dodatkowy rezystor, możemy skorzystać z GPIO2 lub GPIO3. Przeznaczone są do komunikacji I2C, mają wbudowane rezystory pullup 1,8kΩ. Oczywiście wtedy i2C nie będziemy mogli używać. Wprawdzie nie testowałem tego, ale powinno działać.

Teraz uruchamiamy w Raspberry 1-wire. Standardowo ta magistrala nie jest aktywna, wiec albo włączamy ją korzystając z komendy raspi-config, albo w pliku /boot/config.txt dodajemy linię:

dtoverlay=w1-gpio
Spowoduje to uruchomienie kontrolera 1-wire na standardowym pinie, GPIO4.
jeśli z jakiegoś powodu chcemy użyć innego pinu, możemy go zdefiniować, wpisując na przykład dla GPIO17:
dtoverlay=w1-gpio,gpiopin=17
Niestety konieczne bedzie przeładowanie systemu, ale na pocieszenie, to już wszystko, co musieliśmy zrobić, żeby mierzyć temperaturę.

Po restarcie systemu powinniśmy mieć załadowane moduły magistrali 1-wire:

root@minircp:~# lsmod |grep w1
w1_therm               28672  0
w1_gpio                16384  0
wire                   36864  2 w1_gpio,w1_therm
W /sys/bus/w1 pojawią się urządzenia:
root@minircp:~# ls /sys/bus/w1/devices/
28-23b10b000900  w1_bus_master1
w1_bus_master1 to nasz kontroler magistrali 1-wire, 28-23b10b000900 to nasz czujnik temperatury.

Oczywiście urządzeń odpowiadających urządzeniom magistrali 1-wire pojawi się więcej jeśli je podepniemy, kontroler będzie je odróżniał od siebie na podstawie ich unikatowego 64-bitowego numeru.

Ale jak tę temperaturę odczytać? Jakiś przykładowy program by się przydał, jakaś biblioteka...

No, tym razem jest to prostsze. Wystarczy odczytać zawartość /sys/bus/w1/devices/28-23b10b000900/temperature :

root@minircp:~# cat /sys/bus/w1/devices/28-23b10b000900/temperature 
25000
root@minircp:~# 
25000 to właśnie zmierzona przez czujnik temperatura, w °C, przemnożona przez 1000, czyli w naszym przypadku 25.00°C.

Odczytać ją możemy w prosty sposób korzystając z dowolnego języka, a potem zrobić to, do czego ten pomiar był nam potrzebny.

Wyświetlić, włączyć wentylator, wyłączyć grzejnik, wysłać SMS o przegrzaniu serwerowni, zapisać w bazie danych dobowych temperatur na Kilimandżaro...