Obsługa przycisków w SuplaDevice

User avatar
lukfud
Posts: 2271
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Tue Feb 09, 2021 11:55 am Implementacja ON_HOLD wyzwala akcje po przekroczeniu czasu trzymania. Dodając ON_SHORTER_HOLD nie wiadomo kiedy wykonać akcje. W zasadzie trzeba by je wykonywać dopiero po puszczeniu przycisku, a wtedy użytkownik nie wie czy trzymał wystarczająco długo, czy nie ;).
Przy krótkich czasach nie, ale między 5 a 10 s jest wyczuwalna różnica.
klew wrote: Tue Feb 09, 2021 11:55 am Natomiast zastanawiałem się nad dodaniem ON_LONG_CLICK_xx. Działałoby to tak, że po dłuższym przytrzymainu mamy alternatywne wielkokliki.
Hm, rozjaśnisz?
klew wrote: Tue Feb 09, 2021 11:55 am Samo ON_HOLD dostało też niedawno opcję powtarzania (zapomniałem się tym podzielić, poszło tylko na priv do jednego wybrańca ;P ):

Code: Select all

auto b1 = new Supla::Control::Button(...);
b1.setMulticlickTime(200);
b1.setHoldTime(400);
b1.repeatOnHoldEvery(200);

auto rgb = new MyRgb();
b1.addAction(Supla::ITERATE_DIM_RGB, rgb, Supla::ON_HOLD);
b1.addAction(Supla::TOGGLE_RGB, rgb, Supla::ON_CLICK_1);
Da to taki efekt, że kliknięcie przycisku będzie przełączało włączony/wyłączony. Natomiast przytrzymanie będzie wysyłalo ON_HOLD co 200 ms (ustawiane repeatOnHoldEvery). Akcja ITERATE_DIM_RGB będzie zmieniała colorBrightness (czyli jasność dla kanału RGB) o 5 (w zakresie 10-100) z lekką pauzą na 10 i 100. Poza ITERATE_DIM_RGB mamy też dostępny wariant ITERATE_DIM_W (jasność kanału białego oraz dimmer) oraz ITERATE_DIM_ALL (jasność kanałów RGB oraz W)
Dodatkowo gdy rgb jest wyłączone, to przytrzymanie przycisku uruchomi go z jasnością 10.
Czemu nie na master ?! :)
https://github.com/klew/supla-arduino/b ... button.cpp
https://www.facebook.com/groups/supladiy/
User avatar
klew
Posts: 9720
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukfud wrote: Tue Feb 09, 2021 12:21 pm Przy krótkich czasach nie, ale między 5 a 10 s jest wyczuwalna różnica.
Ale do czego ktoś będzie używał 5-10 s? Mnie szlak trafia jak jakiś przycisk wymaga mojej uwagi powyżej 1 s ;)
lukfud wrote: Tue Feb 09, 2021 12:21 pm
klew wrote: Tue Feb 09, 2021 11:55 am Natomiast zastanawiałem się nad dodaniem ON_LONG_CLICK_xx. Działałoby to tak, że po dłuższym przytrzymainu mamy alternatywne wielkokliki.
Hm, rozjaśnisz?
Normlanie ON_CLICK_x zlicza ilość krótkich kliknięć. Natomiast ON_LONG_CLICK_x zliczałoby szybkie kliknięcia po przytrzymaniu.
Można by tego użyć np. do sterowania dwoma roletami przy pomocy jednegok monostabilnego przycisku. Przykładowo:
ON_CLICK_1 opuszcza roletę 1
ON_CLICK_2 podnosi roletę 1
Aby nie bawić się w ON_CLICK_ 3 i 4, to robimy: przytrzymanie i klik lub dwuklik:
ON_LONG_CLICK_1 opuszcza roletę 2
ON_LONG_CLICK_2 podnosi roletę 2
Można to też zrobić na ON_CLICK_3 i 4, ale dla mnie 4 kliknięcia to już mentalna granica, po której zaczyna się masochizm ;)

Dzięki temu mamy te same akcje na dwa analogiczne wielokliki. Poprzez przytrzymanie na początku zmeniamy tylko kontekst (roletę).

