Nachtlicht für erwachsene

Wer nachts hin und wieder mal hoch muss und nicht blind durchs Schlafzimmer laufen möchte, kennt vermutlich das Problem des viel zu hellen Lichts, wenn man seine normale Decken oder Nachttisch Beleuchtung einschaltet.

Abhilfe schafft hier natürlich ein simples Nachtlicht mit Bewegungsmelder. Ab in die Steckdose und fertig!
Aber wer eine etwas moderner und elegantere Lösung wünscht, dem ist damit nicht geholfen. So war es auch bei mir.
Daher kam mir die Idee eine LED Beleuchtung an meinem Bettkasten zu befestigen. Mittlerweile (2018) gibt es dafür zahlreiche Lösungen die genau das anbieten was ich mir gewünscht habe, aber 2015 sah das anders aus. Deshalb habe ich mir einfach ein paar Teile im Internet besorgt und das ganze selbst gebaut.

Dieser Artikel dient nicht als komplette Anleitung zum nachbauen, vielmehr als Beispiel und zur Ideengebung für Ähnliche Projekte.

Funktionsweise

Mein Ziel war es eine Beleuchtung zu haben die auf Bewegung reagiert, jedoch nicht bei Tageslicht. Außerdem wollte ich das Licht auch nicht einfach nur an und aus haben. Es soll langsam an dimmen und auch wieder aus dimmen. Um die Helligkeit nach bedarf auch mal anpassen zu können, wollte ich noch einen Regler zum einstellen der maximalen Helligkeit installieren.

Hardware

Ich habe mir bei meinem Aufbau den Arduino Nano selbst zusammen gebaut, um eine kompaktere Bauweise zu ermöglichen. Darauf werde ich hier aber nicht weiter eingehen.

Leider habe ich nur ein Bild vom Breadboard mit dem selbst zusammengebauten Arduino und ohne angeschlossenen PIR Modulen und LED Stripe.

Software

Hier ist der Code den ich für meinen Arduino geschrieben habe.
Schön ist anders, aber es sollte schnell gehen 🙈
Ich denke die Kommentare im Code sollten ausreichen, um zu verstehen was da passiert.

// fade
int led = 9;               // PIN9 - LED stripes
int brightnessRoom = 1000; // how bright is the room (initial 1000 = daylight)
int brightnessLed = 0;     // how bright the LED is (initial 0 = off)
int brightnessMax = 120;   // initial max brightness of the LEDs
int fadeAmount = 1;        // how many points to fade the LED by

// motion detection
int pir1 = 7;      // PIN7 - movement sensor 1
int pir2 = 8;      // PIN8 - movement sensor 2
int movement1 = 0; // is a movement on pir1 detected (1) or not (0)
int movement2 = 0; // is a movement on pir2 detected (1) or not (0)

// status
int state = 0; // light on (1) or off (0)
int loops = 0; // loop counter for timer
int timer = 0; // counts the seconds

void setup() {
  pinMode(led, OUTPUT);
  pinMode(pir1, INPUT);
  pinMode(pir2, INPUT);
  
  //Serial.begin(9600); // debugging
}

void loop() {
  /***** brightness in room *****/
  int brightnessRoom = analogRead(A0);
  
  /***** movement *****/
  movement1 = digitalRead(pir1);
  movement2 = digitalRead(pir2);
  
  /***** check if light should go on *****/
  if (brightnessRoom <= 1 && (movement1 == HIGH || movement2 == HIGH)) {
    state = HIGH;
  }
  
  if (state == HIGH) {
    if (loops % 10 == 0) {
      timer++;
    }
    loops++; 
  }
  
  if (timer == 60) {
    state = 0;
    loops = 0;
    timer = 0;
  }
  
  /***** check potentiometer *****/
  int potVal = analogRead(A5);
  brightnessMax = potVal * (255 / 1023.0);

  /***** in case we went to high, go back to max brightness *****/
  if (brightnessLed > brightnessMax) {
    brightnessLed = brightnessMax;
    if (state == HIGH) {
      analogWrite(led, brightnessLed);
    }
  }

  /***** in case we went to low, go back to 0 *****/
  if (brightnessLed < 0) {
    brightnessLed = 0;
  }
  
  /***** fade on *****/
  if (state == HIGH) {
    if (brightnessLed < brightnessMax) {
      brightnessLed = brightnessLed + fadeAmount;
      
      analogWrite(led, brightnessLed);
    }
  }

  /***** fade off *****/
  if (state == LOW) {
    if (brightnessLed > 0) {
      brightnessLed = brightnessLed - fadeAmount;
      
      analogWrite(led, brightnessLed);
    }
  }
  
  //String debug = String(brightness) + " - " + String(brightnessMax) + " - " + String(state);
  //Serial.println(debug);
  
  delay(100);
}