Как установить таймер для функции и иметь возможность сбросить его в середине процесса?

Здравствуйте, мне и моему другу нужно сделать школьное задание, но нам нужна помощь. Мы должны сделать так, чтобы светодиод включался с помощью кнопки и реле. Но когда я нажимаю кнопку, светодиод должен гореть в течение 10 минут, а затем гаснуть, если мы не нажмем кнопку в течение этих 10 минут, тогда светодиод должен погаснуть. Затем повторите этот процесс, когда мы снова нажмем кнопку.

const int relay = 6; 
const int button = 5;
int stateold = 1;
int statenew = 0;
int LED = 0;

void setup() 
{   
  pinMode(relay,OUTPUT);   
  pinMode(button,INPUT); 
  time = millis();
} 

void loop() 
{   
  statenew = digitalRead(knop);
  if(stateold==0 && statenew==1){
    if(LED==0){
      digitalWrite(relay,HIGH);
      LED = 1;
      }    
    }
    else{
       digitalWrite(relay,LOW);
        LED = 0;
    }
  }
 stateold=statenew;

} 

, 👍0

Обсуждение

вам нужно думать о «светодиоде в течение 10 минут» по-другому ... это не одно 10-минутное действие ... это два очень коротких действия с интервалом в 10 минут ... выполнить задание на бумаге ... использовать кухню свет для представления светодиода ... используйте часы, чтобы отсчитать 10 минут .... запишите все, что вам нужно сделать, чтобы включить свет на 10 минут ... представьте, что кнопка была нажата в какой-то момент внутри 10-минутный интервал... шаги, которые вы записали, можно превратить в рабочий код, @jsotola

Спасибо, вы мне очень помогли в правильном направлении., @daan

рад помочь .... программирование в основном говорит очень глупой машине, что именно делать в любое время и как реагировать на каждое отдельное интересующее событие., @jsotola

я забыл упомянуть, что в упражнениях с карандашом и бумагой на вашей кухне вы не можете использовать свой мозг, чтобы что-либо запомнить ... такие вещи, как время начала и предыдущее состояние кнопки, должны быть запомнены на бумаге., @jsotola


1 ответ


Лучший ответ:

1

Ниже приведен пример того, что вы описали; нажатие кнопки включит светодиод и погаснет только через 10 минут или при повторном нажатии кнопки.

Прочитайте комментарии в коде:

#define btn 5
#define rly 6

bool btnState;
bool ledState;
unsigned long timer = 0;

void setup() {
  pinMode(btn, INPUT_PULLUP);
  pinMode(rly, OUTPUT);
}

void loop() {
  btnState = digitalRead(btn); // Читаем статус кнопки (по умолчанию 1)

  if (!btnState) { // Если состояние кнопки == 0 (нажато)
    ledState = !ledState; // Переключить это логическое значение
    timer = millis(); // и сбросить таймер
  }

  if (ledState) { // Если состояние светодиода == 1
    digitalWrite(rly, HIGH); // Включаем реле
  } else { // В противном случае отключаем
    digitalWrite(rly, LOW);
  }

  if (ledState && millis() - timer > 600000) { // Если прошло 10 минут, выключаем реле
    digitalWrite(rly, LOW);
    ledState = !ledState;
  }
}

Вы также должны устранить дребезг кнопки, и вы можете включить/выключить светодиод, когда кнопка нажата и отпущена, а не только когда она нажата.

,

Большое спасибо, вы нам очень помогли, и теперь это работает. Только в последнем операторе if вы забыли ledState = !ledState., @daan

@daan YW, да, он должен переключать ledState в операторе таймера., @ElectronSurf