Dämmerschalter

Hallo Leute,

Also kurz zum projekt muss mir einen Dämmerung sschalter basteln der Eine Led einschaltet die dann blinkt. Das ganze soll als Einbruchsschutz als quasi dummy auf die Fensterscheibe kommen :))))

Jz hab ich nur das problem das der LDR auch Fremdlicht erkennt. Ist es möglich die Zeit zu messen und wenn der Wert länger als 30sek überschritten wird dann erst zu schalten. Ich würde eine kleine überlegung von euch brauchen :slight_smile: Danke im Vorraus

lg daniel

das ist sogar sehr einfach möglich...
gehört zu den Grundlagen :slight_smile:

Ist mir eh sehr peinlich bin aber befasse mich leider noch nicht sehr lange mit der Materie:) also quasi zeit zählen und wenn die >30 dann HIGH soviel ist mir klar:) es scheitert jedoch am code :slight_smile:
lg

Du solltest es mit millis (BlinkWithoutDelay) machen und den aktuellen Wert speichern und diesen dann immer wieder vergleichen.
Wenn deine gewünschte Zeit (30 sek) rum ist, die Led blinken (BlinkWithoutDelay) lassen. Wobei 30 sek. sehr kurz sind. Ich würde da schon Minuten wählen.

Ok Blink without delay is klar das ist schon mal gut.
de zeit von 30 sek war nur frei gewählt und da muss i dann eh schaun was sinnvoll ist:) danke schonmal für deine Antwort.
Wie würde das dann mit dem speichern und abfragen aussehn?zuerst muss ich ihn mal zhlen lassen oder? lg

Hier wurde ein ähnliches Thema schon besprochen,

nimm das Beispiel für dein Projekt, ich denke das passt.

http://forum.arduino.cc/index.php?topic=371040.msg2559935#msg2559935

Du musst es nur für dich anpassen.

delfi:
Jz hab ich nur das problem das der LDR auch Fremdlicht erkennt. Ist es möglich die Zeit zu messen und wenn der Wert länger als 30sek überschritten wird dann erst zu schalten. Ich würde eine kleine überlegung von euch brauchen :slight_smile:

Abgesehen davon, dass echte LDRs das hochgiftige Schwermetall Cadmium enthalten und deshalb gar nicht verwendet werden sollten (so wie es die industriellen Gerätehersteller seit Verabschiedung und Inkrafttreten der RoHS Richtlinie machen), weil so das verbastelte Schwermetall irgendwann im Müll landen wird, wäre der größe Fehler:

  • Leuchtmittel und Lichtsensor so anzuordnen, dass das Leuchtmittel den Sensor beleuchtet
  • und dann noch gleichzeitig zu messen, während das Licht gerade blinkt

Entweder muß das Leuchtmittel so leuchten, dass es NICHT den Sensor beleuchtet.
Oder die Lichtmessung muss erfolgen, während das Leuchtmittel gerade nicht leuchtet/blinkt.

Hallo,

das Problem hatte ich bei meiner Helligkeitssteuerung in meinem Schwippbogen. Habe 2 LDRs verbaut. Einen mußte ich abkleben. Die sitzen unten waagerecht in den Raum schauend und werden von den inneren LEDs nicht angestrahlt. Das gedimmte Licht vom Schwippbogen im dunklem Raum reichte jedoch aus um über die spiegelnde Fensterbank zurück zum LDR zugelangen, sodass dieser ganz langsam wieder heller wurde. Verrückt. Über Weihnachten reichte das abkleben eines LDRs. Ich möchte das aber noch über eine Hysterese im Code lösen. Dann dimmt er zwar nicht mehr stufenlos je nach Raumhelligkeit, aber damit wird man wohl leben müssen. Oder ich lass einen abgeklebt bzw. bau ihn ganz raus. Mal sehen.

Hallo,

