Sterowanie LEDem w zależności od stanu przekaźnika

krycha88
Posty: 1414
Rejestracja: pt lis 16, 2018 7:25 am

czw sty 14, 2021 3:36 pm

Może warto dodać takie wsparcie do biblioteki? ;)
Awatar użytkownika
klew
Posty: 2088
Rejestracja: czw cze 27, 2019 12:16 pm

czw sty 14, 2021 5:35 pm

Ok, dorzucam na listę zadań
Patryk
Posty: 1304
Rejestracja: pn sty 07, 2019 7:51 pm
Lokalizacja: Rybnik

czw sty 14, 2021 5:51 pm

Dzięki !!!
Awatar użytkownika
Robert Błaszczak
Posty: 1762
Rejestracja: sob gru 22, 2018 8:55 pm
Lokalizacja: Zielona Góra
Kontaktowanie:

czw sty 14, 2021 5:54 pm

Pomysł dobry. Fajnie byłoby, aby to też działało przy liczniku impulsów.
Pozdrawiam
Robert Błaszczak

Strona prywatna: https://www.blaszczak.pl
Jakość powietrza: https://robert.aqi.eco
krycha88
Posty: 1414
Rejestracja: pt lis 16, 2018 7:25 am

czw sty 14, 2021 6:04 pm

Super, faktycznie nie ma co się ograniczać tylko do przekaźników :) można by też sygnalizować stan kontaktronów itd.
Awatar użytkownika
klew
Posty: 2088
Rejestracja: czw cze 27, 2019 12:16 pm

czw sty 14, 2021 7:33 pm

A może frytki do tego? ;)
lukfud
Posty: 892
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

czw sty 14, 2021 7:37 pm

klew pisze:
czw sty 14, 2021 5:35 pm
Ok, dorzucam na listę zadań
Hm, to nie będzie przypadkiem wyzwalanie własnych akcji stanem przekaźnika o czym wspominałem kilka miesięcy wcześniej? :)
krycha88
Posty: 1414
Rejestracja: pt lis 16, 2018 7:25 am

czw sty 14, 2021 7:42 pm

klew pisze:
czw sty 14, 2021 7:33 pm
A może frytki do tego? ;)
Im dłużej czekamy to mamy więcej pomysłów :D
Awatar użytkownika
lesny8
Posty: 1478
Rejestracja: pn gru 11, 2017 9:43 pm

czw sty 14, 2021 10:27 pm

klew pisze:
czw sty 14, 2021 7:33 pm
A może frytki do tego? ;)
:lol: :lol:
Awatar użytkownika
klew
Posty: 2088
Rejestracja: czw cze 27, 2019 12:16 pm

śr sty 20, 2021 10:39 am

Panowie i Panie

Dziś pojawiło się kilka istotnych zmian, które umożliwiają wszysto, co jest do tej pory w tym wątku (poza frytkami - nad tym nadal pracuję).

Wszystkie kanały (poza licznikami prądu) dostały możliwość wyzwalania akcji zmianą swojego stanu. Działa to analogicznie jak do tej pory przyciski. Np.:

Kod: Zaznacz cały

  auto relay1 = new Supla::Control::Relay(...);
  auto relay2 = new Supla::Control::Relay(...);
  
  relay1->addAction(Supla::TURN_ON, relay2, Supla::ON_TURN_OFF);
  relay1->addAction(Supla::TURN_OFF, relay2, Supla::ON_TURN_ON);
Powyższy kod włącza relay2 w sytuacji gdy wyłączamy relay1, oraz wyłącza relay2, gdy włączamy relay1.

Analogicznie działają sensory binarne (normally open itp):

Kod: Zaznacz cały

  auto alarmRelay = new Supla::Control::Relay(...);
  auto waterSensor = new Supla::Sensor::Binary(....);
  
  waterSensor->addAction(Supla::TURN_ON, alarmRelay, Supla::ON_TURN_ON);
  waterSensor->addAction(Supla::TURN_OFF, alarmRelay, Supla::ON_TURN_OFF);
