IR Sensor zu auslösen LED Stripe

Hi

Sorry das mit nicht gelöst habe ich nicht gewusst bzw. Ich weiß gar nicht wo das geht ?

Ich hatte aber ein Feedback gegeben.

Wäre aber echt super wenn du mir trotzdem noch einmal helfen würdest.

Wünsche allen ein schönes Wochenende

Gruß

Evtl. musst du dich bis morgen gedulden.
Aber das bekommen wir hin.

Keine Angst das habe nicht übersehen, alles lesen bringt Licht in die Dunkelheit ;)

Hi

Das wäre ja wirklich prima :+1::+1::+1:

Vielen lieben Dank

Nur Lauflicht

// Forensketch 10 Sekunden Pixel Lauflicht
// based on https://forum.arduino.cc/t/ir-sensor-zu-auslosen-led-stripe/1249286/16
// Erster Stand: Lauflicht ohne delay()

#include <Adafruit_NeoPixel.h>

constexpr byte irPin {2}; // Pin, an dem der IR-Sensor angeschlossen ist ( von D0 auf Digital 2 aufn Board)
constexpr byte pixelPin {7}; // Hier wird angegeben, an welchem digitalen Pin die WS2812 LEDs bzw. NeoPixel angeschlossen sind
constexpr byte NUMPIXELS {60}; // Hier wird die Anzahl der angeschlossenen WS2812 LEDs bzw. NeoPixel angegeben

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, pixelPin, NEO_GRB + NEO_KHZ800);

void setup()
{
  Serial.begin(115200);
  Serial.println(F("\r\nStart...\r\n"));
  pixels.begin();
}

void loop()
{
  pixelLauflicht(20);
}

void pixelLauflicht(const uint32_t delayTime)
{
  static byte myPixel = 0;
  static uint32_t lastmillis = 0;
  uint32_t myTime = millis();
  if (myTime - lastmillis > delayTime)
  {
    pixels.clear();
    if ((myTime - lastmillis > (delayTime * 2)) ||
        (myPixel > NUMPIXELS - 1))
    {
      myPixel = 0;
    }
    pixels.setPixelColor(myPixel, pixels.Color(255, 000, 0));
    pixels.show();
    myPixel++;
    lastmillis = myTime;
  }
}

Nur ONBOARD(!) LED wenn der Sensor auslöst.
Es kann sein, dass die LED AUS oder auch AN geht, wenn der Sensor eine entsprechende Aktion bemerkt.

Achtung: Ich hab die Hysterese recht klein gestellt in der Hoffnung dass es passt.
Der Sensor hat einen einstellbaren Widerstand - mit dem kannst Du ein wenig spielen.
Es wird Dir auf dem seriellen Monitor der Wert ausgegeben, den der Sensor bereit stellt.

Wenn die Onboard-LED nicht umschaltet, brauche ich die Werte die dort ausgegeben werden für Reflexion und keine Reflexion, damit wir das ggfls. anpassen koennen.
Achte auf die eingestellte Geschwindigkeit für den Seriellen Monitor!

Der PIN 2 geht an D0 auf dem Sensor,
Der PIN A0 geht auf den A0 des Sensor.

// Forensketch 10 Sekunden Pixel Lauflicht
// based on https://forum.arduino.cc/t/ir-sensor-zu-auslosen-led-stripe/1249286/16
// Zweiter Stand: Schaltschwelle feststellen

#include <Adafruit_NeoPixel.h>

constexpr byte irPin {2}; // Pin, an dem der IR-Sensor angeschlossen ist ( von D0 auf Digital 2 aufn Board)
constexpr byte irStatePin {A0};
constexpr int  stateHysterese {300};
constexpr byte pixelPin {7}; // Hier wird angegeben, an welchem digitalen Pin die WS2812 LEDs bzw. NeoPixel angeschlossen sind
constexpr byte NUMPIXELS {60}; // Hier wird die Anzahl der angeschlossenen WS2812 LEDs bzw. NeoPixel angegeben

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, pixelPin, NEO_GRB + NEO_KHZ800);

