Przekaźniki/Relay w SuplaDevice Arduino IDE

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

Post

Biblioteka SuplaDevice na Arduino IDE wspiera aktualnie kilka wersji przekaźników: Relay, BistableRelay, VirtualRelay, LightRelay.

Relay to zwykły przekaźnik. Może być sterowany stanem niskim lub wysokim. Przykład:

Code: Select all

#include <supla/control/relay.h>

// setup
auto r1 = new Supla::Control::Relay(pin1); // przekaźnik na pin1 sterowany stanem wysokim
auto r2 = new Supla::Control::Relay(pin2, false); // przekaźnik na pin2 sterowany stanem niskim
Relay ma kilka opcji do skonfigurowania:

Code: Select all

r1->setDefaultStateOn();      // po uruchomieniu urządzenia, przekaźnik będzie włączony
r2->setDefaultStateOff();     // po uruchomieniu urządzenia, przekażnik będzie wyłączony (domyślne ustawienie)
r1->setDefaultStateRestore(); // po uruchomieniu urządzenia, przekaźnik wróci do stanu sprzed 
                              // wyłączenia zasilania urządzenia (wymaga Storage)
r1->keepTurnOnDuration();     // przekaźnik zapamięta czas wysłany ostatnio przez serwer i będzie używał go przy 
                              // włączeniu przekaźnika z lokalnego przycisku, lub z kodu. Aby urządzenie 
                              // zapamiętał czas włączenia, wymagany jest Storage. Bez Storage, czas 
                              // będzie zapamiętany tylko do resetu.
Metody setDefaulStateRestore() i keepTurnOnDuration() wymagają klasy Storage do prawidłowego działania (tutaj opis viewtopic.php?f=61&t=7162 ). Zalecamy używanie pamięci FRAM.
Skonfigurowanie tego spowoduje dopisanie dodatkowych danych w pamięci. Aktualnie zmiana obszaru zapisywania danych powoduje, że cały obszar jest zapisywany od nowa i dane poprzednio zapisane są tracone. Dlatego wszystkie elementy naszego urządzenia należy skonfigurować "na stałe" i nie modyfikować tych ustawień później.

Przy keepTurnOnDuration, najlepiej jest zostawić "default state OFF". Przy "restore" nie będzie przywrócony pozostały czas świecenia - w takim wypadku, jeśli urządzenie wyłączyło się, gdy przekaźnik był włączony np na 2 min i pozostało 15 s, to po resecie włączy się ponownie na 2 min.

Klasa Relay ma dostępne następujące metody, które możemy wywoływać z kodu:

Code: Select all

r1->turnOn(); // włącza przekaźnik. Jeśli mamy ustawione "keepTurnOnDuration", to
             // zostanie użyty zapisany wcześniej czas włączenia
r1->turnOn(czas_w_milisekundach); // włącza przekaźnik na określony czas
r1->turnOff();  // wyłącza przekaźnik
r1->toggle();  // przeałącza przekaźnik
r1->isOn(); // zwraca true/false w zależności od tego czy przekaźnik jest włączony czy nie
Poza powyższym interfejsem, Relay reaguje też na akcje wyzwalane z innych klas, np. z przycisku Button:

Code: Select all

auto b1 = new Supla::Control::Button(pin3, true, true); // przycisk na pin3, z input pullup i odwróconą logiką (zwieranie do gnd)
b1->addAction(Supla::TURN_ON, r1, Supla::ON_PRESS);
Dostępne akcje:
TURN_ON - włącza przekaźnik - jeśli był ustawiony keepTurnOnDuration, to przekaźnik włączy się na wcześniej zapisany okres czasu.
TURN_OFF- wyłącza przekaźnik
TOGGLE - przełącza przekaźnik. Jeśli był ustawiony keepTurnOnDuration, to przy włączeniu przekaźnika będzie on włączony na określony czas.

VirtualRelay działa analogicznie jak Relay, z tą różnicą, że jest to wirtualny przekaźnik bez powiązania z fizycznym pinem.

Code: Select all

#include <supla/control/virtual_relay.h>

new Supla::Control::VirtualRelay();
Zmiana stanu takiego przekaźnika, zmienia jedynie wartość zmiennej w pamięci. Wszystkie metody opisane powyżej dla Relay mogą być tutaj stosowane.

LightRelay to przekaźnik dedykowany do oświetlenia z opcją programowania czasu żywotności źródła światła. Taki kanał po kliknięciu w aplikacji na ikonkę (i) pozwala zobaczyć dodatkowe informacje związane z żywotnością źródła światła oraz łącznym czasem włączenia. Z aplikacji można ustawić żywotność oraz resetować licznik. Użycie tej klasy wymaga Storage.

