Переключенный светодиод и состояние 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(),

Другие вопросы по тегам