Время между двумя высокими состояниями входного Arduino

#arduino

#arduino

Вопрос:

Я пытаюсь создать программу в Arduino Uno, которая может вычислять интервал времени (в миллах) между двумя ВЫСОКИМИ состояниями одного и того же ввода.

 int V1;

long int time1;
long int time2;
long int interval1;
long int lastvalue;

void setup (){
  pinMode(2, INPUT);
  Serial.begin(9600);
}
 void loop() {
  V1 = digitalRead(2); // reading state of input 2

  if (V1 ==HIGH) {
    Serial.print("Event occure: ");
    time1 = millis();
    Serial.print(time1);
    delay(500);
    
    interval1= time1 - lastvalue;
    Serial.print("difference between previous time1 and current time1 (in mills): ");
    Serial.print(interval1);
    
  }
 }
 

Можете ли вы дать мне подсказку о том, как вычислить разницу между текущим значением time1 и последним значением (текущее time1-1) time1?

Спасибо!

Комментарии:

1. Я не понимаю, с чем ты борешься. ты знаешь миллиса, ты знаешь, как вычесть два значения… что еще вам нужно?

2. Я не знаю, как зарегистрировать предпоследнее (предпоследнее) значение времени, чтобы сделать разницу с текущим значением time 1.

3. Похоже, стандартная процедура Arduino pulseIn() делает то, что вы хотите. (ну, разделите на 1000, чтобы получить ms из usec).

Ответ №1:

Вы могли бы сделать что-то вроде этого.

 unsigned long lastTime = 0;
int lastVal = HIGH;
int val = LOW;

void setup (){
  pinMode(2, INPUT);
}

void loop() {
  // read the current input value
  val = digitalRead(2);
  // if the value has changed since last time and is HIGH
  if(val != lastVal amp;amp; val){

    // get current time
    unsigned long currTime = millis();
    // calculate difference to last time
    unsigned long timeDiff = currTime - lastTime;
    // get a new lastTime for next high
    lastTime = currTime;
    }
    // update lastVal so we know the input changed
    lastVal = val;  
 }
 

В качестве альтернативы вы могли бы использовать прерывание с нарастающим фронтом аналогичным образом.

Комментарии:

1. Спасибо за подсказку, она работает правильно. Мне нравится, как вы представляете свою идею, комментируете каждую строку кода, таким образом, я действительно понял, что нужно не только копировать и изменять код.

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

3. Спасибо за совет. Я буду запускать каждый тип с помощью ручки и бумаги.