Wszystkie kanały, które komunikują z Supla stan binarny (włączony/wyłączony, 0/1, true/false), takie jak Binary, Relay, VirtualRelay, BistableRelay, VirtualBinary, obsługują zdarzenia ON_TURN_ON, ON_TURN_OFF, ON_CHANGE.

Wszystkie pozostałe kanały (za wyjątkiem licznika prądu), czyli RGBW, RollerShutter, HC_SR04, termometry, wilgotnościomierze, sensory wiatru, deszczu, ciśnienia, wagi, oraz liczniki impulsów, obsługują jedynie zdarzenie ON_CHANGE. Dodatkowe zdarzenia do obsługi bardziej skomplikowanych sytuacji (np. dla termostatów) zostaną wkrótce też dodane.

Uważajcie, aby nie zrobić w kodzie cyklicznych dependencji, bo nie jest to w żaden sposób sprawdzane. Dodanie dependencji, że relay1 ustawia relay2, który ustawia relay3, który ustawia relay1 spowoduje zapętlenie się i crash aplikacji.

Kolejne dwie nowości to Supla::Control::InternalPinOutput oraz Supla::Control::PinStatusLed.
InternalPinOutput to coś w rodzaju wewnętrznego przekaźnika (wewnętrznego w sensie, że nie informujemy o jego istnieniu serwera Supli), którego stan możemy zmieniać używając wewnętrznej logiki. Można tutaj podłączać fizyczny przekaźnik, LED, buzzer - cokolwiek co da się sterować cyfrowym wyjściem. InternalPinOutput jest sterowalny przez "addAction", jak również może być sterowany przez akcje z innych elementów programu. Dodałem przykład użycia InternalPinOutput w przykładach w bibliotece dla ImpulseCounter (mruganie diodą, przy każdym zliczeniu impulsu).
InternalPinOutput ma dostępną metodę "setDurationMs(czas_w_ms)", która spowoduje, że akcja TURN_ON (lub inne włączenie), spowoduje włączenie tylko na czas_w_ms podany w setDurationMs. Można tego użyć np. do generowania mrugnięć diodą po każdej zmianie stanu licznika impulsów.
Można również ustawić stan początkowy (po uruchomieniu programu) metodami setDefaultStateOn, setDefaultStateOff. Domyślnie stan jest ustawiony na OFF.
Konstruktor przyjmuje dwa argumenty: pin, oraz highIsOn - informujący o tym, jaki stan wyjścia (HIGH, czy LOW) oznacza ON (czyli włączony).

PinStatusLed jest natomiast bardzo prostym elementem, który kopiuje stan jednego pinu na inny. Można go użyć np. do diody informującej o stanie innego pinu (np. przekaźnika, rolet, sensora binarnego). Nie da się nim inaczej sterować i sam niczego więcej nie robi. Dodałem do przykładu RollerShutter dwie takie "diody", które będą kopiować stan wyjść sterownika rolet - czyli informują użytkownika o aktualnie załączonym kierunku ruchu rolety.
PinStatusLed akceptuje 3 parametry w konstruktorze: pin źródłowy (czyli ten do skopiowania), pin docelowy (ten, który ustawiamy), oraz odwrócenie logiki (domyślnie wartość wynosi false - czyli nie odwracamy logiki, więc jeśli pin źródłowy ma HIGH, to na pin docelowy zapiszemy też HIGH).
Zalecałbym tworzenie PinStatusLed jako ostatnich elementów używanych w programie, dlatego, że stan tego elementu zostanie ustawiony w metodzie "onInit" w SuplaDevice.begin, która wywołuje inicjalizację pozostałych elementów zgodnie z kolejnością ich stworzenia. Oznacza to, że jeśli kopiujemy stan pinu 5 na pin 6, to jeśli PinStatusLed dla pin 6 zostanie stworzony przed elementem sterującym pinem 5, to pin 6 zostanie zainicjalizowany pinem 5, który nie jest jeszcze zainicjalizowany. W efekcie mogą pojawić się krótkie mignięcia diody - do czasu aż program nie wejdzie w normalną pętlę i nie zaktualizuje stanu.
ODPOWIEDZ

Wróć do „Arduino IDE”