void setup()
{
  Serial.begin(115200);
  Serial.println(F("\r\nStart...\r\n"));
  pixels.begin();
  pinMode(irPin, OUTPUT);
  digitalWrite(irPin, HIGH);   // Turning ON LED
  delayMicroseconds(500);                  // kurz warten, einpendeln des Sensors
  pinMode(irStatePin, INPUT);  // Analogpin, aus Gründen der Übersichtlichkeit
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  //  pixelLauflicht(20);
  digitalWrite(LED_BUILTIN, getIrStatus());
}
//
bool getIrStatus()
{
  uint16_t irValue = analogRead(irStatePin);
  Serial.println(irValue);
  delay(100);
  return irValue > stateHysterese ? true : false;
}
//
void pixelLauflicht(const uint32_t delayTime)
{
  static byte myPixel = 0;
  static uint32_t lastmillis = 0;
  uint32_t myTime = millis();
  if (myTime - lastmillis > delayTime)
  {
    pixels.clear();
    if ((myTime - lastmillis > (delayTime * 2)) ||
        (myPixel > NUMPIXELS - 1))
    {
      myPixel = 0;
    }
    pixels.setPixelColor(myPixel, pixels.Color(255, 000, 0));
    pixels.show();
    myPixel++;
    lastmillis = myTime;
  }
}

Moin

Ich habe den Sketch hochgeladen. so wie es aussieht, macht der Sketch was er soll. Onboard LED geht aus wenn sich etwas vor dem IR Sensor befindet.
Ich weiß nicht wie man hier ein Video einbindet. Deshalb der Link zum Video.

Arduino IR Sensor

Gruß

Hi

Und wie geht es weiter ?

Gruß

Daraus baue ich Dir was - Sei nicht so unruhig. Es soll Leute geben, die haben auch noch andere Dinge zu tun...
Und ich werde heute nicht alt.
Also morgen.
In der Hoffnung, dass das Lauflicht auch funktioniert hat.

Moin

Sorry für meine Ungeduld.
Bin ja froh wenn du mir hilfst .

Also das lautliche über den fertigen Sketch alleine funktioniert soweit.

Dein Sketch als einzelnes läuft auch wie oben beschrieben.

Brauchst du noch irgendwelche Informationen?

Ich habe mal an Pin 7 das Signalkabel angeschlossen aber es passierte nix. Denke es sollte auch noch nix passieren, da du ja geschrieben hattest only Onboard LED.

Mit freundlichen Grüßen

// Forensketch 10 Sekunden Pixel Lauflicht
// based on https://forum.arduino.cc/t/ir-sensor-zu-auslosen-led-stripe/1249286/16
// Dritter Stand: Mal sehen, ob es das ist...

#include <Adafruit_NeoPixel.h>

constexpr byte irPin {2}; // Pin, an dem der IR-Sensor angeschlossen ist ( von D0 auf Digital 2 aufn Board)
constexpr byte irStatePin {A0}; // Pin auf dem der IR-Wert ausgelesen wird
constexpr int  stateHysterese {300}; // UmschaltWert am AnalogPort
constexpr bool irActive {true}; // Vorgabe für Vergleich

constexpr byte pixelPin {7}; // Hier wird angegeben, an welchem digitalen Pin die WS2812 LEDs bzw. NeoPixel angeschlossen sind
constexpr byte NUMPIXELS {60}; // Hier wird die Anzahl der angeschlossenen WS2812 LEDs bzw. NeoPixel angegeben


bool pixelIsActive = false;
constexpr uint32_t pixelOnTime {10000}; // Zeit in ms
uint32_t pixelStartTime;

byte myPixel = 0;

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, pixelPin, NEO_GRB + NEO_KHZ800);

void setup()
{
  Serial.begin(115200);
  Serial.println(F("\r\nStart...\r\n"));
  pixels.begin();
  pinMode(irPin, OUTPUT);
  digitalWrite(irPin, HIGH);   // Turning ON LED
  delayMicroseconds(500);                  // kurz warten, einpendeln des Sensors
  pinMode(irStatePin, INPUT);  // Analogpin, aus Gründen der Übersichtlichkeit
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  checkDriveIn();
}
//
void checkDriveIn()
{
  bool irStatus = getIrStatus();         // ermitteln des IR
  digitalWrite(LED_BUILTIN, irStatus);   // Kontrollausgabe
  if (pixelIsActive)
  {
    pixelLauflicht(pixelOnTime);         // Lauflicht
    if (millis() - pixelStartTime > pixelOnTime) // Zeit ist um
    { pixelIsActive = false; }           // beenden
  }
  else                                   // Pixel nicht aktiv
  {
    if (irStatus == irActive)            // Einschaltreflexion
    {
      pixelIsActive = true;              // Pixel aktiv setzen
      myPixel = 0;                       // Startpixel festlegen
      pixelStartTime = millis();         // Startzeit merken
    }
  }
}
//
bool getIrStatus()
{
  uint16_t irValue = analogRead(irStatePin);
  Serial.println(irValue);
  delay(100);
  return irValue > stateHysterese ? true : false;
}
//
void pixelLauflicht(const uint32_t delayTime)
{
  static uint32_t lastmillis = 0;
  uint32_t myTime = millis();
  if (myTime - lastmillis > delayTime)
  {
    pixels.clear();
    if ((myTime - lastmillis > (delayTime * 2)) ||
        (myPixel > NUMPIXELS - 1))
    {
      myPixel = 0;
    }
    pixels.setPixelColor(myPixel, pixels.Color(255, 000, 0));
    pixels.show();
    myPixel++;
    lastmillis = myTime;
  }
}

