Измерение времени между "любыми" двумя нажатиями. Частота нажатии.

Patriot93
Offline
Зарегистрирован: 04.10.2016

Доброго времени суток, форумчанам.

 

Заранее прошу прощения, если подобная тема уже создавалась. 

Дано: arduino uno, 10 светодиодов, кнопка.

Необходимо измерять скорость нажатия на кнопку. И в зависимости от скорости включать конкретное число светодиодов. 

Например:

2 нажатии в секунду - 2 светодиода;

5 нажатии в секунду - 5 светодиодов и т.д. ... (для начала я использовал только 5 светодиодов)

Ориентировался на разные источники. Вот один из них: http://arduino.ru/forum/programmirovanie/plavnoe-miganie-svetodioda-s-izmenyaemym-vruchnuyu-intervalom-miganiya-pomogi

Вот то, что я слепил. Работает хорошо (см.код ниже).

После двух последовательных нажатий, программа измеряет время между этими двумя нажатиями, затем сравнивает это время и при совпадении условии включает определенноые светодиоды. Но для следуюәего измерения интервала требуется сделать еще два нажатия.

Например: 

Нажал-отпустил-1, нажал-отпустил-2, измерил интервал, сравнил, включил сколько надо.

А мне нужно примерно вот так: нажал-отпустил-1, нажал-отпустил-2, измерил интервал1-2, сравнил, включил сколько надо, нажал-отпустил-3, измерил интервал2-3, сравнил, включил сколько надо и т.д. 

Будут другие варианты я буду только рад. 

[code]
//Измерение времени между "любыми" двумя нажатиями. Частота нажатии.
 
int button = 1;               // одна кнопка и пять свтодиодов
int ledPin13 = 13;
int ledPin12 = 12;
int ledPin4 = 4;
int ledPin7 = 7;
int ledPin8 = 8;
 
int button_flag = 0;                    // задал переменные
long time_counter = 0;
 
unsigned long interval = 0;
 
 
void setup() {                              // кнопка как вход, светодиоды как выходы
  pinMode(button, INPUT);
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);
}
void loop() {
  if (digitalRead(button) == HIGH && button_flag == 0) {
    time_counter = millis();                                                    // записал время в переменную-
    button_flag = 1;                                                               // после первого нажатия
  }
  if (digitalRead(button) == LOW && button_flag == 1) {
    button_flag = 2;
  }
  if (digitalRead(button) == HIGH && button_flag == 2) {
    unsigned long current_millis =  millis();                            // записал новое время во вторую переменную
    interval = (current_millis - time_counter);                        // нашел разницу между переменными
    button_flag = 3;
  }
  if (digitalRead(button) == LOW && button_flag == 3) {
    button_flag = 0;                                                             // обнулил флаг
  }
  if (interval <= 200) {                                                         // если переменная меньше 200 и т.д.
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin7, HIGH);
    digitalWrite(ledPin8, HIGH);
    digitalWrite(ledPin12, HIGH);
    digitalWrite(ledPin13, HIGH);
  }
  if (interval > 200 && interval <= 400) {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin7, HIGH);
    digitalWrite(ledPin8, HIGH);
    digitalWrite(ledPin12, HIGH);
    digitalWrite(ledPin13, LOW);
  }
  if (interval > 400 && interval <= 600) {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin7, HIGH);
    digitalWrite(ledPin8, HIGH);
    digitalWrite(ledPin12, LOW);
    digitalWrite(ledPin13, LOW);
  }
  if (interval > 600 && interval <= 800) {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin7, HIGH);
    digitalWrite(ledPin8, LOW);
    digitalWrite(ledPin12, LOW);
    digitalWrite(ledPin13, LOW);
  }
  if (interval > 800 && interval <= 1000) {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin7, LOW);
    digitalWrite(ledPin8, LOW);
    digitalWrite(ledPin12, LOW);
    digitalWrite(ledPin13, LOW);
  }
  if (interval > 1000) {
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin7, LOW);
    digitalWrite(ledPin8, LOW);
    digitalWrite(ledPin12, LOW);
    digitalWrite(ledPin13, LOW);
  }
}
[/code]
заранее спасибо! 
Patriot93
Offline
Зарегистрирован: 04.10.2016

