INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Dämmerungsschalter
18.05.2014, 21:37 (Dieser Beitrag wurde zuletzt bearbeitet: 22.05.2014 20:26 von Chnz.)
Beitrag #1
Smile Dämmerungsschalter
Guten Morgen, guten Mittag oder guten Abend was auch immer bei euch gerade sein mag Smile.

Dies ist mein erster Beitrag und ich will euch direkt mein aktuelles Projekt vorstellen. Es handelt sich um einen Dämmerungsschalter, welcher eine Außenlampe vor unserer Haustür bei ausreichender Dunkelheit einschalten soll.
Dabei gibt es verschiedene Probleme für die ich keine Antwort finde da mir vor allen Dingen die Kenntnisse im Umgang mit der Programmierung noch Probleme machen. Somit hoffe ich bei euch die nötigen Denkanstöße und Lösungen zu finden.
Fürs Erste eine Draufsicht des Aufbaus der Schaltung:

   

Hier noch ein kleiner Verdrahtungsplan Blush:

   



Wie ihr sehen könnt habe ich bereits drei Bauteile besorgt.
Ein „Arduino Nano“ (Nachbau), ein Lichtsensor sowie ein 5 V Relais zum Schalten des Lampendrahts.
Die Verdrahtung steht soweit und der Grundbaustein der Programmierung ist auch schon gelegt. Das Relais schaltet sobald es dunkel wird.


Nun seit ihr gefragt.
Ich habe mir den Schaltvorgang folgendermaßen überlegt. Sobald der Schwellenwert von hell nach dunkel erreicht ist (oder anders rum) und der Lichtsensor dem Arduino Nano ein "1" Signal gibt, dass es dunkel ist, soll das Relais mit Verzögerung von 3-5 Min schalten. Die Verzögerung (delay) wird aufgrund des Schwellenwerts eingebaut da der Lichtsensor kein eindeutigen High bzw. Low Pegel ausgibt. Ohne diese Verzögerung hat das Relais immer angefangen wie wild zu klappernRolleyes. Nachdem also die Verzögerung abgelaufen ist zieht das Relais an und die Außenlampe leuchtet für eine einstellbare Zeitspanne von z.B. 5 Stunden bevor sie wieder aus geht. Oder Optional geht die Lampe wieder aus wenn es wieder hell wird.

So nun habt ihr einen ersten Überblick von meinem Projekt.
Ich hoffe hier kompetente Hilfe zu finden und freue mich auf die ersten Antworten und eventuell noch coole Ideen und Verbesserungen.Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.05.2014, 22:04
Beitrag #2
RE: Dämmerungsschalter
Hi,
das klingt alles ganz sinnvoll, aber wo ist Deine Frage?
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2014, 05:18
Beitrag #3
RE: Dämmerungsschalter
(18.05.2014 22:04)Thorsten Pferdekämper schrieb:  Hi,
das klingt alles ganz sinnvoll, aber wo ist Deine Frage?
Gruß,
Thorsten

Vielleicht war die Frage, ob das mit der Verzögerung so sinnvoll ist.
Ich würde dieses Problem anders lösen, und zwar so wie unter http://www.arduinoforum.de/arduino-Threa...ty-Control bereits geschrieben.

