Таймер энкодера Arduino - PullRequest
0 голосов
/ 09 июля 2019

Это то, чего я пытаюсь достичь: пользователь вводит время с помощью поворотного энкодера.Последовательный монитор Arduino должен отображать значения времени в реальном времени, поскольку пользователь продолжает вращать датчик.Затем пользователь нажимает физический переключатель (нажимной переключатель), чтобы начать обратный отсчет.Изначально мой код отлично работал с функцией delay().Но мое приложение также требует от меня запуска мотора, пока работает таймер.Для этого мне нужна неблокирующая задержка.Мне тяжело с этим.Пожалуйста помоги.Вот мой код:

unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change:
const long interval = 1000;           // interval at which to blink (milliseconds)
#define outputA 6
#define outputB 7
int i;
int button=5;
int counter = 0; 
int aState;
int aLastState;  


void setup() {
  pinMode (outputA,INPUT);
  pinMode (outputB,INPUT);
  pinMode (button,INPUT);

  Serial.begin (9600);
  // Reads the initial state of the outputA
  aLastState = digitalRead(outputA);   
}

void loop() {
  // here is where you'd put code that needs to be running all the time.
  aState = digitalRead(outputA); // Reads the "current" state of the outputA
  // If the previous and the current state of the outputA are different, that means a Pulse has occured
  if (aState != aLastState) {     
    // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
    if (digitalRead(outputB) != aState) { 
      counter = counter+1;
    } else {
      counter = counter-1;
    }

    Serial.print("Time (secs): ");
    Serial.println(counter);
    i = counter;

    if (digitalRead(button) == HIGH) {
      while (i != 0) {
        unsigned long currentMillis = millis();
        if (currentMillis - previousMillis == interval) {
          // save the last time you blinked the LED
          previousMillis = currentMillis;
          i--;
          Serial.println(i);
        }
      }
    }
    aLastState = aState; 
  }
}

1 Ответ

0 голосов
/ 09 июля 2019

Если я правильно понимаю, вы уменьшаете i только при вводе if (currentMillis - previousMillis == interval).Это значит, что вы убываете очень медленно, а не за миллисекунды за миллисекунды ...

Чтобы исправить это, я предлагаю:

unsigned long startMillis = millis();
while (millis() - startMillis() < counter){ //check if your time has elapsed
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis == interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;
    Serial.println((int) counter - (millis() - startMillis()));
   }

}

Надеюсь, это поможет!

...