Обнуление счетчика нажатий
- Войдите на сайт для отправки комментариев
Втр, 26/09/2017 - 21:34
Добрый день.
Может кто чтото подсказать по подову моей проги
Суть в том что есть кнопка (в будущем датчик) и нужно узнать сколько он раз сработал за 10 секунд например
тоесть сработал раз датчик, запустился таймер и в течении 10 сек оно считает количество срабатываний, после окончания обнуляется и снова след 10 сек отрабатыевает.
const int buttonPin = 10; // пин кнопки
int buttonPushCounter = 0; // счетчик для количества нажатий кнопок
int buttonState = 0; // текущее состояние кнопки
int lastButtonState = 0; // предыдущее сост кнопки
long button_press_millis = millis(); // переменная для millis()
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
buttonState = !digitalRead(buttonPin);
if (buttonState != lastButtonState) {
if (buttonState == HIGH ) {
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
}
else {
Serial.println("off");
}
}
lastButtonState = buttonState; // заменяем номер нажатия как предыдущее
}
Поlскажите, пожалуйста, куда нужно вставить условие millis() - button_press_millis <= 10000 миллис и как обнулять переменную через кажные 10 секунд.
тоесть сработал раз датчик, запустился таймер и в течении 10 сек оно считает количество срабатываний
таймер запускается после события "раз датчик"?
или
таймер перезапускается после каждого срабатывания датчика?
таймер запускается при появлении HIGH, и на протяжении 10 секунд считываются сколько раз появилось HIGH на входе пина (включая первую сработку). Потом таймер останавливается и выводится в серийный скок раз сработал датчик. обнуление таймера и после некой задержки снова повтор.
Это для анемометра самодельного.
Спасибо за отзыв)
Это для анемометра самодельного.
если это для анемоментра, а не для кодового замка(когда нужно ограничить время ползателя на набор нужного кол-ва кнопок)как пример, то тебе нужно считать время между кликами датчика анемоментра - получишь мгновенную скорость вращения вала крыльчатки.
если быстро вращается, то придётся вешать пин датчика на прерывание.
хорошая идея, сегодня попробую подумать над кодом, если слабо будет получатся подскажете, если что?
Вроде получилось)
int buttonPushCounter = 0; // counter for the number of button presses int buttonState = 0; // current state of the button int lastButtonState = 0; // previous state of the button long button_press_millis; // время отжатия кнопки long button_next; // время между повторным нажатием int speed_w; // скорость вращения void setup() { pinMode(buttonPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { buttonState = !digitalRead(buttonPin); if (buttonState != lastButtonState) { if (buttonState == HIGH ) { button_next = millis() - button_press_millis; buttonPushCounter++; Serial.println(button_next); Serial.println("on"); Serial.print("number of button pushes: "); Serial.println(buttonPushCounter); anemom_func(); } else { Serial.println("off"); button_press_millis = millis(); } } lastButtonState = buttonState; } void anemom_func() { if( button_next <= 300) speed_w = 10; else if ( button_next > 300 && button_next <= 500) speed_w = 5; else if ( ) // и так далее в зависимости от калибровки самого анемометра // значения speed_w щас от фонаря стоят просто для теста)) Serial.print(speed_w); Serial.println( "m/s"); }а раскажи пожалуйста про прерывание
"то придётся вешать пин датчика на прерывание."
а раскажи пожалуйста про прерывание
"то придётся вешать пин датчика на прерывание."
вначале скажи, какого типа датчик на анемометре.
Геркон стоит
Геркон стоит
если геркон - нет смысла на прерывание вешать, скорость срабатывания ограничена механически и присутствует дребезг.
Понял) а код пойдет со временем или както еще оптимизироват можно?
Понял) а код пойдет со временем или както еще оптимизироват можно?
код для кнопок - здесь. klapautsiy.github.io
анализ на логические и программные ошибки всего остального я не произвожу.
Очень благодарен за помощь)