LED Treppenlicht – smoother fade in and fade out mit Bewegungserkennung.

 

Nach dem der Artikel
LED Lauflicht mit Bewegungserkennung  
so gut angekommen und auch gut angenommen wird, bekommt dieser Beitrag ein Update mit mehreren Effekten.

V1 beinhaltet das durchlaufen der LED von oben
bzw. von unten nach oben :


In V2 des Codes werden die LED smooth hoch und anschließend wieder runtergeregelt.


Da wir hier keinen Arduino mit W-Lan verwenden, ist ein Effekt umschalten nur durch erneutes „flashen“ möglich.

Meine Idee dazu:

Einen Arduino Uno WiFi zu nehmen, eine kleine Android APP und ab geht es, ok so schnell dann doch nicht, ist aktuell auf meiner Agenda 🙂
( IOS wird es nicht geben! )
So kann dann per APP entschieden werden welchen Effekt wir auslösen wollen nach dem der Bewegungsmelder eine Bewegung erkannt hat.

Um diesmal die Übersicht zu wahren, werden die Details mittel Spoiler versteck und erst beim anklicken sichtbar!

Was benötige ich?:

1 x Arduino UNO R3 ohne WiFi
1 x Arduino Uno Wifi ( Wemos D1 R2 WiFi )
1 x Arduino Uno Gehäuse**
2 x HC-SR501 Bewegungsmelder
1 x Lichtsensor 
5m ws2812b ( oder die länge die benötigt wird )
5V Netzteil
Jumperkabel
Die länge an Kabel die benötigt werden
Lötkolben
Kondensator 1000uF 25V
Schrumpfschlauch 
Werkzeug

Meine Seite ist Mitglied des Amazon Partnerprogramms, ich verdiene für jedes Produkt das über einen meiner Amazon Links in den Beiträgen gepostet wurde eine Provision (~3% )

**Gehäuse aus meinem Shop, steht bald zur Verfügung ( Stand 04.12.2020 )
Preis wird sich voraussichtlich auf 3,50- 3,80€ + 0,80€ Versand belaufen.
Vielen Dank im voraus.

 

Anschlussplan Arduino UNO

Dieser Anschluss ist nur geeignet wenn der Arduino per USB mit Stromversorget wird:

Ein Anschluss ohne USB:

5V –> Arduino UNO PIN : VIN
Masse –> Arduino UNO PIN : GND

Achtung!!!!!

Niemals USB und Externe Stromversorgung gleichzeitig nutzen!

Farbsystem per Hexadezimalwert