Dodatkowo planuję tego użyć u siebie do otwierania bramy garażowej i wjazdowej. Mam przygotowane przyciski, które są obok włącznika światła. Nie chciałbym aby ktoś przypadkiem włączając światło, otworzył bramę wjazdową (bo pies zwieje ;) ). Użycie do otwierania/zamykania bramy takiego "ON_LONG_CLICK_1" praktycznie eliminuje możliwość przypadkowego otwarcia, bo trzeba przytrzymać przycisk, po czym go jeszcze raz szybko kliknąć.

lukfud wrote: Tue Feb 09, 2021 12:21 pm Czemu nie na master ?! :)
https://github.com/klew/supla-arduino/b ... button.cpp
Mam otwarty PR do oficjalnego repo Supli i nie chcę tam mieszać. Jak PR zostanie zmerge'owany, to przerzucę mojego developa do mastera.
Kiedy będzie Supla Offline Party / SOP#2025 ?
User avatar
lukfud
Posts: 2271
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Tue Feb 09, 2021 12:57 pm Ale do czego ktoś będzie używał 5-10 s? Mnie szlak trafia jak jakiś przycisk wymaga mojej uwagi powyżej 1 s ;)
Np: 10s - przejście do konfiguracji, 2s - wysłanie linku.
Drążę, bo ostatnio wpadł mi w ręce MiniTiger (dotykowe ustrojstwo). Jako, że włączał się sam jeden kanał, zwiększyłem filtr do 150ms (pomogło). Czas kliku zostawiłem na 350ms. Przy takiej konfiguracji wieloklik praktycznie nie działa (nie mogę wcelować w tą 200ms lukę). Prawdopodobnie poniższe rozwiązało by problem, ale tylko przy ON_LONG_CLICK_1 :)
klew wrote: Tue Feb 09, 2021 12:57 pm Normlanie ON_CLICK_x zlicza ilość krótkich kliknięć. Natomiast ON_LONG_CLICK_x zliczałoby szybkie kliknięcia po przytrzymaniu.
Można by tego użyć np. do sterowania dwoma roletami przy pomocy jednegok monostabilnego przycisku. Przykładowo:
ON_CLICK_1 opuszcza roletę 1
ON_CLICK_2 podnosi roletę 1
Aby nie bawić się w ON_CLICK_ 3 i 4, to robimy: przytrzymanie i klik lub dwuklik:
ON_LONG_CLICK_1 opuszcza roletę 2
ON_LONG_CLICK_2 podnosi roletę 2
Można to też zrobić na ON_CLICK_3 i 4, ale dla mnie 4 kliknięcia to już mentalna granica, po której zaczyna się masochizm ;)

Dzięki temu mamy te same akcje na dwa analogiczne wielokliki. Poprzez przytrzymanie na początku zmeniamy tylko kontekst (roletę).

Dodatkowo planuję tego użyć u siebie do otwierania bramy garażowej i wjazdowej. Mam przygotowane przyciski, które są obok włącznika światła. Nie chciałbym aby ktoś przypadkiem włączając światło, otworzył bramę wjazdową (bo pies zwieje ;) ). Użycie do otwierania/zamykania bramy takiego "ON_LONG_CLICK_1" praktycznie eliminuje możliwość przypadkowego otwarcia, bo trzeba przytrzymać przycisk, po czym go jeszcze raz szybko kliknąć.
A jak z czasami (ms)
https://www.facebook.com/groups/supladiy/
User avatar
klew
Posts: 9720
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukfud wrote: Tue Feb 09, 2021 1:18 pm Np: 10s - przejście do konfiguracji, 2s - wysłanie linku.
Drążę, bo ostatnio wpadł mi w ręce MiniTiger (dotykowe ustrojstwo). Jako, że włączał się sam jeden kanał, zwiększyłem filtr do 150ms (pomogło). Czas kliku zostawiłem na 350ms. Przy takiej konfiguracji wieloklik praktycznie nie działa (nie mogę wcelować w tą 200ms lukę). Prawdopodobnie poniższe rozwiązało by problem, ale tylko przy ON_LONG_CLICK_1 :)
Możesz zwiększyć czas dla wielokliku. Poza tym "multiclick time" to odstęp od puszczenia do następnego wciśnięcia, więc masz 350 ms, a nie 200 ms.
lukfud wrote: Tue Feb 09, 2021 1:18 pm
klew wrote: Tue Feb 09, 2021 12:57 pm Normlanie ON_CLICK_x zlicza ilość krótkich kliknięć. Natomiast ON_LONG_CLICK_x zliczałoby szybkie kliknięcia po przytrzymaniu.
Można by tego użyć np. do sterowania dwoma roletami przy pomocy jednegok monostabilnego przycisku. Przykładowo:
ON_CLICK_1 opuszcza roletę 1
ON_CLICK_2 podnosi roletę 1
Aby nie bawić się w ON_CLICK_ 3 i 4, to robimy: przytrzymanie i klik lub dwuklik:
ON_LONG_CLICK_1 opuszcza roletę 2
ON_LONG_CLICK_2 podnosi roletę 2
Można to też zrobić na ON_CLICK_3 i 4, ale dla mnie 4 kliknięcia to już mentalna granica, po której zaczyna się masochizm ;)

