• 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
Nietypowe sterowanie przekaźnikiem
#1
Potrzebuje sterować przekaźnikami w zależności od długości impulsu podanego na pin.
Dla przykładu podanie krótkiego impulsu załącza przekaźnik nr 1, następny impuls go wyłącza.
Podanie długiego impulsu załącza przekaźnik nr 1 i nr 2, następny impuls je wyłącza. Z tym że na początku impulsu załącza się nr 1 a po 1 sek nr 2.

Nie mogę poradzić sobie ze zmianą, która kolejnym krótkim impulsem wyłączyłaby oba przekaźniki

Kod:
int przekaznik1 = 10;               //przekaznik1 podłączamy do pinu 10
int przekaznik2 = 11;               //przekaznik2 podłączamy do pinu 11

unsigned long keyPrevMillis = 0;
const unsigned long keySampleIntervalMs = 25;
byte longKeyPressCountMax = 15;    // 80 * 25 = 2000 ms
byte longKeyPressCount = 0;

byte prevKeyState = HIGH;           // button is active low
const byte keyPin = 2;              //przycisk podłączamy do pinu 2 - stan niski
bool sp1 = true;                    //zmienna boolowska sp1 do steowania stanem przekaznika1
bool sp2 = true;                    //zmienna boolowska sp2 do steowania stanem przekaznika2



// krótkie naciśniecie ponizej 1 sek
void shortKeyPress() {
  
  Serial.println("krotkie wcisniecie");
  
  sp1=!sp1;                         //zaneguj zmienną sp1
  digitalWrite(przekaznik1, sp1);   //stan przekaźnika 1 ustaw taki jak jest stan sp1
  delay(1000);                       //odczekaj 1000ms
}


// dlugie nacisniecie powyzej 1 sek
void longKeyPress() {
  Serial.println("dlugie wcisniecie");
  sp2=!sp2;                         //zaneguj zmienną sp2
  digitalWrite(przekaznik1, sp2);   //stan przekaźnika 1 ustaw taki jak jest stan sp2
  digitalWrite(przekaznik2, sp2);   //stan przekaźnika 2 ustaw taki jak jest stan sp2
  delay(1000);
}


// wcisniecie
void keyPress() {
  Serial.println("przycisk wcisniety");
  longKeyPressCount = 0;
}


// zwolnienie
void keyRelease() {
  Serial.println("przycisk zwolniony");

  if (longKeyPressCount >= longKeyPressCountMax) {
    longKeyPress();
  }
  else {
    shortKeyPress();
  }
}


void setup() {
  Serial.begin(115200);
  pinMode(przekaznik1, OUTPUT);       //przekaznik 1 jako wyjście
  pinMode(przekaznik2, OUTPUT);       //przekaznik 2 jako wyjście
  pinMode(keyPin, INPUT_PULLUP);      //przycisk1 jako wejście z programowym pull-upem
  digitalWrite(przekaznik1, HIGH);    //stan początkowy przekaznika 1 wysoki
  digitalWrite(przekaznik2, HIGH);    //stan początkowy przekaznika 2 wysoki
}


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;
  }

 
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości