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