08-04-2016, 11:44
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.
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
}