Go Down

Topic: Beleuchtungssteuerung für einen Leuchttum (Read 738 times) previous topic - next topic

timsieberg

Hier ein Bild des Leuchtturms,
den Turm gibt es nicht mehr.

Vielen danke erstmal für eure Antworten, das hat mir schon sehr weitergeholfen.
Jetzt habe ich gestern nochmal mit ihm telefoniert.

Er möchte es jetzt gerne wie folgt haben:
- Einschalten bei Dämmerung 
Habe einen passenden Lichtsensor. Ich habe bei den Programmen von noiasca und MicroBahner auch hinbekommen, dass die LED´s erst angehen, wenn ein bestimmter Wert-X unterschritten ist. Leider ist es jetzt so, dass sobald der Wert-X wieder überschritten wird also Tag, das Programm gestoppt wird und nicht weiterläuft. Wird der Wert wieder unterschritten, wird das Programm an der Stelle fortgesetzt.

Als "Leuchtfeuer" sollte die LED sehr hell sein und sich "drehen":
Habe jetzt an eine 230V G9 LED-Lampe gedacht die dauerhaft über ein Relaismodul eingeschaltet wird.
Mithilfe eines Schrittmotors, soll dich der "Spiegel" mit ca. 1U/min um die LED drehen, sodass eine Art Lichtkegel erscheint. Dies soll natürlich unabhängig von der Fensterbeleuchtung laufen.
Auch hier soll bei Überschreiten von Wert-X die Lampe und der Motor ausgehen.


agmue

Hier ein Bild des Leuchtturms,
Gruß an den Schwiegervater, meine Hochachtung!

Da lohnt sich jede Anstrengung für eine gute Beleuchtung!

den Turm gibt es nicht mehr.
Du meinst in der Realität, weshalb es für die Blinkfolge kein Vorbild gibt?

Leider ist es jetzt so, dass sobald der Wert-X wieder überschritten wird also Tag, das Programm gestoppt wird und nicht weiterläuft. Wird der Wert wieder unterschritten, wird das Programm an der Stelle fortgesetzt.
Du benötigst eine Hysterese: Bei Wert X einschalten, bei Wert Y ausschalten, wobei X "dunkler" ist als Y.

Als "Leuchtfeuer" sollte die LED sehr hell sein ...
Nach meinen Erfahrungen besser nicht. Niemand möchte nachts im Garten mit Sonnenbrille sitzen 8) 

Ich habe zwei Leuchttürme, die mit Kühlschrankbirnen 230 V 5 W betrieben wurden. Ich habe die dann auf 12 V 15 W umgerüstet, was mir aber zu hell war, weshalb ich sie auf 12 V 5 W rediziert habe. Bei LEDs verhält es sich dann noch etwas anders.

Habe jetzt an eine 230V G9 LED-Lampe ...
Die 230 V sind mir für Gartenbeleuchtung zu gefährlich, ein Kabel mit 12 V kann man gefahrlos durchhacken.

Mithilfe eines Schrittmotors, soll dich der "Spiegel" mit ca. 1U/min um die LED drehen, sodass eine Art Lichtkegel erscheint. Dies soll natürlich unabhängig von der Fensterbeleuchtung laufen.
Mechanik im Garten ist beispielsweise wegen Frost nicht ganz unproblematisch. Außerdem genügt ein kleiner DC-Getriebemotor für den gleichmäßigen Antrieb, da wird ja nichts positioniert.

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

timsieberg

Du meinst in der Realität, weshalb es für die Blinkfolge kein Vorbild gibt?
Ja genau.
Du benötigst eine Hysterese: Bei Wert X einschalten, bei Wert Y ausschalten, wobei X "dunkler" ist als Y.
Ok, werde ich mal probieren, jetzt ist es so:
 eingebaut  in den Sketch von noisca.
sensorWert = analogRead(eingang);
Serial.print("Sensorwert = " );
Serial.println(sensorWert);
if (sensorWert < 30){
{currentMillis = millis();
doPWM();                  
doRunning();
Einschaltung funktioniert, Wenn der Wert überschritten wird funktioniert es ja auch, nur nicht richtig es geht nicht aus sondern stoppt nur.

Nach meinen Erfahrungen besser nicht. Niemand möchte nachts im Garten mit Sonnenbrille sitzen 8)  
Ich habe zwei Leuchttürme, die mit Kühlschrankbirnen 230 V 5 W betrieben wurden. Ich habe die dann auf 12 V 15 W umgerüstet, was mir aber zu hell war, weshalb ich sie auf 12 V 5 W rediziert habe. Bei LEDs verhält es sich dann noch etwas anders.
Die 230 V sind mir für Gartenbeleuchtung zu gefährlich, ein Kabel mit 12 V kann man gefahrlos durchhacken
Die 230V hat er schon verlegt ;-). Okay das mit der Helligkeit werde ich mal im Hinterkopf behalten. Ärger bekommt wenn dann er mit den Nachbarn. 

Mechanik im Garten ist beispielsweise wegen Frost nicht ganz unproblematisch. Außerdem genügt ein kleiner DC-Getriebemotor für den gleichmäßigen Antrieb, da wird ja nichts positioniert.
Bekomme ich Getriebemotoren mit so kleiner Übersetzung? Das Getriebe ist ja auch Mechanik, aber ich verstehe was du meinst.

noiasca

#18
Nov 03, 2020, 11:18 am Last Edit: Nov 03, 2020, 11:24 am by noiasca
Quote
Leider ist es jetzt so, dass sobald der Wert-X wieder überschritten wird also Tag, das Programm gestoppt wird und nicht weiterläuft. Wird der Wert wieder unterschritten, wird das Programm an der Stelle fortgesetzt.
bezogen auf das "Leider": das hättest du programmatisch aber auch anders machen können.

Kleingetriebe findet man sicher im Modellbau.
Den Motor hat mir google ausgespuckt: https://at.rs-online.com/web/p/dc-getriebemotor/8347644/.

Andererseits wer sowas baut, der baut sich dann auch eine Untersetzung von 1,5 auf 1, oder 4 auf 1 ... sogesehen alles lösbar.

edit:
es ist ja jetzt dein Sketch aber so hätte ich das nicht gemacht.

Mach dir eine globale Funktion die ein istNacht = true oder false zurückgibt und frag das in den Funktionen doRunning bzw. doPWM ab. bei false schaltest du explizit die LEDs ab, bei true führst du durch so wie jetzt auch.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

michael_x

Quote
Einschaltung funktioniert, Wenn der Wert überschritten wird funktioniert es ja auch, nur nicht richtig es geht nicht aus sondern stoppt nur.
Das zeigt dein Code-Schnipsel leider nicht.

Zusätzlich ist evtl. sinnvoll, eine Verzögerung einzubauen, damit nicht eine kurze Helligkeitsänderung gleich den Leuchtturm an- bzw. abschaltet.
(Zum Testen kann man diese Verzögerung ja kürzer einstellen als hinterher im echten Betrieb)

noiasca

#20
Nov 03, 2020, 11:32 am Last Edit: Nov 03, 2020, 11:32 am by noiasca
doch zeigt es.

er stoppt das currentMillis update - kein wunder dass es "stehen bleibt". Er muss halt auch abschalten.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

michael_x