Gruß, Alex
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2014, 07:25
Beitrag #4
RE: Dämmerungsschalter
(19.05.2014 05:18)AlexRegensburg schrieb:  Ich würde dieses Problem anders lösen, und zwar so wie unter http://www.arduinoforum.de/arduino-Threa...ty-Control bereits geschrieben.
Hi,
ich glaube nicht, dass man her mit Hysterese arbeiten kann, da der Lichtsensor anscheinend nur zwei Werte kennt: "hell" oder "dunkel". Was sollte man da als Hysterese-Schwellwerte benutzen?
Mit etwas Glück hat der Lichtsensor sogar schon eine Hysterese eingebaut. Trotzdem ist es meiner Meinung sinnvoll, eine Art Verzögerung einzubauen. Man will wohl kaum sofort das Licht ausschalten, nur weil ein Autoscheinwerfer es sehr hell macht oder einschalten, nur weil ein Witzbold mal kurz die Hand vor den Sensor hält.
Ich denke, dass hier das richtige Stichwort "entprellen" ist, auch wenn der Lichtsensor ein sehr langsamer "Schalter" ist. Also, wenn das Licht gerade aus ist, dann nur einschalten, wenn der Lichtsensor für mindestens x Minuten "dunkel" sagt. Wenn das Licht gerade an ist, dann nur ausschalten, wenn der Lichtsensor für mindestens y Minuten "hell" sagt.
Die richtigen Werte für x und y muss man wohl experimentell ermitteln.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.05.2014, 10:25
Beitrag #5
RE: Dämmerungsschalter
(19.05.2014 07:25)Thorsten Pferdekämper schrieb:  ich glaube nicht, dass man her mit Hysterese arbeiten kann, da der Lichtsensor anscheinend nur zwei Werte kennt: "hell" oder "dunkel". Was sollte man da als Hysterese-Schwellwerte benutzen?
Richtig. Das hatte ich überlesen. Er geht ja auch auf einen Digital-Eingang. Bin erst von Analog ausgegangen.

Zitat:Mit etwas Glück hat der Lichtsensor sogar schon eine Hysterese eingebaut.
Das offensichtlich nicht, weil das Relais ja zittert.

Zitat:Ich denke, dass hier das richtige Stichwort "entprellen" ist, auch wenn der Lichtsensor ein sehr langsamer "Schalter" ist. Also, wenn das Licht gerade aus ist, dann nur einschalten, wenn der Lichtsensor für mindestens x Minuten "dunkel" sagt. Wenn das Licht gerade an ist, dann nur ausschalten, wenn der Lichtsensor für mindestens y Minuten "hell" sagt.
Die richtigen Werte für x und y muss man wohl experimentell ermitteln.
Das klingt gut Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.05.2014, 22:20 (Dieser Beitrag wurde zuletzt bearbeitet: 20.05.2014 22:21 von Chnz.)
Beitrag #6
RE: Dämmerungsschalter
Heyy,
klasse sind ja schon nen paar Antworten eingetrudelt! Danke erstmal dafür Smile

Erst einmal ein Zitat von Thorsten :
Zitat:Man will wohl kaum sofort das Licht ausschalten, nur weil ein Autoscheinwerfer es sehr hell macht oder einschalten, nur weil ein Witzbold mal kurz die Hand vor den Sensor hält.
Ich denke, dass hier das richtige Stichwort "entprellen" ist, auch wenn der Lichtsensor ein sehr langsamer "Schalter" ist. Also, wenn das Licht gerade aus ist, dann nur einschalten, wenn der Lichtsensor für mindestens x Minuten "dunkel" sagt. Wenn das Licht gerade an ist, dann nur ausschalten, wenn der Lichtsensor für mindestens y Minuten "hell" sagt.
Die richtigen Werte für x und y muss man wohl experimentell ermitteln.
Gruß,
Thorsten

Ganz richtig erkannt. Da die Lampe an einer Gasse steht und des öfteren Autos vorbeifahren kann es durchaus zu diesem Szenario kommen. Allerdings gibt es auch noch ein anderes Problem. Über der Haustür hängt eine weitere Lampe, welche mit Bewegungsmelder geschaltet wird. Diese ist also auch eventuell ein Störfaktor für den Lichtsensor.
Hier eine kleine Draufsicht um eure Vorstellung etwas anzuregen :

   

Aufgrund dieser Störfaktoren wäre es denke ich wie Thorsten schon geschrieben hat am günstigsten, wenn die Lampe nur dann einschalten, wenn der Lichtsensor für mindestens x Minuten „dunkel“ sagt und die Lampe dann am besten für eine einstellbare Zeit an bleibt und dann ausgeht(Option 1). Oder wie auch schon erwähnt nach y Minuten die der Lichtsensor „hell“ sagt die Lampe wieder ausgeht(Option 2).

Jetzt also zu mein/er/en Frage/n.Tongue
Wie kann man Option 1 oder Option 2 (oben Kursiv geschrieben) in einem Arduino Sketch schreiben ? Am liebsten wäre es mir wenn man beide Optionen in einem Sketch schreibt und dort dann jeweils die Option einfach auswählt. Natürlich wäre mir Option 1 oder Option 2 in jeweils einem einzelnen Sketch auch recht. Bloß würde mich interessieren wie man so eine „Optionswahl“ realisiert (nur um es zu lernen). Habe bis jetzt noch keine richtige Vorstellung wie man sowas realisiert. Aber man soll ja nichts überstürzen.

Hier mein erster Sketch Schnipsel:

const int relais = 3;
const int lightdetector = 2;

int lightdetectorState = 0;

void setup(){
pinMode (relais,OUTPUT);
pinMode (lightdetector,INPUT);
}

void loop(){
lightdetectorState = digitalRead(lightdetector);

if (lightdetectorState == HIGH){
delay(10000);
digitalWrite(relais,HIGH);
}

if (lightdetectorState == LOW){
delay(5000);
digitalWrite(relais,LOW);
}
}
Habe hier schon eine erste Frage zum Sketch. Sobald der Lichtsensor (lightdetector) im Dunkeln ist und ein HIGH Signal sendet läuft eine Verzögerung von 10000 ms also 10 Sekunden an. Nach diesen 10 Sekunden zieht das Relais an. Lasse ich nun wieder Licht an den Lichtsensor sollte man meinen das Relais fällt nach den eingestellten 5000ms wieder ab. Leider hält es aber auch hier über den Zeitraum der ersten Verzögerung also 10000ms. Da ist schon was falsch! Aber was ? Huh

Also wie kann man Option 1 und Option 2 vernünftig realisieren? eventuell auch in einem Sketch ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.05.2014, 23:04
Beitrag #7
RE: Dämmerungsschalter
(20.05.2014 22:20)Chnz schrieb:  klasse sind ja schon nen paar Antworten eingetrudelt! Danke erstmal dafür Smile
Bitteschön, und los geht's...
Zitat:Hier eine kleine Draufsicht um eure Vorstellung etwas anzuregen :
Sehr hübsch Smile
Zitat:die Lampe nur dann einschalten, wenn der Lichtsensor für mindestens x Minuten „dunkel“ sagt und die Lampe dann am besten für eine einstellbare Zeit an bleibt und dann ausgeht(Option 1). Oder wie auch schon erwähnt nach y Minuten die der Lichtsensor „hell“ sagt die Lampe wieder ausgeht(Option 2).
Wie wär's mit Option 3: Solange der Lichtsensor mindestens x Minuten "dunkel" gesagt hat, lasse die Lampe mindestens y Minuten an. Ist ja Blödsinn, die Lampe ausgehen zu lassen und dann nach x Minuten wieder an, wenn's immer noch dunkel ist, oder? (Vielleicht ist Option 3 eigentlich dasselbe wie Option 2, da bin ich mir nicht sicher.)
Zitat:Wie kann man Option 1 oder Option 2 (oben Kursiv geschrieben) in einem Arduino Sketch schreiben ? Am liebsten wäre es mir wenn man beide Optionen in einem Sketch schreibt und dort dann jeweils die Option einfach auswählt.
Immer einen Schritt nach dem anderen. Such Dir erstmal eine Option aus und implementiere die. Dann mach einen neuen Sketch und implementiere eine andere Option, wenn Du das immer noch willst. Dann benenne die loop() aus dem ersten Sketch um nach loop1() und die im zweiten nach loop2(). Dann beides in einen dritten Sketch kopieren, in dem die loop() so aussieht:
Code:
void loop() {
  if(option1) loop1();
  if(option2) loop2();
};
option1 und option2 musst Du mit irgendwas ersetzen, was Du von aussen beeinflussen kannst.
Zitat:Bloß würde mich interessieren wie man so eine „Optionswahl“ realisiert
Du brauchst halt irgendeine Kommunikation mit Deinem Arduino. Wenn Du nur einen Lichtsensor hast, dann musst Du ihm sowas wie Morsecodes beibringen, um option1 und option2 zu setzen. Ansonsten eine Taste oder so. (Über Seriell und einen Rechner bringts nicht so, da Du dann auch gleich schnell einen neuen Sketch hochladen kannst.)
Wenn Du die Optionsauswahl per Taste oder Morsecodes machen willst und über einen Stromausfall retten willst, dann such mal nach "Arduino EEPROM".
Zitat:Hier mein erster Sketch Schnipsel:
...das nächste mal bitte mit code-Tags. (Siehe oben)

