Vor einigen Wochen habe ich kommentarlos dieses Video auf Youtube gepostet und viele Leser haben die Lösung natürlich gleich erraten.

Wie so oft ist das am wichtigsten, was man im Video nicht sieht. In diesem Fall ein Infrarot-Entfernungssensor von Sharp, der außerhalb des Bildes positioniert ist.

Der Projektaufbau ist eigentlich recht simpel. Der Sharp-IR-Sensor liefert einen Analogwert ans Arduino-Pin A0, der mit Hilfe der SharpIR Library in einen ungefähren Zentimeter-Wert umgerechnet wird. Damit die doch recht sprunghaften Messwerte des Sensors etwas geglättet werden, lege ich diese in einem Array mit den letzten 20 Messwerten ab und bilde daraus einen gleitenden Durchschnitt. Das führt auch zu einer schön fließenden Bewegung des beleuchteten LED-Bereichs.

Aus dem so ermittelten Abstand werden dann die LEDs auf dem WS2812B LED Streifen ermittelt, die eingeschaltet werden müssen. Fertig ist der Zauber.

Für das Projekt werden die folgenden Teile benötigt:

Arduino Uno R3 (oder ähnlich)
Sharp IR Sensor, z.B. GP2Y0A02YK
WS2812B LED Streifen (60 LEDs)
Netzteil mit 6V/4A
– Kleinteile wie ein Breadboard, 100 nF Kondensator, 200 Ohm Widerstand und einige Jumper-Kabel.

Hier das Tutorial-Video. Den benötigten Arduino-Sketch findet ihr weiter unten.

Die beiden im Sketch verwendeten Libraries können beide in der aktuellen Version über den Library Manager der Arduino IDE installiert werden.

/* WS2812B LED Stripe Magic - Demo
 * 
 * Sharp IR Sensor: Analog Pin A0
 * WS 2812B NeoPixel Pin: Digital 6
 * 
 * More information http://www.makerblog.at/2016/12/der-magische-ws2812b-led-streifen/
 * 
 */

#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUMPIXELS 60

#include <SharpIR.h>
#define ir A0
// Running average variables
const int numReadings = 20;
int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average
int newValue = 0;
int lastpixel = 0;

SharpIR sharp(GP2Y0A02YK0F, A0);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
 Serial.begin(115200);
 pixels.begin(); // This initializes the NeoPixel library.

 // Reset running average array
 for (int thisReading = 0; thisReading < numReadings; thisReading++) {
 readings[thisReading] = 0;
 }
}

void loop() {

 int dis=sharp.getDistance(); // this returns the distance to the object

 // map distance to LED strip
 // map 20-110cm distance to LEDs #0 to #59
 // play with this value to match your LED strip
 int dispix = map(dis,18,95,0,60);

 // Ignore results out of bound, send -10 to average array instead
 // This leads to LED marker gliding to end of strip when no object is within distance
 if ((dispix >= 0) && (dispix < 60)) {
 newValue = dispix;
 } else {
 newValue = -10;
 }

 // Running average code from
 // https://www.arduino.cc/en/Tutorial/Smoothing
 // subtract the last reading:
 total = total - readings[readIndex];
 // read from the sensor:
 readings[readIndex] = newValue;
 // add the reading to the total:
 total = total + readings[readIndex];
 // advance to the next position in the array:
 readIndex = readIndex + 1;
 // if we're at the end of the array...
 if (readIndex >= numReadings) {
 // ...wrap around to the beginning:
 readIndex = 0;
 }
 // calculate the average:
 int avePos = total / numReadings;

 // set LEDs with following function and show them
 draw(avePos);
 pixels.show();

}

// Simple function resetting all pixels and lighten some around desired distance
void draw(int pix) {

 for (int i=0; i<60; i++) {
 pixels.setPixelColor(i, pixels.Color(2,0,0)); 
 } 
 pixels.setPixelColor(pix-2, pixels.Color(0,0,30)); 
 pixels.setPixelColor(pix-1, pixels.Color(0,0,100)); 
 pixels.setPixelColor(pix, pixels.Color(0,0,250)); 
 pixels.setPixelColor(pix+1, pixels.Color(50,0,50)); 
 pixels.setPixelColor(pix+2, pixels.Color(20,0,20)); 
}

Alle benötigten Teile gibt es bei Amazon:

Viel Spaß beim Nachbauen! Fragen und Anregungen bitte einfach in die Kommentare schreiben.

