Raumdisplay mit IR empf.(RC5) das per RS232

Hi,

wie bereits bei dem anderen Bericht ( 96 LED´s über RS232 ) angekündigt, nun das Raumdisplay. Wie auch dei der anderen Schaltung hat auch bei dieser, Tobias den µC programmiert (auch das Test-Script unten).

Die einzelnen Funktionen der Schaltung:

ein 2 x 16 DOGM Display ansteuern
die Hintergrundbeleuchtung des Displays ein- ausschalten
2x LED ansteuern
8x Tasten abfragen
einen Pieper einschalten
den RC-5 Fernbedienungs Code empfangen und entschlüsseln
über RS 232 mit dem PC die Daten austauschen

Es können mehrere von diesen Platinen an einem Seriellen Port betrieben werden. Es gibt dann nur Probleme wenn zwei oder mehr zu genau dem gleichen Zeitpunkt ihre daten zum PC senden. In dem unten beschrieben String ist dann auch eine ID des jeweiligen Bausteins enthalten. Beim Senden können auch alle gleichzeitig angesprochen werden um z.B. die Uhrzeit auf alle Displays schreiben, oder alle Piepser im Haus einzuschalten.

Zur Zeit habe ich die Raum Temp und Feuchtigkeit auf der linken Seite, die aussen Temp und die Uhrzeit auf der Rechten (Bild2). Die Hintergrundbeleuchtung ist zur Zeit die Rote, soll aber wohl doch noch in weiß getauscht werden. Es ist auch auf einer separaten Platine untergebracht, um es bei einem Gehäuseeinbau besser platzieren zu können. Die Steckverbindung ist dabei verdreht, da die Steckerwanne bei der Displayplatine auf der Rückseite sitzt.

Die Anbindung an den PC erfolgt über den MAX232 von Maxim und hat am Ausgang einen Widerstand und eine Diode zur Entkopplung der einzelnen Platinen.
Die Datenübertragung der RS232 ist über ein etwa 25m langes ungeschirmtes Kabel erfolgreich getestet.

Eistellung der seriellen Schnittstelle:
9600,8,1,N

Der RC-5 IR-Code wird mit einem TSOP1736 empfangen und in die Gerätekennung und Tastennummer entschlüsselt und zum PC übertragen. Der Code wird von einigen Firmen (z.B. Loewe/Philips/Grundig/…) verwendet. Daher liegt meisst eine passende ältere Fernbedienung rum.
Also vom Sofa aus mit der Fernbedienung des Fernsehers (da es bei meiner die nicht mehr benötigte Umschaltung auf Gerät VCR gibt) die Rolladen und das Licht steuern.

Daten senden:

\xffBp\0\0($temperatur)\dfC\0

B = Geräte ID
p = Display ansprechen
0 = beginne mit dem Text bei Spalte 0
0 = beginne mit dem Text bei Zeile 0
$temperatur = gebe die Variable $temperatur aus
dfC = das Gradzeichen hinter der Temperatur

xffBp = Daten ans Display (Gerät B)
\xffBa = Licht Display AN (Gerät B)
\xffBb = Licht Display AUS (Gerät B)
\xffBc = Display löschen (Gerät B)
\xffDc = Display löschen (Gerät D)
\xff\0c = Display löschen (alle Geräte)
\xffBv = Versionsinfo

Daten empfangen:

<?
$data = GetValueString("TobiInput");
$teile = explode(";", $data);

// Die Sender heißen A, B, C, D usw...
// Das entspricht dann Wohnzimmer, Flur etc...
$sender = $teile[0]{1};
echo "Sender ".$sender."
";

