Obrázek teploměru

Nejprve stáhneme stránku, ze které budeme číst teplotu. Například stránku z inteligentního snímače teploty s webovým rozhraním nalezneme na adrese http://senzor-12110-2.fsid.cvut.cz/ . Celou ji můžeme načíst do jediného řetězce:

$temp = file_get_contents("http://senzor-12110-2.fsid.cvut.cz/index.htm");

Nyní bychom měli najít, kde se nachází řetězec "Temperature1=", a vše až pod tento řetězec (včetně) smazat, aby náš řetězec začínal hodnotou teploty. Můžeme použít funkci strstr(), která ovšem vrátí zbytek řetězce včetně tohoto řetězce; musíme ji tedy použít dvakrát, nebo tento text odstranit funkcí substr:

$temp = strstr($temp, "Temperature1=");
$temp = substr($temp, 13, 6);

Druhá funkce zkopíruje právě šest znaků (což by mělo stačit). S řetězcovou proměnnou můžeme v php pracovat jako s číselnou, přičemž se jako číselná část vezme všechno od začátku řetězce až do místa, kde již jsou znaky, které jako číslo nedávají smysl. Zbývá podotknout, že zmíněná stránka obsahuje desetinnou tečku, ne čárku (miniwebserver byl vyvíjen ve spolupráci s americkými kolegy, v rámci kompromisu pracuje ve stupních Celsia, ale s desetinnou tečkou). Pokud by vadily počáteční mezery, šlo by je odstranit (cyklem while).

Zde je dobré místo si vyzkoušet, co nám naše funkce vrací. Například můžeme zkusit přičíst jedničku:

echo $temp."<br>";
$temp = 1.1 + $temp;
echo $temp."<br>";

Pokud nám program zobrazí, to co od něj čekáme, můžeme přejít ke generování obrázku. Postupujeme jako u medvědů - za základ si vezmeme nějaký vhodný obrázek. Překvapivě to není na internetu až tak snadné; nakonec jsem první upravil, další je jeho výřezem a třetí jsem vyrobil v Excelu (je zmenšený). Vyberte si jeden z nich a pravým tlačítkem si jej uložte k sobě do adresáře:

   

Do obrázků budeme doplňovat červený obdélník. Pro výpočet jeho rozměrů potřebujeme místo, kde je nulová hodnota (připomínám, že nulová souřadnice v obrázku je vlevo nahoře) - to je pro první obrázek 247, pro druhý 223 a pro třetí 482 (je zmenšený). Dále pro výpočet měřítka potřebujeme polohu hodnoty "50", to je 88, resp. 64, resp. 0 bodů shora. Jako poslední je souřadnice, kde sloupec začíná - někde v jímce (angl. glass bulb), tomu odpovídá souřadnice 361, resp. 337, resp. 676. Sloupec namalujeme jako plný obdélník, kdy souřadnice jeho levé a pravé strany (x1, x2) jsou 68 a 72, resp. 39 a 44, resp. 116-4 a 116+4 (= 112 a 120). Jako barvu bych doporučil červenou - líh v jímce má ve své tmavší části barvu R,G,B=220,10,20.

Pro přepočet ze stupňů na pixely musíme určit poměr; například, je-li souřadnice hodnoty 0°C 223 bodů a pro 50°C 64 bodů, pak tato vzdálenost odpovídá 223-64=159 bodů. Teplotu ve stupních Celsia tedy podělíme 50 a pak ponásobíme touto vzdáleností. Protože jazyk php stejně neumí celočíselné dělení, ani nemá velký smysl tyto operace obracet; stejně budeme muset použít funkci round (pro získání celé části).

Protože y-ová souřadnice je vzhůru nohama, musíme vynášenou hodnotu brát jako negativní. Bývá zvykem to spojit s posunutím nulové hodnoty - místo abychom ji přičetli, musíme od souřadnice, která představuje nulovou hodnotu, vynášenou hodnotu odečíst. Výsledný skript by vypadal následovně:

<?php
header('Content-Type: image/jpeg');
// Vytvoření obrázku z připraveného jpg souboru
$im @imagecreatefromjpeg('teplomer1.jpg');

// Příprava barev pro kreslení
$white imagecolorallocate($im0xFF0xFF0xFF);
$black imagecolorallocate($im2201020);

// Vybarvení pozadí bílou - použije se velký plný obdélník
imagefilledrectangle($im396444337$white);

// Získání textu stránky
$temp = file_get_contents("http://senzor-12110-2.fsid.cvut.cz/index.htm");
// Extrakce hodnoty teploty
$temp = strstr($temp, "Temperature1=");
$temp = trim( substr($temp, 14, 6) );

// Výpočet horního konce rtuťového (lihového) sloupce
$y1 = 223 - round( $temp/50 *(223-64) );

// Vykreslení červeného obdélníku
imagefilledrectangle($im39$y144337$black);

// Výstup obrázku - bez udání jména přímo do prohlížeče

imagejpeg($im);

// Vrácení paměti
imagedestroy($im);
?> 

Teploměr je použit na adrese http://www.fsid.cvut.cz/cz/u12110/dzs/ (úplně dole vpravo).