Zitat:Lasse ich nun wieder Licht an den Lichtsensor sollte man meinen das Relais fällt nach den eingestellten 5000ms wieder ab. Leider hält es aber auch hier über den Zeitraum der ersten Verzögerung also 10000ms. Da ist schon was falsch! Aber was ? Huh
Naja, außer den beiden delays ist da nichts, was wirklich Zeit verbraucht. In dem Moment, in dem wieder Licht drauffällt, bist Du in der delay(10000), da vorher lightdetectorState auf HIGH war. D.h. Du musst im Mittel 5 Sekunden warten, bis das nächste mal lightdetectorState = digitalRead(lightdetector); ausgeführt wird. Dann musst Du nochmal die 5 Sekunden auf delay(5000) warten, bis das Relais schaltet. Macht in Summe im Durchschnitt 10 Sekunden. qed
Zitat:Also wie kann man Option 1 und Option 2 vernünftig realisieren? eventuell auch in einem Sketch ?
Vielleicht erstmal kleinere Brötchen backen und vergessen, dass es die delay()-Funktion gibt. Das willst Du nämlich gar nicht. Fang mal damit an, dass die Lampe angeht, wenn es mindestens 10 Sekunden dunkel ist und wieder aus, wenn es mindestens 10 Sekunden hell ist. In Deinem Sketch reicht es nämlich, wenn es mal kurz im richtigen Moment hell oder dunkel ist.
Das folgende ist aus dem Kopf, also ohne Gewähr.
Code:
void loop() {
  static unsigned long lastChangeTime = 0;

  unsigned long now = millis();
  int newLightdetectorState = digitalRead(lightdetector);
  if(newLightdetectorState != lightDetectorState) {  // state changed
     lastChangeTime = now;      // it just changed
     lightdetectorState = newLightdetectorState;  // remember the new one
  }else    // also eine Weile gleich geblieben
      if(now - lastChangeTime >= 10000) {   // 10 Sekunden gleich geblieben?
         digitalWrite(relais,lightdetectorState);
      };
  }
}

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.05.2014, 14:50
Beitrag #8
RE: Dämmerungsschalter
Genius Thorsten !!! ist ja genial dein Sketch Big Grin habe zwar zwei Stunden gebraucht um den einigermaßen zu checken mit meinen Kenntnissen aber ich denke ich habe es verstanden. Dazu gleich aber mehr.

Zitat:Sehr hübsch
Jaahaa schon fast ein Kunstwerk !
Zitat:Immer einen Schritt nach dem anderen. Such Dir erstmal eine Option aus und implementiere die. Dann mach einen neuen Sketch und implementiere eine andere Option, wenn Du das immer noch willst. Dann benenne die loop() aus dem ersten Sketch um nach loop1() und die im zweiten nach loop2(). Dann beides in einen dritten Sketch kopieren, in dem die loop() so aussieht:
Code:
void loop() {
if(option1) loop1();
if(option2) loop2();
};

Ok hast recht. Machen wir so. Mal sehen ob ich die Option 1 selber hinbekomme. Also die wo die Lampe dann nach einer eingestellten Zeit wieder ausgeht auch wenn es noch dunkel ist. 
Zitat:Bloß würde mich interessieren wie man so eine „Optionswahl“ realisiert.
Du brauchst halt irgendeine Kommunikation mit Deinem Arduino. Wenn Du nur einen Lichtsensor hast, dann musst Du ihm sowas wie Morsecodes beibringen, um option1 und option2 zu setzen. Ansonsten eine Taste oder so. (Über Seriell und einen Rechner bringts nicht so, da Du dann auch gleich schnell einen neuen Sketch hochladen kannst.)
Wenn Du die Optionsauswahl per Taste oder Morsecodes machen willst und über einen Stromausfall retten willst, dann such mal nach "Arduino EEPROM".