$typ = $teile[0]{2};
if($typ == "i") //i=Infrarot
{
  $geraet = rtrim($teile[1]);
  $taste = rtrim($teile[2]);
  echo "Infrarot ";
  echo "Geraetenummer ".$geraet;
  echo " Taste *".$taste."*
";
  
  switch($geraet)
  {
	 case "0": // Gerätecode 0
		switch($taste)
		{
		  case "32":
			 echo "rauf";
			 MBT_WriteCoil(10397 /*[Wago MBT]*/ ,514 /* Ausgang514 = Licht wozi */,true);
			 break;
		  case "33":
			 echo "runter";
			 MBT_WriteCoil(10397 /*[Wago MBT]*/ ,514,false);
			 break;
		  case "01":
			 echo "01";
			 MBT_WriteCoil(10397 /*[Wago MBT]*/ ,540 /* Ausgang525 = Rolladen au */,true);
			 IPS_Sleep (500);
			 MBT_WriteCoil(10397 /*[Wago MBT]*/ ,540 /* Ausgang525 = Rolladen au */,false);
			 break;
		  case "04":
			 echo "04";
			 MBT_WriteCoil(10397 /*[Wago MBT]*/ ,540,false);
			 break;
		  case "35":
			 echo "Display";
			 COMPort_SendText(20531 /*[Serial Port 17 / 3-1..4a+b]*/ , "\xffBc\0\0\xfe");
			 $temperatur = GetValueFloat("Temperatur1");
          		 echo $temperatur;
          		 $temperatur2 = round($temperatur, 1);
          		 echo $temperatur2;
          		 COMPort_SendText(20531 /*[Serial Port 17 / 3-1..4a+b]*/ , "\xffBp\0\0{$temperatur2}\xdfC\0");
			 break;
			 			 
		  case "02":
			 echo "02;
			 COMPort_SendText(20531 /*[Serial Port 17 / 3-1..4a+b]*/ , "\xffBa\0\1\xfe");
			 break;
 
		  case "05":
			 echo "05";
			 COMPort_SendText(20531 /*[Serial Port 17 / 3-1..4a+b]*/ , "\xffBb\0\1\xfe");
			 break;

		  case "03":
			 echo "03";
			 COMPort_SendText(15185 /*[Serial Port 11 / 3-5a]*/ , "\xffAf\9\1\xfe");
			 break;

		  case "06":
			 echo "06";
			 COMPort_SendText(15185 /*[Serial Port 11 / 3-5a]*/ , "\xffAe\9\xfe");
			 break;

		  case "09":
			 echo "09";
			 COMPort_SendText(15185 /*[Serial Port 11 / 3-5a]*/ , "\xffAe\1\xfe");
			 break;

		  case "38":
			 echo "38";
			 COMPort_SendText(15185 /*[Serial Port 11 / 3-5a]*/ , "\xffAd\9\xfe");
			 break;

		  case "38":
		    echo "OK";
			 COMPort_SendText(15185 /*[Serial Port 11 / 3-5a]*/ , "\xffAe\9\xfe");
			 break;
		}

		break;
	 case "1":  // anderes Gerät
		break;
  }
}
else if($typ == "t") //t=Taste
{
  // Taste am Raumdisplay
  $taste = rtrim($teile[1]);
  
  switch($sender)
  {
	  case "B":
	  // Raum x
  	  switch($taste)
	  {
		 case "1":
			echo "Taste 1 Raum x";
			break;
		 case "2":
			echo "Taste 2 Raum x";
			break;
		 case "3":
			echo "Taste 3 Raum x";
			break;
	  }
	  break;
	  case "C":
	  // Raum y
  	  switch($taste)
	  {
		 case "1":
			echo "Taste 1";
			break;
		 case "2":
			echo "Taste 2";
			break;
		 case "3":
			echo "Taste 3";
			break;
	  }
	  break;
  }
}

?>

die Scripte werdet Ihr besser verstehen als ich, da ich noch am Anfang des ganzen bin… …ich Kopiere und „versuche“ zu verstehen.

Gruß

Jan

Hallo Jan!

Joo, dat is doch watt. Nicht schlecht!

Erinnert mich ein wenig an das hier:

Mit dem Layout kommst du in eine Schalterdose. Wie ist es bei dir geplant?

Gruß Helmut