Dzięki temu mamy te same akcje na dwa analogiczne wielokliki. Poprzez przytrzymanie na początku zmeniamy tylko kontekst (roletę).

Dodatkowo planuję tego użyć u siebie do otwierania bramy garażowej i wjazdowej. Mam przygotowane przyciski, które są obok włącznika światła. Nie chciałbym aby ktoś przypadkiem włączając światło, otworzył bramę wjazdową (bo pies zwieje ;) ). Użycie do otwierania/zamykania bramy takiego "ON_LONG_CLICK_1" praktycznie eliminuje możliwość przypadkowego otwarcia, bo trzeba przytrzymać przycisk, po czym go jeszcze raz szybko kliknąć.
A jak z czasami (ms)
Czasy bez zmian względem tego co jest obecnie. Tzn. ON_LONG_CLICK_x byłoby wykrywane przy serii klików (z odstępem takim jak multiklik) po wczesniejszym wykryciu ON_HOLD.

Jeśli chcesz mieć ekstra zachowanie na 10 s (przejście w konfigurację) i jednocześnie używać długich kliknięć, to zawsze możesz zrobić powtarzanie ON_HOLD co 1 s i zliczać do 10, a przy ON_RELEASE kasować licznik.
Kiedy będzie Supla Offline Party / SOP#2025 ?
User avatar
lukfud
Posts: 2271
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Tue Feb 09, 2021 1:45 pm
lukfud wrote: Tue Feb 09, 2021 1:18 pm Np: 10s - przejście do konfiguracji, 2s - wysłanie linku.
Drążę, bo ostatnio wpadł mi w ręce MiniTiger (dotykowe ustrojstwo). Jako, że włączał się sam jeden kanał, zwiększyłem filtr do 150ms (pomogło). Czas kliku zostawiłem na 350ms. Przy takiej konfiguracji wieloklik praktycznie nie działa (nie mogę wcelować w tą 200ms lukę). Prawdopodobnie poniższe rozwiązało by problem, ale tylko przy ON_LONG_CLICK_1 :)
Możesz zwiększyć czas dla wielokliku. Poza tym "multiclick time" to odstęp od puszczenia do następnego wciśnięcia, więc masz 350 ms, a nie 200 ms.
Muszę to potrenować...
klew wrote: Tue Feb 09, 2021 1:45 pm Jeśli chcesz mieć ekstra zachowanie na 10 s (przejście w konfigurację) i jednocześnie używać długich kliknięć, to zawsze możesz zrobić powtarzanie ON_HOLD co 1 s i zliczać do 10, a przy ON_RELEASE kasować licznik.
Zawsze to jest jakieś rozwiązanie, dzięki :)
Niemniej czekam na ON_LONG_CLICK_x.
https://www.facebook.com/groups/supladiy/
User avatar
lukosław
Posts: 116
Joined: Mon Oct 28, 2019 8:20 am

Post

Mam prośbę o podpowiedź, bo męczę się z tym już drugi wieczór i walę już głową w mur.

Próbuję zmusić do działania taki zestaw (zdjęcie poglądowe poniżej):
- wemos d1
- ekspander i/o pcf8574
- układ 4 przekaźników sterowanych stanem niskim
- układ 4 buttonów dotykowych ttp223 (domyślnie działają jako monostabilne podając na wyjście stan wysoki, ale jeden z nich dla testów przestawiłem tak by podawał stan niski)

Buttony, przekaźniki oraz obsługę ekspandera zaimplementowałem w ten sposób:

Code: Select all

class MyPCF8574 : public Supla::Io {
  public:
    void customDigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {
      if ((pin >= 100) && (pin <= 107)) {
        pcf8574.digitalWrite(pin - 100, val);
        return;
      }
      if (pin <= 99) {
        return ::digitalWrite(pin, val);
      }
    }