im Prinzip bräuchtest du Blinkwithoutdelay nur mit einer zweiten Zeitabfrage zu ergänzen.

if (analogRead(LDRpin)>Schwellwert) {LDRmillis=millis();} //LDRmillis wird nur über dem Schwellwert aktualisiert und bleibt unterhalb "stehen"
if (millis()-LDRmillis>LDRIntervall) {Blinkenwithoutdelay;}
    else {digitalWrite(Ledpin,Low)};

Hier ist ein Beispiel, wie du mit der gleichen LED, wenn sie gerade nicht leuchtet, die Helligkeit messen kannst. Habe ich schon probiert, funktioniert gut

Hallo Leute,

also bin wirklich blutiger Anfänger. Ich sitze schon seit Tagen und bekomm es nicht hin das meine Led blinkt wenn der Messwert der LDR über 150 ist. und dann eben das problem mit der Zeit die vergehen soll bevor die LED blinken anfängt.

wäre euch sehr dankbar wenn mir hier wer weiterhelfen könnt.
Momentan steck ich bei dem Code fest und bin langsam echt am verzweifeln.
Alles was ich bis jetzt versucht habe führte leider nicht zum Erfolg :frowning:

lg daniel

int LDR = A1;
const int LED = 12;
int sensorWert = 0;
int ledState = LOW;
unsigned long vergangeneMillis = 0; 
const long interval = 1000;


void setup(){

Serial.begin(9600);
pinMode (LED, OUTPUT);

}

void loop(){

sensorWert =analogRead(LDR);
 Serial.print("Sensorwert = " );
 Serial.println(sensorWert);
 

 unsigned long aktuelleMillis = millis();

  if (aktuelleMillis - vergangeneMillis >= interval) {
   
    vergangeneMillis = aktuelleMillis;

 if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    
    digitalWrite(LED, ledState);
  }
}

delfi:
also bin wirklich blutiger Anfänger. Ich sitze schon seit Tagen und bekomm es nicht hin das meine Led blinkt wenn der Messwert der LDR über 150 ist. und dann eben das problem mit der Zeit die vergehen soll bevor die LED blinken anfängt.

wäre euch sehr dankbar wenn mir hier wer weiterhelfen könnt.
Momentan steck ich bei dem Code fest und bin langsam echt am verzweifeln.
Alles was ich bis jetzt versucht habe führte leider nicht zum Erfolg :frowning:

Dann beschreibe doch erstmal die gewünschte Programmlogik ganz genau!

Als erstes mal brauchst Du beim Schalten nach Helligkeit eine Hysterese, denn analogWerte sind immer mehr oder weniger schwankend, können also z.B. beim Messen immer zwischen 150 und 151 hin- und herspringen, was dann dazu führen würde, dass Deine Programmlogik ständig das Blinken ein- und ausschaltet.

Also brauchst Du getrennte Schaltpunkte für das Ein- und Ausschalten, z.B.:

  • bei >=175 blinken einschalten
  • bei <=125 blinken ausschalten
    Und der Bereich von 126 bis 174 wäre dann der Hysterese-Bereich, in dem bei schwankenden Messwerten immer der letzte Schaltzustand beibehalten wird.

Und wie genau soll das Blinken ablaufen?
Periodendauer in Millisekunden?
Davon Einschaltdauer der LED wie lange?

Danke für die Rasche Antwort.

Hätte mir das so vorgestellt.

Das ganze sollte als quasi Dämmerungsschalter funktionieren.
sollte ein gewisser Helligkeitswert überschritten werden sollte die LED zu blinken beginnen.
Sie sollte alle 5000ms kurz aublinke für 100ms oder so.

Das Problem ist das auf diesen Platz wo das laufen sollte immer wieder Autos mit Scheinwerfer reinleuchten und die würden mir dann quasi das blinken abschalten:-)
Jetzt wäre super wenn der Schwellwert einen gewissen Wert überschritten hat die Zeit anfängt zu laufen und erst nach 1min überschreiten die Led zu blinken beginnen sollte und eben beim ausschalten genauso.

Hoffe du hast meine Logik so halbwegs verstanden :slight_smile:

delfi:
Das Problem ist das auf diesen Platz wo das laufen sollte immer wieder Autos mit Scheinwerfer reinleuchten und die würden mir dann quasi das blinken abschalten:-)
Jetzt wäre super wenn der Schwellwert einen gewissen Wert überschritten hat die Zeit anfängt zu laufen und erst nach 1min überschreiten die Led zu blinken beginnen sollte und eben beim ausschalten genauso.

Hoffe du hast meine Logik so halbwegs verstanden :slight_smile:

Nö, nicht so ganz.

Also bei Dunkelheit möchtest Du 1/10s Blinken pro 5 Sekunden.

Wenn Du nun die Hell-/Dunkelmessung jedesmal durchführen würdest, unmittelbar bevor die 0.1s Blinkdauer beginnen, wäre es dann wirklich so schlimm, wenn diese 0.1s Blinkdauer mal ausfallen, wenn gerade ein Auto mit seinen Scheinwerfern in Deine Schaltung reinleuchtet?

Mal angenommen, die Autoscheinwerfer leuchten nach 5 Sekunden nicht mehr, dann würde die nächste Hell-/Dunkelmessung nach 5s wieder "dunkel" ergeben, und es würde sofort wieder 0.1s lang blinken. Und wenn die Autoscheinwerfer 17 Sekunden lang leuchten, würde dreimal Blinken ausfallen und erst nach 20 Sekunden würde es wieder 0.1s lang blinken.

Ist das so schlimm, dass es zu den Blinkzeitpunkten nicht blinkt, wenn gerade ein Autoscheinwerfer Deine Schaltung blendet?

Also es soll alle 5s unbedingt jedesmal für 0.1s blinken, auch wenn mal 3s, mal 5s, mal 17s oder vielleicht auch mal 60s lang Autoscheinwerfer Deinem LDR Helligkeit simulieren, obwohl es draussen weiterhin dunkel ist?

In dem Fall brauchst Du einen Tiefpassfilter, der die Ergebnisse der Lichtmessungen durch einen Tiefpassfilter sendet und nur langsame Änderungen des zum Schalten verwendeten Werts zuläßt.

Wie lang sollen denn die Autoscheinwerfer Deine Schaltung blenden können, ohne dass das Blinken abschaltet? Eine Minute? Zwei Minuten? Drei Minuten? Fünf Minuten?

Hallo ja genau das sollte immer 1/10s alle 5sek blinken auch wenn der Autischeinwerfer ihn blendet also so 1 minute sollte ok sein. Da dies als Dummy in ein schaufenster kommen sollte ist das leider zwingend notwendig lg

Hallo, ich habe Deinen Sketch etwas verändert. Den Tiefpass kann man noch verbessern, ist eine schnell zu realisierende Variante. Wenn sich die Messungen auf das Tageslicht beziehen, kannst Du die Meßintervalle noch vergrößern. Versuch macht klug:

const int LDR = A1;
const int LED = 13;
int aktSensorWert, altSensorWert;
bool ledState = LOW;
unsigned long messMillis, blinkMillis, aktuelleMillis;
const unsigned long messZeit = 1000;
unsigned long blinkZeit;

void setup() {
  Serial.begin(9600);
  pinMode (LED, OUTPUT);
  aktSensorWert = analogRead(LDR);
  altSensorWert = aktSensorWert;
}

