Pomiar temperatury w OpenWrt

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.

Konwerter USB/1-Wire

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ą:

MP00202 firmy MERA_PROJEKT

Czujniki 1-Wire

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).

Termometr

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.

Czujnik 1-wire na RS232

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.

Przygotowanie do pomiaru temperatury

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”.

usb/1wire.txt · ostatnio zmienione: 2011/12/08 21:56 przez arteq
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki Recent changes RSS feed Valid XHTML 1.0
Profesjonalny Hosting