• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Krótkie i długie wciśniecie
#1
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
   }
 
Odpowiedź
#2
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.
 
Odpowiedź
#3
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; }
    }
  }
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości