我有一个飞行时间传感器,可以测量我的车和车库墙壁之间的距离。我把它们和一些红色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);
}
}
如果你们能帮我或者给我指出正确的方向,我将不胜感激。谢谢!
1条答案
按热度按时间uubf1zoe1#
你的思路是对的。
当你打开发光二极管的时候你会存储一个时间戳。但是你的问题是每次循环执行的时候你都会重置这个时间戳。
10秒后关闭LED的条件为
millis() > milliseconds + time
当发光二极管熄灭时,不应重置开始时间。这会导致以下情况:
如果发光二极管是关闭的,距离得到〈= 50你打开发光二极管,并存储一个打开时间.如果发光二极管是打开的,而当前时间超过打开时间加上所需的打开延迟或如果距离变成〉50你关闭发光二极管.
你可能会想到更复杂的状态,例如你可以只在汽车停下来的时候启动计时器,当汽车开始移动的时候再启动计时器。