как установить вывод 13 на ВЫСОКИЙ уровень только на 1 минуту, если датчик на выводе 8 выдает ВЫСОКИЙ уровень?

int PUMP = 13; 
int sensor = 8; 
int val; 

void setup() {
  pinMode(13,OUTPUT);
  pinMode(8,INPUT);
}

void loop() { 
  val = digitalRead(8);  
  if(val == HIGH) 
  {
    digitalWrite(13,HIGH); 
  }
  else
  {
    digitalWrite(13,LOW);
  }

  delay(0);
}

, 👍1


3 ответа


3

Просто добавьте задержку после включения контакта 13. Таким образом, получится:

int PUMP = 13;
int sensor = 8;
int val;

void setup() {
  pinMode(13, OUTPUT);
  pinMode(8, INPUT);
}

void loop() {

  val = digitalRead(8);

  if (val == HIGH)
  {
    digitalWrite(13, HIGH);
    delay(60000); //60000мс это 1 минута
  }
  else
  {
    digitalWrite(13, LOW);
  }
}
,

2

Я хочу добавить к ответу Яна:

  • Если вы хотите что-то сделать позже в течение этой минуты, не используйте задержку. Вместо этого используйте миллисы, см. Мигание без задержки и используйте тот же принцип. Использование задержек считается плохой практикой, поскольку мешает выполнять другие действия в это время. Однако для вашего небольшого примера это не проблема.

  • Также проверьте, что вы на самом деле подразумеваете под требованием «установить вывод 13 на высокий уровень, если вывод 8 на высоком уровне»:

    • Что, если вывод 13 останется высоким в течение 2 минут, должен ли вывод 8 остаться высоким в течение 1 минуты с момента, когда вывод 13 стал высоким (таким образом, он будет низким, когда вывод 13 все еще будет высоким)?
    • Или контакт 8 должен оставаться высоким ещё 1 минуту после того, как контакт 13 снова станет низким? В этом случае нужно проверять наличие флангов, а не только текущее состояние.
,

1

Это плохой способ сделать это, после этого uC сидит там в течение минуты, не в состоянии сделать что-либо еще. Лучший способ — зафиксировать время ввода PIN-кода, а затем продолжать проверять время, пока не истечет 1 минута.

void loop(){
   if ((digitalRead(8) == HIGH) && (timerRunning == 0)){
      startTime = millis(); // все переменные времени имеют тип unsigned long
      digitalWrite (13, HIGH);
      timerRunning = 1;
   }
   if (timerRunning == 1){
      timeNow = millis();
      if ((timeNow - startTime)>= 60000UL){
         timerRunning = 0;
         digitalWrite (13, LOW);
      } // проверка прохождения времени окончания
   } // завершение проверки работы таймера
   // теперь вы можете заниматься другими делами, ожидая, пока пройдет время
} // конец цикла
,