Unter folgenden Link könnt Ihr die Hexadezimalwerte per Klick festlegen und notieren ( # wird nicht verwenden ):

https://html-color-codes.info/webfarben_hexcodes/

Die ersten 2 Zeichen stehen für ROT,
Der zweite Satz von zwei Zeichen steht für GRÜN
Die letzten 2 Zeichen stehen für BLAU.

Wir müssen vor jedem Hex-Wert  ein „0x“ hinzufügen
(„0x“ bezeichnet einen Hexadezimalwert).

Beispiel:
Dieses „blau“ ist 0101DF.
Die hexadezimalen Werte: Rot ist 01, Grün ist 01 und Blau ist DF.

Im späteren Code muss die Eingabe dann wie folgt aussehen:

FadeInOut(0x01, 0x01, 0xDF);
Arduino Code

Der alte Code kann nicht erweitert bzw verwendet werden, Zugehörigkeiten haben sich geändert! Bitte beachten ggf anpassen!

Hilftext ist soweit im Code hinterlegt!

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN_links 6 //links
#define PIN_rechts 7 // rechts
#define NUMPIXELS 120
Adafruit_NeoPixel pixxels = Adafruit_NeoPixel(NUMPIXELS, PIN_links, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixxel = Adafruit_NeoPixel(NUMPIXELS, PIN_rechts, NEO_GRB + NEO_KHZ800);
const int bewegung_oben = 8; // PIR Oben 
const int bewegung_unten = 9; // PIR Unten
const int lichtsensor = 10; // Lichtsensor 
int bewegungsstatus_oben = 0; // Hilfsvariable 
int bewegungsstatus_unten = 0; // Hilfsvariable 
int lichtsensor_status = 0; // Hilfsvariable 
int i = 0; // Hilfsvariable 
bool running = false; // Läuft der Durchgang? Beim Starten auf false ( falsch ) setzen
long previousMillis = 0; // Setze Bisherige Millisekunden auf 0
long int pause = 20000; // Die Zeit bestimmt die haltezeit der LED bis diese zurück auf 0 geht. 
int fadeingeschwindigkeit = 35; // Millisekunden für den Fadeeffekt beim Aufleuchten
int fadeoutgeschwindigkeit = 50; // Millisekunden für den Fadeeffekt beim Abdunkeln


void setup() {
 pinMode(bewegung_oben, INPUT);
  pinMode(bewegung_unten, INPUT);
  pinMode(lichtsensor, INPUT);
  Serial.begin(9600);
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  pixxels.begin();
  pixxel.begin();
  pixxel.show();
  pixxels.show();
}


void loop() {

  // Frage PIR und Lichtsensor ab ## ANFANG
bewegungsstatus_oben = digitalRead(bewegung_oben);
bewegungsstatus_unten = digitalRead(bewegung_unten);
lichtsensor_status = digitalRead(lichtsensor);
// Frage ab ## ENDE

// Module beide keine Bewegung erkannt, trotz Dunkelheit? Schalte die LED aus:
if(lichtsensor_status == HIGH and bewegungsstatus_oben == LOW and bewegungsstatus_unten == LOW) {
 for (int i=0; i<120; i++) {
 pixxels.setPixelColor(i, pixxels.Color(0,0,0)); 
 pixxel.setPixelColor(i, pixxel.Color(0,0,0));
 pixxel.show();
 pixxels.show();
 } 
 }
// ENDE 

// Laut Lichtsensor ist es "hell" genug? Schalte die LED aus:
 if(lichtsensor_status == LOW) {
  for (int i=0; i<120; i++) {
 pixxels.setPixelColor(i, pixxels.Color(0,0,0)); 
 pixxel.setPixelColor(i, pixxel.Color(0,0,0));
 pixxel.show(); 
 pixxels.show();
 } 
 }
// ENDE

// 
if (bewegungsstatus_oben == LOW)
  {
    running = false;
  }
  if (bewegungsstatus_unten == LOW)
  {
    running = false;
  }
  // erst wenn running auf false steht und bewegung oben erkannt wurde ( Lichtsensor auf high) -> ( also wenig licht ) soll geschaltet werden
if (bewegungsstatus_oben == HIGH and bewegungsstatus_unten == LOW and lichtsensor_status == HIGH and running == false)
  {

/*
Farbtabelle befindet sich hier: https://html-color-codes.info/webfarben_hexcodes/
Die ersten 2 Zeichen stehen für ROT,
Der zweite Satz von zwei Zeichen steht für GRÜN
Die letzten 2 Zeichen stehen für BLAU.

Wir müssen vor jedem Hex-Wert  ein "0x" hinzufügen
("0x" bezeichnet einen Hexadezimalwert).

Beispiel:
Dieses "blau" ist 0101DF.
Die hexadezimalen Werte: Rot ist 01, Grün ist 01 und Blau ist DF.
*/
     
FadeInOut(0x33, 0xFF, 0x0A);
//nach dem Ablauf setze running auf true um ein erneutes sofortiges neustarten zu verhindern. 
running = !running; 
}
  // erst wenn running auf false steht und bewegung unten erkannt wurde ( Lichtsensor auf high) -> ( also wenig licht ) soll geschaltet werden
if (bewegungsstatus_oben == LOW and bewegungsstatus_unten == HIGH and lichtsensor_status == HIGH and running == false)
  {
/*
Farbtabelle befindet sich hier: https://html-color-codes.info/webfarben_hexcodes/
Die ersten 2 Zeichen stehen für ROT,
Der zweite Satz von zwei Zeichen steht für GRÜN
Die letzten 2 Zeichen stehen für BLAU.

Wir müssen vor jedem Hex-Wert  ein "0x" hinzufügen
("0x" bezeichnet einen Hexadezimalwert).

Beispiel:
Dieses "blau" ist 0101DF.
Die hexadezimalen Werte: Rot ist 01, Grün ist 01 und Blau ist DF.
*/
FadeInOut(0x33, 0xFF, 0x0A);
//nach dem Ablauf setze running auf true um ein erneutes sofortiges neustarten zu verhindern. 
running = !running; 
}


} // LOOP ENDE 

// Smoother fade in fade out 

void FadeInOut(byte red, byte green, byte blue){
  unsigned long currentMillis = millis(); // setze millis
  float r, g, b;
         for(int k = 0; k < 256; k=k+1) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showPIXXELs();
    delay(fadeingeschwindigkeit);
  }
  // Pause wie definiert:
  delay(pause);
  //ENDE
        for(int k = 255; k >= 0; k=k-2) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showPIXXELs();
    delay(fadeoutgeschwindigkeit);
  } 
}
//Smoother fade in fade out ENDE 


//WEITERE EFFEKTE: rennendes Licht

