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
26.05.2014, 12:09
Beitrag #9
RE: Dämmerungsschalter
(25.05.2014 14:50)Chnz schrieb:  Genius Thorsten !!!
Danke.
Zitat:EEPROM Library
[...]
Hiermit wäre es also möglich die Option auch nach einem Stromausfall in dem EEPROM des Arduino zu speichern und wieder abzurufen?
Ja, Du musst Dir im EEPROM eine Speicherstelle (Adresse) aussuchen und dann kannst Du mit write() reinschreiben, was Du willst. Mit read() wird's dann wieder gelesen.
Man sollte nur darauf achten, nicht andauernd ins EEPROM zu schreiben, da es das nur so ungefähr 100.000 mal mitmacht.

Zitat:So hier also dein Sketch so wie ich ihn verstanden habe.
Code:
}else                                                   //
      if(now - LastChangeTime >= 10000) {                 // Bleibt NewLightDetectorState und LightDetectorState 10 sek ungleich so wird…..
Cool Du hast Dir das ja wirklich Bit für Bit angeschaut. Der einzige kleine Fehler: Oben muss es heißen "gleich" statt "ungleich". D.h. das Ding schaltet, wenn der Zustand 10 Sekunden lang gleich bleibt. (Er schaltet dann immer wieder, aber eben immer wieder das gleiche.)
Zitat:Aufs Arduino übertragen und siehe da es funktioniert! Glückwunsch hättest doch Gewähr drauf geben können !
Freut mich.
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
04.06.2014, 22:03 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2014 22:08 von Chnz.)
Beitrag #10
RE: Dämmerungsschalter
Danke für die Antwort!
Das mit dem EEPROM ist glaube ich noch weit weg. Habe die letzen Tage erst einmal nen bisschen (ein paar Stunden Confused) rumprobiert wie man es hinbekommt, dass das Relais nach 10 Sekunden abfällt nachdem der Lichtsensor den Zustand dunkel meldet. Abfallen tut es nun auch nach 10 Sekunden. Bloß kommt zwischendurch nur kurz Licht an den Sensor fängt das Arduino ja wieder an den else if - Befehl von vorne abzuwickeln (so habe ich es verstanden) und zack würde die Lampe länger brennen als gewollt. Habe mir überlegt wie man den Zustand nach dem das Relais auf "On" geschaltet hat für die nächsten Stunden "Merken" kann damit der else if – Befehl nicht bei zufällig kurzem Lichteinfall wieder erneut beginnt. Komme aber leider nicht auf nen passenden Lösungsweg.

Hier also mein Code:


Code:
/*In diesem Sketch soll ein Relais nach 5 Sek der Dunkelheit anziehen und nach 10 Sek abfallen. Um dann erst bei wieder eintretender Dunkelheit erneut nach 10 Sek abzufallen.
*/


const int relais = 3;
const int LightDetector = 2;


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

void loop() {
  
  static int LightDetectorState = 0;                      
  static unsigned long LastChangeTime = 0;
  static int relaisOff = 0;  
  static int relaisOn = 1;  
  int RelaisZuruecksetzen =1;
  int LightDetectorDarkSignal = 1;
  unsigned long now = millis();                          
                                                          
  int NewLightDetectorState = digitalRead(LightDetector);


  if(NewLightDetectorState != LightDetectorState) {    /*Toggeln des Lichtsensor Zustandes*/  
      LastChangeTime = now;                                    /*Setze LastChangeTime mit der vergangene Zeit "now" seit Start des MCU (micro controller unit) gleich.*/
      LightDetectorState = NewLightDetectorState;      /*Ändert "LightDetectorState" zum "NewLighDetectorState" und initialisiert so ein Toggeln.*/
      relaisOn = RelaisZuruecksetzen;                         /*Setzt "relaisOn" wieder auf 1 zurück da "relaisOn" in der letzten if-Bedingung auf 0 gesetzt wurde. Ohne Rücksetzen könnte man                                                                               das  Relais in den nächsten Schritten nicht mehr wieder anziehen lassen.*/
      
  }else if(LightDetectorState = LightDetectorDarkSignal){ /*Fragt den Zustand des "LightDetectorState" gegenüber dem "LightDetectorDarkSignal" ab und beginnt
                                                                                         nur mit dem nächsten Schritt wenn "LightDetectorState" = 1 ist also nur bei
                                                                                          Dunkelheit. So wird verhindert, dass nicht jedesmal wenn der LightDetectorState sich ändert der else if befehl auch bei
                                                                                           LightDetectorState = 0 also bei Helligkeit ausgeführt wird sondern nur bei Dunkelheit. */
                                                              
    
     if(now-LastChangeTime >5000){                           /* Zieht das Relais erst nach 5 Sek an (5 Sek = experimenteller Wert, muss in der Praxis noch ausgetüftelt werden!)
                                                                           so wird der instabile Übergang vom 0 zum 1 Signal des Lichtsensors aufgrund von dem langsamen Übergang von hell nach dunkel
                                                                            überbrückt und ein sicheres Schalten des Relais gewährleistet*/
    
     digitalWrite(relais,relaisOn);                          
   }
  
   if(now-LastChangeTime >10000){         /* Hier wird der Wert eingetragen z.B 10 Sek (experimentell = in der Praxis soll das Relais/Lampe nach z.B. 5 Stunden nachdem es dunkel
                                                                geworden ist abfallen) bei dem das Relais abfallen soll.*/                        
     relaisOn = relaisOff;
     digitalWrite(relais,relaisOff);
   } }}