Toll, was du aus
Code: [Select]
if (sensorWert < 30){
{currentMillis = millis();
doPWM();                 
doRunning();

herauslesen kannst :)

noiasca

#22
Nov 03, 2020, 01:13 pm Last Edit: Nov 03, 2020, 01:14 pm by noiasca
Ich hatte ja meine Gründe weswegen das im loop steht und nicht in den do Funktionen.
Ich wäre aber nie auf die Idee gekommen, dass das jemand zum Anhalten missbrauchen würde.   :o
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

timsieberg

Ich hatte ja meine Gründe weswegen das im loop steht und nicht in den do Funktionen.
Ich wäre aber nie auf die Idee gekommen, dass das jemand zum Anhalten missbrauchen würde.   :o
So jetzt hat es Funktioniert, 
void doRunning()                              
{
  static uint8_t actual = totalNoLeds - 1;    
  static uint32_t previousMillis = 0;
  const uint8_t myIntervall = 2;              // Schenlligkeit Fenster in Sekunden
  sensorWert= analogRead(eingang);
  Serial.print ("Helligkeit= ");
  Serial.println (sensorWert);
if (sensorWert < 30){
  if (currentMillis - previousMillis >= myIntervall * 1000UL)
  {
    previousMillis = currentMillis;
    digitalWrite(ledPin[actual], LOW);
    actual++;
    if (actual >= totalNoLeds) actual = 0;
    digitalWrite(ledPin[actual], HIGH);
#if DEBUG_UART
Serial.print("actual Pin=");
   Serial.println(ledPin[actual]);
#endif
  }
}
else {
  digitalWrite(ledPin[actual], LOW);
}
}
So funktioniert es,
jetzt werde ich noch schauen das ich die var global vergebe.

noiasca

#24
Nov 03, 2020, 02:53 pm Last Edit: Nov 03, 2020, 03:00 pm by noiasca
nö, keine global.
mach dir eine Funktion die dir das Ergebnis aufbereitet.


ungeprüft:
Code: [Select]

bool isDark (void)
{
  bool result = true;
  if (analogRead(eingang) < 30) result = false 
  return result;
}


dann kannst mal bei Lust immer noch eine Hysterese (an einer zentralen Stelle) einbauen

vieleicht so:
Code: [Select]

bool isDark (void)
{
  static bool result = true;
  if (analogRead(eingang) < 30) result = false;
  else if (analogRead(eingang) > 60) result = true;
  return result;
}
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

timsieberg


Code: [Select]

bool isDark (void)
{
  bool result = true;
  if (analogRead(eingang) < 30) result = false  
  return result;
}

Danke werde ich mal reinbasteln ist auf alle fälle kürzer.

dann kannst mal bei Lust immer noch eine Hysterese (an einer zentralen Stelle) einbauen

vieleicht so:
Code: [Select]

bool isDark (void)
{
  static bool result = true;
  if (analogRead(eingang) < 30) result = false;
  else if (analogRead(eingang) > 60) result = true;
  return result;
}

Ob eine Hysterese hier so sinnig ist weiß ich nicht, ich denke es ist besser ein zeit einzusetzen WertX muss Y Sekunden unterschritten sein dann ist Dunkel. Andersrum genau so WertX muss Y Sekunden überschritten sein dann Tag. Nicht das mal ein Scheinwerfer eines Autos etc. draufscheint und dann geht alles aus. Wie seht ihr das?

noiasca

kannst auch machen. Auch das bringst du in dieser Funktion unter.  Einfach zweiteilig machen.
Einmal bei "Flankenänderung" den Zeitstempel merken, und im zweiten Teil dann auf millis-previousMillis prüfen.

how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

timsieberg

kannst auch machen. Auch das bringst du in dieser Funktion unter.  Einfach zweiteilig machen.
Einmal bei "Flankenänderung" den Zeitstempel merken, und im zweiten Teil dann auf millis-previousMillis prüfen.


und welche variable frage ich dann ab in der if um das doRunning zu beenden?

agmue

Wie seht ihr das?
Wäre das so schlimm? Du baust kein Atomkraftwerk ::)

Man kann es immer beliebig kompliziert machen und Zeit und Hysterese kombinieren. Du kannst auch den gleitenden Mittelwert zusammen mit der Hysterese verwenden, wäre so mein Tipp.

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

noiasca

#29
Nov 03, 2020, 03:54 pm Last Edit: Nov 03, 2020, 05:16 pm by noiasca
du fragst keine Variable ab sondern die Funktion return't das Ergebnis.

statt deinem

if (sensorWert < 30){


machst ein

if (isDark()){

oder

if (isDark() == true){

wie es dir halt besser gefällt.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Go Up