Befehl bei ausbleibender Veränderung mit Toleranz

Hallo an alle,
mir fehlen leider einige Grundkenntnisse, um die notwendigen Zeile zu ergänzen. Das Programm steuert einen LED-Ring je nach Abstand (Einparksensor in der Garage).

Jetzt wäre es natürlich perfekt, wenn sich die LEDs ausschalten (activeColor = rgbBlack), sollte sich der Wert im Breich 200-50 für einen Zeitraum von 30 Sekunden nicht mehr relevant ändert (+-10 Toleranz).

Würde mich sehr freuen, wenn mir da jemand helfen könnte

Liebe Grüße

Sketch:

/* Parkhilfe mit VL53L0X
 * Weitere Infos und Tutorial auf https://www.makerblog.at
 *  
 * Einparkhilfe z.B. zur fixen Montage an der rückseitigen Garagenwand,
 * misst den Abstand zwischen Sensor und Objekt (Auto) und visualisiert die 
 * korrekte Einparkposition mit WS2812B RGB LEDs
 * 
 *  
 * Setup: 
 * 
 * - Arduino Uno
 * 
 * - VL53LX0 Laser Sensor
 *   - Arduino 5V an Sensor VIN
 *   - Arduino GND an Sensor GND
 *   - Arduino A4 an Sensor SDA (I2C Data)
 *   - Arduino A5 an Sensor SCL (I2C Clock)
 * 
 * - WS2812B RGB LED Stripe
 *   - Arduino D6 über 220Ohm Widerstand an LED Data In
 *   - Stromversorgung über Arduino bei wenigen LEDs oder
 *     mit eigener Stromquelle an +/- des LED Stripes
 *     Achtung: Kondensator zwischen 5V und GND
 *     Siehe Tutorials zu WS2812B Neopixel LEDs
 * 
*/
 
// Libraries für I2C, Sensor und RGB LEDs einbinden. Alle Bibliotheken
// können über den Library Manager der Arduino IDE installiert werden
#include "Wire.h"
#include "VL53L0X.h"
#include "Adafruit_NeoPixel.h"
 
// Sensorobjekt
VL53L0X distanceSensor;
 
// Datenpin für den WS2812B LED Streifen
#define LEDPIN 6
#define LEDCOUNT 16
 
#define RANGESTARTMM 200
#define RANGEENDMM 50
 
#define ORANGESTARTLED 12
#define REDSTARTLED 16
 
// LEDs initialisieren
// in diesem Fall 16 LEDs mit den Adressen 0 bis 15
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDCOUNT, LEDPIN, NEO_GRB + NEO_KHZ800);
 
// Standardfarben für die LEDs definieren
uint32_t rgbRed = strip.Color(255,0,0);
uint32_t rgbOrange = strip.Color(255,90,0);
uint32_t rgbGreen = strip.Color(0,255,0);
uint32_t rgbBlack = strip.Color(0,0,0);
uint32_t activeColor = rgbBlack;
 
 
void setup()
{
  Serial.begin(9600);
  Wire.begin();
 
  // Distanzsensor initialisieren und konfigurieren
  distanceSensor.setTimeout(500);
  if (!distanceSensor.init())
  {
    Serial.println("VL53L0X Sensor nicht gefunden! Ablauf angehalten.");
    while (1) {}
  }
  // Sensor auf 10 Messungen pro Sekunde
  distanceSensor.setMeasurementTimingBudget(100000);
 
  // LED Streifen starten und Helligkeit setzen
  strip.begin();
  strip.setBrightness(100); // Helligkeit 0-255
  strip.show(); 
 
}
 
void loop()
{
  // Entfernung in mm lesen
  int dist = distanceSensor.readRangeSingleMillimeters();
  // Falls TIMEOUT dann Fehler seriell ausgeben und dist auf 0 setzen
  if (distanceSensor.timeoutOccurred()) { 
    Serial.println("TIMEOUT");
    dist = 0;
  }
 
  int lastPixel = 0;
 
  // Sensorbereich in mm in Anzahl der LEDs umwandeln, im Beispiel
  // den Bereich von 50mm bis 200mm auf die LEDs 16 bis 0 mappen
  // D.h. bei bei dist=200 ist lastPixel = 0, bei dist=50 ist
  // lastPixel = 16 und der Wertebereich dazwischen wird ebenfalls
  // richtig umgerechnet.
  // ACHTUNG: eine Range von 50-200mm ist zum Testen auf dem Schreibtisch,
  // in der Garage passen Werte zwischen 500 und 2000mm besser :)
  // Mit den Konstanten ersetzt heisst diese Zeile
  // lastPixel = map(dist, 50, 200, 15, 0);
 
  lastPixel = map(dist, RANGEENDMM, RANGESTARTMM, LEDCOUNT-1, 0);
 
  // Zur Kontrolle Ausgabe der Distanz und der ermittelten LED
  // am seriellen Monitor
  Serial.print("dist = ");
  Serial.print(dist);
  Serial.print(" => ");
  Serial.print("lastPixel = ");
  Serial.println(lastPixel);
 
  // Alle LEDs löschen (= auf schwarz setzen)
  for (int i=0; i< LEDCOUNT; i++) {
    strip.setPixelColor(i, rgbBlack);    
  }
 
  // Entsprechend der Anzahl der aktiven LEDs ändert
  // ändert sich auch die Farbe aller LEDs
  if (lastPixel >= REDSTARTLED) {
    activeColor = rgbRed;
  } else if (lastPixel >= ORANGESTARTLED) {
    activeColor = rgbOrange;
  } else if (lastPixel >= 0) {
    activeColor = rgbGreen;
  } else {
    activeColor = rgbBlack;
  }
 
  // Wenn lastPixel >= LEDCOUNT dann auf LEDCOUNT-1 setzen
  if (lastPixel >= LEDCOUNT) {
    lastPixel = LEDCOUNT-1;
  }
 
  // Nummerierung der LEDs beginnt bei 0!
  for (int i=0; i<= lastPixel; i++) {
      strip.setPixelColor(i, activeColor);    
  }
 
  // LEDs aktualisieren
  strip.show();
 
}

Die Lösung ist recht einfach, aber Dein Code ist nicht lesbar.
Gehe bitte in Dein Eingangspost und markiere den gesamten Code.
Oben findest Du dann das Symbol </> auf welches Du dann drückst und den Post erneut speicherst. Danke!

Vielen Dank für dein Antwort.
Habe es gerade angepasst.

Hoffe, so ist das jetzt richtig!

Liebe Grüße

Nur um testen - ich hab Deinen Code nicht ganz druchgeblättert....
Probier mal:

/* Parkhilfe mit VL53L0X
   Weitere Infos und Tutorial auf https://www.makerblog.at

   Einparkhilfe z.B. zur fixen Montage an der rückseitigen Garagenwand,
   misst den Abstand zwischen Sensor und Objekt (Auto) und visualisiert die
   korrekte Einparkposition mit WS2812B RGB LEDs


   Setup:

   - Arduino Uno

   - VL53LX0 Laser Sensor
     - Arduino 5V an Sensor VIN
     - Arduino GND an Sensor GND
     - Arduino A4 an Sensor SDA (I2C Data)
     - Arduino A5 an Sensor SCL (I2C Clock)

   - WS2812B RGB LED Stripe
     - Arduino D6 über 220Ohm Widerstand an LED Data In
     - Stromversorgung über Arduino bei wenigen LEDs oder
       mit eigener Stromquelle an +/- des LED Stripes
       Achtung: Kondensator zwischen 5V und GND
       Siehe Tutorials zu WS2812B Neopixel LEDs

*/

// Libraries für I2C, Sensor und RGB LEDs einbinden. Alle Bibliotheken
// können über den Library Manager der Arduino IDE installiert werden
#include "Wire.h"
#include "VL53L0X.h"
#include "Adafruit_NeoPixel.h"

// Sensorobjekt
VL53L0X distanceSensor;

// Datenpin für den WS2812B LED Streifen
#define LEDPIN 6
#define LEDCOUNT 16

#define RANGESTARTMM 200
#define RANGEENDMM 50

#define ORANGESTARTLED 12
#define REDSTARTLED 16

// LEDs initialisieren
// in diesem Fall 16 LEDs mit den Adressen 0 bis 15
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDCOUNT, LEDPIN, NEO_GRB + NEO_KHZ800);

// Standardfarben für die LEDs definieren
uint32_t rgbRed = strip.Color(255, 0, 0);
uint32_t rgbOrange = strip.Color(255, 90, 0);
uint32_t rgbGreen = strip.Color(0, 255, 0);
uint32_t rgbBlack = strip.Color(0, 0, 0);
uint32_t activeColor = rgbBlack;


void setup()
{
  Serial.begin(9600);
  Wire.begin();
  // Distanzsensor initialisieren und konfigurieren
  distanceSensor.setTimeout(500);
  if (!distanceSensor.init())
  {
    Serial.println("VL53L0X Sensor nicht gefunden! Ablauf angehalten.");
    while (1) {}
  }
  // Sensor auf 10 Messungen pro Sekunde
  distanceSensor.setMeasurementTimingBudget(100000);
  // LED Streifen starten und Helligkeit setzen
  strip.begin();
  strip.setBrightness(100); // Helligkeit 0-255
  strip.show();
}

void loop()
{
  static unsigned int lastDistance = 0;
  static unsigned int lastMillis = 0;
  const unsigned long anzeigeTimeout = 5000; // zeit in ms
  // Entfernung in mm lesen
  unsigned int dist = distanceSensor.readRangeSingleMillimeters();
  // Falls TIMEOUT dann Fehler seriell ausgeben und dist auf 0 setzen
  if (distanceSensor.timeoutOccurred())
  {
    Serial.println("TIMEOUT");
    dist = 0;
  }
  int lastPixel = 0;
  // Feststellen ob sich die Distance geändert hat
  // wenn ja, dann Zeit merken
  if (lastDistance != dist) lastMillis = millis();
  // Nur wenn sich innerhalb des Tiomeout die Distance geändert hat
  if (millis() - lastMillis < anzeigeTimeout)
  {
    // Sensorbereich in mm in Anzahl der LEDs umwandeln, im Beispiel
    // den Bereich von 50mm bis 200mm auf die LEDs 16 bis 0 mappen
    // D.h. bei bei dist=200 ist lastPixel = 0, bei dist=50 ist
    // lastPixel = 16 und der Wertebereich dazwischen wird ebenfalls
    // richtig umgerechnet.
    // ACHTUNG: eine Range von 50-200mm ist zum Testen auf dem Schreibtisch,
    // in der Garage passen Werte zwischen 500 und 2000mm besser :)
    // Mit den Konstanten ersetzt heisst diese Zeile
    // lastPixel = map(dist, 50, 200, 15, 0);
    lastPixel = map(dist, RANGEENDMM, RANGESTARTMM, LEDCOUNT - 1, 0);
    // Zur Kontrolle Ausgabe der Distanz und der ermittelten LED
    // am seriellen Monitor
    Serial.print("dist = ");
    Serial.print(dist);
    Serial.print(" => ");
    Serial.print("lastPixel = ");
    Serial.println(lastPixel);
    // Alle LEDs löschen (= auf schwarz setzen)
    for (int i = 0; i < LEDCOUNT; i++)
    {
      strip.setPixelColor(i, rgbBlack);
    }
    // Entsprechend der Anzahl der aktiven LEDs ändert
    // ändert sich auch die Farbe aller LEDs
    if (lastPixel >= REDSTARTLED)
    {
      activeColor = rgbRed;
    }
    else if (lastPixel >= ORANGESTARTLED)
    {
      activeColor = rgbOrange;
    }
    else if (lastPixel >= 0)
    {
      activeColor = rgbGreen;
    }
  }
  else
  {
    activeColor = rgbBlack;
  }
  // Wenn lastPixel >= LEDCOUNT dann auf LEDCOUNT-1 setzen
  if (lastPixel >= LEDCOUNT)
  {
    lastPixel = LEDCOUNT - 1;
  }
  // Nummerierung der LEDs beginnt bei 0!
  for (int i = 0; i <= lastPixel; i++)
  {
    strip.setPixelColor(i, activeColor);
  }
  // LEDs aktualisieren
  strip.show();
}

