Monitorowanie temperatury
Kiedyś zaprezentowałem czujnik temperatury (nie było to nic mocno odkrywczego) i postanowiłem trochę zmienić sposób zbierania i wyświetlania danych. Aktualnie wystarcza mi do tego prosta strona www - nie posiada żadnych wodotrysków - w czasie dorobię jakieś filtrowanie po dacie i rysowanie wykresów.
Co potrzebujemy?
Gotowy czujnik lub czujniki DS18B20 (można skorzystać spokojnie z mojego poprzedniego wpisu jak to poskładać w całość) - na jednym porcie COM można spokojnie podłączyć ich więcej. Maszynę do zbierania danych - u mnie całość stoi na Debianie, baza MySQL i PHP. To jest w zasadzie wszystko.
Składamy wszystko w jedną całość
W przypadku Debiana potrzebne będzie zainstalowanie pakietu digitemp
[code=]apt-get install digitemp[/code]
Kolejna kwestia to stworzenie bazy danych:
[code=]CREATE TABLE IF NOT EXISTS `celsjusz` ( `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `numer_seryjny` text, `temperatura` decimal(5,2) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;[/code]
Mając bazę danych możemy zacząć zbierać do niej dane, do tego stworzyłem prosty skrypt:
[code=]#!/bin/sh cd /home/celsjusz mysql -‑host=localhost -‑user=ds18b20 -‑password=trudnehaslo celsjusz << EOF insert into celsjusz (numer_seryjny, temperatura) values(`digitemp_DS9097 -q -s /dev/ttyS0 -a -o"'%R', '%.2C'"`); EOF[/code]
Ustawiłem to aby wykonywało się cyklicznie co 10 minut przy użyciu CRONa:
[code=]*/10 * * * * /home/celsjusz/celsjusz.sh[/code]
Wypadałoby to jeszcze wyświetlić w jakieś strawnej dla każdego oka formie. Stworzyłem do tego 2 pliki config.php i temp.php jednak każdy może to zrobić po swojemu:
Plik config.php - zawiera konfiguracje z użytkownikiem, hasłem i nazwą bazy. Dorobiłem jeszcze parametr warn_temp, przy którym pola z przekroczoną tą wartością są oznaczane na czerwono:
<? $user = 'ds18b20'; $password = 'trudnehaslo'; $database = 'celsjusz'; mysql_connect('localhost', $user, $password); //ostrzeganie o wysokiej temperaturze $warn_temp = 23; ?>
Pozostaje plik główny, który będzie nam generował stronę z wynikami: Plik temp.php
Data | Numer seryjny | Temperatura | |||
---|---|---|---|---|---|
$data | $numer_seryjny | $temperatura | $data | $numer_seryjny | $temperatura |
";echo "";echo "Strona $page z $total_pages";if ($page == 1) {$next=$page+1;echo "<font color=\"grey\">poprzednia</font>, następna";};if (($page > 1) and ($page poprzednia, następna";}if ($page == $total_pages){$prev=$page-1;echo "poprzednia, <font color=\"grey\">następna</font>";}?>[/code]
Tak to wygląda u mnie:
Podsumowanie
Pewnie można było to zrobić prościej i lepiej, ale mnie interesowało zrobienie tego szybko, to nie jestem coś co działa w elektrowni atomowej. Nie dodałem wcześniej informacji ale należy pamiętać, że wypadałoby potworzyć odpowiednie konta do bazy danych. Ze zmian oprócz filtrowania po dacie czy temperaturze dodam jeszcze tabelę z numerami seryjnymi czujników i przypiszę im nazwy - tak by wyświetlać nazwę a nie numer seryjny. Jak ktoś ma sugestie to z chęcią przeczytam.