Temperaturanzeige mit °C mit NanoTerm

Hallo Forum,

ich möchte gern ein °C auf meinem NanoTerminal Display für Temperaturen anzeigen. Das Display kann das Sonderzeichen, nur wie bekomme ich es per Script auf mein Display? In der Doku der Funktionen habe ich es auch nicht gefunden.
Ich glaube es gab schon mal einen Betrag, nur finde ich diesen nicht mehr.

Grüße
Andrge

Hallo Andrge,

es gibt zwei Möglichkeiten:

In der Code-Tabelle des Displays nachsehen, welchen Code das betreffende zeichen hat.
Das Zeichen mit der PHP-Funktion chr(code) als Text ausgeben.

Ein nicht vorhandenes Zeichen mit der Funktion LCDCharDef(…) selbst definieren. Das selbst definierte Zeichen erhält als Code die Nummer des Speicherplatzes unter dem es abgelegt wird. Siehe das Skript LCD_Beispiel in der Dokumentation zum NanoTerminal. Dort ist auch ein (auskommentiertes) Beispiel für das Grad-Zeichen (degree) enthalten.

Gruß
HJH

Hallo HJH,

danke für die beiden Hinweise. Blöde Frage, wie bekomm ich nun das Zeichen auf mein Display?

Habe versucht das chr(x0f) auszugeben, aber nun sehe ich auf dem Display „char…C“. Bitte nicht lachen, aber kannst Du mir sagen wie ich das in den Ausgabestring integriere?

Den zweiten Versuch habe ich mit unter der Funktion versucht, hat aber auch nicht wirklich Funktioniert. Hatte nur Fehlermeldungen.

Könntest Du einem Hardware-Menschen weiter helfen?

Grüße
Andrge

Hallo andrge,

so eventuell,

Auszug von Nanoterminal.

//******************************************************************************
// LCD-Textausgabe an einer bestimmten Cursor-Position
// ===================================================
//
// Zeilenüberlauf wird nicht berücksichtigt!
//
//******************************************************************************
$text = date(„d.m.y H:i:s“);
$lcd->SendLCDText(2, 1, $text); // 3. Zeile, 2. Spalte

$lcd->SendLCDText(2, 1, chr(176));

$degree = „\x06\x09\x09\x06\x00\x00\x00\x00“;
// abspeichern an Speicherposition 3
$lcd->SendLCDCharDef(3, $degree);
// Ausgabe des Zeichens in Position 3
$lcd->SendLCDText(0, 15, „\x03C“); // 1. Zeile, 16. Spalte

Hallo Andrge,

zu 1:
Grundlagen: Der Datentyp String besteht aus einer Aneinanderreihung von Elementen des Datentyps Character. Beispiel: „ABCD“
„A“, „B“, „C“ und „D“ sind Daten vom Typ Character.
In der Character-Tabelle des LC-Displays sind alle Character einem bestimmten (ASCII-)Code zugeordnet. Beispiel: „A“ -> 0x41 (dezimal 65)
Der Code eines Characters ist vom Datentyp Integer.
Einige der LCD-Codes stimmen nicht mit den in Windows verwendeten Codes überein. In diesen Fällen muss man den Windows-Code in den LCD-Code übersetzen. Das Grad-Zeichen ist ein solcher Fall.

Nehmen wir an, der LCD-Code für das Grad-Zeichen sei 198. Dann muss dieser Code in den zu übertragenden String integriert werden. Da ein String aber aus Character-Elementen und nicht aus Integer-Elementen (Code) zusammengesetzt ist, muss der Integer-Code in ein Character-Zeichen übersetzt werden. Dies geschieht mit der PHP-Funktion chr(Code).
Beispiel:

$text = "Temperatur: 23,5 ". chr(198). "C";

zu 2:
Wie Rainer (RWN) und ich schon gezeigt haben: das Beispiel ist bereits fertig im Skript LCD_Beispiel enthalten. Du brauchst es nur abzschreiben.

Gruß
HJH

Hallo HJH
Hallo Rainer