Сомневаюсь, что я доходчиво объяснил. Поэтому поясню подробнее:

Необходимо чтобы время интервала подсчитывался между каждым последним и последующим нажатием. 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

 

класс титановый велосипед StopWatch

// класс считает количество миллисекунд между двумя последними событиями.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Первое присваивание time_counter вынесите в setup(), а из loop() уберите, и сразу после присваивания current_millis и обработки ситуации присваивайте time_counter = current_millis;

Patriot93
Offline
Зарегистрирован: 04.10.2016
Прошу прощения за долгий ответ.
Я попытался следовать Вашему совету, но у меня не получилось. Я увеличил время ограничивающее условие, для удобства. Пришел к выводу, что светодиоды реагируют только через каждые два нажатия. 
 
А "класс титановый велосипед" я еще не освоил. Только приступаю. 
Опыта у меня почти что нет. Студент. Начал изучать только месяц назад.
Я правильно внес изменения? Заранее спасибо за помощь) 
//Измерение времени между "любыми" двумя нажатиями. Частота нажатии.

int button = 1;                     // одна кнопка и пять свтодиодов
int ledPin13 = 13;
int ledPin12 = 12;
int ledPin4 = 4;
int ledPin7 = 7;
int ledPin8 = 8;

int button_flag = 0;                // задал переменные
long time_counter = 0;
unsigned long interval = 0;


void setup() {                      // кнопка как вход, светодиоды как выходы
  pinMode(button, INPUT);
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);
  time_counter = millis();         // вынес первое присваивание
}
void loop() {
  if (digitalRead(button) == HIGH && button_flag == 0) {
    // вынес в setup: time_counter = millis();              // записал время в переменную-
    button_flag = 1;                                        // после первого нажатия
 
  if (digitalRead(button) == LOW && button_flag == 1) {
    button_flag = 2;
  }
  if (digitalRead(button) == HIGH && button_flag == 2) {
    unsigned long current_millis =  millis();               // записал новое время во вторую переменную
    interval = (current_millis - time_counter);             // нашел разницу между переменными
    button_flag = 3;
    time_counter = current_millis;                            // добавил
  }
  if (digitalRead(button) == LOW && button_flag == 3) {
    button_flag = 0;                                          // обнулил флаг
  }
  if (interval <= 1000) {                                 // если переменная меньше 1000 и т.д.
    digitalWrite(ledPin4, HIGH);                         // увеличил интервал времени для удобства 
    digitalWrite(ledPin7, HIGH);
    digitalWrite(ledPin8, HIGH);
    digitalWrite(ledPin12, HIGH);
    digitalWrite(ledPin13, HIGH);
  }
  if (interval > 1000 && interval <= 2000) {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin7, HIGH);
    digitalWrite(ledPin8, HIGH);
    digitalWrite(ledPin12, HIGH);
    digitalWrite(ledPin13, LOW);
  }
  if (interval > 2000 && interval <= 3000) {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin7, HIGH);
    digitalWrite(ledPin8, HIGH);
    digitalWrite(ledPin12, LOW);
    digitalWrite(ledPin13, LOW);
  }
  if (interval > 3000 && interval <= 4000) {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin7, HIGH);
    digitalWrite(ledPin8, LOW);
    digitalWrite(ledPin12, LOW);
    digitalWrite(ledPin13, LOW);
  }
  if (interval > 4000 && interval <= 5000) {
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin7, LOW);
    digitalWrite(ledPin8, LOW);
    digitalWrite(ledPin12, LOW);
    digitalWrite(ledPin13, LOW);
  }
  if (interval > 5000) {
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin7, LOW);
    digitalWrite(ledPin8, LOW);
    digitalWrite(ledPin12, LOW);
    digitalWrite(ledPin13, LOW);
  }
}