c++ TOF传感器添加定时器以关闭LED

f8rj6qna  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(222)

我有一个飞行时间传感器,可以测量我的车和车库墙壁之间的距离。我把它们和一些红色LED连接起来。如果距离小于或等于50毫米,LED就会亮起来。但我不想让LED整夜亮着。所以我试着写逻辑来创建一个计时器或其他东西来关闭LED,尽管事实上我的车仍然会触发50毫米的距离阈值。我知道它'It“这有点混乱,因为当物体〈= 50毫米时,50毫米的阈值会触发LED打开。所以,我想要的是在x秒后触发LED关闭的东西。
这是我的Arduino代码:

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

VL53L0X sensor;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, 8, NEO_GRB + NEO_KHZ800);

unsigned int time = 5000; // 5 seconds

void setup()
{
  strip.begin();
  strip.show();
  pinMode(12, INPUT_PULLUP);
  digitalWrite(12, HIGH);  
  Serial.begin(9600);
  Wire.begin();

  sensor.init();
  sensor.setTimeout(500);

  sensor.startContinuous();

}

void loop()
{
  int distance = sensor.readRangeContinuousMillimeters();
  
  //distance = distance;
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.print("mm");

  if(sensor.timeoutOccurred()){Serial.print("TIMEOUT");}

  if(distance <= 50){

    unsigned int milliseconds = millis();
    
    colorWipe(strip.Color(255, 0, 0), 50);
    //colorWipe(strip.Color(0, 255, 0), 50);
    //colorWipe(strip.Color(0, 0, 255), 50);
    Serial.println("LED ON +++++++");

    // This is the part where I want the LEDs to turn off
    //  after x amount of seconds elapsed.

    if(milliseconds >= time){ 
      colorWipe(strip.Color(0, 0, 0), 50);
      time = 0;
    }
    
    
  }else {
    colorWipe(strip.Color(0, 0, 0), 50);
    Serial.println("LED OFF -------");
    //time = 0;
  }

  Serial.println();

}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, int wait) {
  for(int i=0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    //delay(wait);
  }
}

如果你们能帮我或者给我指出正确的方向,我将不胜感激。谢谢!

uubf1zoe

uubf1zoe1#

你的思路是对的。
当你打开发光二极管的时候你会存储一个时间戳。但是你的问题是每次循环执行的时候你都会重置这个时间戳。
10秒后关闭LED的条件为millis() > milliseconds + time
当发光二极管熄灭时,不应重置开始时间。这会导致以下情况:
如果发光二极管是关闭的,距离得到〈= 50你打开发光二极管,并存储一个打开时间.如果发光二极管是打开的,而当前时间超过打开时间加上所需的打开延迟或如果距离变成〉50你关闭发光二极管.
你可能会想到更复杂的状态,例如你可以只在汽车停下来的时候启动计时器,当汽车开始移动的时候再启动计时器。

相关问题