void loop() {
  aktuelleMillis = millis();
  if (aktuelleMillis - messMillis >= messZeit) {
    messMillis=aktuelleMillis;
    aktSensorWert = analogRead(LDR);
    altSensorWert = ((5 * altSensorWert) + aktSensorWert) / 6;
    Serial.print("Sensorwert = " );
    Serial.print(aktSensorWert);
    Serial.print("   berechneter Wert = " );
    Serial.println(altSensorWert);
  }
  if (altSensorWert > 175) {
    if (aktuelleMillis - blinkMillis >= blinkZeit) {
      blinkMillis = aktuelleMillis;
      if (ledState == LOW) {
        ledState = HIGH;
        blinkZeit = 100;
      } else {
        ledState = LOW;
        blinkZeit = 2000;
      }
      digitalWrite(LED, ledState);
    }
  } else {
    digitalWrite(LED, LOW);
  }
}

@jurs: Sorry wenn ich mich einmische, aber ich feiere diese Woche ein Jahr aktiv im Forum. Daran bist ja nicht ganz unschuldig mit Deinen schönen Beispielen, von denen ich viel gelernt habe. :grin:

Hallo agmue!

Sieht schon nicht so schlecht aus aber kann ich mir das jetzt irgendwie ausrechen welche Zeit er jz Lichteinfluss haben kann oder hängt das davon ab wo er gerade beu den Werten ist oder?

kanst du mir das mal kurz etwas erklären. Tut mir leid bin leider noch mehr oder weniger am anfang mit dem
Arduino und beneide euch echt sehr.

mfg
Daniel

Das Prinzip ist eine Gewichtung der Werte, wobei der vergangene Wert fünfmal stärker gewichtet wird. Diesen Multiplikator habe ich willkürlich gewählt. Dadurch werden kurze "Störungen" unterdrückt. Allerdings geht der analoge Meßwert in die Rechnung ein, ein helleres Licht wird stärker berücksichtigt. Reden wir denn ansonsten über das Tageslicht? Das verändert sich naturgemäß nur recht langsam. Da könnte ein anderer Algorithmus besser geeignet sein. Wenn man beispielsweise "0" für kleiner Grenzwert und "1" für größer nimmt, eliminiert man den analogen Meßwert.

Übrigens fehlt noch die Hysterese, die hatte ich nicht berücksichtigt.

Hallo

Ja es geht grundsätzlich um das Tageslicht.
Die Led sollte zu blinken beginnen wenn es dunkel wird und diese dann auch gegen Lichtstörungen wie einen Autoscheinwerfer immun sein.

könntest du mir bei diesen Sketch noch weiter helfen dazu wäre ich dir sehr dankbar.

mfg

Eine Variante mit Hysterese und deutlich träger: Ein Scheinwerfer benötigt ca. 1 Minute für eine Störung.

const int LDR = A1;
const int LED = 13;
int aktSensorWert;
long rechenWert;
bool ledState = LOW;
unsigned long messMillis, blinkMillis, aktuelleMillis;
const unsigned long messZeit = 1000;
unsigned long blinkZeit;


void setup() {

  Serial.begin(9600);
  pinMode (LED, OUTPUT);
}

void loop() {
  aktuelleMillis = millis();
  if (aktuelleMillis - messMillis >= messZeit) {
    messMillis = aktuelleMillis;
    aktSensorWert = analogRead(LDR);
    if (aktSensorWert > 175) {
      rechenWert = ((99 * rechenWert) + 1000) / 100;
    }
    if (aktSensorWert < 125) {
      rechenWert = ((99 * rechenWert) - 1000) / 100;
    }
    Serial.print("Sensorwert = " );
    Serial.print(aktSensorWert);
    Serial.print("   berechneter Wert = " );
    Serial.println(rechenWert);
  }
  if (rechenWert > 0) {
    if (aktuelleMillis - blinkMillis >= blinkZeit) {
      blinkMillis = aktuelleMillis;
      if (ledState == LOW) {
        ledState = HIGH;
        blinkZeit = 100;
      } else {
        ledState = LOW;
        blinkZeit = 2000;
      }
      digitalWrite(LED, ledState);
    }
  }
  if (rechenWert < 0) {
    digitalWrite(LED, LOW);
  }
}