Obsługa przycisków w SuplaDevice

Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

klew pisze: wt lut 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 pisze: wt lut 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 pisze: wt lut 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 ):

Kod: Zaznacz cały

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/
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

lukfud pisze: wt lut 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 pisze: wt lut 09, 2021 12:21 pm
klew pisze: wt lut 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 pisze: wt lut 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.
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

klew pisze: wt lut 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 pisze: wt lut 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/
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

lukfud pisze: wt lut 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 pisze: wt lut 09, 2021 1:18 pm
klew pisze: wt lut 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.
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

klew pisze: wt lut 09, 2021 1:45 pm
lukfud pisze: wt lut 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 pisze: wt lut 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/
Awatar użytkownika
lukosław
Posty: 116
Rejestracja: pn paź 28, 2019 8:20 am

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:

Kod: Zaznacz cały

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.
Załączniki
IMG_20210210_203506.jpg
IMG_20210210_203506.jpg (3.95 MiB) Przejrzano 1924 razy
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

lukosław pisze: śr lut 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.
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
lukosław
Posty: 116
Rejestracja: pn paź 28, 2019 8:20 am

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.
Awatar użytkownika
lukosław
Posty: 116
Rejestracja: pn paź 28, 2019 8:20 am

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ął :/
Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

klew pisze: wt lut 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/
ODPOWIEDZ

Wróć do „Arduino IDE”