Code: Select all

#include <supla/control/light_relay.h>

new Supla::Control::LightRelay(pin, true); // drugi parametr oznacza sterowanie stanem wysokim (true)
Wszystkie metody opisane powyżej dla Relay mają też zastosowanie do LightRelay.

BistableRelay służy do sterowania zewnętrznym przekaźnikiem bistabilnym. BistableRelay podaje krótkie impulsy 200 ms do przełączania stanu przekaźnika. Do prawidłowego działania potrzebny jest dodatkowe wejście na pin ze stanem przekaźnika. Jeśli pin stanu nie jest zdefiniowany, to urządzenie nie wie w jakim stanie jest przekaźnik bistabilny i będzie wyłał impuls 200 ms na każdą akcję i może mieć odwrotne działanie do oczekiwanego (np. włączenie przekaźnika może go w rzeczywistości wyłączyć).

Code: Select all

#include <supla/control/bistable_relay.h>

new Supla::Control::BistableRelay(pinRelay, pinStatus, statusPullUp,  statusHighIsOn, relayHighIsOn);
statusPullUp - włącza pullup na pinie od statusu
statusHighIsOn - wartość true oznacza, że stan wysoki na pinStatus oznacza, że przekaźnik jest włączony
relayHighIsOn - true - sterownie stanem wysokim, false - sterowanie stanem niskim
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

:) aktualizacja w toku..

Code: Select all

keepTurnOnDuration();
na chwilę obecną zapisuje czas, który ustawiony jest w cloud (automat, brama, furtka) po pierwszym wykonaniu z serwera.
A co się stanie jeśli zmienimy w cloud fukcję na włącznik światła/zasilania, czas się "wyzeruje" i przekaźnik się nie wyłączy?

EDIT
Odpowiadając na swoje pytanie, reakcja przekaźnika włączonego z przycisku podąża za funkcją ustawioną w cloud. :)
https://www.facebook.com/groups/supladiy/
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Thu Oct 01, 2020 2:02 pm Skonfigurowanie tego spowoduje dopisanie dodatkowych danych w pamięci. Aktualnie zmiana obszaru zapisywania danych powoduje, że cały obszar jest zapisywany od nowa i dane poprzednio zapisane są tracone.
Pomimo, że mam ustawiony offset (co przy roletach działa), po wywołaniu metody "setDefaultStateRestore();" nadpisuje mi się od 0.
Mógłbyś to zweryfikować?
https://www.facebook.com/groups/supladiy/
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukfud wrote: Fri Oct 02, 2020 6:48 am
klew wrote: Thu Oct 01, 2020 2:02 pm Skonfigurowanie tego spowoduje dopisanie dodatkowych danych w pamięci. Aktualnie zmiana obszaru zapisywania danych powoduje, że cały obszar jest zapisywany od nowa i dane poprzednio zapisane są tracone.
Pomimo, że mam ustawiony offset (co przy roletach działa), po wywołaniu metody "setDefaultStateRestore();" nadpisuje mi się od 0.
Mógłbyś to zweryfikować?
Pokażesz kod?
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Fri Oct 02, 2020 7:36 am Pokażesz kod?
Tak, zaraz Ci wyślę całość w PW.
https://www.facebook.com/groups/supladiy/
bigthomas
Posts: 234
Joined: Mon Aug 12, 2019 3:35 pm

Post

W ESP32 zaobserwowałem dziwne zachowanie, zadeklarowałem piny 36, 39, 34, 35, 32, 33, 25, 26
Kod:

Code: Select all

#include <SPI.h>
#include <SuplaDevice.h>

#define STORAGE_OFFSET 100
#include <supla/storage/eeprom.h>
Supla::Eeprom eeprom(STORAGE_OFFSET);

#include <supla/control/relay.h>

auto r1 = new Supla::Control::Relay(36, false); // przekaźnik sterowany stanem niskim
auto r2 = new Supla::Control::Relay(39, false); // przekaźnik sterowany stanem niskim
auto r3 = new Supla::Control::Relay(34, false); // przekaźnik sterowany stanem niskim
auto r4 = new Supla::Control::Relay(35, false); // przekaźnik sterowany stanem niskim
auto r5 = new Supla::Control::Relay(32, false); // przekaźnik sterowany stanem niskim
auto r6 = new Supla::Control::Relay(33, false); // przekaźnik sterowany stanem niskim
auto r7 = new Supla::Control::Relay(25, false); // przekaźnik sterowany stanem niskim
auto r8 = new Supla::Control::Relay(26, false); // przekaźnik sterowany stanem niskim

// ESP32 based board:
#include <supla/network/esp32_wifi.h>
Supla::ESP32Wifi wifi("xxxxx", "xxxxx");

void setup() {
  Serial.begin(115200);

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {0x6A,0x80,0xAA,0x8D,0x82,0x1F,0xE9,0x38,0xEB,0x42,0xC2,0xA2,0x5F,0x00,0x15,0x8D};

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {0x21,0x78,0x9F,0x2C,0xF0,0xB9,0xB5,0x85,0x23,0x02,0x46,0x52,0x0B,0x66,0x3A,0xCF};

  SuplaDevice.setName("A Relay x8");
  SuplaDevice.begin(GUID,              // Global Unique Identifier
                    "xxxxx",  // SUPLA server address
                    "xxxxx",   // Email address used to login to Supla Cloud
                    AUTHKEY);          // Authorization key

  WiFi.softAPdisconnect(true); // wyłączenie rozgłaszania sieci ESP

}

void loop() {
  SuplaDevice.iterate();

  delay(200);
  Serial.print("Pin 36 status: ");
  Serial.println(digitalRead(36));
  delay(200);
  Serial.print("Pin 39 status: ");
  Serial.println(digitalRead(39));
  delay(200);
  Serial.print("Pin 34 status: ");
  Serial.println(digitalRead(34));
  delay(200);
  Serial.print("Pin 35 status: ");
  Serial.println(digitalRead(35));
  delay(200);
  Serial.print("Pin 32 status: ");
  Serial.println(digitalRead(32));
  delay(200);
  Serial.print("Pin 33 status: ");
  Serial.println(digitalRead(33));
  delay(200);
  Serial.print("Pin 25 status: ");
  Serial.println(digitalRead(25));
  delay(200);
  Serial.print("Pin 26 status: ");
  Serial.println(digitalRead(26));
  delay(200);
  Serial.println("=======================");
}
I mam problem z pinami 36,39, 34, 35. Na pewno to są te piny na płytce, zweryfikowałem to przy pomocy innego programu, gdzie po podaniu masy na dany PIN jego wartość ulegała zmianie.
Natomiast w logu widać że wyżej wymienione piny z wartości 1 wchodzą od razu na 0 i jest problem ze starowaniem przekaźnikiem.

Code: Select all

12:41:49.029 -> Supla - starting initialization
12:41:49.029 -> Storage initialization
12:41:49.029 -> readStorage: 8; Read: [53 55 50 4C 41 1 0 1 ]
12:41:49.029 -> Storage: Number of sections 1
12:41:49.029 -> Reading section: 0
12:41:49.029 -> readStorage: 7; Read: [3 8 0 0 0 0 0 ]
12:41:49.029 -> Section type: 3; size: 8
12:41:49.029 -> Validating storage state section with current device configuration
12:41:49.029 -> Element state section size doesn't match current device configuration
12:41:49.075 ->  **** Digital write[0], pin: 36; value: 1
12:41:49.075 ->  **** Digital write[1], pin: 39; value: 1
12:41:49.075 ->  **** Digital write[2], pin: 34; value: 1
12:41:49.075 ->  **** Digital write[3], pin: 35; value: 1
12:41:49.075 ->  **** Digital write[4], pin: 32; value: 1
12:41:49.075 ->  **** Digital write[5], pin: 33; value: 1
12:41:49.075 ->  **** Digital write[6], pin: 25; value: 1
12:41:49.075 ->  **** Digital write[7], pin: 26; value: 1
12:41:49.075 -> Initializing network layer
12:41:49.075 -> WIFI: establishing connection with SSID: "supla"
12:41:49.169 -> Using Supla protocol version 12
12:41:49.169 -> Current status: [7] SuplaDevice initialized
12:41:49.169 -> Current status: [21] No connection to network
12:41:49.309 -> local IP: xxxxx
12:41:49.356 -> subnetMask: xxxxx
12:41:49.356 -> gatewayIP: xxxxx
12:41:49.356 -> Signal Strength (RSSI): -76 dBm
12:41:49.356 -> Pin 36 status: 0
12:41:49.543 -> Pin 39 status: 0
12:41:49.777 -> Pin 34 status: 0
12:41:49.965 -> Pin 35 status: 0
12:41:50.152 -> Pin 32 status: 1
12:41:50.339 -> Pin 33 status: 1
12:41:50.573 -> Pin 25 status: 1
12:41:50.760 -> Pin 26 status: 1
12:41:50.947 -> =======================
12:41:50.947 -> Current status: [9] Not connected to Supla server
12:41:50.947 -> Establishing connection with: xxxxx (port: xxxx)
12:41:51.088 -> Connected to Supla Server
12:41:51.088 -> Current status: [10] Register in progress
12:41:51.088 -> Sending: [53 55 50 4C 41 C 1 0 0 0 45 0 0 0 10 3 0 0 62 69 67 74 68 6F 6D 61 73 36 36 36 40 67 6D 61 69 6C 2E 63 6F 6D 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 78 9F 2C F0 B9 B5 85 23 2 46 52 B 66 3A CF 6A 80 AA 8D 82 1F E9 38 EB 42 C2 A2 5F 0 15 8D 41 20 52 65 6C 61 79 20 78 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55 73 65 72 20 53 57 2C 20 6C 69 62 20 32 2E 33 2E 32 0 0 0 73 76 72 32 36 2E 73 75 70 6C 61 2E 6F 72 67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 54 B 0 0 EF 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 54 B 0 0 EF 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 54 B 0 0 EF 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 3 54 B 0 0 EF 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4 54 B 0 0 EF 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 5 54 B 0 0 EF 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 6 54 B 0 0 EF 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 7 54 B 0 0 EF 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ]
12:41:51.228 -> Sending: [53 55 50 4C 41 ]
12:41:51.415 -> Pin 36 status: 0
12:41:51.649 -> Pin 39 status: 0
12:41:51.837 -> Pin 34 status: 0
12:41:52.024 -> Pin 35 status: 0
12:41:52.211 -> Pin 32 status: 1
12:41:52.445 -> Pin 33 status: 1
12:41:52.632 -> Pin 25 status: 1
12:41:52.819 -> Pin 26 status: 1
Ciekawią mnie również te linie:

