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 digitemp

r   e   k   l   a   m   a

apt-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