Программа обработки энкодера и кнопки с контролем коротких и длинных нажатий
- Войдите на сайт для отправки комментариев
Пнд, 24/07/2017 - 18:23
Выкладываю рачий скетч, алгоритм обработки кнопки такой: короткие после отпускания кнопки длинные держать нажатой до сигнала, или более 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; } // пауза для нового опроса
}