Jetzt habe ich hier im Programm mit Multiplexer das Relais wieder dazu eingebaut. Funktioniert wunderbar. Ich habe jetzt mal den Bereich auf 20cm eingestellt. Also wenn vor einem Sensor etwas im Bereich von 20cm auftaucht, dann kommt das Relais und bleibt mindestens 3 Sekunden, wenn in der Zeit wieder was an einem Sensor im Bereich von 20cm auftacht, wird die Relaiszeit um 3 Sek. verlängert, u.s.w.
Franz
Also das funktioniert jetzt erst mal gut. So kannst du es schon mal installieren. Dann kommt nur noch ein Programm Update, wenn ich den Fehler gefunden habe.
Code: Alles auswählen
/* Dieses Beispiel zeigt, wie man eine Einzelschussreichweite erhält
Messungen vom VL53L0X. Der Sensor kann optional sein
mit unterschiedlichen Ranging-Profilen konfiguriert, wie in . beschrieben
das VL53L0X API-Benutzerhandbuch, um eine bessere Leistung für
eine bestimmte Anwendung. Dieser Code basiert auf den vier
"SingleRanging"-Beispiele in der VL53L0X-API.
Die voreingestellte I2C Adresse (0x29)
Die Entfernungsmesswerte sind in mm angegeben. */
#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#include <Arduino.h> // I2C Multiplexer einrichten
#include "TCA9548A.h"
TCA9548A I2CMux;
int messung1 = 0;
int messung2 = 0;
const byte LS_Relais01 = 2; // Pin 2 ist für Relais Lichtschranke
byte MerkerLS1 = 0;
unsigned long LS_Laufzeit01 = 0; // Lichtschranke01 Ablauf Zeit
const unsigned long LS_Pausezeit01 = 3000; // Lichtschranke01 Prüfzeit Überbrückung 3 Sek.
unsigned long milli_aktuell = 0;
byte LS_Status01 = 0;
byte LS_Status02 = 0;
// Entkommentieren Sie diese Zeile, um den Langstreckenmodus zu verwenden. Diese
// erhöht die Empfindlichkeit des Sensors und verlängert seine
// potenzielle Reichweite, erhöht aber die Wahrscheinlichkeit, dass
// eine ungenaue Lesung aufgrund von Reflexionen von Objekten
// anders als das beabsichtigte Ziel. Es funktioniert am besten im Dunkeln
// Bedingungen.
//#define LONG_RANGE
// Entkommentieren Sie EINE dieser beiden Zeilen, um folgendes zu erhalten.
// - höhere Geschwindigkeit auf Kosten einer geringeren Genauigkeit oder
// - höhere Genauigkeit auf Kosten einer geringeren Geschwindigkeit
//#define HIGH_SPEED
#define HIGH_ACCURACY
void setup()
{
digitalWrite (LS_Relais01, HIGH); // Relaisausgang beim Start "aus"
pinMode(LS_Relais01, OUTPUT);
I2CMux.begin(Wire); // Wire-Instanz wird an die Bibliothek übergeben für I2C Multiplexer
I2CMux.closeAll(); // Alle Kanäle schließen
Serial.begin(9600);
Wire.begin();
I2CMux.openChannel(0); // I2C Multiplexer Display Kanal 0 ativieren
lcd.begin(20, 4);
lcd.backlight();
lcd.clear();
lcd.setCursor (2, 0);
lcd.print (F("Abstandsmessung 1"));
lcd.setCursor (2, 1);
lcd.print (F("mm:"));
lcd.setCursor (2, 2);
lcd.print (F("Abstandsmessung 2"));
lcd.setCursor (2, 3);
lcd.print (F("mm:"));
I2CMux.closeAll(); // Close all
I2CMux.openChannel(1); // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
sensor.setTimeout(500);
if (!sensor.init())
{
Serial.println("Sensor 1 konnte nicht erkannt und initialisiert werden!");
while (1) {}
}
delay(200);
I2CMux.closeAll(); // Close all
I2CMux.openChannel(2); // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
sensor.setTimeout(500);
if (!sensor.init())
{
Serial.println("Sensor 2 konnte nicht erkannt und initialisiert werden!");
while (1) {}
}
delay(200);
#if defined LONG_RANGE
// Verringern Sie die Begrenzung der Rücksendesignalrate (Standard ist 0,25 MCPS)
// Sensor 1
I2CMux.closeAll(); // Close all
I2CMux.openChannel(1); // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
sensor.setSignalRateLimit(0.1);
// Laserpulsperioden erhöhen (Standardwerte sind 14 und 10 PCLKs)
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
delay(200);
//Sensor 2
I2CMux.closeAll(); // Close all
I2CMux.openChannel(2); // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
sensor.setSignalRateLimit(0.1);
// Laserpulsperioden erhöhen (Standardwerte sind 14 und 10 PCLKs)
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif
delay(200);
// Sensor 1
I2CMux.closeAll(); // Close all
I2CMux.openChannel(1); // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
#if defined HIGH_SPEED
// Timing-Budget auf 20 ms reduzieren (Standard ist etwa 33 ms)
sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
// Timing-Budget auf 200 ms erhöhen
sensor.setMeasurementTimingBudget(200000);
#endif
delay(200);
// Sensor 2
I2CMux.closeAll(); // Close all
I2CMux.openChannel(2); // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
#if defined HIGH_SPEED
// Timing-Budget auf 20 ms reduzieren (Standard ist etwa 33 ms)
sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
// Timing-Budget auf 200 ms erhöhen
sensor.setMeasurementTimingBudget(200000);
#endif
delay(200);
}
void loop()
{
// ---Millis übergeben----------------------------
milli_aktuell = millis();
// ---Lichtschranke01 Kontrolle-------------------
if (messung1 <= 200) {
LS_Status01 = LOW;
}
else{ LS_Status01 = HIGH;}
if (messung2 <= 200) {
LS_Status02 = LOW;
}
else{ LS_Status02 = HIGH;}
if ((LS_Status01 == LOW) || (LS_Status02 == LOW)) {
digitalWrite (LS_Relais01, LOW); // Relais01 auf Pin2 einschalten
LS_Laufzeit01 = milli_aktuell;
MerkerLS1 = 1;
}
else {
if ((milli_aktuell - LS_Laufzeit01 >= LS_Pausezeit01) && (MerkerLS1 == 1)) // Überbrückungszeit abgelaufen ?
{
digitalWrite (LS_Relais01, HIGH); // Relais01 auf Pin2 ausschalten
MerkerLS1 = 0;
}
}
//---Lichtschranke01 Ende------------------------
//Sensor 1
I2CMux.closeAll(); // Close all
I2CMux.openChannel(1); // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
messung1 = (sensor.readRangeSingleMillimeters());
I2CMux.closeAll(); // Close all
I2CMux.openChannel(0); // I2C Multiplexer Display Kanal 0 aktivieren
lcd.setCursor (10, 1);
lcd.print (F(" "));
lcd.setCursor (10, 1);
lcd.print (messung1);
//Sensor 2
I2CMux.closeAll(); // Close all
I2CMux.openChannel(2); // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
messung2 = (sensor.readRangeSingleMillimeters());
I2CMux.closeAll(); // Close all
I2CMux.openChannel(0); // I2C Multiplexer Display Kanal 0 aktivieren
lcd.setCursor (10, 3);
lcd.print (F(" "));
lcd.setCursor (10, 3);
lcd.print (messung2);
// Sensor 1
I2CMux.closeAll(); // Close all
I2CMux.openChannel(1); // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
if (sensor.timeoutOccurred()) {
Serial.print(F(" TIMEOUT Sensor 1"));
}
// Sensor 2
I2CMux.closeAll(); // Close all
I2CMux.openChannel(2); // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
if (sensor.timeoutOccurred()) {
Serial.print(F(" TIMEOUT Sensor 2"));
}
}