Мне нужно изменить этот код, чтобы запустить раздел кода, когда переключатель включен, а не когда переключатель отпущен
У меня есть этот раздел кода. Он работает нормально и только так, как я хочу, он выполняется, когда кнопка отпущена, а не когда она нажата. Мое приложение должно выполнять этот код при включенном переключателе. Проблема в том, что это 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);
}
}
Любая помощь очень ценится.
@Daytona675, 👍1
Обсуждение1 ответ
Вы должны предоставить описание настройки вашего оборудования в рамках вашего вопроса, а также более четкое изложение вашей проблемы.
Вы хотите сказать, что ваш код написан в обратном порядке и действует так, как будто кнопка нажата, когда ее нет, и как будто она была отпущена, когда вы ее нажмете?
Вероятно, ваша кнопка настроена как INPUT_PULLUP и подключена для подключения контакта к заземлению. Это довольно типичная установка. В этом случае вывод кнопки считывается как LOW
, когда она нажата, и HIGH
, когда она не нажата. Просто изменил ваше утверждение if на:
// vvv
if (digitalRead(BUTTON) == LOW)
// ^^^
Привет, Дункан, спасибо за ответ. Нет, у меня есть переключатель, когда переключатель включен, сигнал 5 В поступает на цифровой вход a на arduino. Что бы я хотел, чтобы произошло, так это то, что код ожидает включения переключателя, зажигает зеленый светодиод, выключает зеленый светодиод после задержки. Затем красный светодиод включится и снова погаснет позже. То, что происходит, - это ничто, когда переключатель выключен, когда он включен, ничего не происходит, но как только он снова выключен, код выполняется., @Daytona675
- Использовать timer0, не влияя на millis() и micros().
- Торговый автомат Arduino для мониторинга ввода монет в слот во время ожидания ввода пользователя
- Arduino Мигает двумя светодиодами без задержки (количество повторений)
- Сброс Arduino с помощью ПО (каждый день)
- Та же кнопка одним кликом и двойным кликом
- Как сбросить millis()?
- Реструктурировать код для многозадачности Neopixel + ИК-пульт + ардуино
- Кнопка переключения переключает между операторами обращения с разблокированием кнопки
в твоей проблеме нет никакого смысла ... если вы можете обнаружить кнопку в нажатом состоянии, то вы можете обнаружить кнопку в отпущенном состоянии так же легко ... есть ли что-то, что вы забыли нам сказать?, @jsotola
В своем вопросе вы точно сказали, в чем заключается проблема. Уберите эту линию. Переместите его туда, где это происходит только тогда, когда выключатель выключен. Я не понимаю, в чем тут задержка., @Delta_G
О, я вижу, вы хотите обновить это время один раз, когда кнопка впервые нажата, а не постоянно, пока она нажата. Посмотрите на пример изменения состояния в IDE. Он показывает вам, как использовать переменную, чтобы идти в ногу с последним состоянием, так что вы можете реагировать только тогда, когда состояние меняется., @Delta_G