oscat.lib > Modulentwicklung / Module Development

Lichtschalter mit Helligkeitssensor

(1/5) > >>

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:
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;

--- Ende Zitat ---

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

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln