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!
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();
}
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.
/* 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.