LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

Pierwsze kroki z Raspberry Pi: obsługa magistrali 1-Wire

Aplikacja konsolowa realizująca odczyt czujników DS18B20

Finalnym efektem poznawania obsługi magistrali 1-Wire w systemie Linux na przykładzie zestawu Raspberry Pi oraz czujników DS18B20, będzie przygotowanie prostej aplikacji konsolowej realizującej skanowanie i odczyt temperatury z wszystkich dołączonych do systemu czujników. Należy pamiętać, że magistrala 1-Wire nie posiada systemów automatycznej detekcji dołączenia i odłączenia czujników stąd przed każdą próbą odczytu, jednym z zadań aplikacji będzie usunięcie numerów czujników z pliku w1_master_slaves , a następne ponowne, jednokrotne przeskanowanie magistrali (poprzez zapis wartości '1′ do pliku w1_master_search ). Taki tok postępowania pozwala upewnić się, że odczyt temperatury będzie odbywał się ze wszystkich aktualnie podłączonych do systemu czujników.

Kod aplikacji, napisany z wykorzystaniem skryptu powłoki, został przedstawiony na poniższym listingu:

#!/bin/bash
#zmienna liczaca
i=1

#sprawdzenie liczby czujnikow aktualnie zarejestrowanych w systemie
LICZBA_CZUJNIKOW=`cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count`

#wyrejestrowanie wszystkich czujnikow
while [ $i -le $LICZBA_CZUJNIKOW ]
do
	ID_CZUJNIKA=`awk NR==1{print} /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves`
	echo $ID_CZUJNIKA > /sys/bus/w1/devices/w1_bus_master1/w1_master_remove
	i=$(($i+1))
done

#ponownie skanowanie
echo 1 > /sys/bus/w1/devices/w1_bus_master1/w1_master_search

#ponowne sprawdzenie liczby podlaczonych czujnikow
LICZBA_CZUJNIKOW=`cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count`
echo "Czas rozpoczecia pomiaru: " `date +%H:%M`
echo "Liczba wykrytych czujnikow: $LICZBA_CZUJNIKOW"
i=1

#id
while [ $i -le $LICZBA_CZUJNIKOW ]
do
	ID_CZUJNIKA=`awk NR==$i{print} /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves`
	cat /sys/bus/w1/devices/$ID_CZUJNIKA/w1_slave > /tmp/pomiar
	CRC=`cat /tmp/pomiar | grep crc | awk '{ print $12 }'`

	WYNIK=`awk -F= '/t=/ {print $2/1000}' /tmp/pomiar`
	echo "CRC: $CRC Czujnik: $ID_CZUJNIKA - Wartosc temperatury: $WYNIK C"

	i=$(($i+1))
done

Na początku działania skryptu do zmiennej LICZBA_CZUJNIKOW pobieramy za pomocą polecenia cat na pliku w1_master_slave_count liczbę aktualnie zarejestrowanych czujników. Następnie za pomocą pętli do..while z pliku w1_master_slaves odczytujemy numery ID kolejnych zarejestrowanych czujników, które posłużą nam do ich wyrejestrowania za pomocą pliku w1_master_remove . Po zakończeniu działania pętli, jednokrotnie skanujemy magistralę przy wykorzystaniu pliku w1_master_search . Po ponownym odczytaniu liczby aktualnie zarejestrowanych czujników w kolejnej pętli do..while odczytujemy i odpowiednio formatujemy (dzieląc przez 1000) wartość temperatury dla poszczególnych sensorów.

Aby uruchomić powyższy przykład tworzymy nowy plik (np. o nazwie pomiar) , zapisujemy w nim kod przedstawiony na powyższym listingu, a następnie ustawiamy atrybut wykonywania skryptu:

  chmod +x pomiar

Ostatnim etapem jest uruchomienie skryptu (skrypty powłoki nie wymagają procesu kompilacji):

./pomiar

Wynik działania:

Czas rozpoczecia pomiaru:  16:18
Liczba wykrytych czujnikow: 3
CRC: YES Czujnik: 28-000002f218f8 - Wartosc temperatury: 26.625 C
CRC: YES Czujnik: 28-000002f1af7c - Wartosc temperatury: 26.687 C
CRC: YES Czujnik: 28-000002f203e3 - Wartosc temperatury: 26.875 C

Przedstawiony kod może zostać znacznie uproszczony, jednak zamysłem autora jest pełne przedstawienie sposobu konfiguracji magistrali 1-Wire poprzez dostarczone interfejsy jądra systemu Linux.

 

BIBLIOGRAFIA:

[1] „Linux. Podstawy i aplikacje dla systemów embedded” Skalski Ł., Wydawnictwo BTC, Legionowo 2012, ISBN: 978-83-60233-85-6.

[2] „1-Wire® Software Resource Guide Device Description ” Maxim Integrated, 2008.

Łukasz Skalski - absolwent Politechniki Gdańskiej, miłośnik FLOSS, autor książki "Linux. Podstawy i aplikacje dla systemów embedded" oraz szeregu artykułów dotyczących programowania systemów wbudowanych. Zawodowo związany z firmą Samsung. Wszystkie wolne chwile poświęca projektowaniu i programowaniu urządzeń wyposażonych w mikroprocesory 8-/16- i 32-bitowe. Szczególnym zainteresowaniem obejmuje tematykę systemu Linux w aplikacjach na urządzenia embedded.