Rolety w Arduino Ide

User avatar
klew
Posts: 9693
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

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:

Code: Select all

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

Code: Select all

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:

Code: Select all

 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:

Code: Select all

 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:

Code: Select all

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

Code: Select all

#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
Kiedy będzie Supla Offline Party / SOP#2025 ?
User avatar
pzygmunt
Posts: 19240
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków

Post

Dobra robota. Przy zapisie do EEPROM-u wystarczy jak zapis będzie w momencie zatrzymania rolety.
User avatar
klew
Posts: 9693
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

pzygmunt wrote: Wed Sep 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).
Kiedy będzie Supla Offline Party / SOP#2025 ?
User avatar
lukfud
Posts: 2266
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

Dla step_by_step tak ma wyglądać deklaracja?

Code: Select all

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/
User avatar
klew
Posts: 9693
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukfud wrote: Wed Sep 09, 2020 12:25 pm Dla step_by_step tak ma wyglądać deklaracja?

Code: Select all

Supla::Control::Button *buttonSBS = new Supla::Control::Button(PIN_BUTTON, true, true);
buttonSBS->willTrigger(*rs1, Supla::ON_PRESS, Supla::STEP_BY_STEP);
Tak
Kiedy będzie Supla Offline Party / SOP#2025 ?
User avatar
lukfud
Posts: 2266
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

Dzięki.
https://www.facebook.com/groups/supladiy/
LukaszH
Posts: 670
Joined: Sat Dec 14, 2019 11:49 pm

Post

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.
User avatar
klew
Posts: 9693
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

LukaszH wrote: Wed Sep 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:

Code: Select all

  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.
Kiedy będzie Supla Offline Party / SOP#2025 ?
opuncja21@wp.pl
Posts: 16
Joined: Sat Aug 01, 2020 7:26 pm

Post

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.
User avatar
klew
Posts: 9693
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

opuncja21@wp.pl wrote: Mon Sep 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ę.
Kiedy będzie Supla Offline Party / SOP#2025 ?

Return to “Arduino IDE”