Ist bestimmt einfach zu lösen. Vielleicht ist mein Code auch der totale nonsense (!) und man kann ihn gleich über Bord werfen. Wie oben geschrieben man müsste den Zustand nachdem es dunkel geworden ist irgendwie "Merken". Aber wie ???

Erst wenn der Code klappt traue ich mich an die EEPROM Geschichte und dann wird mein lieber Freund EAGLE ausgepackt und nen nettes Platinenlayout erstellt mit allem drum und dran. Nur um ein wenig vorwegzugreifen was ich noch so vor habe. Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.06.2014, 09:49
Beitrag #11
RE: Dämmerungsschalter
Hi,
als erstes fällt mal auf, dass das hier eine Zuweisung ist und kein Vergleich:
Code:
}else if(LightDetectorState = LightDetectorDarkSignal){
Es muss "==" heissen und nicht "=". Ansonsten weisst Du nur dem LightDetectorState den Wert von LightDetectorDarkSignal zu (immer 1, oder?). Das Ergebnis des Ausdrucks ist dann genau dieser Wert, also immer 1. Das ist also immer "true" und Du könntest es Dir auch komplett sparen.
Ich verstehe momentan auch nicht so genau, was das ganze eigentlich wirklich tun soll. Mein Vorschlag macht ja im Prinzip Folgendes:
  • Immer wenn es mindestens x Sekunden dunkel ist, dann Lampe einschalten.
  • Immer wenn es mindestens x Sekunden hell ist, dann Lampe ausschalten.
Mir ist jetzt nicht wirklich klar, was Du machen willst. Soweit ich es verstehe:
  1. Wenn die Lampe an ist, dann soll sie n Stunden an bleiben, auch wenn es zwischendurch wieder hell wird. ...oder...
  2. Wenn die Lampe an ist, dann soll sie nach n Stunden ausgehen, auch wenn es immer noch dunkel ist.

Dabei ist mit "es ist hell" oder "es ist dunkel" immer gemeint "mindestens seit x Sekunden".
Zu 1 oben: Hier muss man noch entscheiden, ob die Nachlaufzeit anfangen soll, wenn es wieder hell geworden ist, oder an der Stelle, an der es dunkel wurde.
Zu 2 oben: Was soll hier passieren, wenn die Lampe ausgeht, und es immer noch dunkel ist. Soll der Zyklus dann von vorne beginnen? ...oder soll das ganze System erst einmal warten, bis es hell wird und dann erst bei erneuter Dunkelheit von vorne anfangen?
Ich glaube, dass beides etwas zu unsicher bzw. nicht wirklich sinnvoll werden könnte. Ich persönlich würde bei dem ursprünglichen Teil bleiben und die Sekunden auf ein paar Minuten hochschrauben und fertig. Je nachdem, was wichtiger ist (Lampe an wenn dunkel oder Lampe aus wenn hell) kann man ja die eine oder die andere Zeit länger machen.
Aber es geht wahrscheinlich auch anders, nur musst Du Dir ganz genau überlegen, was das Teil tun soll.

Zitat:und dann wird mein lieber Freund EAGLE ausgepackt und nen nettes Platinenlayout erstellt mit allem drum und dran.
Interessant, kannst Du Platinen erstellen? Ich habe da auch so ein Projekt...
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
Antwort schreiben 


Gehe zu:


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