danke für eure Unterstützung!! Einen Teilerfolg hatte ich nun dank eurer Hilfe, ich habe versucht ein chr darzustellen. Ich habe aber den Eindruck, dass gegen die Bedienungsanleitung mein Display nicht höher wie 0xDF anzeigen kann. Wenn ich ein chr 0xef und nachfolgende Zeichen senden möchte, dann wir entweder ein „ß“ angezeigt.

Bedeutet das, wenn ich das blöde „°“ Zeichen haben möchte, dass ich das Zeichen Pixel für Pixel definieren muß? Wie ist es denn mit dem Display von HJH? Kann das das ° Zeichen?

Für den versuch 2 bin ich noch zu Blöd! Das Zeichen zu definieren hab ich nicht hin bekommen. Ich müßte es doch in meinem Scrip einfügen, oder?

Im Moment schaut mein Code folgendermaßen aus:


$InstanceID = 29548;
$ControllerType = "ST7036";
$Zeilen = 4;
$Spalten = 20;


$includeFile =  IPS_GetScriptFile("LCD_Functions");
require_once "LCD_Functions.ips.php";

$lcd = new OneWireLCD($InstanceID, $ControllerType, $Zeilen, $Spalten);
//$lcd = new OneWireLCD($id, $ControllerType, $Zeilen, $Spalten);

$lcd->SendLCDInit();

$Zeit = GetValueString("CurrentTime");
$Lux = GetValueString("Lux");
$ATemp  = GetValueFloat("Aussentemp");
$ATemp = round ($ATemp, 1);
$Temp_Werkstatt  = GetValueFloat("Temp_Werkstatt");
$Temp_Werkstatt  = round ($Temp_Werkstatt, 1);
$Var_ATemp = GetValueString("Var_ATemp");


SetValueString("Var_ATemp",$ATemp . chr(0xa5). "C");  //Testweise senden von Sonderzeichen

$text = "$Zeit Uhr|Aussen Temp:$Var_ATemp |Helligkeit: $Lux |Werkstatt Temp:$Temp_Werkstatt" ;


$lcd->SendLCDScreen($text);

?>

Grüße
Andreas
habe nach euren

Meinst Du diesen hier.

Hallo Reiner,

nein, diesen hier

Grüße
Andreas

Das ist auch ein Hd 44780, oder hab ich was verlesen.

Hallo Andreas,

beim Beschicken des LCD’s solltest Du unterscheiden zwischen Initialisierungsphase und Betriebsphase. Die Initialisierung ist nur nach dem Einschalten der Stromversorgung oder als Reset nötig. Es genügt daher völlig, wenn Du die Initialisierung (SendLCDInit()) nur einmal durchführst. Ich schlage vor, Du sendest diesen Befehl über ein eigenes Skript. Außerdem wird die Reaktion des Displays dadurch deutlich beschleunigt. Die normale Textausgabe erfolgt dann in der Betriebsphase.

Dein Skript weist zwei Fehler auf:

  1. Du gibst als Controller den Typ ST7036 an. Warum? :confused:
    Im Datenblatt ist nachzulesen, dass es sich um einen KS0073 handelt und dass dieser auch als HD44780 (Standard) angesprochen werden kann. Es kommen also nur die Wahlmöglichkeiten „KS0073“ oder „Standard“ in Frage.

  2. Du änderst die externe Variable „Var_ATemp“. Die interne Variable $Var_ATemp wird anschließend zum Display gesendet. Diese interne Variable blieb aber unverändert. Also kann das LCD Dein Sonderzeichen auch nicht anzeigen.

Was ist bei der Definition von eigenen Zeichen so schwierig?
Da das Grad-Zeichen im Beispiel-Skript (LCD_Beispiel.ips.php) sogar schon definiert ist, brauchst Du doch nur zwei Zeilen mit Cut and Paste in Dein eigenes Initialisierungsskript (s.o.) zu übertragen. Von da an steht es Dir unter dem gewählten Speicherplatz (=Code) zur Verfügung. Natürlich ist es auch sinnvoll, die Kommentare zu den Funktionen im Skript zu lesen.

Zum Thema: Variablen in IP-Symcon.

Und nicht den Kopf hängen lassen! Du kriegst das schon hin. :wink:

Gruß
HJH

… also mit dem 1W-Nanoterminal gibt es keine Probleme.
Ich habe extra ein ° in die 1. Zeile eingefügt.
Live-Test

