Elektronik-Dachbude |
Die
derzeitige Konfiguration sieht so
aus:
Die Hauptsteuereinheit ist hier ein
Arduino Uno. Dieser
steuert via PWM vier der hier
vorgestellten Power-MOSFETs an. An diese habe ich ein
RGB-Stripe und eine Power-LED
angeschlossen.
Als Auslöser dient folgendes Bewegungsmelder-Modul:
Gleich fünf dieser Module hab ich
günstig in einem
namenhaften Online-Auktionshaus erworben. Mit zwei
Reglern kann man die Empfindlichkeit und die
Schaltdauer einstellen. Die Empfindlichkeit habe ich komplett hoch
gesetzt, die
Schaltdauer auf gering, denn der Arduino soll das Signal selbst
auswerten.
Allerdings wäre es mit diesen Modulen auch möglich, irgendetwas direkt
anzusteuern. Das Modul selbst läuft mit 5 V. Der Ausgangspegel liegt
bei 3,3 V,
was aber dennoch ausreicht um von einem Arduino als high erkannt zu
werden.
Alles in allem sieht das gelötete
Shield schließlich so aus:
An den Pins 11-9 ist der RGB Stripe
angeschlossen, am Pin 3
die Power-LED und an Pin 7 der Bewegungsmelder. Genaueres kann man im
Sketch
aber noch gut lesen.
Das Programm funktioniert ähnlich wie
die Analoge-Lösung von
damals, hat aber auch einige Verbesserungen:
Wenn der Bewegungsmelder ausgelöst wird, werden die RGB-LEDs langsam (ca. 2 Sekunden) auf einen angenehmen Gold-Gelb-Ton geschaltet. Diese Stufe wird dann eine Minute beibehalten. Zeigt der Melder dann immer noch eine Bewegung, wird die Power LED dazu geschaltet. Das hat den Zweck, dass man sich eben was aus der Küche holen kann, dabei aber nicht die volle Beleuchtung braucht. Bleibt man aber länger dort, um z.B. zu Kochen, wird auch das Arbeitslicht aktiviert. Wenn eine Minute lang keine Bewegung registriert wird, werden alle LEDs etwas dunkler. Das dient als Warnung, sodass man gegebenenfalls nochmal Triggern kann, und die LEDs wieder hell werden. Bleibt die Bewegung aus, erlischt das Licht komplett.
//Die LEDs
int rot= 10;
int gruen= 9;
int blau= 11;
int weiss = 3;
int iRot, iGruen, iBlau, iWeiss;
int sRot, sGruen,sBlau,sWeiss;
//Die Sensoren
int sens1 = 7;
int sens2 = A5;
void setup() {
pinMode(rot, OUTPUT);
pinMode(blau, OUTPUT);
pinMode(gruen, OUTPUT);
pinMode(weiss, OUTPUT);
pinMode (sens1, INPUT);
pinMode (sens2, INPUT);
}
void loop() {
if (digitalRead(sens1)){pKueche();}
}
void pKueche()
{
sFade (255,150,10,0,10);
delay(30000);
while (digitalRead(sens1)){
sFade (255,150,10,255,10);
for (int x=0; x<=60;x++){
delay(1000);
if (digitalRead(sens1)){x = 0;}
}
sFade(150,50,0,100,10);
for (int x=0; x<=20;x++){
delay(250);
if (digitalRead(sens1)){break;}
}
}
sFade(0,0,0,0,10);
}
void sFade(byte vRot, byte vGruen, byte vBlau, byte vWeiss, int vZeit)
{
for (int i=0; i<=255;i++)
{
if (vRot > iRot){sRot= sRot+1;}
if (vRot < iRot){sRot= sRot-1;}
if (vGruen > iGruen){sGruen= sGruen+1;}
if (vGruen < iGruen){sGruen= sGruen-1;}
if (vBlau > iBlau){sBlau= sBlau+1;}
if (vBlau < iBlau){sBlau= sBlau-1;}
if (vWeiss > iWeiss){sWeiss= sWeiss+1;}
if (vWeiss < iWeiss){sWeiss= sWeiss-1;}
sPwm(sRot, sGruen, sBlau, sWeiss);
delay(vZeit);
}
}
void sPwm(byte vRot, byte vGruen, byte vBlau, byte vWeiss)
{
analogWrite(rot, vRot) ;
analogWrite(gruen, vGruen) ;
analogWrite(blau, vBlau) ;
analogWrite(weiss, vWeiss) ;
iRot = vRot;
iGruen= vGruen;
iBlau = vBlau;
iWeiss = vWeiss;
}