Vielen Dank

leider kann ich es im Moment nicht testen. Hab mir die Veränderungen von dir jetzt mal angeschaut.

Ich interpretiere einen Timeout (stellt die LEDs auf Black) nach 5 Sekunden, wenn sich der Messwert nicht verändert hat.
Hoffe, ich verstehe das so richtig. Dann könnte ich den Timeout ja anpassen!

Aber der Sensor hat Toleranzen. Der Wert verändert sich auch ohne Veränderung der Position immer im Bereich von +-5 (5mm), daher wäre eine Abweichung von 10 wichtig.

Tut mir leid, dass ich deine Veränderung gerade nicht testen kann.

Vielen Dank für deine Hilfe

Ah ja - mach ich nachher noch...

Hey
Wollte mal fragen, ob das mit der Abweichung geklappt hat.

Liebe Grüße

Was sagt denn der bisherige Test?
Vielleicht:

/* Parkhilfe mit VL53L0X
   Weitere Infos und Tutorial auf https://www.makerblog.at

   Einparkhilfe z.B. zur fixen Montage an der rückseitigen Garagenwand,
   misst den Abstand zwischen Sensor und Objekt (Auto) und visualisiert die
   korrekte Einparkposition mit WS2812B RGB LEDs


   Setup:

   - Arduino Uno

   - VL53LX0 Laser Sensor
     - Arduino 5V an Sensor VIN
     - Arduino GND an Sensor GND
     - Arduino A4 an Sensor SDA (I2C Data)
     - Arduino A5 an Sensor SCL (I2C Clock)

   - WS2812B RGB LED Stripe
     - Arduino D6 über 220Ohm Widerstand an LED Data In
     - Stromversorgung über Arduino bei wenigen LEDs oder
       mit eigener Stromquelle an +/- des LED Stripes
       Achtung: Kondensator zwischen 5V und GND
       Siehe Tutorials zu WS2812B Neopixel LEDs

*/

// Libraries für I2C, Sensor und RGB LEDs einbinden. Alle Bibliotheken
// können über den Library Manager der Arduino IDE installiert werden
#include "Wire.h"
#include "VL53L0X.h"
#include "Adafruit_NeoPixel.h"

// Sensorobjekt
VL53L0X distanceSensor;

// Datenpin für den WS2812B LED Streifen
#define LEDPIN 6
#define LEDCOUNT 16

#define RANGESTARTMM 200
#define RANGEENDMM 50

#define ORANGESTARTLED 12
#define REDSTARTLED 16

// LEDs initialisieren
// in diesem Fall 16 LEDs mit den Adressen 0 bis 15
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDCOUNT, LEDPIN, NEO_GRB + NEO_KHZ800);

// Standardfarben für die LEDs definieren
uint32_t rgbRed = strip.Color(255, 0, 0);
uint32_t rgbOrange = strip.Color(255, 90, 0);
uint32_t rgbGreen = strip.Color(0, 255, 0);
uint32_t rgbBlack = strip.Color(0, 0, 0);
uint32_t activeColor = rgbBlack;


