Die automatisierte Küchenbeleuchtung

Kuecheleuchte2

Vor geraumer Zeit habe ich ja bereits meine automatisierte Küchenleuchte vorgestellt (Link). Diese war auch lange Zeit in Benutzung, aber nun war es doch an der Zeit, einen Mikrocontroller den Job übernehmen zu lassen. Der Grund ist vor allem, dass es leichter ist das Programm seinen Wünschen anzupassen. Insgesamt habe ich nämlich vor, die Automatisierung immer weiter zu verbessern.

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:

Kuecheleuchte3

Gleich fünf dieser Module hab ich günstig in einem namen haften 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:

Kuecheleuchte1

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.

Das Listing

Listing

//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;
}

[collapse]

YouTube Film