Die alte Hausnummernbeleuchtung wurde per Zeituhr gesteuert. Sie sollte bei Dämmerung einschalten, und dann bis etwa Mitternacht oder spätabends leuchten, um nächtlichen Besuchern den Weg zu weisen.
Leider war das mit einer Zeitschaltuhr recht lästig, im Sommer wird es erst um 22:00 dunkel (und die Hausnummernbeleuchtung muss nur noch für 1-2h eingeschaltet werden), im Winter wird es schon um 16:00 dunkel (und die Hausnummernbeleuchtung muss für etwa 7-8h leuchten).
Für die Hausnummernbeleuchtung V2.0 habe ich daher beschlossen, einen intelligenten Dämmerungssensor zu bauen, der die Jahreszeit mitberücksichtigt.
Ich hatte einige Zeit nach einer fertigen Lösung gesucht, aber keine gefunden.
Daher beschloß ich, selbst solch einen Sensor zu bauen.
Als Plattform wird ein Arduino verwendet, der dafür am besten geeigent ist. Dabei verwende ich aber kein Board, sondern nur den programmierten AVR.
Ein Schaltplan wurde erstellt, der die LED-Kette ein- und ausschaltet. Die erste Version war mit Relais und 5V-Regler, da zuerst eine andere LED-Kette Verwendung finden sollte.
Nach Umschwenken auf die nun verwendete Kette mit den WS2812-Controllern wurde eine weitere Version gebaut, da diese LED-Kette nur 5V Eingangsspannung benötigt, und daher der Spannungsregler überflüssig ist. Auf den Bildern zu sehen ist die Version 1.
Zum Schalten wurde in der ersten Version ein Relais verwendet, in der aktuellen ein MOS-FET, da ich kein 5V Relais fand, welches 8A schalten kann.
Der Schaltplan sieht so aus:
Die Schaltung wurde auf Lochraster aufgebaut, da sie ja nur einmal benötigt wird. Ich hab zwar noch ein Layout gemacht, jedoch mehr für den sinnvollen Aufbau auf Lochraster.
Die Problematik bestand darin, ohne Echtzeituhr zu erkennen, ob Sommer oder Winter ist, und die Leuchtdauer entsprechend einzustellen. Das Problem wurde dadurch gelöst, dass die Dauer der Nacht gemessen wird, und für die Längenberechnung ein Teil einer Sinuskurve verwendet wird. Die Länge des Tages über das Jahr ist ebenfalls eine Sinusfunktion.
Im Code werden Sekunden gezählt, und aus ihnen Minuten berechnet. Die Nachtlänge wird in Minuten gezählt, die Einschaltdauer ebenfalls.
Hier der Code:
int Eingang = 0;
int Ausgang = 2;
int Helligkeit[] = {300, 300, 300, 300, 300, 300, 300, 300, 300, 300};
int HellDurch = 350;
int i = 0;
int x = 1;
boolean Nacht = false;
int Nachtlaenge = 0;
double Beleuchtungsdauer = 5;
int UntereSchwelle = 150;
int ObereSchwelle = 250;
float sechs = 600;
float vier = 4.3;
void setup(){
pinMode(Eingang, INPUT);
pinMode(Ausgang, OUTPUT);
// Serial.begin(9600);
}
void loop(){
Minuten(); // Eine Minute warten
if (HellDurch <= UntereSchwelle) // ist es Nacht geworden?
{
Nacht = true; // Es ist Nacht
Nachtlaenge++; // Nachtlänge um eine Minute hochzählen
}
else if (HellDurch >= ObereSchwelle) // ist es Tag geworden?
{
if (Nacht == true) // das erste mal?
{
Beleuchtungsdauer = abs(cos((Nachtlaenge/sechs)+vier)*480); // Sinusfunktion zur Korrektur der Tageslängen zwischen Sommer und Winter
Nachtlaenge = 0;
}
Nacht = false; //Es ist Tag
digitalWrite(Ausgang,LOW);
}
else if (Nacht == true) // Zwischenwert Hysterese bei Nacht
{
Nachtlaenge++; // Nachtlänge um eine Minute hochzählen
}
if (Nachtlaenge < Beleuchtungsdauer && Nacht == true){ // Wenn es Nacht ist und die Beleuchtung an sein soll digitalWrite(Ausgang,HIGH); // Beleuchtung Einschalten } else { digitalWrite(Ausgang,LOW); // Beleuchtung ausschalten } } void Sekunden(){ Helligkeit[i] = analogRead(Eingang); // Helligkeitswert einlesen i++; if (i == 10) { HellDurch = (Helligkeit[0] + Helligkeit[1] + Helligkeit[2] + Helligkeit[3] + Helligkeit[4] + Helligkeit[5] + Helligkeit[6] + Helligkeit[7] + Helligkeit[8] + Helligkeit[9])/10; i=0; // Nehme den Durchschnitt aus 10 Messungen in 10 Sekunden } delay(1000); // Eine Sekunde warten // Serial.print("Helligkeit:"); // Serial.print(HellDurch); } void Minuten(){ for(int x = 1; x < 61; x++){ Sekunden(); // Serial.print(" Sekunden:"); // Serial.print(x); // Serial.print(" Nacht:"); // Serial.print(Nacht); // Serial.print(" Nachtlaenge:"); // Serial.print(Nachtlaenge); // Serial.print(" Beleuchtungsdauer:"); // Serial.print(Beleuchtungsdauer); // Serial.print(" Ausgang:"); // Serial.println(digitalRead(Ausgang)); } }
Die Probewerte f√ºr die seriuelle Schnittstelle hab ich mal dringelassen üôÇ
Eigentlich wollte ich das mit einem energiesparenden ATTiny machen, da ja nur ein Analogeingang und ein Schaltausgang benötigt wird. Es war aber grade keiner verfügbar, daher wurde es dann doch der normale Arduino AVR mit 16MHz Takt.
Für diese Aufgabe natürlich massiv oversized, aber mei...
Sollte es jemand nachbauen wollen: Viel Spaß damit!