Uhrzeit/beliebige Werte als 7Segment Anzeige

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

Moderator: Co-Administratoren

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

Uhrzeit/beliebige Werte als 7Segment Anzeige

Beitrag von Sanys » 24.04.2008, 22:24

Hallo FHZ-Gemeinde,

beim basteln mit php bin ich auf einen sehr simplen Weg gestossen, z.B. die Uhrzeit oder beliebige andere Werte als Digitalanzeige/ 7-Segment Anzeige anzeigen zu lassen.

Voraussetungen:
-php für Studio muß installiert sein
-es muß eine Typdefinition der Digitalanzeige gemacht werden.

Im einzelnen:
man benötigt die Zahlen 0 bis 9 als Grafiken, so wie die Anzeige gestaltet sein soll. Das läßt sich mit vielen Grafikprogrammen problemlos machen.
Mit diesen Grafiken definiert man einen neuen Typ, z.B. DigiAnzeige
Dieser Typ bekommt 10 Zustände, von 0 bis 9, der erste muß 0 sein, dann aufsteigend bis 9.
Studio läßt allerdings keine Zahlen zu bei der Typdefinition, deshalb einfach null, eins, zwei etc verwenden.
Jeder "Zustand" bekommt die entsprechende Grafik zugewiesen (0 = 0, 1 = 1....)
Typ.jpg

Nun muß man sich Gedanken machen, was angezeigt werden soll. Am Beispiel einer Uhr (Std,Min,Sec, je 2 Stellen) werde ich es aufzeigen.
Für jede Stelle muß ein Objekt angelegt werden:
DigUhrHrZ für die Zehner Stunden
DigUhrHrE für die Einer Stunden
DigUhrMinZ für die Zehner Minuten
DigUhrMinE für die Einer Minuten
DigUhrSecZ für die Zehner Sekunden
DigUhrSecE für die Einer Sekunden.

Jedes Objekt vom Typ DigiAnzeige, wie oben definiert.

Die 6 Objekte werden wunschgemäß auf der Ansicht plaziert.

Wenn nicht vorhanden das Uhr-Objekt erstellen:

Objekt Name Uhr, Typ Zeichen oder Makro, Ausführung permanent, 1 mal je sekunde

Makro:

Code: Alles auswählen

Uhr:=Uhrzeit
Damit ist systemweit die Uhrzeit mit sekunden vorhanden

Diese "Uhr" wird nun in der Digitalanzeige verwendet:

Makro:

Name beliebig, z.B. DigiUhr, Typ Makro, Ausführung permanent 1 mal pro sekunde

Code: Alles auswählen

** Uhr als 7-Segment Anzeige
** die einzelnen Digits müssen definiert sein
** als Objekte mit den Zuständen 0 bis 9
** analog die angezeigten Zahlen
** Die Objekte werden nur über den Index angesprochen
** d.h. erster Zustand = 0, 2ter= 1 etc.


<?

// Uhr enthält die Uhrzeit aus Studio (Uhr:=Uhrzeit, sekündlich)

$split = str_split($Uhr);

$DigUhrHrZ = $split[0];
$DigUhrHrE = $split[1];

$DigUhrMinZ = $split[3];
$DigUhrMinE = $split[4];

$DigUhrSecZ = $split[6];
$DigUhrSecE = $split[7];

?>
Die Funktion str_split($Uhr) zerlegt die Zeichenkette Uhr in einzelne Zeichen und speichert sie als Array. Nun kann auf jedes Zeichen zurückgegriffen werden. Das erste Zeichen ($split[0]) enthält die Zehner-Stunden, das zweite ($split[1]= die Einer-Stunden. $split[2] würde den Doppelpunkt enthalten, den brauchen wir aber nicht, genauso wie $split[5].
Diese einstelligen Zahlen werden nun den Objekten zugewiesen, und zwar als Index, nicht über den Namen der Typdefinition. Das geht laut contronics schneller, da die Namen nicht aufgelöst werden müssen, ausserdem passt es hier für eine Zahlenanzeige ganz wunderbar.
UhrAnzeige.jpg
UhrAnzeige.jpg (15.66 KiB) 2838 mal betrachtet


Vielleicht nützt es dem einen oder anderen, sein Projekt optisch aufzuwerten. In den Projektvorstellungen ist ja eine Oberfläche im Wetterstationslook vorgestellt, der Autor meine allerdings, es sei eine Heidenarbeit, die 7-Segment Anzeigen zu basteln.

Ich denke, der oben beschriebene Weg ist nicht zu aufwändig. Einmal die Grafiken erstellen, Typ definieren und dann je Ziffer ein Objekt.


Viel Spaß damit!! Funktioniert prima!! :D



Sanys
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 ;-)

Martin_HH
Beiträge: 2
Registriert: 02.06.2008, 01:44

Re: Uhrzeit/beliebige Werte als 7Segment Anzeige

Beitrag von Martin_HH » 02.06.2008, 11:26

Hallo Sanys und alle anderen,

nachdem ich auch ein wenig am Thema 7-Segment-Anzeige (als Temperaturanzeige) gebastelt habe und mich deine Anleitung sehr weit gebracht hatte (ich wollte auf keinen Fall 1000 verschiedene Bitmaps und Zustandstypen erzeugen und trotzdem auch die Nachkommastelle anzeigen), bin ich allerdings auf einige Probleme gestoßen:

