Miernik temperatury
Pomiar temperatury przez komputer z wykorzystaniem czujnika DS18S20Ostatnia zmiana: 2007-03-03 17:26
Spis treści 1. Założenia 2. Wykonanie 2.1. Elementy 2.2. Montaż 2.3. Pomiar 2.4. Zapis danych do bazy 3. Uwagi 4. USB |
Umożliwia pomiar temperatury przy pomocy dowolnej ilości czujników. Koszt wykonania jednego czujnika to ok 10PLN.
Założenia
- możliwość pomiaru temperatury zewnętrznej- jak najmniejszy koszt :)
- zapis pomiarów do bazy danych
Oczywiście pomiar temperatury można przeprowadzić w innych miejscach - temperatura w serwerze, na zewnątrz, w akwarium, spiżarni, na balkonie itd.
Wykonanie
Do budowy czujnika wykorzystano tani i łatwo dostępny czujnik temperatury DS18S20 (1-wire) oraz parę elementów dyskretnych. Całość podłączona jest do portu RS232C komputera (ale nie ma najmniejszych przeszkód żeby podłączyć to do portu równoległego lub USB). Niestety, wymagana jest umiejętność posługiwania się lutownicą.Oprogramowanie jest szeroko dostępne - wykorzystano program digitemp; oczywiście nie ma problemów żeby takie oprogramowanie napisać samemu.
Jako bazę danych wykorzystano postgresql (dlatego że już jest u mnie w systemie), można dowolną inną - mysql, sqlite, pliki tekstowe lub rrd.
Pomysł został zaczerpnięty z Elektrody, stamtąd też pochodzą schematy.
Elementy
- 1x DallasSemiconductor DS1820 temperature sensor (został użyty DS18S20)- 2x dioda schottky 1N5818 (lub odpowiedniki - BAT85)
- 1x dioda zenera 6.2V 1N5234 (lub odpowiednik)
- 1x dioda zenera 3.9V 1N5228 (lub odpowiednik)
- 1x złącze RS232C żeńskie + obudowa
- 1x rezystor 1,5KOhm
- kabel, został użyty 10m kawałek dwużyłowego cienkiego przewodu
Koszty elementów to ok 10PLN, wszystkie są dość łatwo dostępne.
Montaż
Schemat ideowy interfejsu:Całość jest na tyle mała, że zmieści się w obudowie standardowej wtyczki DB9. Nie wymaga specjalnej płytki drukowanej, można całość zlutować "na pająka".
(kliknij, aby powiększyć)
Złącza we wtyczce RS232C są ponumerowane, więc nie ma problemu ze znalezieniem odpowiedniej nóżki, natomiast numeracja DS18S20 wygląda następująco:
Pomiar
Czujnik DS1820 jest sensorem temperatury, odpytywanym przy pomocy magistrali 1-Wire. Każdy czujnik zawiera unikalny kod 64-bitowy. Możliwy jest pomiar w zakresie temperatur od -55C do +125C z dokładnością 0,5 stopnia. Pod jedną linię można podłączyć kilka czujników; długość magistrali (przewodu) to maksymalnie ok 30 metrów.Zakładając, że czujnik został podłączony do portu ttyS0, należy wywołać polecenie
# digitemp_DS9097 -i -s /dev/ttyS0 -aPowinniśmy dostać coś takiego:
DigiTemp 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 2861567400000045 : DS18B20 Temperature Sensor ROM #0 : 2861567400000045 Wrote .digitemprc Aug 03 12:36:56 Sensor 0 C: 26.44 F: 79.59Został wykryty jeden czujnik (2861567400000045 : DS18B20 Temperature Sensor) o podanym numerze seryjnym. Została zmierzona temperatura i podana data pomiaru (Aug 03 12:36:56 Sensor 0 C: 26.44 F: 79.59)
Jeżeli nie został wykryty żaden czujnik, upewnij się, że został od dobrze zmontowany oraz podłączony jest do właściwego portu rs232. Inne problemy mogą tez wynikać ze złych dobranych odpowiedników diod BAT85.
Brawo! Czujnik został zmontowany, uruchomiony i działa.
Zapis danych do bazy
Ponieważ nie chciało mi się pisać dedykowanego programu do zapisu danych wykorzystałem parę digitemp i psql.Zakładając że mamy już zainstalowanego i działającego postgresqla, zakładamy bazę danych (create database), a następnie tabelę, gdzie będziemy przechowywać wyniki. Do moich celów wystarczyła prosta tabelka:
create table temperatura ( data timestamp without time zone default now(), numer_seryjny text, temperatura numeric(5,2) );Przechowywana jest data pomiaru, numer seryjny czujnika (na wypadek gdyby zostało podłączonych więcej czujników) i oczywiście temperatura w st. C.
Wykorzystując digitemp można teraz zapisać dane do bazy przy pomocy psql. Utworzony został plik /usr/local/bin/log_tmp o następującej zawartości:
#!/bin/sh SQL='insert into temperatura (numer_seryjny, temperatura) values ('`digitemp_DS9097 -q -s /dev/ttyS0 -a -o"%R,%.2C"`');' psql -q -h host -d baza -U user -c "$SQL"Użyto formatowania wyniku digitemp'a, dzięki czemu nie trzeba dodatkowo obrabiać danych w skrypcie. Wywołanie skryptu można wrzucić crona.
Ponieważ psql może domagać się hasła (zależy od konfiguracji postgresql) to najlepiej utworzyć plik .pgpass w katalogu domowym użytkownika z prawami którego będzie wywoływany skrypt o następującej zawartości:
host:port:baza:user:passwordOczywiście należy wpisać poprawne dane swojej bazy! Aby przekonać się czy całość działa, należy uruchomić parę razy skrypt, a następnie odczytać zawartość tabeli:
# psql -q -d baza -U user -h host -c "select * from temperatura limit 10"; data | numer_seryjny | temperatura
2005-08-03 12:50:52.083691 | 2861567400000045 | 26.62 2005-08-03 13:10:03.321288 | 2861567400000045 | 26.50 2005-08-03 13:15:02.71231 | 2861567400000045 | 26.56 2005-08-03 13:20:03.123117 | 2861567400000045 | 26.69 2005-08-03 13:25:02.524579 | 2861567400000045 | 26.50 2005-08-03 13:30:02.915088 | 2861567400000045 | 26.69 2005-08-03 13:35:03.293208 | 2861567400000045 | 26.56 2005-08-03 13:40:03.173722 | 2861567400000045 | 26.44 2005-08-03 13:45:02.522157 | 2861567400000045 | 26.62 2005-08-03 13:50:02.94823 | 2861567400000045 | 26.62 (10 rows)
Dane już mamy, więc wystarczy już tylko je obrobić (php, gnuplot, rddtool) i użyć je tam gdzie potrzeba. Można użyć np. mrtg, rrdtool czy php i robić np. takie wykresy.
Uwagi
Należy pamiętać, że przed uruchomieniem pomiarów należy załadować moduł odpowiedzialny za port szeregowy
# modprobe 8250(oczywiście o ile obsługa portu szeregowego jest skompilowana jako moduł). Żeby nie było problemu najlepiej moduł załadować przy starcie systemu - wpisać 8250 do pliku /etc/modules.
USB
Ostatnio dostępne są także interfejsy na USB oparte na DS2940.(kliknij, aby powiększyć)
Instalacja jest prosta - podłączyć do USB. Nowsze jądra mają już wbudowaną obsługę magistrali 1wire, więc może się zdarzyć że czujniki będą od razu obsługiwane. W innym przypadku należy wywołać digitemp z innymi opcjami
#!/bin/sh SQL='insert into temperatura (numer_seryjny, temperatura) values ('`digitemp_DS2490 -q -a -o"%R,%.2C" | grep -v Found`');' psql -q -h host -d baza -U user -c "$SQL"
Zobacz też pomiar temperatury w OpenWrt