Arduino - 不使用 delay() 的 PIR 运动传感器代码
Arduino - PIR motion sensor code without using delay()
我有一个 Arduino 设置有多个传感器打印到串口。最初,我让 PIR 传感器实现了几个内置的延迟,这样它就不会向运动检测消息发送垃圾邮件。但是,delay() 函数当然会暂停整个代码并干扰其他传感器。
我想做的事情:
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 设置为 millis()。这样,只要它确实开始运动,previousMillis 就会有最后一次它没有的时间。
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。因为那会让你从那时开始计时。这将导致您每隔 interval 毫秒获得一个 "motion detected",因为您基本上是在每次打印时重新开始计时。
我有一个 Arduino 设置有多个传感器打印到串口。最初,我让 PIR 传感器实现了几个内置的延迟,这样它就不会向运动检测消息发送垃圾邮件。但是,delay() 函数当然会暂停整个代码并干扰其他传感器。
我想做的事情:
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 设置为 millis()。这样,只要它确实开始运动,previousMillis 就会有最后一次它没有的时间。
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。因为那会让你从那时开始计时。这将导致您每隔 interval 毫秒获得一个 "motion detected",因为您基本上是在每次打印时重新开始计时。