Hallo zusammen,
auf der folgenden Webseite bin ich auf ein cooles Projekt gestoßen, dass ich gut gebrauchen könnte. Hierbei geht es um eine Einparkhilfe für die Garage, im Zusammenspiel mit dem Arduino, dem VL53L0X und einem WS2812B LED-Ring:
Arduino Einparkhilfe mit VL53L0X IR Laser Entfernungssensor und WS2812B NeoPixels – Makerblog.at
Hier der dahinter liegende 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();
}
Ich möchte das gerne genau so umsetzen. Für mich stellt sich nur die Frage: Was passiert mit den LEDs, wenn das Auto eingeparkt wurde? Leuchten dann die LEDs die ganze Nacht durch?
Ich würde es gerne so machen, dass sich die LEDs nur dann einschalten / ändern, wenn eine Bewegung erkannt wird. Meine Idee daher:
-
Wenn sich das lastPixel für einen Zeitraum von 2 Minuten nicht geändert hat -> schalte LEDs auf schwarz.
-
Wenn sich das lastPixel im Zeitraum von 2 Minuten geändert hat -> aktualisiere die LEDs.
Macht das Sinn? Würdet ihr das anders lösen?
Ich bin nur zu doof das im Sketch entsprechend zu ändern. Vom Ersteller habe ich bisher leider keine Rückmeldung erhalten, daher frage ich hier nach.