Программа обработки энкодера и кнопки с контролем коротких и длинных нажатий

Нет ответов
Н_Андрей_Ю
Н_Андрей_Ю аватар
Offline
Зарегистрирован: 22.12.2016

Выкладываю рачий скетч, алгоритм обработки кнопки такой: короткие после отпускания кнопки длинные держать нажатой до сигнала, или более 2 секудны. Может кому пригодится. Мучился неделю с кнопками. :( 

//Абсолютно рабочий скетч управления энкодером и кнопкой! И контролем длинных нажатий на кнопку более секунды
// 19.07.17 Андрей Никитин
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);
#define PIN_A 2
#define PIN_B 3
#define ENC_BTN 4
#define TON_PIN 9 //выход на зумер

volatile bool PinAH = 0;
volatile bool PinBH = 0;
volatile bool PinAB = 0;
volatile bool PinBA = 0;
unsigned long ButlastMillis = 0;

int Enc_v = 0;
int encValue =0;
byte butPres = 0;
byte flag_Long = 0;

void setup(){
  pinMode(PIN_A, INPUT);
  pinMode(PIN_A, INPUT);
  pinMode(ENC_BTN, INPUT);
  pinMode(TON_PIN, OUTPUT);
  
  digitalWrite(PIN_A,HIGH);
  digitalWrite(PIN_B,HIGH);
  digitalWrite(ENC_BTN,HIGH);
    Serial.begin(115200);
    Serial.println("Ready");
}
 
 void loop() {
  /**********************Энкодер***********************/
if(digitalRead(PIN_A)== HIGH && PinBH == 0 && PinBA == 0)
  {PinAH = 1;PinAB = 1;
   if(digitalRead(PIN_B)== HIGH)
      {PinBH = 1; Enc_v--;}
   }
if(digitalRead(PIN_A)== LOW && digitalRead(PIN_B)== LOW){PinAH = 0; PinBH = 0;PinAB = 0;PinBA = 0;}   

if(digitalRead(PIN_B)== HIGH && PinAH == 0 && PinAB == 0)
  {PinBH = 1; PinBA = 1;
   if(digitalRead(PIN_A)== HIGH)
      {PinAH = 1; Enc_v++;}
   }
if(digitalRead(PIN_A)== LOW && digitalRead(PIN_B)== LOW){PinAH = 0; PinBH = 0;PinAB = 0;PinBA = 0;} 

if(encValue != Enc_v){
Serial.print("Enc=");Serial.println(Enc_v);

encValue = Enc_v;
}
/**************КНОПКА******************************************************/
    static unsigned long timerInc = 0;
  if (digitalRead(ENC_BTN)== LOW && butPres == 0 ) {
   delay(10);
    butPres = 1;
   ButlastMillis = millis();
    }
  if (digitalRead(ENC_BTN)== HIGH && ( millis() - ButlastMillis ) <= 400 && butPres == 1 && flag_Long == 1){
     //flag_Long = 0;
     butPres = 0; 
   Serial.print("START_BUT=");Serial.println( millis() - ButlastMillis );
   tone(TON_PIN, 700, 100);
    }
  if (digitalRead(ENC_BTN)== LOW && ( millis() - ButlastMillis ) > 1200 && butPres ==1 ){ // и удерживать 1 cекунду  или больше...
    flag_Long = 0;
    butPres = 0;    
    Serial.print("START_BUT_LONG=");Serial.println( millis() - ButlastMillis );
    tone(TON_PIN, 2000, 100);   
   // timerInc = millis() + 401;      // пауза для нового опроса
 }
    
  if (digitalRead(ENC_BTN)== HIGH && butPres == 1 && ( millis() - ButlastMillis ) > 401) {butPres = 0;
  flag_Long = 1;  }    // пауза для нового опроса
 }