Bilder in Studio einbinden (Webcam, Diagramme...)

Programmierung der FHZ-Zentralen mit contronics homeputer Standard / homeputer Studio & WEB-Server

Moderator: Co-Administratoren

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Bilder in Studio einbinden (Webcam, Diagramme...)

Beitrag von buempi » 12.07.2008, 12:18


Ich glaube, ich hab' die Lösung:

Code: Alles auswählen

Zaehler := Zaehler + 1

<?

$PseudoSchriftArt = 'H:/HomeputerStudio/Alger.ttf';
$SchriftArt = 'H:/HomeputerStudio/Hatten.ttf';

$Groesse = 60;
$Orientierung = 45; // schräg aufwärts

$Schreiben = $V_Tank_Zaehler; // Ausgabe-Text

$Bild = imagecreate(160,160); // Bildgrösse (Länge/Höhe)

$Hintergrund = ImageColorAllocate($Bild, 255, 255, 255); // weiss
$SchriftFarbe = ImageColorAllocate($Bild, 0, 0, 0); // schwarz

// Pseudo-Schrift
ImageTTFtext($Bild,$Groesse,$Orientierung,40,160,$SchriftFarbe,$PseudoSchriftArt,"");

ImageTTFtext($Bild,$Groesse,$Orientierung,40,160,$SchriftFarbe,$SchriftArt,$Schreiben);

imagejpeg($Bild, "H:\HomeputerStudio\BMP\Bild3.jpg");

ImageDestroy($Bild);
?>

Anzeige := Scriptoutput

** Bei diesem Schalter ist Bild3.jpg bei BEIDEN Zuständen als Bitmap hinterlegt
TestSchalter umschalten
Ich generiere das Bild zunächst in einer Schrift, die ich gar nicht will mit einem LEEREN STRING (sonst kommt ein Fehler!). Nachher erst in der gewollten Schrift mit dem gewollten Text.

Fragt mich nicht, warum es so funktioniert, aber es läuft seit ca. einer halben Stunde jede Sekunde. Der Zähler ist mittlerweile bei 1912. Hoffentlich kratzt mir das Ding nicht ein Loch in die Festplatte, da wo das Bildchen steht!

Schade ist nur, dass Homeputer das Bildchen nicht ganz sauber malt. Werde es noch mit anderen Grafikformaten versuchen.

Viele Grüsse
Bümpi

Benutzeravatar
Sanys
Beiträge: 270
Registriert: 31.01.2007, 12:29
Wohnort: Wetterau

Re: Bilder in Studio einbinden (Webcam, Diagramme...)

Beitrag von Sanys » 12.07.2008, 23:50

Hi Bümpi,

super Idee von Dir, einfach eine andere Schrift vorher zu laden. Das ist zumindest mal ein Workaround. Werde ich mal testen.
Zum Problem selbst (problem loading Glyph...): Ich habe nochmals Tests mit Freetype gemacht. Hat leider keinen Erfolg, sondern den gleichen Fehler wie bei TrueType Fonts gebracht. Auch langes suchen nach der Fehlermeldung hat nicht zu einer Lösung geführt. Wie gesagt, auf meinem Apache-Server läuft es problemlos, mit der selben Version php.
Freetype ist übrigens in der gd2.dll integriert. Man braucht nichts extra. Deshalb klappt ja auch der erste Aufruf. Warum es bei weiteren Aufrufen nicht mehr geht kann ich mir nur so vorstellen, daß Studio die "php-für-die-Kommandozeile-Version" als interpreter nutzt, Apache aber anders mit php umgeht (eigener, angepaßter Interpreter). Vermutlich wird beim ersten Aufruf irgendwas im Speicher behalten, was bei einem erneuten Aufruf nicht nachgeladen wird aber auch nicht mehr richtig funktioniert. Das alles sind Vermutungen.

Bümpi, hast Du schon ausprobiert was passiert, wenn Du mehrere Texte in eine Grafik einbauen willst? Womöglich kommt da wieder das Problem, da ja jedesmal beim imagettftext die Schriftdatei mit angegeben ist. Oder speichert php das irgenwo zwischen?
Mir schwebt da so ein Anzeige z.B. für Wetterwerte vor, die alle möglichen Werte in einer Grafik vereint. Ändert sich ein Wert, so lädt das Makro die ganze Grafik (imagecreatefromjpeg) und überschreibt dann den zu ändernden Teil erst mit dem Hintergrund (imagefilledrectangle) und anschließend mit dem neuen Text. Wenn verschiedene Sensoren gleichzeitig neue Werte liefern müßte man die entsprechenden Makros mit starte() aufrufen, damit sie in die Ausführungswarteschlange gesteckt werden und nacheinander abgearbeitet werden.
Schade ist nur, dass Homeputer das Bildchen nicht ganz sauber malt. Werde es noch mit anderen Grafikformaten versuchen.
Du speicherst das Bild als jpeg. Ich glaube, der default für die Qualität ist 60. Das sieht wirklich nicht schön aus. Maximal ist 99 möglich und wird so angegeben:

Code: Alles auswählen

imagejpeg($Bild, "H:\HomeputerStudio\BMP\Bild3.jpg", 99);
Ach ja, ich sehe gerade noch etwas:
imagecreate erzeugt wohl ein "simples" Bild, statt dessen sollte imagecreatetruecolor verwendet werden.

Und zum Abschluß: wie ganz am Anfang meines Threads schon erwähnt ist jpeg ein komprimierendes Bildformat, d.h. alle Schriften werden an den Rändern unsauber, da jpeg versucht, auch diese Kontraste platzsparend unterzubringen.
Mit der bmp.php kannst Du aber bmp-Bilder erzeugen (und lesen), die dann Pixelgenau in Studio dargestellt werden.
Dafür die bmp.php runterladen und am besten ins Arbeitsverzeichnis von Studio kopieren.
Im php-script steht dann am Anfang irgendwo:

Code: Alles auswählen

include("Pfad//bmp.php");
Das Bild wird dann, nachdem es erzeugt ist, mit

Code: Alles auswählen

imagebmp ($bild , $Dateiname);
gespeichert.

So, nun viel Spaß und Erfolg beim weitertesten.


sanys
(Stephan)
FHZ 1350PC Prof. mit HomeputerStudio 100224 + Direktsendebefehle à la tsa (v 8.0)
WIN XP Pro SP3 (neuester Stand) + buempi's Minibrowser + etliche fs20+HMS+FHT Komponenten + nie genug Zeit, das alles fertig zu bekommen ;-)

Benutzeravatar
Sanys
Beiträge: 270
Registriert: 31.01.2007, 12:29
Wohnort: Wetterau

Re: Bilder in Studio einbinden (Webcam, Diagramme...)

Beitrag von Sanys » 13.07.2008, 00:23

@tsa :wink:
Dein Hinweis mit dem Include-File ist OBERKLASSE!!! Da fallen mir sofort weiter Anwendungsmöglichkeiten ein (Parametrierungen die zur Laufzeit änderbar sind)- und ähnliches!!! DANKE! (Hättest Du natürlich auch schon mal eher erwähnen können)
gucks Du hier :lol: (ganz unten im letzen Beitrag)


...Grüße...


sanys

:arrow: P.S. demnächst noch was zu Sonnenzeiten und erstellen einer ini-Datei für Studio mit php, the easy way.... :idea:
FHZ 1350PC Prof. mit HomeputerStudio 100224 + Direktsendebefehle à la tsa (v 8.0)
WIN XP Pro SP3 (neuester Stand) + buempi's Minibrowser + etliche fs20+HMS+FHT Komponenten + nie genug Zeit, das alles fertig zu bekommen ;-)

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Bilder in Studio einbinden (Webcam, Diagramme...)

Beitrag von tsa » 14.07.2008, 10:47

