我有一个Arduino设置与多个传感器打印到串行端口。最初,我让PIR传感器实现了几个内置的延迟,这样它就不会发送运动检测信息。 然而,延迟()函数当然会暂停整个代码,并干扰其他传感器。
我想做的是
1)当运动传感器在X时间内处于高位时,打印一条信息到串口上。
2)在这里插入一段短暂的时间,它没有检测到运动的情况。
3)如果运动传感器在时间<x内处于高位,它什么也不做
总的想法是用软件也要尽量减少误报。 我一直在尝试使用millis()函数来控制它,但没有太大成功。 它可能是一个非常简单的解决方案,我只是没有看到它。
void loop() {
// Get value from motion sensor
pirValue = digitalRead(pirPin); //detectedPin
// See if motion Detected
unsigned long currentMillis = millis();
if (pirValue == 1 && (currentMillis - previousMillis >= interval) ){
previousMillis = millis();
// Display Triggered LED for 3 seconds
digitalWrite(detectedLED, HIGH);
motionDetected = 1;
Serial.println("motion detected");
//delay(3000);
} else {
digitalWrite(detectedLED, LOW);
}
我知道这是绝对错误的,因为我认为现在的设置方式永远不会进入循环。 我已经尝试了其他几种结构,但我没有看到我需要做什么。 这种情况下,我是否需要构造一个状态机的本质?如果有任何帮助思考的地方,我将感激不尽!
你很接近了。你只需要在某个地方设置 previousMillis。那么,你的定时的起始点是什么?就是当PIR传感器第一次检测到运动时。对吧?或者换一种方式,你想从上次它没有检测到运动的时候开始计时。所以只需添加一行,如果PIR没有看到任何运动,那么它就会将previousMillis设置为毫秒()。这样一来,每当它检测到运动时,foreverMillis就会有上次没有检测到运动的时间。
void loop() {
// Get value from motion sensor
pirValue = digitalRead(pirPin); //detectedPin
// See if motion Detected
unsigned long currentMillis = millis();
if (pirValue == LOW) {
previousMillis = millis();
}
if (pirValue == HIGH && (currentMillis - previousMillis >= interval) ){
// Display Triggered LED for 3 seconds
digitalWrite(detectedLED, HIGH);
motionDetected = 1;
Serial.println("motion detected");
//delay(3000);
} else {
digitalWrite(detectedLED, LOW);
}
你不希望把 previousMillis 设置在你现在的位置。因为这将使你从那个点开始计时。这将导致你每隔一毫秒就得到一个 "检测到运动",因为你每次打印的时候基本上都是重新开始计时。