Переключенный светодиод и состояние MotorFan не могут переключиться назад после задержки
функциональность:
Пользователь приближается к ультразвуковому / инфракрасному датчику, подключенному к Arduino Uno, если расстояние сближения меньше 20 см, триггерный контакт ультразвукового / инфракрасного датчика переключится с НИЗКОГО на ВЫСОКОЕ -> список "0" будет переключен на список "1",
Когда ультразвуковой / инфракрасный датчик переключается с "0" на "1", светодиодный индикатор состояния и состояние MotorFan переключаются в HIGH из LOW. Оба состояния будут оставаться до тех пор, пока возвращаемые данные от ультразвукового датчика будут равны "1".
Когда пользователь покидает близость ультразвукового / инфракрасного датчика, триггерный вывод ультразвукового / инфракрасного датчика переключится с ВЫСОКОГО на НИЗКОЕ -> список "1" будет переключен на список "0".
Однако в этот момент светодиод состояния и MotorFan состояния будут оставаться в состоянии ВЫСОКИЙ в течение 10 секунд, прежде чем переключаться в состояние НИЗКИЙ. В случае, если другой пользователь приближается к датчику приближения, и ультразвуковой / инфракрасный датчик переключается обратно на "1" с задержкой в 10 с, светодиод состояния и состояние MotorFan должны оставаться в состоянии ВЫСОКИЙ без переключения.
Поэтому правильный поток выглядит следующим образом:
Ультразвуковой / инфракрасный датчик возвращает "0" ->, но когда чувствительный пользователь в пределах (расстояние < 20) ультразвуковой / инфракрасный датчик переключается на "1", когда ультразвуковой / инфракрасный датчик переключается на "1", состояние MotorFan и состояние светодиода будут переключаться в ВЫСОКОЕ от НИЗКОЕ ультразвуковой / инфракрасный датчик возвращает "1" при измерении близости->, но когда сенсорный пользователь больше (расстояние> 20) ультразвуковой / инфракрасный датчик переключается в "0", в этот момент состояние MotorFan и состояние светодиода будут оставайтесь в состоянии ВЫСОКИЙ в течение 10 секунд, прежде чем переключаться на НИЗКИЙ. Условие: когда другой пользователь приближается до истечения 10-секундной задержки, состояние MotorFan и светодиод будут оставаться в состоянии HIGH.
Что я сделал:
Я назначил следующие цифровые выводы для следующих вариантов:
trigPin ультразвукового датчика является цифровым Контакт 8 echoPin ультразвукового датчика является цифровым Контакт 9 FanPin двигателя Вентилятор является цифровым Контакт 5 LED назначен реле 4.
Во-вторых, я попытался использовать функцию millis(), чтобы получить время, и если оно превысит предел 10000, он переведет оба состояния в цифровое и низкое с ВЫСОКОГО.
Код: const int trigPin = 8; const int echoPin = 9; // Motor-Fan подключен к номеру контакта 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", когда он чувствителен к близости, во-вторых, он также может переключать как состояние светодиода, так и состояние вентилятора на HIGH из LOW.
Тем не менее, как состояние светодиода, так и моторный вентилятор переключаются обратно на НИЗКИЙ, когда датчик Arduino переключается с ВЫСОКОГО на НИЗКИЙ, не дожидаясь задержки 10 с.
Я хотел бы попросить некоторую помощь в этом, поскольку я абсолютно застрял в этой проблеме.
Спасибо
1 ответ
Вы назначаете значение Timer
в setup()
функция, которая означает, что вы делаете это только один раз, когда система запускается. Я бы переехал Timer = millis();
в if (distance < 20) {
состояние. Затем, если пользователь уходит, считая расстояние, у вас уже будет время "последнего контакта".
Помните: если вы хотите, чтобы что-то выполнялось только при запуске - вставьте это в setup()
, Если вы хотите, чтобы что-то было выполнено повторно - поместите это в loop()
,