Обнуление счетчика нажатий

bandirom
Offline
Зарегистрирован: 26.09.2017

Добрый день. 

Может кто чтото подсказать по подову моей проги

Суть в том что есть кнопка (в будущем датчик) и нужно узнать сколько он раз сработал за 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 секунд.

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

bandirom пишет:

тоесть сработал раз датчик, запустился таймер и в течении 10 сек оно считает количество срабатываний

таймер запускается после события "раз датчик"?

или

таймер перезапускается после каждого срабатывания датчика?

bandirom
Offline
Зарегистрирован: 26.09.2017

таймер запускается при появлении HIGH, и на протяжении 10 секунд считываются сколько раз появилось HIGH на входе пина (включая первую сработку). Потом таймер останавливается и выводится в серийный скок раз сработал датчик. обнуление таймера и после некой задержки снова повтор. 

Это для анемометра самодельного.

Спасибо за отзыв)

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

bandirom пишет:

Это для анемометра самодельного.

если это для анемоментра, а не для кодового замка(когда нужно ограничить время ползателя на набор нужного кол-ва кнопок)как пример, то тебе нужно считать время между кликами датчика анемоментра - получишь мгновенную скорость вращения вала крыльчатки. 

если быстро вращается, то придётся вешать пин датчика на прерывание.

bandirom
Offline
Зарегистрирован: 26.09.2017

хорошая идея, сегодня попробую подумать над кодом, если слабо будет получатся подскажете, если что?

bandirom
Offline
Зарегистрирован: 26.09.2017

Вроде получилось)

const int buttonPin = 10; // the pin that the pushbutton is attached to

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");
}

а раскажи пожалуйста про прерывание

"то придётся вешать пин датчика на прерывание."

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

bandirom пишет:

а раскажи пожалуйста про прерывание

"то придётся вешать пин датчика на прерывание."

вначале скажи, какого типа датчик на анемометре.

bandirom
Offline
Зарегистрирован: 26.09.2017

Геркон стоит

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

bandirom пишет:

Геркон стоит

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

bandirom
Offline
Зарегистрирован: 26.09.2017

Понял) а код пойдет со временем или както еще оптимизироват можно?

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

bandirom пишет:

Понял) а код пойдет со временем или както еще оптимизироват можно?

код для кнопок - здесь. klapautsiy.github.io

анализ на логические и программные ошибки всего остального я не произвожу.

bandirom
Offline
Зарегистрирован: 26.09.2017

Очень благодарен за помощь)