Lichtschalter mit Helligkeitssensor

Begonnen von Majaestix, 07. September 2009, 22:30:56

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Majaestix

Hallo Zusammen,

zunächst ein grosses Lob an die Oscat-Programmierer, einfach nur klasse! Vielen Dank für Euren Einatz!

Nun zu meinem Vorschlag für einen neuen Baustein (hoffe ich zumindest, wenn es ihn schon gibt, habe ich ihn einfach nicht gefunden):

In unserem Haus schalte ich das Licht über div. Helligkeitssensoren. Wird ein festgelgter Schwellenwert unterschritten und ein BWM getoggelt, wird das Licht eingeschaltet. Enprellt habe ich das Ganze mit dem Baustein DEBOUNCE, funzt auch prima :-))
Jetzt passiert aber folgendes: Sobald das Licht an ist, wird der Schwellenwert überschritten und natürlich der Eingang des DEBOUNCE nicht mehr getoggelt. Das führt dazu, dass nach Ablauf der Entprellzeit das Licht kurz flackert, dann der Schwellwert unterschritten wird und das Licht wieder für die festgelegte Entprellzeit angeht.

Da ich mir vorstellen könnte, dass auch andere dieses Problem haben, ist dies mein Vorschlag für einen neuen Baustein.

Nochmals danke für Eure Mühe.

Gruß

Majaestix

hugo

kannst du das mit einem kleinen projekt oder mehr details beschreiben
ich verstehe die aufgabenstellung nicht

Majaestix

Hallo Hugo,

danke für Dein Interesse.

Also, ich versuche es mal:

In der Küche habe ich einen Helligkeitssensor, einen BWM und ein paar Lampen.
Der HS meldet pro Zyklus einen Wert der Helligkeit an den CX, so zwischen 25000 = Sonne scheint direkt in die Fenster und 100 = Rolladen runter und Licht aus.
Durch Probieren habe ich herausbekommen, dass ich ab ca. 16000 (Meldung des HS) Licht in der Küche benötige, falls ich in der Küche bin => BWM meldet Anwesenheit in der Küche. Werden diese beiden Bedingungen wahr, BWM meldet Anwesenheit und Schwellenwert von 16000 wird unterschritten, schaltet der CX das Licht in der Küche, also dem Raum, in dem auch der HS hängt, ein. Das führt natürlich dazu, dass der HS eine Lichtwertsteigerung von ca. 5000 auf 21000 meldet, da ja die Küche jetzt heller ist. Damit ist der Schwellwert von 16000 aber überschritten und eine der zwei Bedingungen nicht mehr wahr. Also schaltet der CX das Licht wieder aus und so weiter und so weiter....
Ich habe mir jetzt schon ein paar Tage den Kopf zerbrochen wie ich das lösen könnte, evtl. mit einem Flag oder Differenzbildung, komme aber auf keine brauchbare Lösung.

Die Logik könnte evtl. so aussehen:
IF BWM = true
AND IST-Lichtmenge - MEHR-Lichtmenge-durch-Lampen < Unterer-Schwellenwert THEN
     Lampen-Ein
ELSE
     Lampen-Aus
END_IF

oder so ähnlich...

Was den Baustein betrifft, schön wäre, wenn er
1. einen Eingang für einen unteren Schwellenwert
2. einen Eingang für einen oberen Schwellenwert
3. einen Eingang für eine Entprellzeit (wie DEBOUNCE zum Vermeiden von Flattern)
und
4. einen Ausgang für die Steuerung der Lampen hätte.

So, ich hoffe, ich habe das einigermassen verständlich erklärt. Falls nicht bin ich zu weiteren Ausführungen gerne sofort bereit.

Gruss

Majaestix

hugo

#3
spass beiseite,

vom prinzip solltest du deine einschaltbedingung nur dazu beutzen einen ausgang zu setzen, und wenn er gesetzt ist eine andere bedingung um sie zu löschen.

etwa so:
Q ist der ausgang deiner logik:

if Q then
  (* dein ausgang q ist ein hier also die logik für ausschalten *)
  Q := BWM; (* licht brennt solange wiue bwm bewegung meldet *)
  (* in einer weiteren bedingung kannst du Q löschen wenn die max runtime überschritten wird.
else
  (* else passiert nur wenn q false ist, also das licht aus *)
  Q := bwm and HS < 16000;
end_if;

eine andere alternative wäre der baustein switch_I

der macht debounce und T_on_max bereits alles mit

var
  xxx : switch_i;
end_var


xxx(in := bwm and hs < 16000, rst := not bwm);    (* setzt den ausgang wenn bedingung erfüllt, löscht aber nicht wenn nicht erfüllt *)

(* wenn keine bewegung dann immer ausschalten, wenn der bewegungsmelder kein nachlauf hat dann mit tof eines einbauen rst and set bedeutet reset hat vorrang *)

der baustein sollte eigentlich genau das machen was du benötigst

ich habs nicht getestet aber diese eine zeile mit dem switch_i sollte recht genau das tun was du benötigst
list vorher das manual damit du den baustein richtig konfigurierst

Majaestix

Hallo Hugo,

ganz vielen Dank für Deine Hilfe!!!

Wahrscheinlich habe ich Deine Lösung noch nicht richtig kapiert :-(

Was ich nicht verstehe, wie ich die mit Deiner Lösung das Licht anbehalte, obwohl durch das zusätzliche Licht der Lampen der untere Schwellenwert fürs Einschalten überschritten wird, aber der obere Schwellenwert fürs Ausschalten noch nicht erreicht wurde.

Zitat
Q ist der ausgang deiner logik:
if Q then
   (* dein ausgang q ist ein hier also die logik für ausschalten *)
   Q := BWM; (* licht brennt solange wiue bwm bewegung meldet *)
   (* in einer weiteren bedingung kannst du Q löschen wenn die max runtime überschritten wird.
else
   (* else passiert nur wenn q false ist, also das licht aus *)
   Q := bwm and HS < 16000;
end_if;

Der ELSE Zweig prüft doch jetzt nur auf gesamtes Licht < Schwellenwert. Wenn das Licht dann an ist, wird die Bedingung < 16000 doch nie mehr erfüllt???
Mein Problem besteht doch darin, dass ich das Licht auch in der Range zwischen 16000 und 21000 anbrauche, obwohl der untere Schwellenwert mit Licht > 16000 durch z. B. Tageslicht und Lampe zusammen überschritten wird. Erst wenn das Tageslicht alleine die untere Schwelle überschreitet, brauche ich die Lampen nicht mehr.

Bitte hab Nachsicht, ich krieg es einfach nicht ins Hirn.

Gruss

Majaestix


hugo

im code ist ein speicher eingebaut wie z.b. rs flip flop

habe den code nicht getestet, er sollte eine gedankenanregung sein.

wichtig ist die if then else

if Q then
   bedingung zum löschen des ausgangs
   dieser teil wird ja nur aufgerufen wenn q bereits true also das licht ein ist
   sobald die bediungung hier true ist wird q auf false gesetzt und der else zweig ab sofort  aufgerufen
else
   jetzt alle bedingungen die den ausgang q setzten.
   sobald q gesetzt wird der else zweig nicht mehr aufgerufen
end_if

im beispiel mit switch_i passiert im prinzip dasselbe, nur das sich der speicher innerhalb vom modul switch_i befindet

spiel mal mit der if then else bedingung oben rum dann kommst du schnell drauf.

hier noch in worten:
zuerst ist ja q = false.
das bedeutet das nur der teil zwischen else und end_if ausgeführt wird.
wenn du jetzt mit einer bedingung bwm und helligkeit < 1600 q auf true setzt wird dieser teil nicht mehr ausgeführt.

jetzt wird da q ja true isdt der teil zwischen if unf else ausgeführt.

hier steht jetzt diejenige bedingung die q wieder löschen kann, und das ist im einfachsten fall bwm = false, also q := not bwm
denn wenn keine bewegung soll ja ausgeschaltet werden oder.
hier können dann noch weitere bedingungen stehen wie z.b. helligkeit < 24000 usw....
ganz einfach oder

Majaestix

Hallo Hugo,

Du Gott der SPS! Ich danke Dir! Ich hab´s begriffen und es funktioniert auch noch :D

Du hast was gut!

Gruss

Majaestix

hugo

ein tip vom mir

lies mal übers wochenende ein buch über programmierung basic, pascal oder c egal ist eh alles gleich
dann werden dir die augen aufgehen was man mit programmierung alles machen kann

übrigends ist st eigentlich pascal

Majaestix

Hallo Hugo,

üble Nachrichten, es läuft leider doch nicht so ganz  >:(

Folgenden Code habe ich erstellt:


PROGRAM MAIN
VAR

(*=========================================== Ein-/Ausgaenge Lichtschalter Kueche ======================*)

Lichtschalter_Kueche : SWITCH_I;
Lichtschalter_Kueche_getastet : BOOL := FALSE;
Lichtschalter_Kueche_Entprellzeit : TIME := T#3m;

Licht_Kueche_ein : BOOL := FALSE;

(*----------------------------------------------- Schwellenwert Helligkeitssensoren  ---------------------------------------*)

Licht_Kueche_unterer_Schwellenwert : INT := 14000;
Licht_Kueche_oberer_Schwellenwert : INT := 18500;

END_VAR

(*+++++++++++++++++++++++++++++++++++++++++++ Kueche ++++++++++++++++++++++++++++++++++++++++++++*)

Lichtschalter_Kueche (SET := EG_KC_NORD_WAND_WEST_BWM_E1_48b
AND EG_KC_NORD_DECKE_HS_E1_2a < Licht_Kueche_unterer_Schwellenwert,
RST := NOT EG_KC_NORD_WAND_WEST_BWM_E1_48b
AND EG_KC_NORD_DECKE_HS_E1_2a > Licht_Kueche_oberer_Schwellenwert,
T_ON_MAX := Lichtschalter_Kueche_Entprellzeit,
Q => Licht_Kueche_ein);

IF Licht_Kueche_ein THEN EG_KC_WEST_DECKE_LICHT_DIMMER_S1_7 := 32767;
EG_KC_OST_DECKE_LICHT_DIMMER_S1_31 := 32767;
EG_KC_NORD_DECKE_LICHT_DIMMER_S1_36 := 32767;
ELSE EG_KC_WEST_DECKE_LICHT_DIMMER_S1_7 := 0;
EG_KC_OST_DECKE_LICHT_DIMMER_S1_31 := 0;
EG_KC_NORD_DECKE_LICHT_DIMMER_S1_36 := 0;
END_IF


Wenn das Licht an ist, also SET = true, dann liegt der vom Helligkeitssensor gemessene Lichtwert über der unteren Schwelle. Das führt dazu, dass SET trotz BWM nicht erneut getoggelt wird. Damit bleibt das Licht zwar für die T_ON_MAX Zeit an, aber nach Ablauf dieser Zeit gibt es einen Licht-aus/Licht-an Effekt. Das dauert zwar nicht lange, SET wird ja sofort wieder getoggelt, aber man merkt es.
Das ist eigentlich das Problem, an dem ich mir schon solange die Zähne ausbeisse.

Hast Du noch eine Idee?

Danke.

Gruss

Majaestix

Majaestix

Hallo Hugo,

ich glaube, jetzt habe ich es doch:

Lichtschalter_Kueche (SET := EG_KC_NORD_WAND_WEST_BWM_E1_48b
AND EG_KC_NORD_DECKE_HS_E1_2a < Licht_Kueche_unterer_Schwellenwert
OR EG_KC_NORD_WAND_WEST_BWM_E1_48b
AND EG_KC_NORD_DECKE_HS_E1_2a > Licht_Kueche_unterer_Schwellenwert
AND EG_KC_NORD_DECKE_HS_E1_2a < Licht_Kueche_oberer_Schwellenwert,
RST := NOT EG_KC_NORD_WAND_WEST_BWM_E1_48b
AND EG_KC_NORD_DECKE_HS_E1_2a > Licht_Kueche_oberer_Schwellenwert,
T_ON_MAX := Lichtschalter_Kueche_Entprellzeit,
Q => Licht_Kueche_ein);



Die erste Bedingung war wahrscheinlich falsch, mal sehen, was bei Sonnenaufgang passiert.

Gruss

Majaestix

Majaestix

Hallo Hugo,

war natürlich nicht so intelligent:

Lichtschalter_Kueche      (SET      :=   EG_KC_NORD_WAND_WEST_BWM_E1_48b
                        AND EG_KC_NORD_DECKE_HS_E1_2a < Licht_Kueche_unterer_Schwellenwert
                        OR EG_KC_NORD_WAND_WEST_BWM_E1_48b
                        AND EG_KC_NORD_DECKE_HS_E1_2a > Licht_Kueche_unterer_Schwellenwert
                        AND EG_KC_NORD_DECKE_HS_E1_2a < Licht_Kueche_oberer_Schwellenwert,

ist ja gleich:

Lichtschalter_Kueche      (SET      :=   EG_KC_NORD_WAND_WEST_BWM_E1_48b
                        AND EG_KC_NORD_DECKE_HS_E1_2a < Licht_Kueche_OBERER_Schwellenwert

Aber ein Problem logisches bleibt mir trotzdem erhalten:

von HS = 0 bis HS = 14000 brauche ich Licht.
Wenn Licht an, dann ist ja HS = 19000 und bleibt bzw. steigt noch wg. Tageslicht.
Wie kriege ich jetzt das Licht aus, wenn das HS(Tageslicht) > 14000 aber kleiner 19000 ist?

Gruss

Majaestix

McNugget2000

Gute Morgen.

Nur mal eben so: Auch Bewegungsmelder von B.E.G (und die sind wirklich kein Schnäppchen) haben das Problem mit dem kurzen Flackern, wenn sie selber Licht geschaltet haben.
Es ist eben ein allgemeines Problem, dass die BWM sich ihr eigenes Dämmerungssignal mit dem geschalteten Licht zu sehr aufhellen.

In Produktionhallen immer sehr gern gesehen: BWM schaltet aus, weil hell genug, alle Mitarbeiter stehen im dunkeln, dann nach ca. 2-5 Sekunden geht das Licht wieder an.

Ich glaube, wenn Ihr das Problem gut löst, könntet Ihr es den einschlägigen Bewegungsmelderlieferanten teuer verkaufen. ;-)


Evtl. sollte man es mit einem Dämmerungsschalter koppeln und diesen z.B. auf´s Dach setzen, und so lange es draussen unter einem gewissen Helligkeitswert ist, werden die weiteren Bewegungsschalter aktiviert.
Das von diesen Melder geschaltete Licht darf dann eben nicht den Helligkeitssensor auf dem Dach (oder sonst wo) beeinflussen).

Wenn es draussen hell genug ist, entfällt wieder die Freigabe für die Bewegungsmelder.

Ist nicht schön, aber ich wüsste keinen anderen praktikablen Ansatz.

Gruss

McNugget

hugo

was du beschreibst ist ja auch kein logisches problem, sondern ein problem der sensorik.
grundsätzlich kannst du die helligkeit im raum nur ohne licht ermitteln. sobald das licht ein ist ist es ja per definition heller als der schwellwert.
um nun später nach dem einschalten wieder die helligkeit zu messen musst du zwangsläufig das licht ausschalten, damit du die wirkliche helligkeit ohne beleuchtung messen kannst.
ein sensotr ausserhalb des raumes würde das zwar lösen, aber nur indeirekt, und es könnte z.b. durchaus sein das dein raum abgedunkelt ist wegen sonnenschutz und du beleuchtung benötigst obwohl der externe sensor hell genug ist.

volgender vorschalg:
einschaltbedingung:
- bwm = true and helligkeit < unterer schwellwert

ausschaltbedingung

- bmw = false  or  helligkeit > oberer schwellwert
(* wenn niemand mehr im raum dann ausschalten bwm hat entsprechenden nachlauf *)
oder wenn die helligkeit größer als ein oberer schwellwert liegt.
der oberer schwellwert ist etwas höher zu legen als der wert der sich ergibt wenn bei unterem schwellwert das licht eingeschaltet wird.
wenn der obere schwellwert zu niedrig gewählt wird entsteht genau dieses flackern von dem du sprichst

das ist standard und kann mit bordmitteln wie switch_i wunderbar als 3 zeiler implementiert werden.

eine weitere abschaltbedingung könnte z.b. auch maximale laufzeit sein.

damit muss es kein flackern geben. das ist lediglich eine geeignete wahl von unterer und oberer schwellwert des helligkeitssensors.

Majaestix

Hallo Zusammen,

Zitatdamit du die wirkliche helligkeit ohne beleuchtung messen kannst.

ich bin ja nun wirklich nicht der grosse Physiker, aber, ist Licht nicht additiv?

Mein Gedanke:

Wenn gemessenes Licht zwischen 0 und 16 dann Kunstlicht an
Wenn Kunstlicht an dann gemessenes Licht = 19
Daraus resultiert ein Delta von 3.
Wenn gemessenes Licht => Kunstlicht + Delta dann Kunstlicht aus.

Oder liege ich da völlig falsch?

Gruss

Majaestix

hugo

naja nicht ganz im prizip hadt du schon recht aber die realen verhälnisse in einem raum sind durchaus komplizierter.
das hängt von vielen faktoren wie der geometrie, oder der spektralen anteile im licht ab und von der art und position der lichtquellen.

ganz wichtig ist hier die optimale position für den lichtsensor.

aber du hast schon recht umgebungslicht von 10000 plus kunstlicht von 20000 sollte gesamt ca 11000 ergeben.
damit aber das ganze nicht flackert und vernünftiog funktioniert wäre ein szenario eher wie folgt:

kunstlich 20000
unterste schwelle 16000
16000+20000 ergibt 36000
hier wäre eine obere grenze von ca 40000 angebracht.

bewegungsmelder : einschaltverzögerung keine ausschaltverzögerung 30sekunden bis einge minuten jke nach artd und nutzung des raumes.

dann passier folgendes:
wenn helligkeit < 16000 und bwm dann licht einschalten.
licht bleibt solange ein bis entweder bwn = false oder helligkeit > 40000

in diesem szenario solltest du kein flackern haben wird das tageslicht > 20000 plus die 20000 des kunstlichtes schaltet das kunstlicht ab und resultiert in ca 20000 tageslicht
was deutlich über den 16000 liegt und das licht bleibt aus bis die helligkeit wieder unter 16000 sinkt.

das flackern von dem du spricht passiert nur bei ganz primitiven schaltern die bei einer schwelle einschalten und dann eine fest zeit anbleiben.
nach ablaufg der zeit geht das licht aus und der schwellwertschalter schaltet wieder ein.
das ist genau das flackern von dem du sprichst.