Jaaa Morsecodes Big Grin Natürlich könnte man so machen. Macht hier aber, so denke ich wenig Sinn. Zumal ich für so einen Sketch noch viel zu wenig Erfahrung habe. Interessant wäre es trotzdemTongue .
Gut die Idee mit dem Taster ist wohl am sinnvollsten. Und klar du hast recht über USB könnte man natürlich ruck zuck nen neuen Sketch hochladen.
Stromausfall, ahhh mist. Das Arduino setzt sich ja nach einem Stromausfall zurück:/
Das habe ich zu EEPROM gefunden:
Zitat:EEPROM Library
The microcontroller on the Arduino board has EEPROM: memory whose values are kept when the board is turned off (like a tiny hard drive). This library enables you to read and write those bytes.
The microcontrollers on the various Arduino boards have different amounts of EEPROM: 1024 bytes on the ATmega328, 512 bytes on the ATmega168 and ATmega8, 4 KB (4096 bytes) on the ATmega1280 and ATmega2560.
Functions
• read()
• write()

Hiermit wäre es also möglich die Option auch nach einem Stromausfall in dem EEPROM des Arduino zu speichern und wieder abzurufen?
Gut in der Annahme, dass es möglich ist werde ich zur Schaltung noch einen Taster hinzufügen. Aber erst einmal kleine Brötchen backen nicht wahr WinkIdea. Soll heißen die Optionswahl kann noch was wartenExclamation

Zitat:Zitat:Hier mein erster Sketch Schnipsel:
...das nächste mal bitte mit code-Tags. (Siehe oben)
Zur Kenntnis genommen. Wink

So hier also dein Sketch so wie ich ihn verstanden habe.
Code:
const int relais = 3;
const int LightDetector = 2;


void setup(){
    pinMode (relais,OUTPUT);
    pinMode (LightDetector,INPUT);
}
  

void loop() {
  static int LightDetectorState = 0;                      //Das Keyword 'static' wird benutzt, um einer Funktion eine Variable zu geben,
                                                          //die nur dort sichtbar ist und zusätzlich auch zwischen Funktionsaufrufen ihren Wert beibehält.
                                                          //Diese Variable hat auch nur eine feste Adresse welche bei jedem Funktionsaufruf gleich bleibt.
                                                          // Im Vergleich dazu werden normale lokale Variablen jedes Mal erzeugt, wenn die Funktion aufgerufen wird und am Ende auch wieder gelöscht.
                                                          //Static Variablen werden zum ersten und einzigen Mal erzeugt, wenn die Funktion zum ersten Mal aufgerufen wird.
  static unsigned long LastChangeTime = 0;                // Behält die letzte Zeit in der sich am Lichtsensor etwas geändert hat!

  unsigned long now = millis();                           //Gibt die Anzahl an Millisekunden zurück,
                                                          //die vergangen sind seit dem das Arduino Board das aktuelle Programm ausführt!
  int NewLightDetectorState = digitalRead(LightDetector); // newLightdetectorState fragt den Status des lightdetector ab.

  if(NewLightDetectorState != LightDetectorState) {       // Status geändert ? Ja oder Nein ?  (!= bedeutet ungleich)
     LastChangeTime = now;                                // Sobald ein ungleicher Wert festgestellt wird übernimmt "LastChangeTime" den Wert von "now" also die Zeit die nach dem Start des Sketch vergangen ist.
     LightDetectorState = NewLightDetectorState;          // "LightDetectorState" nimmt nun den Wert des "NewLightDetectorState" an.
  }else                                                   //
      if(now - LastChangeTime >= 10000) {                 // Bleibt NewLightDetectorState und LightDetectorState 10 sek ungleich so wird…..
         digitalWrite(relais,LightDetectorState);         // LightDetectorState je nach Zustand des LightDetector an bzw. aus geschaltet.
                                                          
                                                  

      };
  }
Aufs Arduino übertragen und siehe da es funktioniert! Glückwunsch hättest doch Gewähr drauf geben können !
Jetzt noch Option1, also die wo die Lampe dann nach einer eingestellten Zeit wieder ausgeht auch wenn es noch dunkel ist realiserien. Dann können wir uns drum kümmern wie man die Optionswahl implementiert.

Gruß Christoph
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste