功能
用户接近连接到Arduino Uno的超声波/红外线传感器,如果接近距离小于20cm,超声波/红外线传感器的triggerPin将从低切换到高 - > '0'列表将切换到'1'的列表。
当超声波/红外线传感器从“0”切换到“1”时,状态LED和状态MotorFan将从LOW切换到HIGH。只要超声波传感器的返回数据为“1”,两种状态都将保持不变。
当用户离开超声波/红外线传感器的附近时,超声波/红外线传感器的triggerPin将从HIGH切换到LOW - > '1的列表将被切换到'0'的列表。
然而,此时,状态LED和状态MotorFan将在切换到状态LOW之前保持高电平状态10秒。在这种情况下,另一个用户接近接近传感器并且超声波/红外线传感器在10秒的延迟内切换回“1”,状态LED和状态MotorFan应保持在HIGH状态而不切换。
因此,正确的流程如下:
超声波/红外线传感器返回'0' - &gt;但当感应用户(距离<20)超声波/红外线传感器在超声波/红外线传感器切换到1时切换到'1',MotorFan状态和LED状态将从LOW超声波/红外线传感器切换到HIGH当感测到接近时,返回'1'&gt;但是当感测用户更多(距离> 20)超声波/红外线传感器切换到'0'时,此时,MotorFan状态和LED状态将保持在高电平状态10秒,然后切换到低电平。条件:当另一个用户在10秒延迟之前接近时,MotorFan状态和LED状态将保持在HIGH状态。
我做了什么:
我为以下版本分配了以下数字引脚:
超声波传感器的trigPin是数字引脚8超声波传感器的echoPin是数字引脚9电机的FanPin风扇为数字引脚5 LED分配给继电器4。
其次,我试图利用millis()来获取时间,如果它超过10000的限制,它将从HIGH状态数字写入LOW状态。
代码: const int trigPin = 8; const int echoPin = 9; //电机风扇连接到arduino引脚号 const int FanPin = 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状态和motorFan状态从LOW切换为HIGH。
然而,当Arduino传感器从HIGH切换到LOW而不等待10s延迟时,LED状态和motorFan都切换回LOW
我想请求一些帮助,因为我完全坚持这个问题。
由于
答案 0 :(得分:0)
您在Timer
函数中为setup()
分配值,这意味着您只在系统启动时执行一次。我会将Timer = millis();
移至if (distance < 20) {
条件。然后,如果用户在感应到距离时移出,您将有一段时间&#34;最后一次接触&#34;。
请记住:如果您想在启动时执行某些操作,请将其放入setup()
。如果您想要重复执行某些内容 - 请将其放在loop()
。