1-Wire jest sposobem komunikacji pomiędzy elementami elektronicznymi przy wykorzystaniu zaledwie dwóch linii - sygnałowej i masy. Dodatkowo, układy mogą być zasilane przy pomocy tych linii, odpada więc potrzeba zewnętrznego zasilania układów. Długość linii może wynosić do 30m. Każde dołączone urządzenie posiada unikalny 64bitowy kod, możliwe jest więc podpięcie wielu układów równolegle.
Dostępne są moduły USB <> 1-Wire (np MP00202). Taki moduł składa się z dwóch konwerterów: USB-RS232(chip FTDI), oraz RS232-1Wire(DS2480B) Schemat aplikacyjny dostępny jest na stronie Maxim IC; złożony układ jest malutką płytą:
Dostępne jest obecnie wiele chipów obsługujących 1-Wire - od układów pamięci, zegarów czasu rzeczywistego na zaawansowanych miernikach temperatury i wilgotności kończąc. Jednym z popularnych i tanich jest układ pomiaru temperatury DS1820 (DS18S20/DS18B20).
Czujnik wyposażony jest w 3 nóżki - środkowa to dane, dwie skrajne należy podłączyć ze sobą i do masy. Tak przygotowany czujnik należy podłączyć do konwertera. Do odczytu należy użyć modułów dostępnych standardowo w jądrach oraz programu digitemp.
Instalacja niezbędnych pakietów:
opkg update opkg install kmod-usb-serial-ftdi opkg install digitemp
Przy pierwszym uruchomieniu należy wygenerować plik konfiguracyjny poleceniem
digitemp_DS9097U -s /dev/ttyUSB0 -a -i
Wynikiem powinna być informacja, że wykryto interfejs DS2409 na magistrali USB, wyszukano i znaleziono czujniki, oraz oczywiście odczyt temperatury z czujników.
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane GNU Public License v2.0 - http://www.digitemp.com Turning off all DS2409 Couplers .. Searching the 1-Wire LAN 289B2B07010000F2 : DS18B20 Temperature Sensor ROM #0 : 289B2B07010000F2 Wrote .digitemprc Dec 18 15:30:08 Sensor 0 C: 20.19 F: 68.34
Jeżeli nie działa, należy w pierwszej kolejności sprawdzić, czy właściwie został podłączony czujnik pod interfejs.
Odczyt wykonuje się w podobny sposób:
digitemp_DS9097U -a
Żeby zautomatyzować proces należy utworzyć plik /usr/sbin/gettemp.sh o następującej zawartości:
echo `digitemp_DS9097U -a -q -o "%Y-%m-%d %H:%M:%S %.2C"` >> /tmp/temperature.txt
Oraz dodać wywołanie tego skryptu do crona
echo "*/10 * * * * /usr/sbin/gettemp.sh" >> /etc/crontabs/root
Wynikiem działania będzie zbieranie co 10min bieżącej temperatury do pliku /tmp/temperature.txt. Później można z tego zrobić odpowiednie wykresy przy użyciu rrdtools, php lub gnuplot.
We wszystkich urządzeniach oficjalnie wspieranych przez Openwrt, posiadających RS232, istnieje możliwość podłączenia czujnika temperatury opartym na popularnym czujniku Dallas Semiconductors DS18B20. Całość sprowadza się do wykonania, bardzo prostego układu, na podstawie niżej przedstawionego schematu. Koszt budowy zamyka się w okolicy 2-3 zł.
Podzespoły:
R1 - 4,7kOhm (4K7) (słownie: cztery przecinek siedem kiloOhma)
R2 - 4,7kOhm (4K7)
R3 - 47kOhm (47K) (słownie: czterdziesci siedem kiloOhma)
Q1 - BC556B (tranzystor PNP)
+ termometr cyfrowy DS18B20
+ stabilizator =12V na 5V= (100mA)
Jak widać na załączonym schemacie (oba dotyczą tego samego układu) wyprowadzoną mamy linię 1-wire, GND, oraz 3,3V, którą należy pominąć !, ponieważ nie będziemy z niej korzystać. Termometr Cyfrowy DS18B20 będzie więc podłączony tylko do 1-wire i GND oraz do zasilania zewnętrznego. Jest tak dlatego, że termometr nie pracuje na napięciu mniejszym niż 5V (port rs daje tylko 3,3V). Zmuszeni będziemy zatem zastosować zasilanie z wtyczki od zasilacza z PCB routera. Najlepszy pomysł to właśnie zakup stabilizatora, który pozwoli na podłączenie się do lini +12V (czyli defacto do zasilacza) i zamianę napięcia na +5V, bezpiecznego dla naszego czujnika. Jak widać na załączonym obrazku, operacja nie jest skomplikowana. Niebieskie kable przylutowane zostały do PCB routera w miejcu wtyczki od zasilacza.
Zanim przejdziemy do właściwego pomiaru temp. musimy przypisać nowego użytkownika w firmware'rze i nadać mu prawa do korzystania z portu rs. W tym celu należy wyedytować plik /etc/passwd i dopisać wymyślonego przez nas użytkownika. (ja posłużę się nazwą digitemp jako nowego usera z przydzielonymi prawami roota):
1.
echo „digitemp:*:1234:0:nobody:/:/bin/ash” » /etc/passwd
2. Następnie musimy ustawić hasło dla nowo powstałego użytkownika digitemp:
passwd digitemp
3. Aby móc odczytać temp wymagane są prawa roota do portu rs, prawa te są automatycznie kasowane przy każdym reboocie, należy więc utworzyć dwa plik startowe które przypiszą pełne prawa do portu dla użytkownika digitemp:
a) wchodzimy do /etc/rc.d i towrzymy nowy skrypt startowy:
vi S95tts1
Wciskamy na klawiaturze literkę 'a' pozwalającą na edycję zawartości i wklejamy poniższy skrypt:
#!/bin/sh chown digitemp /dev/tts/1
zapisujemy zawartość poprzez wciśnięcie ESC a następnie ':wq' (bez cudzysłowia), skrytp zostanie utworzony.
musimy nadać mu prawa wykonywalności:
chmod +x S95tts1
b) tworzymy i zapisujemy kolejny skrypt startowy w analogiczny sposób opisany powyżej, również z prawami wykonywalności:
vi S97tts2
…z zawartością…
#!/bin/sh chmod 777 /dev/tts/1
4. Ściągamy paczkę digitemp_DS9097:
opkg install ftp://81.168.251.139/Omle/packages/mips/digitemp_3.3.2-2_mipsel.ipk
5. Ustawiamy pełne prawa do uruchamiania programu digitemp_DS909 dla użytkownika digitemp:
chown digitemp /usr/bin/digitemp_DS9097 chmod 777 /usr/bin/digitemp_DS9097
6. Tworzymy folder do którego w przyszłości zapiszemy wszystkie skrypty potrzebne do tworzenia wykresów:
mkdir /temp
7. Ponownie nadajemy prawa dla utworzonego folderu dla użytkownika digitemp:
chown digitemp /temp chmod 777 /temp
Na tym etapie przygotowaliśmy już miejsce i prawa do wykonywania programu poprzez użytkownika digitemp. Rebootujemy router. Przejchodzimy do wydania komendy odczytującej temp:
1. Logujemy się na router jako użytkownik digitemp:
ssh digitemp@192.168.1.1
2. Uruchamiamy program:
digitemp_DS9097 -i -s /dev/tts/1
Jeżeli czujnik został prawidłowo wykonany zgodnie ze schematem i doprowadzono do niego zasilanie ze stabilizatora, to naszym oczom ukaże się informacja:
igiTemp v3.3.2 Copyright 1996-2004 by Brian C. Lane GNU Public License v2.0 - http://www.brianlane.com Turning off all DS2409 Couplers . Searching the 1-Wire LAN 281F41780100005A : DS18B20 Temperature Sensor ROM #0 : 281F41780100005A
3. Aby odczytać temp wpisujemy:
digitemp_DS9097 -a
….co zaowocuje informacją o temperaturze:
DigiTemp v3.3.2 Copyright 1996-2004 by Brian C. Lane GNU Public License v2.0 - http://www.brianlane.com Jun 22 02:13:19 Sensor 0 C: 27.75 F: 81.95
4. Należy pamiętać, że po każdym reboocie całość trzeba powtórzyć od początku, aby tego uniknąć potrzebny będzie srkypt startowy uruchamiający program digitemp_DS9097:
vi /etc/rc.d/S99digitemp
..o zawartości…
#!/bin/sh digitemp_DS9097 -i -s /dev/tts/1
nadajemy mu prawa wykonywalności:
chmod +x /etc/rc.d/S99digitemp
oraz zamieniamy właściciela praw:
chown digitemp /etc/rc.d/S99digitemp chmod 777 /etc/rc.d/S99digitemp
Na końcu zmieniamy prawa do utworzonych plików na użytkownika digitemp
chown digitemp /temp/* chmod 777 /temp/*
5. Po tych zabiegach po każdorazowym reboocie i zalogowaniu się na router (na użytkownika digitemp !!) mozna już bezproblemowo sprawdzać temp wydaąc komendę „digitemp_DS9097 -a”.
