24-10-2023, 18:38
(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