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.