MST

Klasse Steiner,

Die Webcam ist immer wieder eine schau! Welches chr ist es für das „°“ bei dem Nanoterminal Display?

Grüße
Andreas

Hallo Andreas,

wie man zu Sonderzeichen kommt wurde oben ausgiebig beschrieben.
Hier, falls Interesse besteht, das Skript der Webcam:

<?
function Show($val) {
if($val) {
   return "ON";
  } else {
   return "OFF";
  }  
} 

if(isset($action)) {
	
	if(($action=="setlcd") && (isset($newtext))){


		require_once "../scripts/LCD_Functions.ips.php";
		$InstanceID = 25827;
		$ControllerType = "Standard";
		$Zeilen = 2;
		$Spalten = 16;
		$lcd = new OneWireLCD($InstanceID, $ControllerType, $Zeilen, $Spalten);	 	
		$lcd->SendLCDInit();
		$lcd->SendLCDScreen($newtext);
		
		SetValueString("Web_txt_Labor", GetValueString("Web_txt_Labor") ."-". $newtext); 


		$degree = "\x06\x09\x09\x06\x00\x00\x00\x00";
		$lcd->SendLCDCharDef(3, $degree);
		$lcd->SendLCDText(0, 15, "\x03C"); // 1. Zeile, 16. Spalte	
	

	}
	
} 


?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>IP-Symcon Labor</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
//-->
</script>
</head>

<body>
<p align="left"><font size="5"><strong><font color="#0000CC"><font size="+4"><a href="http://www.ipsymcon.de" target="_blank">Willkommen im IP-Symcon-Labor</a> </font></font></strong></font></p>
<p><img src="labor.jpg" width="640" height="480" border="0"></p>
<p><strong>Das Bild wird alle 10 Sekunden neu von der Web-Kamera übertragen! Bitte <a href="?" target="_self">Refresh</a> klicken!</strong>
</p>
<tr>
<form>
<input type=hidden name=action value=setlcd>
<td colspan=2>Für das private Tele-Text-Programm:
  <input type=text name=newtext size=25> <input type=submit value="An LCD senden"></td>
</form>
</tr>
<p>16 Zeichen * 2 Zeile - diese bitte mit | trennen (Zeile1 | Zeile2)  IPS-Chat:<br>
<textarea name="textarea" cols="100" rows="10"><? echo GetValueString("Web_txt_Labor");?>
  </textarea>
</p>
<tr><td colspan=2> </td>
</tr>
</body>
</html>

MST

Hallo Steiner,

ne, ne, ich bleib erstmal bei meinen Anfängerproblemen! Erstmal hätte ich gern so ein blödes „°“ Zeichen auf meinen Displays. :confused:

Aber mal sehen, vielleicht bin ich in einem halben- oder einem Jahr so weit.:o Danke erst mal.

Schönen Tag

Grüße
Andreas

Hallo Andreas,

ich glaube Du hast meinen letzten Beitrag übersehen.

Steiner benutzt in seinem NanoTerminal-Beispiel ein ganz anderes LC-Display als Du. Folglich nützt es Dir wenig, wenn Du seinen Code für das Grad-Zeichen kennst.
Der Zeichen-Code für Dein Display steht im zugehörigen Datenblatt. Er lautet 0xDF.

Du musst also in Deinen String chr(0xdf) einfügen.

Zeig uns doch bitte noch einmal die neueste Version Deines Skripts.

Gruß
HJH

Hallo HJH,

ich habe bereits versucht das Sonderzeichen zu schicken, aber offensichtlich reagiert das Display nicht darauf. Ich erhalte als Ausgabe ein „ß“. Hier stimmt offenbar das Datenblatt nicht mit dem Display überein. Andere Sonderzeichen eine Spalte vorher werden richtig dargestellt, von daher denke ich, es liegt diesmal nicht an meinem Code (wenigstens diesmal nicht)

NanoTerm-Display:
Ich habe nach dem chr für dieses Display gefragt, weil ich dieses Display auch im Einsatz habe und es hier gegenprüfen wollte.

Erstaunlich, wie einen doch so ein Kringel auf einem Display ärgern kann.
Mein Script werde ich heute Abend einstellen.

Grüße