@Sanys:
OK - ist ja schon sooo lange her... Ich habe mich damals noch gar nicht mit FS20 bzw. FHZ beschäftigt :(
Ich schaffe es auch nicht, mal alle älteren Beiträge zu überfliegen... Ist also gut, tolle Ideen ab und zu mal zu wiederholen! :P

@Bümpi:
Gute Idee mit dem Laden der "Pseudoschriftart". Ich kann damit leben...
Hast Du schon Erfolge mit Sanys Vorschlägen bezüglich besserer Qualität zu verzeichnen?

Gruss
Thomas

Benutzeravatar
Sanys
Beiträge: 270
Registriert: 31.01.2007, 12:29
Wohnort: Wetterau

Re: Bilder in Studio einbinden (Webcam, Diagramme...)

Beitrag von Sanys » 14.07.2008, 11:42

Hallo zusammen,

so, nun konnte ich mal ein paar Tests bzgl. Bümpis Vorschlag mit der Pseudoschrift machen.
Funktioniert prima! Eines fiel aber auf: Ich habe in einem include-file den php-code zum testen. Studio läuft, es wird beim Anklicken auf das Anzeigeobjekt (Typ Schalter) dieses umgeschaltet und somit das include aufgerufen.
Wenn ich nun neue Schriften zum ausprobieren eingefügt habe hat Studio diese wieder nur beim ersten mal angezeigt, danach nicht mehr und es gab wieder die Fehlermeldung (Problem loading Glyph in...). Wenn ich die Ausführung der Steuerung gestoppt habe und dann neu gestartet wurden wieder alle Schriften angezeigt, auch bei mehrmaligem Aufruf. Es scheint wohl tatsächlich beim ersten Aufruf eines php-Programms der Interpreter geladen zu werden und dann bleibt da irgenwas im Speicher, was einen 2ten Aufruf mit Schriften nicht richtig abarbeitet. Ich vermute aber, wir müssen damit leben (da wird sich weder contronics noch die php-Leute drum kümmern...:-(

folgender code

Code: Alles auswählen

<?
$spgverzeichnis = "c://ELVData//SPG//";
include($spgverzeichnis."bmp.php");
$im = imagecreatetruecolor (400, 400);
$black = ImageColorAllocate ($im, 0, 0, 0);
$white = ImageColorAllocate ($im, 255, 255, 255);
$fontdir = "c:\\windows\\fonts\\";
$hintergrund = imagecolorallocate($im,236,233,216); //mit bmp-Ausgabe evtl auf blau umstellen
imagefill($im,0,0,$hintergrund);
ImageTTFText ($im, 18, 0, 20, 20, $black, $fontdir."arial.ttf","");
ImageTTFText ($im, 18, 0, 20, 20, $black, $fontdir."verdana.ttf", "Testtext (Verdana)");
ImageTTFText ($im, 18, 0, 40, 40, $black, $fontdir."tahoma.ttf", "Testtext2 (Tahoma");	
// Zeilenumbruch : wird mit \n erzeugt.
ImageTTFText ($im, 12, 0, 60, 60, $black, $fontdir."cour.ttf", "TTF-Font in Studio\nLinebreak (Courier)");
ImageTTFText ($im, 10, 45, 100, 200, $black, $fontdir."tahoma.ttf", "Testtext2 (Tahoma)");
ImageTTFText ($im, 18, 0, 40, 40, $black, $fontdir."tahoma.ttf", "Testtext2 (Tahoma)");	
ImageTTFText ($im, 18, 0, 10, 390, $black, $fontdir."dotmatrix.ttf", "Testtext2 (DotMatrix)");
ImageTTFText ($im, 18, 90, 390, 390, $black, $fontdir."ds-digi.ttf", "Testtext2 (DS Digital)");		  
$filejpg = "C:\\ELVData\\BMP\\GrafikWork\\freetypetest.jpg";			  
$filebmp = "C:\\ELVData\\BMP\\GrafikWork\\freetypetest.bmp";				  
Imagejpeg ($im, $filejpg , 99);
Imagebmp ($im , $filebmp );
ImageDestroy ($im);
?>
aufgerufen von Studio

Objekt: freetype freetype
Typ: Schalter
Darstellung in Ansicht : Tester
Definitionen:
Ausführung bei Bildschirmeingabe
Makro nicht zeitgesteuert aktiviert
Ausführung bei Empfang

Code: Alles auswählen

aktZeit:=Uhrzeit
<?
include  ("c://ELVData//SPG//freetype.php");
?>
Fehlertext:=scriptoutput
schreibedatei("freetype.txt","%<freetype.aktZeit>")
schreibedatei("freetype.txt","Output: %<freetype.Fehlertext>")
warte  00:00:01
freetype:=1
erzeugt folgene Ausgabe:
als bmp:

[Die Dateierweiterung bmp wurde deaktiviert und kann nicht länger angezeigt werden.]

als jpeg ohne Angabe der Qualität:
freetypetest60.jpg
freetypetest60.jpg (15.17 KiB) 4810 mal betrachtet
als jpeg mit Qualität 99 (siehe Code):
freetypetest99.jpg
Man sieht bei den Jpegs ganz deutlich die Muster an den Schrifträndern, bei bmp gibt es das nicht.


Somit sind auf diesem Weg nun doch völlig freie (und gut aussehende) Anzeigen in Studio zu realisieren!

Viel Erfolg!

sanys


@tsa
tsa hat geschrieben:@Sanys:
OK - ist ja schon sooo lange her... Ich habe mich damals noch gar nicht mit FS20 bzw. FHZ beschäftigt :(
Ich schaffe es auch nicht, mal alle älteren Beiträge zu überfliegen... Ist also gut, tolle Ideen ab und zu mal zu wiederholen! :P
Es stimmt, das ist sehr lange her. Bekräftigt mich aber, es sollte so eine Art Wiki geschaffen werden, um Grundlagen nachvollziehbar abzulegen. Quasi eine Online-Hilfe, die erweitert werden kann.
FHZ 1350PC Prof. mit HomeputerStudio 100224 + Direktsendebefehle à la tsa (v 8.0)
WIN XP Pro SP3 (neuester Stand) + buempi's Minibrowser + etliche fs20+HMS+FHT Komponenten + nie genug Zeit, das alles fertig zu bekommen ;-)

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Bilder in Studio einbinden (Webcam, Diagramme...)

Beitrag von buempi » 14.07.2008, 13:11

Hallo zusammen

War zwei Tage blockiert. Festplatten-Crash nach Spannungsschwankung. Natürlich am Wochenende, wo man nirgendwo Ersatzteile kriegt!

Netzgerät ersetzt. Festplatte gewechselt. Backup zurückgespielt. Alles scheint wieder zu laufen. Muss aber natürlich noch ein paar Sachen seit dem letzten Backup rekonstruieren. - Vor allem alle Versuche, die ich mit "imageTTFtext()" gemacht hatte. Werde wohl nicht gleich weitermachen können.

Aber, wie ich sehe, nimmt mir ja Sanys die ganze Arbeit ab....

Viele Grüsse
Bümpi

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Beispiel für den Temperatur-Feuchte-Sensor HMS100 TF

Beitrag von tsa » 15.07.2008, 13:11

Hallo,

aufbauend auf die vorangegangenen Beiträge, hier ein "PlugPlay"-Beispiel für den HMS100 TF.
An der Hintergrundfarbe lässt sich die Aktualität der Sensorinformationen erkennen: grau=normal; gelb=1 Signal verpasst; hellrot=2 Signale verpasst; rot mehr als zwei Signale nicht mehr empfangen...
(Soll nur ein Beispiel für die vielen Möglichkeiten sein, die man jetzt hat)

[Die Dateierweiterung bmp wurde deaktiviert und kann nicht länger angezeigt werden.]

[Die Dateierweiterung bmp wurde deaktiviert und kann nicht länger angezeigt werden.]

[Die Dateierweiterung bmp wurde deaktiviert und kann nicht länger angezeigt werden.]

[Die Dateierweiterung bmp wurde deaktiviert und kann nicht länger angezeigt werden.]

##############################################################

Folgendes Schritte sind dazu notwendig:

1. Ein Anzeige-Objekt anlegen, z.B. "AnzeigeSensorWZ",
Typ: EAGeraet
Makroinhalt ("Ausführen bei Eingabe" gesetzt):

Code: Alles auswählen

GueltigkeitSensorWZ := Stoppzeit(TemperaturWZ.ct)
<?
  $Objectname = "AnzeigeSensorWZ";
  $HeadLine = "Wohnzimmer";
  $Value1 = $TemperaturWZ;
  $Value2 = $FeuchteWZ;
  $Timer = $GueltigkeitSensorWZ;

  //Dieser Pfad muß angepasst werden!!!
  include("Z:\\fs20\\php\\HMS100TF.php");
?>

**Anzeige:=Scriptoutput
AnzeigeSensorWZ umschalten
Annahme: Der Temperaturwert liegt im Objekt "TemperaturWZ", der Feuchtigkeitswert im Objekt "FeuchteWZ"
Achtung: Pfad für include anpassen


2. Ein Objekt "GueltigkeitSensorWZ" vom Typ Zeichen anlegen
Makroinhalt (Ausführungsintervall z.B. 1 x pro Sekunde):

Code: Alles auswählen

GueltigkeitSensorWZ := Stoppzeit(TemperaturWZ.ct)
3. Im Objekt des Feuchtigkeitssensors (hier "FeuchteWZ" wird folgendes Makro hinterlegt:
("Ausführung bei Empfang" ist gesetzt)

Code: Alles auswählen

Startuhr(TemperaturWZ.ct)
STARTE(AnzeigeSensorWZ)
**Aller 05:13 Minuten wird ein Signal empfangen (kurz vor Signaleingang soll die Farbe bereits umschalten)...
WARTE("00:05:12") 
STARTE(AnzeigeSensorWZ)
WARTE("00:05:13")
STARTE(AnzeigeSensorWZ)
WARTE("00:05:13")
STARTE(AnzeigeSensorWZ)
4. Die Datei "HMS100TF.php" in das Verzeichnis spielen, welches unter Punkt 1 unter include angegeben wurde,
Inhalt:

Code: Alles auswählen

<?
    //Dieser Pfad ist anzupassen
    $filejpg = "z:\\fs20\\temp\\".$Objectname.".jpg";

    $HeaderSize = 18;
    $SizeX = 150;
    $SizeY = 28+$HeaderSize;
    $HeadFont = "arialbd.ttf";
    $HeadFontSize = 10;
    $Font = "ds-digi.ttf";
    $FontSize = 18;

    $Value1 = sprintf("%.1f", $Value1);
    $Value2 = sprintf("%.1f", $Value2);
    if ($Value1 < -100) $Value1 = "--,-";
    if ($Value2 < -100) $Value2 = "--,-";
    $Text1 = str_replace(".", ",", $Value1) . " 'C";
    $Text2 = str_replace(".", ",", $Value2) . " %";

    $TimerSec = substr($Timer, 0, 2)*3600 + substr($Timer, 3, 2)*60 + substr($Timer, 6, 2);
    $ReceiveIntervall = 05*60 + 13;
 
    $im = imagecreatetruecolor ($SizeX, $SizeY);
    $gray = ImageColorAllocate ($im, 214, 211, 206);
    $darkgray = ImageColorAllocate ($im, 128, 128, 128);
    $black = ImageColorAllocate ($im, 0, 0, 0);
    $white = ImageColorAllocate ($im, 255, 255, 255);
    $yellow = ImageColorAllocate ($im, 255, 255, 0);
    $lightred = ImageColorAllocate ($im, 255, 192, 192);
    $red = ImageColorAllocate ($im, 255, 0, 0);
    $green = ImageColorAllocate ($im, 0, 128, 0);
    $blue = ImageColorAllocate ($im, 0, 0, 255);

    
    $hintergrund = $gray;
    $vordergrund = $blue;

    if ($TimerSec >= $ReceiveIntervall-2) 
    {
      $hintergrund = $yellow;
    }
    if ($TimerSec >= 2*$ReceiveIntervall-2)
    {
      $hintergrund = $lightred;
    }
    if ($TimerSec >= 3*$ReceiveIntervall-2)
    {
      $hintergrund = $red;
      $vordergrund = $white;
    }
    
    ImageTTFText ($im, 18, 0, 0, 0, $black, $fontdir."wingding.ttf", "");        
    
    imagefill($im, 0, 0, $hintergrund);
    imagerectangle ($im, 0, 0, $SizeX-1, $SizeY-1, $darkgray);
    imagerectangle ($im, 1, 1, $SizeX-2, $SizeY-2, $darkgray);
    imagerectangle ($im, 3, 3, $SizeX-2, $SizeY-2, $darkgray);
    imagerectangle ($im, 1, 1, $SizeX-4, $SizeY-4, $white);
    imagerectangle ($im, 2, 2, $SizeX-1, $SizeY-1, $darkgray);
    imagerectangle ($im, 0, 0, $SizeX-3, $SizeY-3, $white);

    imageline($im, 2, $HeaderSize, $SizeX-4, $HeaderSize, $white);
    imageline($im, 2, $HeaderSize+1, $SizeX-4, $HeaderSize+1, $darkgray);

    imageline($im , ceil($SizeX/2), $HeaderSize+1, ceil($SizeX/2), $SizeY-4 , $white);
    imageline($im , ceil($SizeX/2)+1, $HeaderSize+1, ceil($SizeX/2)+1, $SizeY-4 , $darkgray);

    $tb = imagettfbbox($HeadFontSize, 0, $HeadFont, $HeadLine);
    ImageTTFText ($im, $HeadFontSize, 0, ceil(($SizeX-50 - $tb[2]) / 2), $HeadFontSize+5, $black, $HeadFont, $HeadLine);        

    $tb = imagettfbbox($FontSize, 0, $Font, $Text1);
    ImageTTFText ($im, $FontSize, 0, ceil(($SizeX/2 - $tb[2]) / 2), $SizeY-7, $vordergrund, $Font, $Text1);        

    $tb = imagettfbbox($FontSize, 0, $Font, $Text2);
    ImageTTFText ($im, $FontSize, 0, ceil($SizeX/2)-2+ceil(($SizeX/2 - $tb[2]) / 2), $SizeY-7, $vordergrund, $Font, $Text2);

    Imagejpeg ($im, $filejpg , 99);
    ImageDestroy ($im);
?>
Achtung: Pfad für $filejpg anpassen

5. Anzeige-Objekt (hier "AnzeigeSensorWZ") in die Visualisierung bringen , Projekt starten

6. Anzeigeobjekt anklicken, dabei sollte das JPG dort entstehen, wie der Pfad unter Punkt 4 festgelegt wurde (vorher eventuell das Temp-Verzeichniss anlegen)

7. Dem Anzeigeobjekt für beide Zustände die unter Punkt 6 entstandene Grafik zuordnen.

-> FERTIG

##############################################################

Wenn man -wie im obigen Beispiel- auch den Zeitstempel seit letztem Signaleinlauf in die Visualisierung bringen möchte, braucht man nur noch das Objekt "GueltigkeitSensorWZ" in die Ansicht einfügen.


Viel Spass damit
Thomas

PS:
- Voraussetzungen: PHP installiert, zusätzlich die php_gd2.dll vorhanden, php.ini angepasst (wie bereits von sanys beschrieben)
- weiterhin: Schriftarten vorhanden (speziell "ds-digi.ttf"), hier kann man natürlich auch mit anderen Schriftarten spielen...
- Ich habe bewusst auf die Ausgabe als BMP (BMP.PHP) verzichtet, da diese enorm Performance frisst und bei diesen kleinen Schriftarten kaum Vorteile bringt...

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Bilder in Studio einbinden (Webcam, Diagramme...)

Beitrag von tsa » 15.07.2008, 15:51

...hier noch das Gleiche für den HMS100 T:

[Die Dateierweiterung bmp wurde deaktiviert und kann nicht länger angezeigt werden.]

Alles genauso machen wie oben, nur "$Value2" enfällt. Und die Aktualisierungsrate ist etwas höher: ca. 05:19 Minuten.


Gruss
Thomas
Dateianhänge
HMS100T.zip
Include-Datei HMS100T.php
(888 Bytes) 138-mal heruntergeladen

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Bilder in Studio einbinden (Webcam, Diagramme...)

Beitrag von buempi » 15.07.2008, 20:02

Hallo zusammen

Toll, was Thomas da kreiert hat!!! Da schäme ich mich fast, mein Gesellenstück zu präsentieren...

Ich habe mich mal an ein konkretes Projekt gemacht: Die von Strohfeuer auf Seite 1 dieses Threads gewünschte Füllstandsanzeige eines Wassertanks.

Es scheint ganz gut gelungen zu sein. Optisch kommt's natürlich nicht an Thomas' Bildchen ran. Habe mich auch bemüht, es "Plug and Play" zu schreiben. Deshalb die vielen Variablen und auch die unzähligen Kommentare. Hoffentlich hilft das dem einen oder anderen PHP-Neuling:

Voraussetzungen

PHP muss installiert sein. Man kann es auf der Download-Seite von Contronics herunterladen und sollte die Installationshinweise dort beachten.

Aus der heruntergeladenen ZIP-Datei muss zusätzlich mindestens folgende Datei kopiert werden:

Code: Alles auswählen

php_gd2.dll
Ferner braucht man (um wirklich schöne Bildchen zu erstellen) die bmp.php, die ich dank eines Hinweises von Sanys hier finden konnte:

http://www.jpexs.com/php.html
Achtung: Wenn Windows beim Download noch ein ".txt" dranhängt, bitte entfernen!!

Es ist zwar nicht ganz sauber, aber für PHP-Anfänger wohl am einfachsten, die benötigten Dateien einfach ins Homeputer-Studio-Verzeichnis zu kopieren.

Dann muss im Homeputer-Verzeichnis noch eine Datei namens PHP.INI erstellt werden, mit folgendem Inhalt:

Code: Alles auswählen

[PHP]
extension_dir = "./"
extension = php_gd2.dll
Damit wären die Vorbereitungen abgeschlossen.

Und nun zum Makro:

Code: Alles auswählen

** 1. Objekt

** Objekt-Name                TankAnzeige
** Objekt-Typ                 Schalter
** Bitmap für beide Zustände  Tank.bmp (einfach von Hand eintragen)


** 2. Objekt

** Objekt-Name                Tank
** Objekt-Typ                 Zahl
** Ausführen                  bei Eingabe (zum Testen)

** Variable:
** Gesamtinhalt               Typ Zahl, Startwert = Dein Tankinhalt


** Makro im 2. Objekt (Tank):

<?

// 4 Pfade allenfalls ändern
include ("C:\Programme\contronics\homeputer Studio\bmp.php");
$Schrift1            = "C:\Windows\Fonts\Cour.ttf";
$Schrift2            = "C:\Windows\Fonts\Arial.ttf";
$BildName            = "C:\Programme\contronics\homeputer Studio\BMP\Tank.bmp";

$SchriftGroesse      = 18;   // In Pixel
$SchriftOrientierung = 0;    // waagrecht

$BreiteBitmap        = 100;
$HoeheBitmap         = 136;

// Ein leeres Bild erzeugen
$Bild = ImageCreateTruecolor($BreiteBitmap,$HoeheBitmap);

// Farben definieren
$Schwarz     = ImageColorAllocate($Bild,0,0,0);
$Blau        = ImageColorAllocate($Bild,0,0,254); // nicht 255 - wäre durchsichtig
$Hintergrund = ImageColorAllocate($Bild,236,233,216);

// Wegen Fehler in Homeputer-PHP, zunächst Pseudoschrift laden
ImageTTFtext($Bild,$SchriftGroesse,$SchriftOrientierung,0,0,$Schwarz,$Schrift1,"");

// Den Hintergrund "ausmalen"
ImageFill($Bild,0,0,$Hintergrund);

// Rahmen ums ganze Bildchen zeichnen; da Homeputer nicht immer bis zum Rand
// anzeigt, Breite und Höhe des Rahmens 2 Pixel weniger als die Bild-Masse
ImageRectangle($Bild,0,0,$BreiteBitmap-2,$HoeheBitmap-2,$Schwarz);

// Damit der Anzeige-Text zentriert werden kann, zunächst die Länge des
// auszugebenden Textes ermitteln:
$BildParameter = ImageTTFBbox($SchriftGroesse,$SchriftOrientierung,$Schrift2,$Tank);
$TextLaenge    = $BildParameter[2];

// Der Text soll um die Hälfte der TextLaenge vor der Mitte der Zeile beginnen
$TextAnfang    = $BreiteBitmap/2 - $TextLaenge/2;

// Den aktuellen Tankinhalt reinschreiben und zwar unten, 5 Pixel vom Rand
ImageTTFtext($Bild,$SchriftGroesse,$SchriftOrientierung,$TextAnfang,$HoeheBitmap - 5,$Schwarz,$Schrift2,$Tank);

// 5 Pixel über dem Text eine Linie über die Ganze Breite ziehen
// Vertikale Position: Höhe des Bitmaps, minus Abstand unten vom Rand,
// minus Höhe der Schrift, minus Abstand der Linie gegenüber der Schrift oben
$VertikalePosLinie = $HoeheBitmap - 5 - $SchriftGroesse - 5;

$HorizAnfangLinie = 0;
$HorizEndeLinie   = $BreiteBitmap-2;

// Linie zeichnen
ImageLine($Bild,$HorizAnfangLinie,$VertikalePosLinie,$HorizEndeLinie,$VertikalePosLinie,$Schwarz);

// Der Untere Teil der Anzeige ist erledigt

// Jetzt müssen wir im oberen Teil noch den Tank (eine Ellipse) zeichnen und ausmalen
// Horizontal steht der Platz zwischen ganz oben (0) und der Linie (HorizEndeLinie) zur Verfügung.
// Die Ellipse wird vom Mittelpunkt her gezeichnet:

$MittelpunktHorizontal = $BreiteBitmap / 2;
$MittelpunktVertikal   = $VertikalePosLinie / 2;

$BreiteDesTanks = $BreiteBitmap - 30;      // 30 Pixel weniger breit als der obere Teil des Bitmap
$HoeheDesTanks  = $VertikalePosLinie - 15; // 15 Pixel weniger hoch als der obere Teil des Bitmap

// Das "Tankfeld" wird ausgemalt; 0,360 bedeutet rundherum also von 0° bis 360°,
// angefangen bei 03:00 Uhr
ImageFille-darc($Bild,$MittelpunktHorizontal,$MittelpunktVertikal,$BreiteDesTanks,$HoeheDesTanks,0,360,$Blau,IMG_ARC_PIE);

// Jetzt haben wir einen vollen Tank gezeichnet! Damit aber nur der gefüllte Teil
// angezeigt wird, decken wir oben so viele Prozente von der Bildfläche wieder mit
// der Hintergrund-Farbe ab, wie der Tank LEER ist

$ProzentVoll = 100 / $V_Tank_Gesamtinhalt * $Tank;
$ProzentLeer = 100 - $ProzentVoll;

// Der vertikal oberste Punkt des Tankes liegt bei MittelpunktVertikal minus halbe HoeheDesTanks
$AbdeckenVon = $MittelpunktVertikal - $HoeheDesTanks / 2;

// Abzudecken sind so viele Prozent von der Tankhöhe, wie der Tank ProzentLeer ist
$AbdeckenBis = $AbdeckenVon + $ProzentLeer * $HoeheDesTanks / 100;

// Jetzt decken wir dieses Rechteck mit Ausnahme von 2 Pixeln links und 3 rechts ab
ImageFilledRectangle($Bild,2,$AbdeckenVon,$BreiteBitmap-3,$AbdeckenBis,$Hintergrund);

// Jetzt müssen wir noch den Stahlmantel des Tanks zeichnen
// Damit dieser gut sichtbar ist, zeichnen wir drei Ellipsen um je 1 Pixel grösser
// also einen 3 Pixel dicken Strich
ImageEllip-se($Bild,$MittelpunktHorizontal,$MittelpunktVertikal,$BreiteDesTanks,$HoeheDesTanks,$Schwarz);
ImageEllip-se($Bild,$MittelpunktHorizontal,$MittelpunktVertikal,$BreiteDesTanks+1,$HoeheDesTanks+1,$Schwarz);
ImageEllip-se($Bild,$MittelpunktHorizontal,$MittelpunktVertikal,$BreiteDesTanks+2,$HoeheDesTanks+2,$Schwarz);

// Das Bildchen erzeugen und ins Homeputer-BMP-Verzeichnis schreiben
ImageBmp($Bild,$BildName);

// Vom Bildchen verwendeten Hauptspeicher freigeben
ImageDestroy($Bild);

?>

** Damit das Bild in Homeputer aktualisiert wird
TankAnzeige umschalten
Einen FS20-Füllstandssensor gibt's natürlich nicht. Aber Strohfeuer hat so was zusammen mit einem HMS100T konstruiert und wird es demnächst im Forum vorstellen.

Viele Grüsse
Bümpi

tsa
Beiträge: 725
Registriert: 03.01.2008, 17:42
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Digitalanzeige für Wetterstation KS300

Beitrag von tsa » 17.07.2008, 11:59

Hallo,

mach langer Abstinenz 8) nun auch noch ein Vorschlag für die Wetterstation KS300:

[Die Dateierweiterung bmp wurde deaktiviert und kann nicht länger angezeigt werden.]

Falls jemand bessere Design-Ideen hat, sei er herzlich wilkommen (mir gehen langsam die Ideen aus...)

Die Anzeigeaktualisierung macht man am besten im Makro "KS300 Regen" ("Ausführen bei Empfang" gesetzt!)

Code: Alles auswählen

WARTE("00:00:00")
AnzeigeAktualisieren:
Makro ausführen AnzeigeKS300
WARTE("00:02:32")
GEHEZU AnzeigeAktualisieren
Die Werteübergabe wird dann im Makro "AnzeigeKS300" folgendermassen realisiert:

Code: Alles auswählen

GueltigkeitKS300 := Stoppzeit(KS300_Temp.ct)
<?
  $Objectname = "AnzeigeKS300";
  $HeadLine = "Wetterstation";
  $Value1 = $KS300_Temp;
  $Value2 = $KS300_Feuchte;
  $Value3 = $KS300_Regen;
  $Value4 = $KS300_Wind;

  $Value5 = $KS300_RegenATag;
  $Value6 = $KS300_RegenLTag;
  $Value7 = $KS300_RegenAStunde;
  $Value8 = $KS300_RegenLStunde;
  $Timer = $GueltigkeitKS300;
  include("Z:\\fs20\\php\\KS300.php");
?>
**Anzeige:=Scriptoutput
AnzeigeKS300 umschalten
Hier kommt noch das entsprechende INCLUDE - ansonsten wird alles gemacht wie oben beschrieben.


Gruss
Thomas

PS.: @Bümpi
Deine Grafik lässt sich sicher aufpeppen - Deine Arbeit aber nicht!!!
Wichtig ist ja vor allem erst mal die Funktionsweise.
Dateianhänge
KS300.zip
Include-Datei KS300.php
(1.7 KiB) 150-mal heruntergeladen

Antworten

Zurück zu „homeputer Studio / Standard: Programmierbeispiele“