void RunningLights(byte red, byte green, byte blue, int WaveDelay) {
  int Position=0;
 
  for(int j=0; j<NUMPIXELS*2; j++)
  {
      Position++; // = 0; //Position + Rate;
      for(int i=0; i<NUMPIXELS; i++) {
        // sine wave, 3 offset waves make a rainbow!
        //float level = sin(i+Position) * 127 + 128;
        //setPixel(i,level,0,0);
        //float level = sin(i+Position) * 127 + 128;
        setPixel(i,((sin(i+Position) * 127 + 128)/255)*red,
                   ((sin(i+Position) * 127 + 128)/255)*green,
                   ((sin(i+Position) * 127 + 128)/255)*blue);
      }
     
      showPIXXELs();
      delay(WaveDelay);
  }
}

// ENDE 
// EFFEKT: REGENBOGEN ANFANG 
  
  void rainbowCycle(int SpeedDelay) {
  byte *c;
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< NUMPIXELS; i++) {
      c=Wheel(((i * 256 / NUMPIXELS) + j) & 255);
      setPixel(i, *c, *(c+1), *(c+2));
    }
    showPIXXELs();
    delay(SpeedDelay);
  }
}

byte * Wheel(byte WheelPos) {
  static byte c[3];
 
  if(WheelPos < 85) {
   c[0]=WheelPos * 3;
   c[1]=255 - WheelPos * 3;
   c[2]=0;
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   c[0]=255 - WheelPos * 3;
   c[1]=0;
   c[2]=WheelPos * 3;
  } else {
   WheelPos -= 170;
   c[0]=0;
   c[1]=WheelPos * 3;
   c[2]=255 - WheelPos * 3;
  }

  return c;
}
//Regenbogen ENDE


void showPIXXELs() {
 #ifdef ADAFRUIT_NEOPIXEL_H
  pixxel.show();
  pixxels.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H
    pixxel.setPixelColor(Pixel, pixxel.Color(red, green, blue)); // Beide LED Streifen aktivieren
    pixxels.setPixelColor(Pixel, pixxels.Color(red, green, blue)); // Beide LED Streifen aktivieren
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUMPIXELS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showPIXXELs();
}



Die Effekte Rennendes Licht und Regenbogen werden wie folgt angesteuert:

REGENBOGEN, die ZAHL in den Klammern ist eine Pause, einfach mal mit spielen.

rainbowCycle(20); anstelle von:  FadeInOut(0x33, 0xFF, 0x0A);

Rennendes Licht, Farbwerte wie oben Definiert eingeben, die ZAHL am Ende ist eine Pause, einfach probieren was einem Gefällt.

RunningLights(0x33,0xFF,0x0A, 50); anstelle von: FadeInOut(0x33, 0xFF, 0x0A);

Vielen Dank fürs Lesen und nachbauen dieses Projektes.

Kaffee spendieren?

 

7 Replies to “LED Treppenlicht – smoother fade in and fade out”

    1. Hallo Seyit,

      die WS2812B LED müssen zwingend mit Strom von extern versorgt werden.
      Wenn möglich sollten alle 2,5 Meter die Streifen neu mit Strom versorgt werden, da sonst ein zu höher Spannungsabfall vorliegt und die LED ab dieser Stelle dunkler werden.

      Wichtig ist das die Streifen mit GND des Arduino verbunden ist. ( GND Netzteil : GND Arduino )

      Grüße

  1. Hi vielen Dank für die schnelle Antwort
    Ich hab jetzt alles soweit verkabelt und installiert.
    Die led’s leuchten
    Aber irgendwie machen sie was sie wollen ich komme nicht weiter hab alles versucht ich denke ich hab nen fehler im Code.
    Wenn es dir möglich ist könntest du dich mit mir in Verbindung setzten ich bekomme so langlam die kriese😄

    1. Hallo Seyit,

      hmm, das natürlich schade.
      Kannst Du mir einen Schaltplan und den Sketch mal an folgende Adresse senden: p.vens-cappell@online,de ?

      Ich schaue dann mal drüber, vielleicht fällt mir ja was auf.

      Grüße

  2. Hallo,
    das Projekt sieht echt super aus!
    Leider habe ich bei der Umsetzung ein Problem und zwar habe ich die AVR/POWER Library wie sie am Anfang included wird nicht installiert.
    Kannst du mir sagen welche Libarary zu installieren ist?
    Beste Grüße

    1. Hallo,

      vielen Dank.
      Sollte es beim Kompilieren zu Problemen kommen wird versucht es auf einem nicht AVR ( UNO oder nano etc ) zu schreiben.

      Sie können die Zeile auch löschen wenn Sie keinen AVR kompatiblem Controller verwenden.
      Die Bibliothek ist speziell für diese Controller geschrieben und ist fester Bestandteil der Arduino Standard-Bibliotheken.
      https://www.nongnu.org/avr-libc/user-manual/index.html

      Sollte es unerwartet zu Problemen führen, melden Sie sich einfach bitte nochmal.

      Grüße 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.