1. im Temperatur-String kommt zusätzlich ein Dezimaltrennzeichen [ , ] und bei negativen Temperaturen ein entsprechendes Vorzeichen [ - ] vor.
2. der String hat eine Variable Länge; von drei Zeichen (z.B. [1,1]) bis zu fünf Zeichen (z.B. [-28,6]). Führende Nullen werden leider nicht ausgegeben.

Ich hab mir ein paar Gedanken gemacht und bin zusammen mit meinen doch sehr dürftigen PHP-Kenntnissen zu folgender Lösung kekommen:

(diese ist zwar nicht mehr so simpel, funktioniert dafür einwandfrei und läßt sich universell einsetzen)

1. Typdefinition der Digitalanzeige
(Name z.B. auch "DigiAnzeige")
Ich verwende auch Grafiken für die Zahlen 0 bis 9, das "Minus" und ein "Leezeichen" d.h. alle Segmente aus (dient als Platzhalter).
Da ich für die Anzeige eine feste Breite haben möchte, habe ich zusätlich noch die Zahlen 0. bis 9. (mit folgendem Dezimalpunkt) als Grafik definiert. Bei einer 7-Segment-Anzeige als elektrisches Bauteil hat ja auch jede Stelle einen Punkt.
Die Zustände haben also die Namen [Null] .. [Neun], [Minus], [Leer], [NullP] .. [NeunP] (P=Punkt).


2. Erstellen der Objekte
Natürlich muss auch hier für jede anzegeigte Stelle ein Objekt erstellt werden.
Mein Beispiel bezieht sich auf die Temperaturmessung in meinem Kühlschrank (mit einem HMS100T). Da der Punkt keine eigene Stelle bekommt, genügen hier vier Stellen bzw. Objekte (alle natürlich Typ "DigiAnzeige"):

TmpKlsD1 für die 1. Stelle, wenn verwendet, dann auch nur für das negative Vorzeichen
TmpKlsD2 für die 2. Stelle, die "schwierigste", kann Vorzeichen, Zahl oder leer sein
TmpKlsD3 für die 3. Stelle, ist auf jeden Fall eine Zahl, soll mit folgendem Punkt angezeigt werden
TmpKlsD4 für die 4. Stelle, dies ist auch immer eine Zahl und gleichzeitig die Nachkommastelle

3. Das Makro
Das Makro habe ich direkt im Objekt "Temperatur_Kuehlschrank" (das ist der HMS100T) abgelegt, Ausführung bei Empfang.

Code: Alles auswählen

<?
    // Um das Ganze nur einmal schreiben zu müssen: eine Funktion, die
    // den Werten die im Anzeigeobjekt definierten Zustände zuweist
function getdigit($digit) {
  if ($digit == "0") $digit = "Null";
  elseif ($digit == "1") $digit = "Eins";
  elseif ($digit == "2") $digit = "Zwei";
  elseif ($digit == "3") $digit = "Drei";
  elseif ($digit == "4") $digit = "Vier";
  elseif ($digit == "5") $digit = "Fuenf";
  elseif ($digit == "6") $digit = "Sechs";
  elseif ($digit == "7") $digit = "Sieben";
  elseif ($digit == "8") $digit = "Acht";
  elseif ($digit == "9") $digit = "Neun";
  elseif ($digit == "-") $digit = "Minus";
  else $digit = "Leer";
   // Alles, was nicht Zahl oder Minus ist, wird ausgeblendet
  return $digit;
}

   // Anzahl der Zeichen im String ermitteln
$laenge = strlen($Tempertatur_Kuehlschrank);

   // Auslesen der Werte der Stellen, beginnend mit der Letzten
$ksdigit4 = substr($Tempertatur_Kuehlschrank, -1);
$ksdigit3 = substr($Tempertatur_Kuehlschrank, -3, 1);

   // Zusätzlich für Strings mit einer Länge von 4-5 Zeichen
if ($laenge > 3)
  {
  if ($laenge > 4)
    {
    $ksdigit1 = substr($Tempertatur_Kuehlschrank, -5, 1);
    }
  $ksdigit2 = substr($Tempertatur_Kuehlschrank, -4, 1);
  }

   // Zuweisen der Zustände an die Anzeigeobjekte
$TmpKlsD1 = getdigit($ksdigit1);
$TmpKlsD2 = getdigit($ksdigit2);
$TmpKlsD3 = getdigit($ksdigit3) . "P";   // Anfügen des Punktes nach der 3. Stelle
$TmpKlsD4 = getdigit($ksdigit4);
?>
Wie gesagt, ich hab von PHP nicht wirklich große Ahnung, aber so funktioniert es bei mir. Der Einfachheit wegen setze ich z.B. auch voraus, dass der Temperatur-String mindestens drei Zeichen lang ist (Null Grad wird als [0,0] zurück gegeben) und der Dezimalpunkt wird statisch der vorletzten Stelle beigefügt, da er nur dort vorkommt.

Vielleicht kann ja jemand etwas damit anfangen.
Grüße
Martin

Antworten

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