Переменная истекшего времени не сбрасывается

Я новичок в программировании 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 секунд

      }
     }

    }
}

, 👍1

Обсуждение

Почему бы вам не использовать библиотеку отладки?, @Edgar Bonet

@Эдгар, можешь пожалуйста поподробнее?, @Niloy Talukder

Ваша проблема очень похожа на [отскок кнопки](https://learn.adafruit.com/make-it-switch/debouncing), хотя и с более длительными временными рамками. Готовые [библиотеки](https://github.com/thomasfredericks/Bounce2) предназначены для надежного решения этой проблемы., @Edgar Bonet

@Эдгар, большое спасибо за объяснение. Я рад узнать о debounce. Позвольте мне взглянуть на это. Счастливых праздников!, @Niloy Talukder


1 ответ


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

0

Переменная 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