20 thoughts on “Pure Magie! WS2812B LED Streifen mit Sharp IR Entfernungssensor

  • 2. Januar 2017 at 0:28
    Permalink

    Hey,

    Ist es auch möglich den Aufbau mit einem Ultraschallsensor statt einem Infarotsensor zu bauen, der kann doch die Entfernung auch messen?

    Wenn ja wie würde denn der Sketch denn aussehen?

    Vielen Dank

    Reply
    • 3. Januar 2017 at 14:11
      Permalink

      Hi, die gängigen Ultrasonic-Sensoren wie die HC-SR04 Modelle funktionieren ja etwas anders und überlassen die Zeitmessung zwischen Ping und Echo meistens dem Arduino. Dazu gibt es eine sehr gute Library hier https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home – die ist mit fast allen Sensoren kompatibel und sehr gut dokumentiert.
      Ich werde den Sketch auf einen HC-SR04 anpassen und ebenfalls veröffentlichen.

      Reply
      • 3. März 2017 at 20:43
        Permalink

        Hallo,
        danke für die tolle Arbeit.
        Die Anpassung ein den HC-SR04 würde ich mir auch wünschen.
        Habe es selber probiert, aber als Anfänger komme ich da irgendwie nicht weiter

        Reply
      • 7. Mai 2018 at 19:58
        Permalink

        Did you ever write the SR04 version of this sketch?

        Reply
      • 18. März 2022 at 15:37
        Permalink

        Hallo mein Name ist Christoph ich wollte fragen wo ich den angepassten sketch mit ultraschallsensor finden kann für das magische Licht

        Mfg
        Christoph

        Reply
  • Pingback: PIR Sensor / Bewegungsmelder am Arduino – Makerblog.at

  • 1. März 2017 at 18:01
    Permalink

    Hallo, wo bekommt man die aktuelle Library für den LED Streifen. Es wird vielfach berichtet, dass die Librarys nicht funktionieren.

    Reply
  • 18. September 2017 at 7:36
    Permalink

    Guten Tag,

    ist es möglich mit so einem Infrarot sensor auch messungen im Millimeter bereich durchzuführen?

    Reply
  • 29. September 2018 at 23:19
    Permalink

    Hi,
    Hast du schon mit dem ultrasonic mal probiert ob es funktioniert. Hätte auch Interesse an ultrasonic.

    Reply
  • 29. Oktober 2018 at 14:57
    Permalink

    Hallo,
    ich habe einen led Streifen “ rgbww5″ und wollte ihn für dieses Projekt nutzen. Leider funktioniert das nicht so einfach. Die Neopixel Library geht dafür nicht. Kann mir jemand helfen für meinen LED-Streifen eine Library und Programm zu finden?

    Vielen Dank
    Ardufrosch

    Reply
    • 30. Oktober 2018 at 14:50
      Permalink

      Bist du dir sicher, dass es sich bei deinem LED-Strip um einzelen ansteuerbare LEDs handelt? RGBWW steht meiste für „RGB warm white“ und bezeichnet oft LED-Streifen, bei denen alle LEDs in der gleichen Farbe leuchten. Eigentlich müsste das an den Eingängen erkennbar sein, wie sind denn die Pins an deinem Streifen beschriftet?

      Reply
  • 20. Juli 2019 at 16:58
    Permalink

    Hallo,
    Ich habe den sketch 1zu1 kopiert und nur die Anzahl der der LEDs geändert. Die Librarys sind installiert, doch beim Kompilieren kommt folgende Fehlermeldung:
    ‚GP2Y0A02YK0F‘ was not declared in this scope
    Vielleicht kann mir ja jemand helfen,
    Vielen Dank und Gruß. Bernie

    Reply
      • 23. Juli 2019 at 9:08
        Permalink

        Hallo,
        ich habe das Problem gelöst indem ich in der Zeile „SharpIR sharp(GP2Y0A02YK0F, A0);“ das „GP2Y0A02YK0F“ durch die Zahl 1 ersetzt habe (ich habe einen GP2Y0A21 Sensor und in der lib sind die unterschiedlichen Sensoren nummeriert). Dann ließ sich der Sketch kompilieren.
        Nun läuft das LED Licht zwar, jedoch mit einem nervigen Fehler: es blinken ständig wahllos unterschiedliche LEDs in verschiedenen Farben auf, auch die die eigentlich Leuchten sollen wechseln vereinzelt ganz kurz die Farbe. Dies ist unabhängig vom Analogen Eingang, passiert also auch wenn ich den Sharp Sensor abgezogen habe. Sheit am Ausgang des UNOs zu liegen. Habe es schon mit einem anderen Ausgang versucht – ändert sich nichts.

        Reply
        • 23. Juli 2019 at 10:11
          Permalink

          Wegen des Flackerns: Wie versorgst du die LEDs mit Strom? Eventuell ist die Stromversorgung nicht stabil genug. Und: Hast du GND der LEDs und vom Arduino miteinander verbunden? Das kann sonst auch zu diesem Effekt führen.

          Reply
          • 23. Juli 2019 at 11:29
            Permalink

            JUCHUUU
            Das wars! Der fehlende Potentialausgleich.
            Vielen Dank für die Hilfe, bin noch blutiger Anfänger auf dem Gebiet ;)
            Gruß Bernie

          • 23. Juli 2019 at 11:50
            Permalink

            Die nicht verbundenen GNDs haben mich irgendwann mal bei einem Projekt viele Stunden gekostet. Sowas vergisst man dann nicht mehr :)

          • 24. Juli 2019 at 11:57
            Permalink

            Noch eine Frage, jetzt wo es so schön läuft:
            Wie bekomme ich denn zwei identische LED-Stripes angeschlossen? Einfach beide Steuerleitungen zusammen an pin6 oder muss ein zweiter Ausgangs-pin angesteuert werden? ….und wenn ja – wie? ;)

  • 18. März 2022 at 15:36
    Permalink

    Hallo mein Name ist Christoph ich wollte fragen wo ich den angepassten sketch mit ultraschallsensor finden kann für das magische Licht

    Mfg
    Christoph

    Reply
  • 18. März 2022 at 18:06
    Permalink

    Hi wo kann man den sketch mit dem ultraschallsensor finden?

    Reply

Schreibe einen Kommentar zu Bernie Antworten abbrechen

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

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.