Search code examples
arduinosensorsarduino-c++

Arduino vl53l0x sensor


I'm trying to make a toilet sensorish trigger using vl53l0x sensor, I'm having trouble firing an action while my hand is in front of the sensor for 5 seconds or so, while I've tried different versions of blinkwithoutdelay sketches, and other methods found online, all of them, trigger the 5 seconds, after I pulled my hand off the sensor, which is not what I want. Thanks in advance, I posted my sketch to what I got so far. Thanks in advance!

// Library for TOF SENSOR
#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

// Time calculation
unsigned long startTime;
unsigned long endTime;    // store end time here
unsigned long duration;   // duration stored
byte timerRunning;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Wire.begin();
  sensor.init();
  sensor.setTimeout(500);

  // Start continuous back-to-back mode (take readings as
  // fast as possible).  To use continuous timed mode
  // instead, provide a desired inter-measurement period in
  // ms (e.g. sensor.startContinuous(100)).
  sensor.startContinuous();

}

void loop() {
  // put your main code here, to run repeatedly:

  delay(1000);
  int tofdata = sensor.readRangeContinuousMillimeters();
  int distance = tofdata / 10;        // convert mm to cm
  Serial.print( distance );            // print new converted data
  Serial.println( " cm" );


//  Code for presence detection

  if ( timerRunning == 0 && distance <= 20 ){
      startTime = millis() / 1000;
      Serial.println("time started, starting count");
      timerRunning = 1;  

  }
 
  if ( timerRunning == 1 && distance >= 20 ){
      endTime = millis() / 1000;
      timerRunning = 0;
      duration =  endTime - startTime;
      Serial.println ("Presence detected for seconds: ");
      Serial.print(duration);
  }

}

Solution

  • If want it to fire after the hand has been in front of the sensor for 5 seconds try this:

    void loop() {
    
      // Get distance
      delay(1000);
      int tofdata = sensor.readRangeContinuousMillimeters();
      int distance = tofdata / 10;        // convert mm to cm
    
      //  Code for presence detection
    
      if (distance <= 20 ) {
          // Object is close, check if timer is running
          if (!timerRunning) {
              // Timer not running. Start timer
              startTime = millis();
              Serial.println("time started, starting count");
              timerRunning = 1;
          }
          else {
              // Has 5 seconds passed?
              uint32_t elapsed_time = millis() - startTime ;
              if (elapsed_time >= 5000) {
                  // YES. DO SOMETHING HERE
                  // and reset
                  timerRunning = 0;
              }
          }
      }
      else {
          // Object is not close.
          timerRunning = 0;      
    }