Bin ja mal gespannt...
Es ist keine Routine drin, die erkennt, ob der Sensor wieder frei ist.
Sollte also vor dem Sensor dauerhaft was sein, wird auch dauerhaft das LL gehen.
Ist nix davor, geht das LL nach nicht aus. Es bleibt der letzte Pixel an - das ist Absicht und wenn das funktioniert, kannst Du Dir noch was wünschen - in der naechsten Version geht der Pixel dann auch aus und das wars dann.

Moin

Vielen Dank für deine Mühe.
Ich habe den Sketch hochgeladen und das ist das Ergebnis.

IR Sensor Teil 2

Außer das eine LED vom Lauflicht an ist und bleibt, ist alles beim alten.
Der Onboard LED geht aus wenn sich etwas vor dem Sensor befindet.
Ich habe die Verkabelung so gelassen. DO auf PIN2 (Digital PWM) und A0 auf Analog In A0, VCC an 5Volt + und GND auf GND auf Board.
Das Lauflicht WS2812 habe ich mit einem ext. Netzteil 5V 1A versorgt und zusätzlich GND auf dem Board. Das Grüne Kabel ( Signal ) habe ich auf Digital PWM Pin 7 gelegt.

Wenn ich das Examples Adafruit NEO Pixel ( standfest wheel ) nehme funktioniert es.

Habe ich mal wieder etwas übersehen ??

Gruß

Hallo

Bin leider noch nicht weiter :frowning:

Allen einen schönen Sonntag.

Gruß

Hallo

Dieses Problem ist gelöst !!

Vielen dank

Dann bitte laß uns nicht neugierig und unwissend sterben.
Grüße Uwe

Kannst Du das irgendwie teilen und hier anpinnen?

Bitte dann meinen Folgekommentar auch mitnehmen.

Moin

Hier mein Sketch

#include <Adafruit_NeoPixel.h>

// Pin für WS2812-Streifen
#define LED_PIN 6
// Anzahl der LEDs im Streifen
#define NUM_LEDS 60
// Initialisierung des WS2812-Streifens
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

// Pin für TCRT5000-Sensor
#define SENSOR_PIN 2

// Variablen für Timing und Zustand
bool is_running = false;
unsigned long start_time = 0;
unsigned long duration = 10000; // 15 Sekunden !! GEÄNDERT //

void setup() {
  strip.begin();
  strip.show(); // Alle LEDs ausschalten
  pinMode(SENSOR_PIN, INPUT); // Sensor-Pin als Eingang setzen
}

void loop() {
  // Sensor lesen
  int sensor_value = digitalRead(SENSOR_PIN);

  // Lauflicht aktivieren, wenn der Sensor ausgelöst wird
  if (sensor_value == LOW && !is_running) {  // GEÄNDERT
    is_running = true;
    start_time = millis(); // Zähler starten
  }

  // Wenn das Lauflicht aktiviert ist und die 15 Sekunden nicht überschritten sind
  if (is_running && millis() - start_time < duration) {
    runChaseLight(); // Lauflicht aktivieren
  } else if (is_running) {
    // Lauflicht stoppen
    strip.clear(); // Alle LEDs ausschalten
    strip.show();
    is_running = false; // Status zurücksetzen
  }
}

void runChaseLight() {
  // Anzahl der LED-Pixel
  static int pixel = 0;

  // LEDs ausschalten
  strip.clear();

  // Ein Lauflicht-Effekt
  for (int i = 0; i < 3; i++) {
    int led_pos = (pixel + i) % NUM_LEDS;
    strip.setPixelColor(led_pos, strip.Color(255, 0, 0)); // Grün als Beispiel
  }

  strip.show(); // Aktualisieren

  // Zur nächsten LED für das Lauflicht
  pixel = (pixel + 2) % NUM_LEDS;

  // Kurze Verzögerung, um das Lauflicht zu verlangsamen
  delay(10);
}

Hallo

Ich nochmal eine kurze Zusammenfassung.

Vielen lieben Dank an alle die dieses Projekt unterstützt haben.

Ein besonderes Dankeschön möchte ich an
[my_xy_projekt] Brattain senden :+1:

Kyosho Mini Z Pitstop

Wünsche allen einen gesunden und schönen Tanz in den Mai