    int customDigitalRead(int channelNumber, uint8_t pin) {
      if ((pin >= 100) && (pin <= 107)) {
        return pcf8574.digitalRead(pin - 100);
      }
      if (pin <= 99) {
        return ::digitalRead(pin);
      }
    }
} MyPCF8574;

//Supla::Control::Button::Button(int pin, bool pullUp, bool invertLogic)
Supla::Control::Button button1(14, true, true);
Supla::Control::Button button2(12, false, false);
Supla::Control::Button button3(13, false, false);
Supla::Control::Button button4(107, false, false);

//Relay::Relay(int pin, bool highIsOn, _supla_int_t functions)
Supla::Control::Relay relay1(100, false);
Supla::Control::Relay relay2(101, false);
Supla::Control::Relay relay3(102, false);
Supla::Control::Relay relay4(103, false);

setup:

 for (int i = 0; i <= 3; i++) {
    pcf8574.pinMode(i, OUTPUT);
  }
  for (int i = 4; i <= 7; i++) {
    pcf8574.pinMode(i, INPUT);
  }
  pcf8574.begin();

  button1.addAction(Supla::TOGGLE, relay1, Supla::ON_RELEASE);
   // button1.setSwNoiseFilterDelay(50);
  button2.addAction(Supla::TOGGLE, relay2, Supla::ON_RELEASE);
   // button2.setSwNoiseFilterDelay(50);
  button3.addAction(Supla::TOGGLE, relay3, Supla::ON_RELEASE);
  //  button3.setSwNoiseFilterDelay(50);
  button4.addAction(Supla::TOGGLE, relay4, Supla::ON_RELEASE);
   // button4.setSwNoiseFilterDelay(50);
Przekaźniki na ekspanderze działają prawidłowo.
3 buttony podpięte pod wejścia wemosa również działają prawidłowo (jeden podający stan niski, a pozostałe wysoki).

Problem jest z buttonem podpiętym do ekspandera, który niestety nie działa. Próbowałem już różnych kombinacji pullup, odwróconej logiki, pominięcie przycisku i zwieranie bezpośrednio do masy itp. Nie jestem w stanie w żaden sposób sprawić, żeby buttony działały na ekspanderze, a to jest moja docelowa konfiguracja.

Co ciekawe, podpinając button pod ekspander i po prostu czytając stan poprzez pcf8574.digitalRead(4) jest on zwracany prawidłowo i zwraca poprawny stan po dotknięciu/puszczeniu. Tak więc sam ekspander jest raczej w porządku,

Byłbym wdzięczny za jakieś wskazówki.
You do not have the required permissions to view the files attached to this post.
User avatar
klew
Posts: 9720
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukosław wrote: Wed Feb 10, 2021 7:44 pm Co ciekawe, podpinając button pod ekspander i po prostu czytając stan poprzez pcf8574.digitalRead(4) jest on zwracany prawidłowo i zwraca poprawny stan po dotknięciu/puszczeniu. Tak więc sam ekspander jest raczej w porządku,
W kodzie masz button na pin "107" (czyli 7), a tutaj piszesz, że działa odczyt z 4.
Kiedy będzie Supla Offline Party / SOP#2025 ?
User avatar
lukosław
Posts: 116
Joined: Mon Oct 28, 2019 8:20 am

Post

To tylko przykład jak sobie wcześniej sprawdzałem stany i działanie buttona z ekspanderem. Wklejony kod dotyczy opisanej przeze mnie sytuacji i problemu.
User avatar
lukosław
Posts: 116
Joined: Mon Oct 28, 2019 8:20 am

Post

Odpowiem sobie sam, bo dziś przysiadłem znowu do tematu. Udało się w końcu rozwiązać problem, po zmianie biblioteki obsługującej PCF8574 z tej https://github.com/xreef/PCF8574_library, na https://github.com/RobTillaart/PCF8574 . Problem od razu zniknął :/
User avatar
lukfud
Posts: 2271
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Tue Feb 09, 2021 11:55 am Natomiast zastanawiałem się nad dodaniem ON_LONG_CLICK_xx. Działałoby to tak, że po dłuższym przytrzymainu mamy alternatywne wielkokliki.
Jak tam zastanawianie się? ;)
https://www.facebook.com/groups/supladiy/

Return to “Arduino IDE”