Arduino Polska Forum

Pełna wersja: Sterowanie pilotem 433mhz
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
(22-10-2023, 17:17)oscarX napisał(a): [ -> ]To jeszcze sprawdź, czy coś innego nie przychodzi w momencie puszczenia klawisza. Jednak ponieważ to jest transmisja radiowa, nawet jak coś innego jest wysyłane, to i tak należy liczyć się z tym, że może nie zostać poprawnie odebrane. Tak czy inaczej, trzeba oprzeć się na czasie. W logu, który wrzuciłeś w poprzednim poście widać, że kody przychodzą tak mniej więcej 2-3 razy na sekundę, czyli co 300-400ms. Wystarczy zapamiętać moment odebrania każdego kodu i działanie uzależnić od długości przerwy od poprzedniego kodu. Arduino samo z siebie liczy czas, jedną z funkcji jest millis() - zwraca czas w milisekundach (dla nas to akurat). Zeruje się po mniej więcej 50 dniach, więc to nie problem.

Kod:
unsigned long timestamp;

void loop()
{
   int value = mySwitch.getReceivedValue();
    if (value == 1653416)
    {
        unsigned long current = millis();
        resetAvailable();
        if (current - timestamp > 2000)  // 2 sekundy przerwy - przykladowo
        {
            stan = !stan;
            Serial.println(stan);
            digitalWrite(3, stan);
            // bez zadnych delay
        }
        else
        {
            // klawisz przytrzymany
        }
        timestamp = current;
    }
}

Dałem 2 sekundy minimalnej przerwy - kod powtarzania klawisza też może się zakłócić, więc trzeba więcej niż 1 brak kodu.


zamiast resetAvailable(); powinno być mySwitch.resetAvailable ??

Poprawiłem kod i wpisałem mySwitch.resetAvailable, przekaźnik się nie załącza 
(24-10-2023, 18:38)kopcor07 napisał(a): [ -> ]
(22-10-2023, 17:17)oscarX napisał(a): [ -> ]To jeszcze sprawdź, czy coś innego nie przychodzi w momencie puszczenia klawisza. Jednak ponieważ to jest transmisja radiowa, nawet jak coś innego jest wysyłane, to i tak należy liczyć się z tym, że może nie zostać poprawnie odebrane. Tak czy inaczej, trzeba oprzeć się na czasie. W logu, który wrzuciłeś w poprzednim poście widać, że kody przychodzą tak mniej więcej 2-3 razy na sekundę, czyli co 300-400ms. Wystarczy zapamiętać moment odebrania każdego kodu i działanie uzależnić od długości przerwy od poprzedniego kodu. Arduino samo z siebie liczy czas, jedną z funkcji jest millis() - zwraca czas w milisekundach (dla nas to akurat). Zeruje się po mniej więcej 50 dniach, więc to nie problem.

Kod:
unsigned long timestamp;

void loop()
{
   int value = mySwitch.getReceivedValue();
    if (value == 1653416)
    {
        unsigned long current = millis();
        resetAvailable();
        if (current - timestamp > 2000)  // 2 sekundy przerwy - przykladowo
        {
            stan = !stan;
            Serial.println(stan);
            digitalWrite(3, stan);
            // bez zadnych delay
        }
        else
        {
            // klawisz przytrzymany
        }
        timestamp = current;
    }
}

Dałem 2 sekundy minimalnej przerwy - kod powtarzania klawisza też może się zakłócić, więc trzeba więcej niż 1 brak kodu.


zamiast resetAvailable(); powinno być mySwitch.resetAvailable ??

Poprawiłem kod i wpisałem mySwitch.resetAvailable, przekaźnik się nie załącza 




Zrobiłem i nawet działa


Kod:
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
           
boolean stan = LOW;

void setup()
{
Serial.begin(9600);
  pinMode(3, OUTPUT);
  digitalWrite(3,LOW);

  mySwitch.enableReceive(0);
}

unsigned long timestamp;

void loop()
{
   
    if (mySwitch.getReceivedValue() == 1653416)
    {
      mySwitch.resetAvailable();
        unsigned long current = millis();
        if (current - timestamp > 100)  // 2 sekundy przerwy - przykladowo
        {

            stan = !stan;
            Serial.println(stan);
            digitalWrite(3, stan);
            // bez zadnych delay
        }
        else
        {
            // klawisz przytrzymany
        }
        timestamp = current;
    }
}
Stron: 1 2