VL53L Bei Abstand xxx Signal ausgeben

Hallo zusammen,

ich habe einen Lidar Sensor VL53L0x und kann mit dem Beispielcode schön Entfernungen im Serial Monitor anzeigen lassen.
Nun möchte ich bei einem Abstand von 500mm PIN3 auf HIGH setzen, und unterhalb 500mm wieder auf LOW.

Könnte mir bitte jemand einen Tipp geben, wonach ich hierfür am sinnvollsten suchen muss, um mir etwas passendes zusammen zu schreiben?

Vielen Dank!

unsigned int weite;
void setup() {
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(3, OUTPUT)
}

void loop() {
  if (weite > 500)
  {
    digitalWrite(3, HIGH);
  }
  else
  {
    digitalWrite(3, LOW);
  }
}

???

Hallo my_xy_projekt!

Danke dir für die Antwort.
Ich habe noch ein Semikolon ergänzt und die Geschwindigkeit auf 9600 gesetzt (sonst kommen nur umgedrehte Fragezeichen raus...) aber außer "Start..." im Serial Monitor und das PIN3 dauerhaft HIGH ist passiert da nichts, egal welchen Abstand ich simuliere.
Habe auch statt PIN3 mal die LED (13) versucht zu triggern, aber tut sich ebenfalls nichts.

Die setz mal im Seriellen Monitor hoch - unten rechts.

unsigned int weite;
void setup() {
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(3, OUTPUT);
}

void loop() {
  weite = getWeite();
  if (weite < 500)
  {
    digitalWrite(3, HIGH);
  }
  else
  {
    digitalWrite(3, LOW);
  }
  Serial.print(F("PIN ist: "));
  Serial.println(digitalRead(3));

}
int getWeite()
{
  static bool richtung = 0;
  static unsigned int wert = 0;
  if (richtung == 0)
  {
    wert++;
  }
  else
  {
    wert--;
  }
  if (wert > 550)
  {
    richtung = 1;
  }
  if (wert < 450)
  {
    richtung = 0;
  }
  return wert;
}

Der sollte Dir was ausgeben - achtung das geht sehr schnell....

Ja, so gibt er mir wechselnd Pin ist: 0 und Pin ist 1 im Serial Monitor raus, verändert dies aber nicht, wenn ich den Abstand ändere...

Naja, wenn Du Deinen Abstandsensorcode, den Du ja nur bei Dir auf dem PC hast, nicht mit integrierst, wird das nichts.
An Stelle von weite=getWeite(); dort übergeben, was Dir deine Sensorberechnung zurück gibt.

Da steige ich "mittendrin" aus... :frowning:

So weit habe ich es geändert:

/* This example shows how to use continuous mode to take
range measurements with the VL53L0X. It is based on
vl53l0x_ContinuousRanging_Example.c from the VL53L0X API.

The range readings are in units of mm. */

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

unsigned int weite;

void setup()
{
  Serial.begin(115200);
  Wire.begin();
  pinMode(3, OUTPUT);

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }

  sensor.startContinuous();
}

void loop()
{
  weite = getWeite();
  if (weite < 500)
  {
    digitalWrite(3, HIGH);
  }
  else
  {
    digitalWrite(3, LOW);
  }
  Serial.print(F("PIN ist: "));
  Serial.println(digitalRead(3));

}
int getWeite()
{
  static bool richtung = 0;
  static unsigned int wert = 0;
  if (richtung == 0)
  {
    wert++;
  }
  else
  {
    wert--;
  }
  if (wert > 550)
  {
    richtung = 1;
  }
  if (wert < 450)
  {
    richtung = 0;
  }
  return wert;
  Serial.print(sensor.readRangeContinuousMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();
}

Aber da kommt im Serial Monitor weiterhin 0 oder 1 raus.
Ich gehe davon aus, dass ich bei "getWeite()" in die Klammern noch den gemessenen Wert rein bringen muss, aber dafür reicht mein Verständnis nicht aus, abgesehen davon glaube ich, das meine "Hochzeit" der beiden Scripte nicht korrekt ist...

Du musst Dir ein wenig Lektüre antun.
Du verstehst nicht, WAS Du da machst.

https://www.arduinoforum.de/code-referenz
Da gibts nen pdf - runterladen Jeden Abend ein paar Seiten.

zusammengeschrumpft

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

void setup()
{
  Serial.begin(115200);
  Wire.begin();
  pinMode(3, OUTPUT);

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }
  sensor.startContinuous();
}

void loop()
{
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  if (sensor.readRangeContinuousMillimeters() < 500)
  {
    digitalWrite(3, HIGH);
  }
  else
  {
    digitalWrite(3, LOW);
  }
  Serial.print(F("PIN ist: "));
  Serial.println(digitalRead(3));
}

Hey vielen lieben Dank!
Ich habe es zeitgleich auch geschafft aber etwas anders und nicht so elegant/sauber wie du...
Ich habe das Script von Makerblog AT für die Neopixel als Grundlage genommen, und Stück für Stück alles auskommentiert was mit den Neopixeln zu tun hatte.
Irgendwann blieb dann die reine Auswertung einer map des Messbereichs, damit konnte ich dann über digitalWrite meine LED schalten.
Da sich dein Script aber nur mit dem notwendigen befasst ist dieses wesentlich schlanker und „effektiver“.

Das pdf werde ich mir auf jeden Fall anschauen, es nervt mich total dass ich alles (waren nur die ersten Steps aber immerhin...) aus dem Gedächtnis gelöscht habe was ich mir mal vor Jahren angelesen hatte, aber derzeit fällt es mir extremst schwer mich auf die Materie zu konzentrieren was mich ziemlich annervt.

