Krótkie i długie wciśniecie - fulus - 08-04-2016
Witam
Proszę mi powiedzieć czy istnieje taka możliwość obsługi przycisków, aby krótkie naciśniecie powodowało natychmiastowe załączenie przekaźnika, a długie załączenie po czasie. Przy czym czasem okazuje się, że zbyt długo wciśnięto przycisk. Dlatego też ponowne krótkie wciśniecie przycisku powoduje wykonanie sekcji dla krótkie przyciśniecie. Czy można zastosować delay do opóźnienia czy też inny sposób. Jak w takim przypadku zastosować przerwania. Próbuje dopasować kod.
Kod: unsigned long keyPrevMillis = 0;
const unsigned long keySampleIntervalMs = 25;
byte longKeyPressCountMax = 80; // 80 * 25 = 2000 ms
byte longKeyPressCount = 0;
byte prevKeyState = HIGH; // button is active low
const byte keyPin = 2; // button is connected to pin 2 and GND
// called when button is kept pressed for less than 2 seconds
void shortKeyPress() {
Serial.println("krotkie wcisniecie");
}
// called when button is kept pressed for more than 2 seconds
void longKeyPress() {
Serial.println("dlugie wcisniecie");
}
// called when key goes from not pressed to pressed
void keyPress() {
Serial.println("przycisk wcisniety");
longKeyPressCount = 0;
}
// called when key goes from pressed to not pressed
void keyRelease() {
Serial.println("przycisk zwolniony");
if (longKeyPressCount >= longKeyPressCountMax) {
longKeyPress();
}
else {
shortKeyPress();
}
}
void setup() {
Serial.begin(115200);
pinMode(keyPin, INPUT_PULLUP);
}
void loop() {
// Sekcja zarządzania przyciskiem
if (millis() - keyPrevMillis >= keySampleIntervalMs) {
keyPrevMillis = millis();
byte currKeyState = digitalRead(keyPin);
if ((prevKeyState == HIGH) && (currKeyState == LOW)) {
keyPress();
}
else if ((prevKeyState == LOW) && (currKeyState == HIGH)) {
keyRelease();
}
else if (currKeyState == LOW) {
longKeyPressCount++;
}
prevKeyState = currKeyState;
}
// Inny kod wprowadzamy tutaj
}
RE: Krótkie i długie wciśniecie - Lobaf - 08-04-2016
Spróbuj poszukać i wykorzystać biblioteką OneButton, moim zdaniem to najlepsze rozwiązanie, masz do wyboru, krótkie przyciśnięcie, długie, podwójne.
RE: Krótkie i długie wciśniecie - JasQ - 09-04-2016
Kiedyś się bawiłem w coś podobnego może ci się przyda , kod prosty jak konstrukcja cepa . Buzzer jest do informacji o stanie przycisku daj słuchawkę lub głośniczek
Kod: int PushCount = 0;
int Przycisk = 0;
byte przyciskPIN = 5;
byte led = 3;
byte buzz = 10;
void setup() {
pinMode(przyciskPIN , INPUT_PULLUP);
pinMode(buzz , OUTPUT);
pinMode(led , OUTPUT);
}
void loop() {
Przyciski();
if ( Przycisk == 1 )analogWrite(led , 3);
if ( Przycisk == 2 )analogWrite(led , 50);
if ( Przycisk == 3 )analogWrite(led , 150);
}
void Przyciski(){
PushCount = 0;
Przycisk = 0;
while (digitalRead(przyciskPIN) != HIGH ){
PushCount ++ ;delay(10);
if ( PushCount == 10 ){ Przycisk = 1; tone(buzz, 1800, 100);}
if ( PushCount == 60 ){ Przycisk = 2; tone(buzz, 1200, 100);}
if ( PushCount == 100 ){ Przycisk = 3; tone(buzz, 600, 100);}
if ( PushCount >= 200 ){ PushCount = 0; }
if (digitalRead(przyciskPIN) == HIGH ){ break; }
}
}
|