Доброго времени суток, форумчанам.
Заранее прошу прощения, если подобная тема уже создавалась.
Дано: 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]
заранее спасибо!
Сомневаюсь, что я доходчиво объяснил. Поэтому поясню подробнее:
Необходимо чтобы время интервала подсчитывался между каждым последним и последующим нажатием.
класс титановый велосипед StopWatch
// класс считает количество миллисекунд между двумя последними событиями.
Первое присваивание time_counter вынесите в setup(), а из loop() уберите, и сразу после присваивания current_millis и обработки ситуации присваивайте time_counter = current_millis;