Rolety w Arduino Ide

Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

Do biblioteki SuplaDevice została dodana obsługa rolet (na chwilę obecną dostępne tylko na moim githubie: https://github.com/klew/arduino - do oficjalnego trafi wkrótce)
To już ostatni "stary" element ze starej biblioteki, który doczekał się nowej odsłony :)

Rolety są w dwóch wariantach "RollerShutter" oraz "BistableRollerShutter". Ten drugi pewnie nie będzie miał wielu fanów ;).

W kodzie dodajemy odpowiedniego includea:

Kod: Zaznacz cały

#include <supla/control/roller_shutter.h>
// lub
#include <supla/control/bistable_roller_shutter.h>
Następnie dodajemy roletę:

Kod: Zaznacz cały

Supla::Control::RollerShutter *rs1 = new Supla::Control::RollerShutter(PIN_UP, PIN_DOWN, true); 
Ostatni parametr to "true" - dla sterowania stanem wysokim, "false" - dla sterowania stanem niskim.

Dodajemy fizyczne przyciski:

Kod: Zaznacz cały

 Supla::Control::Button *buttonOpen = new Supla::Control::Button(PIN_BUTTON_OPEN, true, true);
 Supla::Control::Button *buttonClose = new Supla::Control::Button(PIN_BUTTON_CLOSE, true, true);

 buttonOpen->willTrigger(*rs1, Supla::ON_PRESS, Supla::OPEN_OR_STOP);
 buttonClose->willTrigger(*rs1, Supla::ON_PRESS, Supla::CLOSE_OR_STOP);
Roleta wspiera następujące akcje, które można przypisać w "willTrigger":
CLOSE_OR_STOP, OPEN_OR_STOP - najbardziej typowa konfiguracja dla sterowania dwoma przyciskami - wciśnięcie przycisku powoduje ruch w określonym kierunku lub zatrzymanie rolety, jeśli jest w ruchu.
CLOSE, OPEN - powoduje ruch w określonym kierunku. Jeśli roleta porusza się w tym samym kierunku, to kontynuuje ruch, jeśli porusza się w przeciwnym kierunku, to się zatrzymuje i zaczyna poruszać w zadanym kierunku
STOP - zatrzymuje roletę
STEP_BY_STEP - do sterowania roletą przy pomocy jednego przycisku - działa na podobnej zasadzie jak automaty do bram, kolejne wciśnięcia powodują: ruch w dół -> zatrzymanie -> ruch w górę -> zatrzymanie -> itd.
COMFORT_UP_POSITION, COMFORT_DOWN_POSITION - powoduje ustawienie rolety we wcześniej skonfigurowanych pozycjach komfortowych górnej i dolnej. Przykładowo możemy sobie ustawić górną pozycję na 20%, a dolną na 70% i te akcje nam ustawią tak rolety. Czasy komfortowe są ustawiane w programie:

Kod: Zaznacz cały

 rs1->configComfortUpValue(20);
 rs1->configComfortDownValue(70);
Domyślne wartości to 20 i 80.
Nie rozmawiałem o tym jeszcze z nikim, ale może takie coś mogłoby być dodane do wszystkich rolet. W połączeniu z obsługą "action trigger" można by np. dłuższym przytrzymaniem przycisku w dół, ustawiać pozycję "komfortowa dół" itd. Jeśli nie, to można to sobie ustawić w programie i może ktoś dorobi do tego GUI :). Obsługa Button w SuplaDevice też będzie rozwinięta o wykrywanie wieloklików, dłuższego przytrzymania itd. Na chwilę obecną tego jeszcze nie ma.

BistableRollerShutter działa identycznie, tylko pracuje na przekaźnikach bistabilnych (podobnie jak BistableRelay). Więc zamiast dawać stały sygnał na przekaźnik, daje krótki impuls na początek ruchu i krótki impuls, aby wyłączyć przekaźnik. Nie wiem czy ktoś ma takie przekaźniki przy roletach, nastomiast ja planuję z tego zrobić "nakładkę" na moje 16 standardowych sterowników do rolet (SRM-10) i udawać przyciski chwilowe do sterowania tym sterownikiem. Trochę na około, ale nie chcę wszystkiego wymieniać.

Ostatnia ważna rzecz: rolety potrzebują pamięci, aby sensownie działały. Bez pamięci gubią przy resecie informację o konfiguracji czasów otwierania/zamykania oraz o aktualnej pozycji. Dlatego pojawiła się wstępna obsługa pamięci EEPROM/Flash oraz FRAM SPI (wymaga zewnętrznej biblioteki Adafruit FRAM SPI).
Dodajemy includey:

Kod: Zaznacz cały

#include <supla/storage/fram_spi.h>
// lub
#include <supla/storage/eeprom.h>
I tworzymy instancję klasy:

Kod: Zaznacz cały

#define SUPLA_STORAGE_OFFSET 0
#define FRAM_CS 43    // pin for FRAM CS

// Hardware SPI
Supla::FramSpi fram(FRAM_CS, SUPLA_STORAGE_OFFSET);
// Software SPI
Supla::FramSpi fram(24, 22, 23, FRAM_CS, SUPLA_STORAGE_OFFSET); // <- sofrware spi, piny (SCK, MISO, MOSI, CS)
// EEPROM / Flash
Supla::Eeprom eeprom(SUPLA_STORAGE_OFFSET);
W zasadzie tyle wystarczy, aby ruszyło. Obsługa pamięci będzie się jeszcze mocno zmieniać w najbliższym czasie, więc nie gwarantuję kompatybilności zapisanych danych, po aktualizacji biblioteki ;).
W tej chwili zapis do EEPROM/Flash jest robiony co 10 s, ale zapisuje tylko, gdy jest taka potrzeba. Ten domyślny czas będzie wydłużony (pewnie na 3 min - tak jak to wcześniej robiłem na liczniku impulsów). EEPROM/Flash trzeba oszczędzać, bo z reguły działa do około 100 000 zapisów. Dlatego wszystkim polecam doinstalować sobie pamięć FRAM (aktualnie wspieramy Adafruit FRAM SPI - jeśli ktoś ma inną kostkę, to dajcie znać). FRAM jest praktycznie niezniszczalny i bardzo szybki. Dlatego tutaj zapis jest realizowany co 1 s (o ile jest taka potrzeba).
Także testując resety, miejcie na uwadze te czasy. Jak za szybko zresetujecie, to może być stan jeszcze nie zapisany
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
pzygmunt
Posty: 18280
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Dobra robota. Przy zapisie do EEPROM-u wystarczy jak zapis będzie w momencie zatrzymania rolety.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

pzygmunt pisze: śr wrz 09, 2020 10:34 am Dobra robota. Przy zapisie do EEPROM-u wystarczy jak zapis będzie w momencie zatrzymania rolety.
Jeszcze to przemyślę. Muszę jeszcze przekaźniki dorzucić do zapisywania (czas schodowego, utrzymanie stanu po resecie), przerzucić liczniki impulsów na "po nowemu" (to pójdzie szybko), zapisywanie wartości dla RGBW/dimmer.
Zapisywanie w momencie zatrzymania rolety też mogłoby czekać na zatrzymanie ruchu wszystkich rolet. Ja będę miał pewnie koło 10 rolet na jednym sterowniku. Jeśli zamknę wszysktie na raz, to lepiej poczekać parę sekund i zrobić jeden zapis, niż 10 zapisów co pół sekundy ;).
Przy licznikach impulsów pozostaje raczej tylko periodyczny zapis (np. co 3 min).
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

Dla step_by_step tak ma wyglądać deklaracja?

Kod: Zaznacz cały

Supla::Control::Button *buttonSBS = new Supla::Control::Button(PIN_BUTTON, true, true);
buttonSBS->willTrigger(*rs1, Supla::ON_PRESS, Supla::STEP_BY_STEP);
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: śr wrz 09, 2020 12:25 pm Dla step_by_step tak ma wyglądać deklaracja?

Kod: Zaznacz cały

Supla::Control::Button *buttonSBS = new Supla::Control::Button(PIN_BUTTON, true, true);
buttonSBS->willTrigger(*rs1, Supla::ON_PRESS, Supla::STEP_BY_STEP);
Tak
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

Dzięki.
https://www.facebook.com/groups/supladiy/
LukaszH
Posty: 640
Rejestracja: sob gru 14, 2019 11:49 pm

Super wiadomość że rolety doczekały się wsparcia :) Jak starczy czasu bardzo chętnie popróbuję coś skompilować. Trochę nie do końca rozumiem funkcji w "willTrigger" i tak tylko zapytam w konfiguracji CLOSE_OR_STOP, OPEN_OR_STOP dany przekaźnik uruchamiany jest tylko kiedy trzymamy przycisk czy do momentu ponownego wciśnięcia lub wciśnięcia drugiego przycisku ? Pytam, ponieważ niedługo będę instalował żaluzje fasadowe i właśnie najczęściej potrzebne będzie sterowanie od 0,2sek (krótki impuls do lekkiej zmiany kąta lamelek) do około 3sek (tyle czasu uchylają się albo zamykają lamelki). Pełne otwarcie albo zamknięcie żaluzji praktycznie nie różni się już od rolet.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