Klasse! Das ist genau was ich schon lange suche.
Veröffentlichst du den Schaltplan usw. auch noch? Das wäre super. Wäre evtl. auch bereit ein bisschen was dafür abzudrücken.

Vielen Dank und viele Grüße
Chris

@Helmut

es sollen eigentlich die MFD-80-B von Moeller als Gehäuse herhalten. Hab aber in einer der letzten ELV Zeitungen eine kleines Radio für Schaltereinbau gesehen. Mal sehen ob ich mir mal eins besorge und anschaue, würde auch besser ins Schalterprogramm passen. µC Platiene soll dann in der Holwanddose verschwinden.

@spaceguy

abdrücken:eek: glaub wohl eher nicht:o lieber profitiere ich davon, das andere auch die Sachen in IPS integrieren und ich PHP abschreiben kann;)
Layout und Schaltung kommt morgen. Jetzt bekomme ich das aus Eagle rausholen nicht mehr gebacken (brauche Schlaf)

Jan

So sehe ich Das auch.

Dann gibt es dann ja auch einen „Austausch“.

Wenn ich groß bin, kaufe ich mir 'ne Fräse, das wird schick…:slight_smile:

Es soll wohl, für das Display aus meinem Link, Abdeckplatten gefräst worden sein. Jan, glaube ich, hat da, bei sich, Möglichkeiten.

Gruß Helmut

Hallo Helmut,

nettes Projekt das Du da unter „das hier“ hast. Ich wollt auch mit Tobi zusammen eine Haussteuerung komplett selbst bauen. Bin dann aber auf IPS gestossen.

Hier nun die Schaltung und das Layout. Per PN kann ich diese auch zusenden.

Var Anlegen Mit Bool

$Hilfe = GetValueBoolean("JanHilfs");

if ($Hilfe== True){

//Hier Dein Befehl für Aus

SetValueBoolean("JanHilfs",False);
}
if ($Hilfe== False){

//Hier Dein Befehl für AN

SetValueBoolean("JanHilfs",True);
}

oder so?

$Hilfe = GetValueBoolean("JanHilfs");

if ($Hilfe)
 {

    //Hier Dein Befehl für Aus

    SetValueBoolean("JanHilfs",False);
    }
    else
    {
    
    //Hier Dein Befehl für AN

    SetValueBoolean("JanHilfs",True);
}  

oder


SetValueBoolean("JanHilfs",! GetValueBoolean("JanHilfs")); 

Danke Ken, und viel Erfolg noch beim W. am K. zu wechseln.:stuck_out_tongue:

Auch dank an die Anderen beiden, wobei ich ja wenig verstehe, aber den letzten Vorschlag garnicht:( Kommt evt. noch…

Jan

Der letzte ist eigelich der einfachste wie ich finde.

Nehmen wir ein kurzes Beispiel:


SetValueBoolean("JanHilfs", True); // Nun ist die Variable JanHilfs auf True gesetzt

$test = GetValueBoolean("JanHilfs"); //In $test steht jetzt True

$test = !GetValueBoolean("JanHilfs"); //in $test steht jetzt False
// das ! invertiert die Variable, d.h. aus True wird False und aus False wird True. Das ist Mathematik. 2 * (-1) = -2 und (-2) * (-1) = 2 

SetValueBoolean("JanHilfs",! GetValueBoolean("JanHilfs")); //Hier wird dann JanHilfs immer auf das Gegenteil von JanHilfs gesetzt.  


Ich hoffe ich hab das einigermaßen verständlich erklärt.

Viele Grüße
Chris

Danke für die Erklärung. Damit komme ich dann auch dahinter;)
Bin halt noch am Anfang und damit auf die Erklärungen angewiesen.

Gruß

Jan

Nach der Bastelaktion (Stammtisch Hannover) ist nun der Kurser von Display verschwunden und die 8 Tasten funktionieren.

@spaceguy: Datei kommt…

Gruß

Jan

Neue Funktion:

h = im Gegetackt zur Funktion f blinken

Bilder wieder rausgesucht…