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

У меня есть этот раздел кода. Он работает нормально и только так, как я хочу, он выполняется, когда кнопка отпущена, а не когда она нажата. Мое приложение должно выполнять этот код при включенном переключателе. Проблема в том, что это vairable "fsrOnMillis" постоянно обновляется, когда кнопка находится высоко. Я попробовал несколько вещей, но не могу понять, как лучше всего заставить это работать так, как я хочу.

Описание оборудования: Переключатель при включении будет обеспечивать 5В. При выключенном 0В. 2 светодиода-один зеленый и один красный.

Я хочу, чтобы при включении выключателя загорался и гас зеленый светодиод. Затем через 60 000 мс загорится красный светодиод, сообщающий о завершении процесса.

Происходит то, что когда переключатель включен, ничего не происходит, но когда он выключен, код выполняется. Я хочу, чтобы процесс выполнялся после включения выключателя.

if (digitalRead(BUTTON) == HIGH) {
  // update the time when button was pushed

  fsrOnMillis = currentMillis;
  greenReady = true;
  redReady = true;
 }

 // make sure this code isn't checked until after button has been let go
 if (greenReady) {
   //this is typical millis code here:
   if ((unsigned long)(currentMillis - fsrOnMillis) >= greenOnDelay ) {
     // okay, enough time has passed since the button was let go.
     analogWrite(greenLedPin, 153);
     // setup our next "state"
     greenState = true;
     // save when the greenLedPin turned on
     greenTurnedOnAt = currentMillis;
     // wait for next button press
     greenReady = false;
   }
 }

 // see if we are watching for the time to turn off greenLedPin
 if (greenState) {
   // okay, led on, check for now long
   if ((unsigned long)(currentMillis - greenTurnedOnAt) >= greenOffDelay) {
     greenState = false;
     analogWrite(greenLedPin, 0);
   }
 }

 if (redReady) {
   //this is typical millis code here:
   if ((unsigned long)(currentMillis - fsrOnMillis) >= redOnDelay) {
     // okay, enough time has passed since the button was let go.
     analogWrite(redLedPin, 153);
     // setup our next "state"
     redState = true;
     // save when the greenLedPin turned on
     redTurnedOnAt = currentMillis;
     // wait for next button press
     redReady = false;
   }
 }

 // see if we are watching for the time to turn off greenLedPin
 if (redState) {
   // okay, led on, check for now long
   if ((unsigned long)(currentMillis - redTurnedOnAt) >= redOffDelay) {
     redState = false;
     analogWrite(redLedPin, 0);
   }
 }

Любая помощь очень ценится.

, 👍1

Обсуждение

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

В своем вопросе вы точно сказали, в чем заключается проблема. Уберите эту линию. Переместите его туда, где это происходит только тогда, когда выключатель выключен. Я не понимаю, в чем тут задержка., @Delta_G

О, я вижу, вы хотите обновить это время один раз, когда кнопка впервые нажата, а не постоянно, пока она нажата. Посмотрите на пример изменения состояния в IDE. Он показывает вам, как использовать переменную, чтобы идти в ногу с последним состоянием, так что вы можете реагировать только тогда, когда состояние меняется., @Delta_G


1 ответ


0

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

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

Вероятно, ваша кнопка настроена как INPUT_PULLUP и подключена для подключения контакта к заземлению. Это довольно типичная установка. В этом случае вывод кнопки считывается как LOW, когда она нажата, и HIGH, когда она не нажата. Просто изменил ваше утверждение if на:

//                         vvv
if (digitalRead(BUTTON) == LOW)
//                         ^^^
,

Привет, Дункан, спасибо за ответ. Нет, у меня есть переключатель, когда переключатель включен, сигнал 5 В поступает на цифровой вход a на arduino. Что бы я хотел, чтобы произошло, так это то, что код ожидает включения переключателя, зажигает зеленый светодиод, выключает зеленый светодиод после задержки. Затем красный светодиод включится и снова погаснет позже. То, что происходит, - это ничто, когда переключатель выключен, когда он включен, ничего не происходит, но как только он снова выключен, код выполняется., @Daytona675