Переменная истекшего времени не сбрасывается
Я новичок в программировании Arduino. Позвольте мне описать приложение, над которым я работаю. Я нажимаю кнопку в течение определенного периода времени (30 секунд). Не могу постоянно держать его в нажатом положении. Я хочу избежать случайного перехода из состояния кнопки с логики ВЫСОКОГО на НИЗКИЙ. Я пытаюсь управлять электромагнитным клапаном только в конце мероприятия.
Алгоритм, который я использую, заключается в том, что если система обнаруживает ВЫСОКИЙ сигнал датчика, она переходит в цикл и ищет переход в НИЗКИЙ. Он проверяет, имеется ли непрерывный НИЗКИЙ уровень в течение более 5 секунд. Если НЕТ, то он сбрасывается и снова начинает проверять НИЗКИЙ уровень. Если ДА, это означает конец события и приводит в действие электромагнитный клапан.
Проблема, с которой я столкнулся с кодом, заключается в том, что хотя переход в НИЗКИЙ режим и пребывание в НИЗКОМ состоянии составляет менее 5 секунд, система посылает импульс для управления электромагнитным клапаном. Я включил функцию Serial.print() для наблюдения за значением состояния входа датчика и затраченного времени. Переменная прошедшего времени не сбрасывается и продолжает увеличиваться, даже если состояние кнопки меняется с НИЗКОГО на ВЫСОКОЕ.
Я включил сюда часть кода, связанную с алгоритмом. Я буду очень признателен, если вы посмотрите на код и выходной файл и поможете мне обнаружить ошибку.
Еще раз спасибо! Нилой.
void loop() {
buttonstate = digitalRead(button); // читаем состояние значения микропереключателя: HIGH «включено» или LOW «выключено»
if (buttonstate == HIGH ){
countstart = 1;
while(countstart == 1) {
buttonstate = digitalRead(button); // читаем состояние значения микропереключателя: HIGH «включено» или LOW «выключено»
if ( ( buttonstate == LOW ) && ( startFlag == 0 ) ) { // начинаем новую временную последовательность
startFlag = 1;
startTime = millis();
}
if ( ( buttonstate == LOW ) && startFlag == 1 ){
endTime = millis();
elapsedTime = endTime - startTime;
}
if ( ( buttonstate == HIGH ) && startFlag == 1 ){
startFlag == 0;
endTime = startTime =0;
elapsedTime = endTime - startTime;
countstart = 0;
}
Serial.print(buttonstate);
Serial.print("\n"); // Печать табуляции
Serial.print(elapsedTime);
Serial.print("\n"); // Печать табуляции
if ( elapsedTime >= 5000)
{
delay(2000); //задержка 2 секунды
solenoid->run(FORWARD);
delay(40);
solenoid->run(RELEASE);
delay(500);
solenoid->run(BACKWARD);
delay(40);
solenoid->run(RELEASE);
countstart = 0;
endTime = startTime =0;
elapsedTime = endTime - startTime;
buttonstate = LOW;
delay(15000); //ждём 15 секунд
}
}
}
}
@Niloy Talukder, 👍1
Обсуждение1 ответ
Лучший ответ:
Переменная startFlag никогда не становится нулевой, потому что в этой части кода есть ошибка:
if ( ( buttonstate == HIGH ) && startFlag == 1 ){
**startFlag = 0;**
endTime = startTime =0;
elapsedTime = endTime - startTime;
countstart = 0;
}
4 скобки на втором ПЧ, 3 на третьем, 3 на четвёртом., @mikeY
@ leoc7, да, это была ошибка, которая не позволяла сбросить истекшее время. Я неправильно поставил лишний знак равенства. Большое спасибо за указание на это. Теперь система работает как положено! С праздником, еще раз спасибо!, @Niloy Talukder
@user141512 user141512, пожалуйста!, @leoc7
- Кнопка переключения переключает между операторами обращения с разблокированием кнопки
- Как справиться с rollover millis()?
- Есть ли способ воспроизводить звуки с Arduino без использования звукового экрана?
- В чем разница между analogWrite и digitalWrite?
- Использование millis() и micros() внутри процедуры прерывания
- Что означает “LSB на градус в секунду” (LSB per degree per second)?
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
Почему бы вам не использовать библиотеку отладки?, @Edgar Bonet
@Эдгар, можешь пожалуйста поподробнее?, @Niloy Talukder
Ваша проблема очень похожа на [отскок кнопки](https://learn.adafruit.com/make-it-switch/debouncing), хотя и с более длительными временными рамками. Готовые [библиотеки](https://github.com/thomasfredericks/Bounce2) предназначены для надежного решения этой проблемы., @Edgar Bonet
@Эдгар, большое спасибо за объяснение. Я рад узнать о debounce. Позвольте мне взглянуть на это. Счастливых праздников!, @Niloy Talukder