切换 LED 和电机风扇状态在延迟后无法切换回来
Toggled LED and MotorFan State unable to TOGGLE back after delay
功能:
用户接近连接到 Arduino Uno 的 ultrasonic/infra-red 传感器,如果接近距离小于 20cm,ultrasonic/infra-red 传感器的 triggerPin 将从低电平切换到高电平 -> 将切换“0”列表到“1”的列表。
当 ultrasonic/infra-red 传感器从“0”切换到“1”时,状态 LED 和状态 MotorFan 将从低切换到高。只要来自超声波传感器的 return 数据为“1”,这两种状态都会保持。
当用户离开 ultrasonic/infra-red 传感器附近时,ultrasonic/infra-red 传感器的 triggerPin 将从高电平切换到低电平 ->“1”列表将切换到“0”列表。
但是,此时,状态 LED 和状态 MotorFan 将保持高状态 10 秒,然后切换到低状态。如果另一个用户接近接近传感器并且 ultrasonic/infra-red 传感器在 10 秒的延迟内切换回“1”,状态 LED 和状态 MotorFan 应保持在高状态而不切换。
因此,正确的流程如下:
ultrasonic/infra-red 传感器 returns '0's -> 但是当感应用户在(距离 < 20)内时 ultrasonic/infra-red 传感器切换到 '1' 当 ultrasonic/infra-red 传感器切换到'1's,MotorFan 状态和 LED 状态将从低电平切换到高电平 ultrasonic/infra-red 传感器在感应接近时为 returns '1's,但当感应用户更多(距离 > 20)时 ultrasonic/infra-red 传感器切换为“0”,此时,MotorFan 状态和 LED 状态将保持高状态 10 秒,然后切换为低状态。条件:当另一个用户在 10s 延迟结束之前接近时,MotorFan 状态和 LED 状态将保持在状态 HIGH。
我做了什么:
我已经为以下变量分配了以下数字引脚:
超声波传感器的trigPin为数字Pin 8 超声波传感器的echoPin为数字Pin 9 FanPin电机Fan为数字Pin 5 LED分配给继电器4.
其次,我尝试使用 millis() 来获取时间,如果它应该超过 10000 的限制,它将数字写入两个状态从高到低。
代码:
常数 int trigPin = 8;
const int echoPin = 9;
//电机风扇连接到arduino引脚号
const int 范拼 = 5;
字节中继 = 4;
long duration;
int distance;
unsigned long Timer;
unsigned long Interval = 10000; //teh repeat Interval
void setup() {
Timer = millis();
pinMode(FanPin, OUTPUT); // Set pinMode for FanPin as OUTPUT, display
pinMode(trigPin, OUTPUT);
pinMode(relay, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600); // Open serial port to communicate with the Ultrasaonic Sensor
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
if (distance < 20) {
// Write a pin of HIGH
Serial.println("1");
//Set motor-fan to operate
digitalWrite(FanPin, HIGH);
digitalWrite(relay, HIGH);
} else {
Serial.println("0");
//Check if Timer is longer than 10s
if ((millis() - Timer) > Interval) {
digitalWrite(FanPin, LOW);
digitalWrite(relay, LOW);
}
}
delay(100);
}
问题:
传感器能够在感应接近时从“0”切换到“1”,其次,它还能够将 LED 状态和电机风扇状态从低切换到高。
但是,当 Arduino 传感器从高电平切换到低电平时,LED 状态和电机风扇都会切换回低电平,而无需等待 10 秒的延迟
我想就此请求一些帮助,因为我完全无法解决这个问题。
谢谢
你在setup()
函数中给Timer
赋值,这意味着你只在系统启动时赋值一次。我会将 Timer = millis();
移动到 if (distance < 20) {
条件。然后,如果用户在感应距离外移动,你已经有"last contact"的时间。
记住:如果你想让某些东西只在启动时执行 - 把它放在 setup()
中。如果你想重复执行某些东西 - 把它放在 loop()
.
功能:
用户接近连接到 Arduino Uno 的 ultrasonic/infra-red 传感器,如果接近距离小于 20cm,ultrasonic/infra-red 传感器的 triggerPin 将从低电平切换到高电平 -> 将切换“0”列表到“1”的列表。
当 ultrasonic/infra-red 传感器从“0”切换到“1”时,状态 LED 和状态 MotorFan 将从低切换到高。只要来自超声波传感器的 return 数据为“1”,这两种状态都会保持。
当用户离开 ultrasonic/infra-red 传感器附近时,ultrasonic/infra-red 传感器的 triggerPin 将从高电平切换到低电平 ->“1”列表将切换到“0”列表。
但是,此时,状态 LED 和状态 MotorFan 将保持高状态 10 秒,然后切换到低状态。如果另一个用户接近接近传感器并且 ultrasonic/infra-red 传感器在 10 秒的延迟内切换回“1”,状态 LED 和状态 MotorFan 应保持在高状态而不切换。
因此,正确的流程如下:
ultrasonic/infra-red 传感器 returns '0's -> 但是当感应用户在(距离 < 20)内时 ultrasonic/infra-red 传感器切换到 '1' 当 ultrasonic/infra-red 传感器切换到'1's,MotorFan 状态和 LED 状态将从低电平切换到高电平 ultrasonic/infra-red 传感器在感应接近时为 returns '1's,但当感应用户更多(距离 > 20)时 ultrasonic/infra-red 传感器切换为“0”,此时,MotorFan 状态和 LED 状态将保持高状态 10 秒,然后切换为低状态。条件:当另一个用户在 10s 延迟结束之前接近时,MotorFan 状态和 LED 状态将保持在状态 HIGH。
我做了什么:
我已经为以下变量分配了以下数字引脚:
超声波传感器的trigPin为数字Pin 8 超声波传感器的echoPin为数字Pin 9 FanPin电机Fan为数字Pin 5 LED分配给继电器4.
其次,我尝试使用 millis() 来获取时间,如果它应该超过 10000 的限制,它将数字写入两个状态从高到低。
代码: 常数 int trigPin = 8; const int echoPin = 9; //电机风扇连接到arduino引脚号 const int 范拼 = 5; 字节中继 = 4;
long duration;
int distance;
unsigned long Timer;
unsigned long Interval = 10000; //teh repeat Interval
void setup() {
Timer = millis();
pinMode(FanPin, OUTPUT); // Set pinMode for FanPin as OUTPUT, display
pinMode(trigPin, OUTPUT);
pinMode(relay, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600); // Open serial port to communicate with the Ultrasaonic Sensor
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
if (distance < 20) {
// Write a pin of HIGH
Serial.println("1");
//Set motor-fan to operate
digitalWrite(FanPin, HIGH);
digitalWrite(relay, HIGH);
} else {
Serial.println("0");
//Check if Timer is longer than 10s
if ((millis() - Timer) > Interval) {
digitalWrite(FanPin, LOW);
digitalWrite(relay, LOW);
}
}
delay(100);
}
问题:
传感器能够在感应接近时从“0”切换到“1”,其次,它还能够将 LED 状态和电机风扇状态从低切换到高。
但是,当 Arduino 传感器从高电平切换到低电平时,LED 状态和电机风扇都会切换回低电平,而无需等待 10 秒的延迟
我想就此请求一些帮助,因为我完全无法解决这个问题。
谢谢
你在setup()
函数中给Timer
赋值,这意味着你只在系统启动时赋值一次。我会将 Timer = millis();
移动到 if (distance < 20) {
条件。然后,如果用户在感应距离外移动,你已经有"last contact"的时间。
记住:如果你想让某些东西只在启动时执行 - 把它放在 setup()
中。如果你想重复执行某些东西 - 把它放在 loop()
.