Code: Select all

12:41:49.029 -> Validating storage state section with current device configuration
12:41:49.029 -> Element state section size doesn't match current device configuration
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

bigthomas wrote: Tue Oct 13, 2020 10:51 am W ESP32 zaobserwowałem dziwne zachowanie, zadeklarowałem piny 36, 39, 34, 35, 32, 33, 25, 26
Kod:
Zgodnie z https://randomnerdtutorials.com/esp32-p ... nce-gpios/ piny 34-39 są "input only". Pewnie dlatego nie działają jako OUTPUT ;)
bigthomas wrote: Tue Oct 13, 2020 10:51 am Ciekawią mnie również te linie:

Code: Select all

12:41:49.029 -> Validating storage state section with current device configuration
12:41:49.029 -> Element state section size doesn't match current device configuration
EEPROM/flash jest zapisywany co 3 min. Chyba brakuje tam początkowego zapisu zaraz po uruchomieniu modułu. Spróbuj poczekać kilka minut i zobacz, czy pojawi się zapis do pamięci, wtedy ten log powininen zniknąć.
Ewentualnie do testów skróć sobie czas zapisu przy pomocy:

Code: Select all

eeprom.setStateSavePeriod(10000); // zapis co 10 s
Tylko nie zostawiaj na stałe tak częstego zapisu. Daj znać, czy problem zniknął.
Widzimy się na Supla Offline Party vol. 2 :!:
bigthomas
Posts: 234
Joined: Mon Aug 12, 2019 3:35 pm

Post

@klew a jest jakaś możliwość ustawienia przekaźnika z odwróconą logiką?

Mam pod przekaźnik podłączone urządzenie które cały czas ma mieć zasilanie, a chciałbym sterować tylko jego ewentualnie wyłączenie. Więc podłączam w przekaźniku pod NC - COM. Ale aby wyłączyć to urządzenie muszę wybrać "włącz" w aplikacji :)
Więc trochę mylne działanie.
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

bigthomas wrote: Fri Oct 30, 2020 2:18 pm @klew a jest jakaś możliwość ustawienia przekaźnika z odwróconą logiką?

Mam pod przekaźnik podłączone urządzenie które cały czas ma mieć zasilanie, a chciałbym sterować tylko jego ewentualnie wyłączenie. Więc podłączam w przekaźniku pod NC - COM. Ale aby wyłączyć to urządzenie muszę wybrać "włącz" w aplikacji :)
Więc trochę mylne działanie.
Daj za pinem "false"

Code: Select all

Supla::Control::Relay(relay_pin, false)
https://www.facebook.com/groups/supladiy/
bigthomas
Posts: 234
Joined: Mon Aug 12, 2019 3:35 pm

Post

lukfud wrote: Fri Oct 30, 2020 2:45 pm Daj za pinem "false"

Code: Select all

Supla::Control::Relay(relay_pin, false)
Z tego co czytałem, parametr ten oznacza sterowanie stanem niskim.
I tak mam właśnie ustawione.

A mi chodzi o to aby odwrócić logikę, Czyli zamiast w aplikacji wybierać "włącz" aby uruchomić przekaźnik i przerwać obwód. Wybrać "wyłącz" aby odpowiadało to faktycznemu działaniu.

Return to “Arduino IDE”