Interruptroutine bei 2 VL53L0X Sensoren

Liebe Leute,
ich habe einen Programm geschrieben für meine Abi Arbeit. Es soll einen Blindenstock darstellen. Die 2 Messsensoren messen die Entfernung und nochdazu habe ich Vibrationssensoren. Wenn ein "Blinder" z.B einem Wand näher kommen gibt er Vibrationen aus. Damit man den Gefahr erkennt, habe ich einen bestimmten Rhythmus eingebaut, undzwar zb wenn ein Hindernis in einer Entfernung von 1000mm-750mm ist vibriert er 300 sek lang dann geht er auf low für 250 Sekunden und beginnt wieder zu vibrieren. Bei einer Entfernung von 750-500 vibriert er länger(600 sek) und geht dann für 250 auf low und das geht so weiter.. Meine frage wäre.. ich habe den Code zum testen mit delay geschrieben und er hat funktioniert, jedoch will ich, dass er nebenbei weitermisst, während er die Vibrationen ausgibt. Dafür wären Interrupts am idealsten, jedoch verstehe ich nicht wirklich, wie ich den Code mit einer Interrupt schreiben könnte.
Hier, die Stelle mit dem Delay:
void read_dual_sensors() {
pinMode(5, OUTPUT);
int t=250;
lox1.rangingTest(&measure1, false); // pass in 'true' to get debug data printout!
lox2.rangingTest(&measure2, false); // pass in 'true' to get debug data printout!

// print sensor one reading
Serial.print("1: ");
if(measure1.RangeStatus != 10) { // if not out of range
sensor1 = measure1.RangeMilliMeter-25;
Serial.print(sensor1);
Serial.print("mm");

if(sensor1<=1000 && sensor1 >= 750){
digitalWrite(5, HIGH);
delay(300);
digitalWrite(5, LOW);
delay(t);}

if(sensor1< 750 && sensor1 >= 500){
digitalWrite(5, HIGH);
delay(600);
digitalWrite(5, LOW);
delay(t);}

if(sensor1< 500 && sensor1 >= 400){
digitalWrite(5, HIGH);
delay(900);
digitalWrite(5, LOW);
delay(t);}

if(sensor1< 400 && sensor1 >= 300){
digitalWrite(5, HIGH);
delay(1200);
digitalWrite(5, LOW);
delay(t);}

if(sensor1< 300 && sensor1 >= 200){
digitalWrite(5, HIGH);
delay(1500);
digitalWrite(5, LOW);
delay(t);}

if(sensor1< 200 && sensor1 >= 150){
digitalWrite(5, HIGH);
delay(1800);
digitalWrite(5, LOW);
delay(t);}

if(sensor1< 150 && sensor1 >= 100){
digitalWrite(5, HIGH);
delay(2100);
digitalWrite(5, LOW);
delay(t);}

if(sensor1< 100 && sensor1 >= 50){
digitalWrite(5, HIGH);
delay(2400);
digitalWrite(5, LOW);
delay(t);}
}
else {
Serial.print("Out of range");
}
 
B

Benutzer250079

Gast
Bei einer Entfernung von 750-500 vibriert er länger(600 sek)
Da ist fuer mich irgendwie ein gravierender Fehler drin. Wenn Jemand auf eine Wand zulaeuft, macht er nicht alle 10 Minuten einen Schritt.
Dein "Signal" muss also immer sofort kommen, wenn ein Hindernis erkannt wird und die Info, wie weit es weg ist, kann nicht erst dann klar sein, wenn Du Dir schon die Nase gebrochen hast.
Musst also die Entfernung direkt in die Vibration stecken. Ich glaube bei denen, die auf dem Markt sind wird das je naeher desto intensiver wird vibriert.
Wenn Du Dein Intensitaet nicht einstellen kannst, dann vibriere z.B. bei einem Meter Abstand nur 1 mal pro s und bei 50 cm 4 mal, oder so, dass man es halt noch unterscheiden kann, dass es 4 Vibrationen sein sollen.
So hat der Benutzer jeder Zeit die Info und Du brauchst keinen Interrupt.
 
Da ist fuer mich irgendwie ein gravierender Fehler drin. Wenn Jemand auf eine Wand zulaeuft, macht er nicht alle 10 Minuten einen Schritt.
Dein "Signal" muss also immer sofort kommen, wenn ein Hindernis erkannt wird und die Info, wie weit es weg ist, kann nicht erst dann klar sein, wenn Du Dir schon die Nase gebrochen hast.
Musst also die Entfernung direkt in die Vibration stecken. Ich glaube bei denen, die auf dem Markt sind wird das je naeher desto intensiver wird vibriert.
Wenn Du Dein Intensitaet nicht einstellen kannst, dann vibriere z.B. bei einem Meter Abstand nur 1 mal pro s und bei 50 cm 4 mal, oder so, dass man es halt noch unterscheiden kann, dass es 4 Vibrationen sein sollen.
So hat der Benutzer jeder Zeit die Info und Du brauchst keinen Interrupt.
Hey, erstmals danke für deine Antwort.
Hast du eine Empfehlung für mich, wie ich den Signal sofort ausgeben kann, weil ich bin gerade wirklich sehr verwirrt
 
B

Benutzer250079

Gast
Hey, erstmals danke für deine Antwort.
Hast du eine Empfehlung für mich, wie ich den Signal sofort ausgeben kann, weil ich bin gerade wirklich sehr verwirrt
Dafuer hast Du wirklich zu wenig Info gepostet.
Aber so bald Du in Deinem Programm einen Messwert hast, kannst Du doch das Signal auf den Vibrator geben.
Wenn Du die Messwerte jede s aktualisierst, gibst Du entweder "kein", "eins" oder "vier" Vibrationen aus.
(Nur mal so als Beispiel)
Bist Du sicher, dass da s gemeint sind und nicht mili s?
 
Dafuer hast Du wirklich zu wenig Info gepostet.
Aber so bald Du in Deinem Programm einen Messwert hast, kannst Du doch das Signal auf den Vibrator geben.
Wenn Du die Messwerte jede s aktualisierst, gibst Du entweder "kein", "eins" oder "vier" Vibrationen aus.
(Nur mal so als Beispiel)
Bist Du sicher, dass da s gemeint sind und nicht mili s?
ja hab den Code ausgeschnitten gehabt.. und ja habe mich vertan meinte Millisekunden..

stelle dir den vollständigen Code zur verfügung, vielleicht interessiert es dich. Ich glaube somit wurde der Fehler, den du meintest ja indirekt wieder behoben haha

Code:
#include "Adafruit_VL53L0X.h"

// address we will assign if dual sensor is present
#define LOX1_ADDRESS 0x2B
#define LOX2_ADDRESS 0x30
int sensor1,sensor2;


// set the pins to shutdown
#define SHT_LOX1 7
#define SHT_LOX2 6

// objects for the vl53l0x
Adafruit_VL53L0X lox1 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox2 = Adafruit_VL53L0X();

// this holds the measurement
VL53L0X_RangingMeasurementData_t measure1;
VL53L0X_RangingMeasurementData_t measure2;
/*
    Reset all sensors by setting all of their XSHUT pins low for delay(10), then set all XSHUT high to bring out of reset
    Keep sensor #1 awake by keeping XSHUT pin high
    Put all other sensors into shutdown by pulling XSHUT pins low
 */
void setID() {
  // all reset
  digitalWrite(SHT_LOX1, LOW);   
  digitalWrite(SHT_LOX2, LOW);
  delay(10);
  // all unreset
  digitalWrite(SHT_LOX1, HIGH);
  digitalWrite(SHT_LOX2, HIGH);
  delay(10);

  // activating LOX1 and reseting LOX2
  digitalWrite(SHT_LOX1, HIGH);
  digitalWrite(SHT_LOX2, LOW);

  // initing LOX1
  if(!lox1.begin(LOX1_ADDRESS)) {
    Serial.println(F("Failed to boot first VL53L0X"));
    while(1);
  }
  delay(10);

  // activating LOX2
  digitalWrite(SHT_LOX2, HIGH);
  delay(10);

  //initing LOX2
  if(!lox2.begin(LOX2_ADDRESS)) {
    Serial.println(F("Failed to boot second VL53L0X"));
    while(1);
  }
}

void read_dual_sensors() {
  pinMode(5, OUTPUT);
  int t=250;
  lox1.rangingTest(&measure1, false); // pass in 'true' to get debug data printout!
  lox2.rangingTest(&measure2, false); // pass in 'true' to get debug data printout!

  // print sensor one reading
  Serial.print("1: ");
  if(measure1.RangeStatus != 10) {     // if not out of range
    sensor1 = measure1.RangeMilliMeter-25;   
    Serial.print(sensor1);
    Serial.print("mm");
      
    if(sensor1<=1000 && sensor1 >= 750){
      digitalWrite(5, HIGH);
      delay(300);
      digitalWrite(5, LOW);
      delay(t);}
      
    if(sensor1< 750 && sensor1 >= 500){
      digitalWrite(5, HIGH);
      delay(600);
      digitalWrite(5, LOW);
      delay(t);}
      
    if(sensor1< 500 && sensor1 >= 400){
      digitalWrite(5, HIGH);
      delay(900);
      digitalWrite(5, LOW);
      delay(t);}
      
    if(sensor1< 400 && sensor1 >= 300){
      digitalWrite(5, HIGH);
      delay(1200);
      digitalWrite(5, LOW);
      delay(t);}
      
    if(sensor1< 300 && sensor1 >= 200){
      digitalWrite(5, HIGH);
      delay(1500);
      digitalWrite(5, LOW);
      delay(t);}
      
    if(sensor1< 200 && sensor1 >= 150){
      digitalWrite(5, HIGH);
      delay(1800);
      digitalWrite(5, LOW);
      delay(t);}
      
    if(sensor1< 150 && sensor1 >= 100){
      digitalWrite(5, HIGH);
      delay(2100);
      digitalWrite(5, LOW);
      delay(t);}
    
    if(sensor1< 100 && sensor1 >= 50){
      digitalWrite(5, HIGH);
      delay(2400);
      digitalWrite(5, LOW);
      delay(t);}
    }
   else {
    Serial.print("Out of range");
  }
 
  Serial.print(" ");

  // print sensor two reading
  Serial.print("2: ");
  if(measure2.RangeStatus != 4) {
    sensor2 = measure2.RangeMilliMeter;
    Serial.print(sensor2);
    Serial.print("mm");
  } else {
    Serial.print("Out of range"); 
  }
 
  Serial.println();
}

void setup() {
  Serial.begin(9600);

  // wait until serial port opens for native USB devices
  while (! Serial) { delay(1); }

  pinMode(SHT_LOX1, OUTPUT);
  pinMode(SHT_LOX2, OUTPUT);

  Serial.println("Shutdown pins inited...");

  digitalWrite(SHT_LOX1, LOW);
  digitalWrite(SHT_LOX2, LOW);

  Serial.println("Both in reset mode...(pins are low)");
 
 
  Serial.println("Starting...");
  setID();
 
}

void loop() {
  
  read_dual_sensors();
  delay(100);
}
 
Top