Andrge

Hallo,

hier nun mein Script. Ich habe es um weitere Ausgabewerte erweitert.

$InstanceID = 29548;
$ControllerType = "Standard";
$Zeilen = 4;
$Spalten = 20;


$includeFile =  IPS_GetScriptFile("LCD_Functions");
require_once "LCD_Functions.ips.php";

$lcd = new OneWireLCD($InstanceID, $ControllerType, $Zeilen, $Spalten);
//$lcd = new OneWireLCD($id, $ControllerType, $Zeilen, $Spalten);

$lcd->SendLCDInit();


//Ausgabe 1
$Zeit = GetValueString("CurrentTime");
$V5 = GetValueString("Spannung_5V");
$A5 = GetValueString("Strom_5V");
$V12 = GetValueString("Spannung_12V");
$A12 = GetValueString("Strom_12V");

//Temperatur Hub
$HubTemp = GetValueFloat("Hub_2_Temp_Sensor");
$HubTemp = round ($HubTemp, 1);

$text0 = "1-Wire Hub|Hub-Temp: $HubTemp  Grad|5V:   $V5   $A5 |12V: $V12   $A12";

$lcd->SendLCDScreen($text0);

IPS_Sleep(5000);    // Warten bis nächste Seite

//Ausgabe 2
//$Zeit = GetValueString("CurrentTime");
$Lux = GetValueString("Lux");
$ATemp = GetValueFloat("Aussentemp");
$ATemp = round ($ATemp, 1);

$Temp_Werkstatt  = GetValueFloat("Temp_Werkstatt");
$Temp_Werkstatt  = round ($Temp_Werkstatt, 1);

SetValueString("Var_ATemp",$ATemp. "AC");  //chr(0xDF) = ° Zeichen. Testweise senden von Sonderzeichen

$Var_ATemp = GetValueString("Var_ATemp");

$text1 = "$Zeit Uhr|AussenTemp:$Var_ATemp |KellerTemp:$Temp_Werkstatt Grad|Helligkeit: $Lux" ;


$lcd->SendLCDScreen($text1);


?>

Hallo Andreas,

ich kann nicht erkennen, dass Du das Grad-Zeichen irgendwo ausgibst.

Es wundert mich daher auch nicht, dass es nicht auf dem Display erscheint.

Gruß
HJH

Hallo Andreas,

Teile deines Scriptes kommen mir sehr bekannt vor :wink:

Warum ersetzt du nicht einfach das „°“ Symbol in deinem Script mit dem Symbol aus dem Display-Manual, das den gleichen ASCI-Wert hat. Ist mit Sicherheit nicht die sauberste Lösung, aber die einfachste.
Beim meinem Display was es das „ß“, also sende ich einfach „26.8ßC“ um „26.8°C“ auf dem Display zu erhalten. Das funktioniert datürlich nur, wenn dein Display auch das Grad-Symbol kennt. Habe mir das Datenblatt nicht angeschaut.

Doc

Hallo Andreas,

langsam verstehe ich, in welche Falle du getappt bist:

PHP erlaubt es, innerhalb eines Text-Strings auch PHP-Variablen zu verwenden. Diese werden von PHP am $-Zeichen erkannt und bei der Ausgabe durch den entsprechenden Wert ersetzt.

Ich selbst nutze diese Vermischung nie, da sie leicht, wie auch bei Dir, zu Fehlern führt!

Statt dieser Variante:

$text1 = "$Zeit Uhr|AussenTemp:$Var_ATemp |KellerTemp:$Temp_Werkstatt Grad|Helligkeit: $Lux" ;

solltest Du lieber die Variablen außerhalb des Strings anordnen und diese hier verwenden:

$text1 = $Zeit. "Uhr|AussenTemp: ". $Var_ATemp. chr(0xdf). "C|KellerTemp: ". $Temp_Werkstatt. chr(0xdf). "C|Helligkeit: ". $Lux. "lx";

Oder so:

$Grad = chr(0xdf);
$text1 = $Zeit. "Uhr|AussenTemp: ". $Var_ATemp. $Grad. "C|KellerTemp: ". $Temp_Werkstatt. $Grad. "C|Helligkeit: ". $Lux. "lx";

Gruß
HJH