Przekaźniki/Relay w SuplaDevice Arduino IDE

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

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:

Kod: Zaznacz cały

#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:

Kod: Zaznacz cały

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:

Kod: Zaznacz cały

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:

Kod: Zaznacz cały

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.

Kod: Zaznacz cały

#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.

Kod: Zaznacz cały

#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ć).

Kod: Zaznacz cały

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

:) aktualizacja w toku..

Kod: Zaznacz cały

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

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

lukfud pisze: pt paź 02, 2020 6:48 am
klew pisze: czw paź 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 :!:
Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

klew pisze: pt paź 02, 2020 7:36 am Pokażesz kod?
Tak, zaraz Ci wyślę całość w PW.
https://www.facebook.com/groups/supladiy/
bigthomas
Posty: 234
Rejestracja: pn sie 12, 2019 3:35 pm

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

Kod: Zaznacz cały

#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.

Kod: Zaznacz cały

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:

Kod: Zaznacz cały

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

bigthomas pisze: wt paź 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 pisze: wt paź 13, 2020 10:51 am Ciekawią mnie również te linie:

Kod: Zaznacz cały

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:

Kod: Zaznacz cały

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
Posty: 234
Rejestracja: pn sie 12, 2019 3:35 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.
Awatar użytkownika
lukfud
Posty: 2091
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

bigthomas pisze: pt paź 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"

Kod: Zaznacz cały

Supla::Control::Relay(relay_pin, false)
https://www.facebook.com/groups/supladiy/
bigthomas
Posty: 234
Rejestracja: pn sie 12, 2019 3:35 pm

lukfud pisze: pt paź 30, 2020 2:45 pm Daj za pinem "false"

Kod: Zaznacz cały

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.
ODPOWIEDZ

Wróć do „Arduino IDE”