LukaszH pisze: śr wrz 09, 2020 6:03 pm Trochę nie do końca rozumiem funkcji w "willTrigger" i tak tylko zapytam w konfiguracji CLOSE_OR_STOP, OPEN_OR_STOP dany przekaźnik uruchamiany jest tylko kiedy trzymamy przycisk czy do momentu ponownego wciśnięcia lub wciśnięcia drugiego przycisku ? Pytam, ponieważ niedługo będę instalował żaluzje fasadowe i właśnie najczęściej potrzebne będzie sterowanie od 0,2sek (krótki impuls do lekkiej zmiany kąta lamelek) do około 3sek (tyle czasu uchylają się albo zamykają lamelki). Pełne otwarcie albo zamknięcie żaluzji praktycznie nie różni się już od rolet.
Wszystko zależy od tego jakie triggery i akcje przypiszesz do willTrigger. W przykładach w pierwszym poście jest użyty trigger "ON_PRESS", który wywołuje OPEN/CLOSE_OR_STOP. Dana akcja wykona się za każdym razem, gdy ktoś wciśnie przycisk. Nie ma znaczenia jak długo go trzyma.

W Twoim przypadku lepiej będzie zdefiniować triggery "ON_PRESS" -> CLOSE oraz "ON_RELEASE" -> STOP i analogicznie dla OPEN:

Kod: Zaznacz cały

  buttonClose->willTrigger(*roleta, Supla::ON_PRESS, Supla::CLOSE);
  buttonClose->willTrigger(*roleta, Supla::ON_RELEASE, Supla::STOP);
Wtedy roleta/żaluzja będzie się przesuwać tak długo, jak trzymasz przycisk. Łatwo będzie więc uzyskać bardzo krótkie czasy wywoływania akcji. Podobnie możesz użyać przycisków sterowania rolety z aplikacji - strzałki po lewej stronie ekranu działają dokładnie w ten sam sposób, tylko dochodzi losowe opóźnienie spowodowane komunikacją telefon->serwer->urządzenie. Ale u mnie śmiga to bardzo szybko.

Użycie tego softu rolet do żaluzji będzie pewnie powodowało rozjeżdżanie się stanu rolety w aplikacji z rzeczywistością, ale powinno działać.
Jak znajdę chwilę, to dodam lepszą obsługę żaluzji.
Widzimy się na Supla Offline Party vol. 2 :!:
opuncja21@wp.pl
Posty: 16
Rejestracja: sob sie 01, 2020 7:26 pm

Czy po użyciu tego kodu będzie można sterować roleta także z apki telefonu, czy tylko z przycisku.
Przepraszam za głupie pytanie ale szukam jakiegoś "odchudzonego " kodu do sterowania roletą. Mam teraz wsad MULTIBOARD i niestety działa to bardzo niestabilnie. Moduł się często zawiesza. Innym razem np roleta się opuszcza a procenty w apce się nie zmieniają skutkiem czego wszystko rozjeżdża - program widzi że roleta jest na pozycji 0% i jej nie podnosi a tak na prawdę roleta jest zamknięta.
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

opuncja21@wp.pl pisze: pn wrz 14, 2020 12:07 pm Czy po użyciu tego kodu będzie można sterować roleta także z apki telefonu, czy tylko z przycisku.
Przepraszam za głupie pytanie ale szukam jakiegoś "odchudzonego " kodu do sterowania roletą. Mam teraz wsad MULTIBOARD i niestety działa to bardzo niestabilnie. Moduł się często zawiesza. Innym razem np roleta się opuszcza a procenty w apce się nie zmieniają skutkiem czego wszystko rozjeżdża - program widzi że roleta jest na pozycji 0% i jej nie podnosi a tak na prawdę roleta jest zamknięta.
Przyciski fizyczne i z apki będą działać. Ta konfiguracja w kodzie dotyczy tylko fizycznych przycisków - nie zmienia to działania przycisków z apki.

Z założenia ma to działać stabilnie i niezawodnie. Gdyby coś było nie tak, to pisz - będę szukał problemu i to poprawię.
Widzimy się na Supla Offline Party vol. 2 :!:
ODPOWIEDZ

Wróć do „Arduino IDE”