Vielen Dank noch mal!

Dann las mich noch etwas anmerken:
Setze am Codeanfang eine Zeile, in der Du den PIN benennst.

const byte ausgabePin = 3;

und ersetze alle ,3 durch ,ausgabePin

Dann brauchst oben nur einmal ändern und hast nichts im Code übersehen - und weisst, das den Pin nicht mehr nehmen kannst....

Hallo zusammen,
also grundsätzlich funktioniert das ganze nun genau wie ich es mir erhofft habe, der Sensor geht zwar mit unterschiedlichen Untergründen nicht so weit wie angegeben, aber dafür hat er einen sehr engen "Sensorbereich" in dem er misst ohne sich durch Gegenstände die kurz außerhalb des Erfassungsbereichs liegen ablenken zu lassen.

Nun stehe ich aber vor einem kleinen Problem was mich verzweifeln lässt und ich verstehe nicht warum.
Ich möchte nun, dass der Ausgabepin für eine einstellbare Zeit HIGH ist und danach wieder auf LOW geschaltet wird, somit habe ich einfach hinter digitalwrite ein Delay gesetzt.
Aber, er ignoriert das vollständig obwohl bei anderen Sachen das Delay wunderbar hinter digitalwrite funktioniert?!
So habe ich das ganze geschrieben:

void loop()
{
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  if (sensor.readRangeContinuousMillimeters() > 500)
  {
    digitalWrite(ausgabePin, HIGH);
    delay(6000);
    digitalWrite(ausgabePin, LOW);
  }
  else
  {
    digitalWrite(ausgabePin, LOW);
  }
  Serial.print(F("PIN ist: "));
  Serial.println(digitalRead(ausgabePin));
}

Nachtrag, ich habe (die Hälfte) des Problems erkannt, delay arbeitet aber nur als "Haltefunktion" will sagen, wenn sich nach Ereignis der gemessene Abstand verringert, schaltet der Ausgang auf LOW.
Ich möchte aber, dass wenn der Sensor erkennt das der eingestellte Abstand überschritten wird, für eine Zeit X der Ausgang auf HIGH geht und dann wieder auf LOW. Das aber, auch wenn der Abstand sich in der Zwischenzeit NICHT wieder verringert...
Sollte sich der Abstand zwischenzeitlich verringern, darf der Ausgang auf LOW gehen und warten bis der Abstand wieder überschritten wird.
Hat jemand einen Tipp für mich?

Ohne delay.

Bei BlinkWithoutDelay geht es nicht um Blinken, sondern um den grundsätzlich anderen Programmier-Ansatz, dass ein loop-Durchlauf keine Zeit dauert, dafür unendlich oft drankommt.

Ich versteh nicht was Du vorhast.
Du beschreibst zwei vollkommen unterschiedliche Szenarien, die im Endeffekt das Selbe machen. Nämlich den PIN auf LOW ziehen.

Für mich hört sich das an wie:
ist der Abstand < 50 gehe LOW.
Ist der Abstand > 50 gehe kurz HIGH, dann wieder LOW
Da der jetzt LOW ist, braucht es aber die erste Bedingung nicht.
Oder willst Du das evtl. so:
Ist der Abstand < 50

  1. gehe LOW und
  2. merke Dir, das Du unter 50 warst.

Ist der Abstand > 50
3. gehe kurz HIGH, wenn Du vorher unter 50 warst.
4. Dann wieder LOW UND lösche den Merker.
5. Geht er in der HIGH-Zeit wieder unter 50, fange an bei 1.

Dann brauchst Du eine Variable bool in der Du Dir merkst das Du unter 50 warst und eine Variable unsigned long in der Du die Startzeit für das HIGH-Signal merkst.

Hallo ihr zwei!
So wie Du es unten beschreibst (Punkt 1-5) ist genau was ich realisieren möchte.

Es soll nur für z.B. eine Minute leuchten, wenn er < 50 überschreitet, jedoch nicht die ganze Zeit die er > 50 ist.
Erst wenn das nächste mal < 50 gemessen und dann überschritten wird, soll wieder für eine Minute der Ausgang auf HIGH gehen.

Schön!
Das ist ein endlicher Automat, eine Ablaufsteuerung.
Dazu gibts hier reichlich Beispiele......

Ungetestet und die Zeit erstmal kleiner gehalten zum testen.

// Forensketch- basiert auf:
// https://forum.arduino.cc/t/vl53l-bei-abstand-xxx-signal-ausgeben/871668/8
// https://forum.arduino.cc/t/vl53l-bei-abstand-xxx-signal-ausgeben/871668/14
#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

const byte ausgabePin = 3;
const unsigned long laufZeit = 2000; // Zeit in ms
unsigned long startZeit;  // Merker
bool unterschritten = false; // Merker


void setup()
{
  Serial.begin(115200);
  Wire.begin();
  pinMode(ausgabePin, OUTPUT);

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }
  sensor.startContinuous();
}

void loop()
{
  if (sensor.timeoutOccurred()) {
    Serial.print(" TIMEOUT");
  }
  if (sensor.readRangeContinuousMillimeters() < 500)
  {
    digitalWrite(ausgabePin, HIGH);
    unterschritten = true;
    startZeit = millis();
    Serial.println(F("EIN!"));
  }
  else
  {
    if (unterschritten)
    {
      if (millis() - startZeit >= laufZeit)
      {
        Serial.println(F("AUS!"));
        digitalWrite(ausgabePin, LOW);
        unterschritten = !unterschritten;
      }
    }
    else
    {
      digitalWrite(ausgabePin, LOW);
    }
  }
  Serial.print(F("PIN ist: "));
  Serial.println(digitalRead(ausgabePin));
}