void setup()
{
  Serial.begin(9600);
  Wire.begin();
  // Distanzsensor initialisieren und konfigurieren
  distanceSensor.setTimeout(500);
  if (!distanceSensor.init())
  {
    Serial.println("VL53L0X Sensor nicht gefunden! Ablauf angehalten.");
    while (1) {}
  }
  // Sensor auf 10 Messungen pro Sekunde
  distanceSensor.setMeasurementTimingBudget(100000);
  // LED Streifen starten und Helligkeit setzen
  strip.begin();
  strip.setBrightness(100); // Helligkeit 0-255
  strip.show();
}

void loop()
{
  const unsigned int abweichung = 10;
  static unsigned int lastDistance = 0;
  static unsigned int lastMillis = 0;
  const unsigned long anzeigeTimeout = 5000; // zeit in ms
  // Entfernung in mm lesen
  unsigned int dist = distanceSensor.readRangeSingleMillimeters();
  // Falls TIMEOUT dann Fehler seriell ausgeben und dist auf 0 setzen
  if (distanceSensor.timeoutOccurred())
  {
    Serial.println("TIMEOUT");
    dist = 0;
  }
  int lastPixel = 0;
  // Feststellen ob sich die Distance geändert hat
  // wenn ja, dann Zeit merken
  if (abs((int)lastDistance - (int)dist) > abweichung)
  {
    lastDistance = dist;
    lastMillis = millis();
  }
  // Nur wenn sich innerhalb des Tiomeout die Distance geändert hat
  if (millis() - lastMillis < anzeigeTimeout)
  {
    // Sensorbereich in mm in Anzahl der LEDs umwandeln, im Beispiel
    // den Bereich von 50mm bis 200mm auf die LEDs 16 bis 0 mappen
    // D.h. bei bei dist=200 ist lastPixel = 0, bei dist=50 ist
    // lastPixel = 16 und der Wertebereich dazwischen wird ebenfalls
    // richtig umgerechnet.
    // ACHTUNG: eine Range von 50-200mm ist zum Testen auf dem Schreibtisch,
    // in der Garage passen Werte zwischen 500 und 2000mm besser :)
    // Mit den Konstanten ersetzt heisst diese Zeile
    // lastPixel = map(dist, 50, 200, 15, 0);
    lastPixel = map(dist, RANGEENDMM, RANGESTARTMM, LEDCOUNT - 1, 0);
    // Zur Kontrolle Ausgabe der Distanz und der ermittelten LED
    // am seriellen Monitor
    Serial.print("dist = ");
    Serial.print(dist);
    Serial.print(" => ");
    Serial.print("lastPixel = ");
    Serial.println(lastPixel);
    // Alle LEDs löschen (= auf schwarz setzen)
    for (int i = 0; i < LEDCOUNT; i++)
    {
      strip.setPixelColor(i, rgbBlack);
    }
    // Entsprechend der Anzahl der aktiven LEDs ändert
    // ändert sich auch die Farbe aller LEDs
    if (lastPixel >= REDSTARTLED)
    {
      activeColor = rgbRed;
    }
    else if (lastPixel >= ORANGESTARTLED)
    {
      activeColor = rgbOrange;
    }
    else if (lastPixel >= 0)
    {
      activeColor = rgbGreen;
    }
  }
  else
  {
    activeColor = rgbBlack;
  }
  // Wenn lastPixel >= LEDCOUNT dann auf LEDCOUNT-1 setzen
  if (lastPixel >= LEDCOUNT)
  {
    lastPixel = LEDCOUNT - 1;
  }
  // Nummerierung der LEDs beginnt bei 0!
  for (int i = 0; i <= lastPixel; i++)
  {
    strip.setPixelColor(i, activeColor);
  }
  // LEDs aktualisieren
  strip.show();
}

Vielen Dank für deine Antwort. Ich schaue mir das Sketch morgen mal in Ruhe durch. Mit dem Test dauert es leider noch ein paar Tage. Dabe aktuell keinen Sensor da, müsste aber bald im Briefkasten liegen.
Ich werde dir dann erneut schreiben und berichten.

Vielen lieben Dank

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.