Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

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 digitempapt-get install digitemp

Kolejna kwestia to stworzenie bazy danych: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;

Mając bazę danych możemy zacząć zbierać do niej dane, do tego stworzyłem prosty skrypt:#!/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

Ustawiłem to aby wykonywało się cyklicznie co 10 minut przy użyciu CRONa:*/10 * * * * /home/celsjusz/celsjusz.sh

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 <? $page_file="temp.php"; include('config.php'); @mysql_select_db($database) or die("Problem z dostępem do bazy danych"); if (isset($_GET["page"])) { $page = $_GET["page"]; } else { $page=1; }; $start_from = ($page-1) * 20; $query="SELECT * FROM celsjusz ORDER BY data DESC LIMIT $start_from, 20"; $result=mysql_query($query); $num=mysql_numrows($result); //policzymy ilość wierszy aby później stworzyć strony $sql = "SELECT COUNT(data) FROM celsjusz"; $rs_result = mysql_query($sql); $row = mysql_fetch_row($rs_result); $total_records = $row[0]; $total_pages = ceil($total_records / 20); mysql_close(); echo "<b><center>Temperatura</center></b><br><br>"; echo "<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">"; echo "<tr><td><b>Data</b></td><td>Numer seryjny</td><td>Temperatura</td></tr>"; $i=0; while ($i < $num) { echo "<tr>"; $data=mysql_result($result,$i,"data"); $numer_seryjny=mysql_result($result,$i,"numer_seryjny"); $temperatura=mysql_result($result,$i,"temperatura"); //temperatura powyżej 23 stopni if ($temperatura > $warn_temp) { echo "<td bgcolor=\"red\"><b>$data</b></td><td bgcolor=\"red\">$numer_seryjny</td><td bgcolor=\"red\">$temperatura</td>"; }else //temperatura poniżej 22 stopni { echo "<td><b>$data</b></td><td>$numer_seryjny</td><td>$temperatura</td>"; } echo "</tr>"; $i++; } echo "</table>"; echo "<br>"; echo "Strona $page z $total_pages<br>"; if ($page == 1) { $next=$page+1; echo "<font color=\"grey\">poprzednia</font>, <a href=\"$page_file?page=$next\">następna</a>"; }; if (($page > 1) and ($page < $total_pages)) { $prev=$page-1; $next=$page+1; echo "<a href=\"$page_file?page=$prev\">poprzednia</a>, <a href=\"$page_file?page=$next\">następna</a>"; } if ($page == $total_pages) { $prev=$page-1; echo "<a href=\"$page_file?page=$prev\">poprzednia</a>, <font color=\"grey\">następna</font>"; } ?>

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. 

serwery inne

Komentarze

0 nowych
PAMPKIN   11 #1 26.06.2013 08:17

Podoba mi się bardzo, zrobię sobie do mojego serwera. Gdy ostatnio przygrzało, to az było czuć że go mam, bo zwykle tylko słychać ;) przydało by się jeszcze raportowanie na maila i/lub sms (jakieś api do dostawcy) o przekroczeniu temp i więcej progów z krytycznym włącznie!

Axles   17 #2 26.06.2013 09:20

Wygląda to na skomplikowane, ale skoro piszesz, że tak nie jest i zrobiłeś to na 'szybko' to jestem pod wielkim wrażeniem.

dav4   4 #3 26.06.2013 10:36

Ja osobiście wolę zapisywać te dane do bazy RRD i mieć piękne wykresy jak tutaj http://luk7.eu/tertemp/index.php?c=3 (ja to napisałem dla kumpla, aktualnie nie działa bo padł dysk w terminalu HP) :)

PAMPKIN   11 #4 26.06.2013 10:53

No i znowu się czegoś dowiedziałem. Nie miałem pojęcia o bazie RRD, a to ciekawy stwór jest. Wprawdzie nie szukałem takiego typu bazy - ale przez przypadek wiem, że coś takiego istnieje i już się w mojej głowie kręci zastosowanie!

Autor edytował komentarz.
bachus   20 #5 26.06.2013 16:18

Dobre! Miałem pisać, jak zrobić prosty monitoring za pomocą czujnika za kilka dolarów.
Pamiętam, jak na płycie Abit BE6 była złączka do czujnika temperatury, który można było umieścić w dowolnej części obudowy. Z racji tego, że był to serwer na Debiania chodzący po 24h/dobę, przedłużyłem kabelek i wystawiłem czujke za okno :>

Viperoo   8 #6 26.06.2013 22:59

Wiem że może używanie mysql_query nie jest złym pomysłem ale w dobie PDO...

deepone   10 #7 26.06.2013 23:33

@dav4 zastanawiam się nad GNUPlot lub właśnie RRD.

@Axles tylko wygląda, w rzeczywistości jest proste.

@Viperoo - PHP pamiętam z dawnych czasów, pewnie można to prościej i dwukrotnie krócej.

@PAMPKIN planuje dorobić raportowanie na emaila - sms nie potrzebuje bo emaile i tak lądują u mnie na telefonie :)

  #8 27.06.2013 18:20

Temat wygląda dosyć ciekawie. Moje pytanie do znawców: jaką max temperaturę wytrzymuje obudowa (korpus) czujnika DS18B20 ?
W datasheet podają temperaturę pomiarową od -55stC do +125stC. Czy znaczy to, że obudowa wytrzymuje minimum +125stC ?

Chciałbym zmontować sobie prosty miernik temperatury + program w Delphi/Lazarus. Układ służyłby do pomiaru temperatury wody w instalacji CO przy piecu CO. Do tego ustawione widełki Tmin/Tmax i alarm świetlny/dźwiękowy informujący o przekroczeniu widełek Tmin/Tmax. Czujnik zamocowany byłby na rurze z wodą ogrzewaną przez piec CO.

Nie chcę wydawać dużej kasy na jakieś mierniki/sterowniki za kilka stówek. Prostota to podstawa!
No chyba, że przedstawi ktoś tanie (max 100-150zł) urządzenie z dokładnym pomiarem (powinno wystarczyć +/-2stC):
- zasilanie z sieci lub bateryjne,
- czujnik temperatury (wystarczy pomiar do 100-120stC),
- obudowa czujnika MUSI wytrzymać temp. około 100-120stC,
- jakiś mały wyświetlacz LCD z programowaniem, alarmem dźwiękowym (ew. dodatkowo świetlnym), jeśli bez LCD to przynajmniej programowanie na PC,
- możliwość wykorzystania przewodu długości minimum 7-10m łączącego czujnik temp. z wyświetlaczem (alarmem)

Jakieś pomysły? Może link lub nazwę urządzenia/sklepu/aukcji?

deepone   10 #9 30.06.2013 10:00

@delphi czujnik ten powinien wytrzymać, w sieci gdzieś było że wytrzymuje taką temperaturę, powyżej nie mierzy. Możesz kupić w obudowie wodoodpornej (taniej na ebay z wysyłką niż na allegro).

Jeżeli chcesz wyższe temperatury to MAX6630 ale tutaj więcej zabawy z podłączeniem będzie.

Nie prościej to zrobić pod linuxem?

Dimatheus   22 #10 01.07.2013 09:32

Hej,

No tak - wpis z serii mały majsterkowicz. :) A swoją drogą zobaczyłbym, jak stronka wygląda po zmianach, o których pisałeś na samym końcu. :)

Pozdrawiam,
Dimatheus