Obsługa przycisków w SuplaDevice

Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

śr lut 19, 2020 7:37 pm

lukfud pisze:
śr lut 19, 2020 7:27 pm
klew pisze:
sob lut 15, 2020 9:03 am
Na chwilę obecną pojawiła się tam klasa Supla::Control::Button z obsługą dwóch zdarzeń "ON_PRESS" i "ON_RELEASE".
Wydaje mi się, że działanie jest odwrotne, bynajmniej u mnie działa odwrotnie.
Bodajże trzeci parametr konstruktora Button odwraca logikę.
PRESS jest sygnalizowany normalnie przy przejściu z low na high. A RELEASE w sytuacji odwrotnej. Gdy używany internal pullup, to przy otwartym przycisku mamy high, a wciśnięcie powoduje zwarcie do gnd i pojawia się low. Stąd przy używaniu internal pullup, trzeba odwrócić logikę
daniel
Posty: 32
Rejestracja: czw lut 15, 2018 7:29 am

śr lut 19, 2020 7:53 pm

Przydało by się zdarzenie ON_CHANGE (zmiana stanu LOW -> HIGH i na odwrót) do obsługi np. przełączników bistabilnych.
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

śr lut 19, 2020 8:10 pm

daniel pisze:
śr lut 19, 2020 7:53 pm
Przydało by się zdarzenie ON_CHANGE (zmiana stanu LOW -> HIGH i na odwrót) do obsługi np. przełączników bistabilnych.
Ok, dodam. Aktualnie możesz zarejestrować dwa zdarzenia pod tą samą akcję i efekt będzie taki sam.
lukfud
Posty: 217
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

śr lut 19, 2020 8:16 pm

klew pisze:
śr lut 19, 2020 7:37 pm
lukfud pisze:
śr lut 19, 2020 7:27 pm
klew pisze:
sob lut 15, 2020 9:03 am
Na chwilę obecną pojawiła się tam klasa Supla::Control::Button z obsługą dwóch zdarzeń "ON_PRESS" i "ON_RELEASE".
Wydaje mi się, że działanie jest odwrotne, bynajmniej u mnie działa odwrotnie.
Bodajże trzeci parametr konstruktora Button odwraca logikę.
PRESS jest sygnalizowany normalnie przy przejściu z low na high. A RELEASE w sytuacji odwrotnej. Gdy używany internal pullup, to przy otwartym przycisku mamy high, a wciśnięcie powoduje zwarcie do gnd i pojawia się low. Stąd przy używaniu internal pullup, trzeba odwrócić logikę
Moje spostrzeżenia. Jeśli mam ustawione tak:

Kod: Zaznacz cały

void setup() {
//pinMode(button_pin, INPUT_PULLUP);
button.willTrigger(*relay01, Supla::Control::Button::ON_PRESS, Supla::Control::Relay::TOGGLE);}
Program startuje z włączonym przekaźnikiem, a przycisk przełącza przy puszczeniu (rozwarciu z GND)

Kod: Zaznacz cały

void setuo() {
//pinMode(button_pin, INPUT_PULLUP);
button.willTrigger(*relay01, Supla::Control::Button::ON_RELEASE, Supla::Control::Relay::TOGGLE);}
Program startuje z wyłączonym przekaźnikiem i przycisk przełącza po wciśnięciu (zwarciu do GND)

Ta sama sytuacja z odkomentowanym pullupem.
.newbie
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

śr lut 19, 2020 11:11 pm

lukfud pisze:
śr lut 19, 2020 8:16 pm
Moje spostrzeżenia. Jeśli mam ustawione tak:

Kod: Zaznacz cały

void setup() {
//pinMode(button_pin, INPUT_PULLUP);
button.willTrigger(*relay01, Supla::Control::Button::ON_PRESS, Supla::Control::Relay::TOGGLE);}
Program startuje z włączonym przekaźnikiem, a przycisk przełącza przy puszczeniu (rozwarciu z GND)

Kod: Zaznacz cały

void setuo() {
//pinMode(button_pin, INPUT_PULLUP);
button.willTrigger(*relay01, Supla::Control::Button::ON_RELEASE, Supla::Control::Relay::TOGGLE);}
Program startuje z wyłączonym przekaźnikiem i przycisk przełącza po wciśnięciu (zwarciu do GND)

Ta sama sytuacja z odkomentowanym pullupem.
Dobrze kojarzę, że button masz ustawiony na GPIO0 a relay01 na GPIO15?

GPIO0 jest "pulled up", więc tam ustawianie input pullup nic nie zmienia. W związu z tym musiałbyś tworząc buttona ustawić mu trzeci parametr na "true", aby odwrócić logikę:

Kod: Zaznacz cały

Button(0, true, true)
Druga sprawa to używanie GPIO0 do przycisku nie jest najlepszym pomysłem, bo jeśli podczas resetu układu, przycisk będzie wciśnięty, to płytka wejdzie w tryb flashowania i program się nie odpali.

Problemu z przekaźnikiem nie udało mi się zaobserwować u mnie. Napisz coś więcej - mówisz o fizycznym stanie przekaźnika (sterujesz low czy high) ? Jaki jest stan przekaźnika widoczny w aplikacji?

pinMode nie ustawiaj samemu. Klasy button, relay same sobie to ustawią bazując na parametrach, które podasz podczas ich tworzenia.
Zybi
Posty: 1449
Rejestracja: ndz cze 26, 2016 4:24 pm

śr lut 19, 2020 11:35 pm

klew pisze:
śr lut 19, 2020 11:11 pm
...
Druga sprawa to używanie GPIO0 do przycisku nie jest najlepszym pomysłem, bo jeśli podczas resetu układu, przycisk będzie wciśnięty, to płytka wejdzie w tryb flashowania i program się nie odpali.
...
Z tym to się zupełnie nie zgadzam.
Właśnie na GPIO0 w dostępnych na rynku modułach jest najczęściej "ulokowany" przycisk.
Należy jednak pamiętać, że może to być tylko przycisk monostabilny (tzw dzwonkowy), aby właśnie nie było niezamierzonych efektów, o których piszesz jw. Z drugiej strony właśnie dla tych efektów (ale kontrolowanych) na tym pinie stosujemy przycisk.
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

czw lut 20, 2020 12:00 am

Zybi pisze:
śr lut 19, 2020 11:35 pm
klew pisze:
śr lut 19, 2020 11:11 pm
...
Druga sprawa to używanie GPIO0 do przycisku nie jest najlepszym pomysłem, bo jeśli podczas resetu układu, przycisk będzie wciśnięty, to płytka wejdzie w tryb flashowania i program się nie odpali.
...
Z tym to się zupełnie nie zgadzam.
Właśnie na GPIO0 w dostępnych na rynku modułach jest najczęściej "ulokowany" przycisk.
Należy jednak pamiętać, że może to być tylko przycisk monostabilny (tzw dzwonkowy), aby właśnie nie było niezamierzonych efektów, o których piszesz jw. Z drugiej strony właśnie dla tych efektów (ale kontrolowanych) na tym pinie stosujemy przycisk.
Są gotowe moduły, które pod GPIO0 mają gotowe wyprowadzenia na zewnętrzny przycisk?

Bo to, że jest tam podpięty microswitch, to jest to zrozumiałe.
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

czw lut 20, 2020 12:10 am

Akcja ON_CHANGE jest dodana na moim githubie.
Dodałem też software'owe filtrowanie szumów na gpio. Domyślnie ustawione na 20 ms, ale można sobie ustawić inną wartść przez:

Kod: Zaznacz cały

button.setSwNoiseFilterDelay(50);
Czas podawany w ms.
Zybi
Posty: 1449
Rejestracja: ndz cze 26, 2016 4:24 pm

czw lut 20, 2020 12:14 am

klew pisze:
czw lut 20, 2020 12:00 am
...
Są gotowe moduły, które pod GPIO0 mają gotowe wyprowadzenia na zewnętrzny przycisk?
...
Chociażby cała kolekcja włączników dotykowych (Sonoff Touch 1-3 gang)
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

czw lut 20, 2020 12:44 am

Zybi pisze:
czw lut 20, 2020 12:14 am
klew pisze:
czw lut 20, 2020 12:00 am
...
Są gotowe moduły, które pod GPIO0 mają gotowe wyprowadzenia na zewnętrzny przycisk?
...
Chociażby cała kolekcja włączników dotykowych (Sonoff Touch 1-3 gang)
Z tego co czytam o tych modułach, to wynika, że w starych wersjach przytrzymanie przycisku ustawionego na GPIO0 nie wprowdzało modułyu w tryb flashowania.
W nowszych wersjach trzeba trzymając przycisk, wciśnąć microswitch "reset", a jeszcze w innych wersjach można dwukrotnie wcisnąć reset.

Trzymanie przycisku przy starcie po "power on" nie powoduje wejścia w tryb flashowania, bo przycisk wtedy jeszcze nie działa.

Także nie jest to to samo, co podłączenie standardowego przycisku dzwonkowego.

Ale w zasadzie, "róbta co chceta" ;). Ważne, aby pamiętać o tym, że tak się podłączyło przycisk i mieć świadomość potencjalnego "zawieszenia" układu.
ODPOWIEDZ