Biblioteki Supla

marcin_77
Posts: 15
Joined: Sun Aug 08, 2021 1:23 pm

Post

Czy poza https://github.com/klew/supla-arduino, https://github.com/SUPLA/supla-arduino oraz niniejszego forum, istnieje jakaś oficjalna dokumentacja bibliotek SuplaDevice dla Arduino i ESPXX ?

Mam na myśli szczegółowe omówienie klas i metod dla obsługi przekaźników, czujników, przycisków, etc.

Np. kiedy stosować:

Code: Select all

Supla::Control::BistableRelay *relay = new Supla::Control::BistableRelay(33, 44, true, true, true);
a kiedy:

Code: Select all

auto relay = new Supla::Control::BistableRelay(33, 44, true, true, true);
User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Szczegółowej dokumentacji nie ma.
Jedynie plik readme z repo oraz ewentualnie komentarze z plików .h (choć za dużo ich nie ma).

Ale... akurat pytanie, które zadałeś nie dotyczy SuplaDevice, tylko znajomości C++.
marcin_77
Posts: 15
Joined: Sun Aug 08, 2021 1:23 pm

Post

OK, to inaczej. W jaki sposób mogę w Arduino uzyskać efekt załączania przekaźnika przez określony czas (np 5s) po wciśnięciu w aplikacji mobilnej przełącznika ON i tak samo wysterowanie innego przekaźnika również przez określony czas - po wciśnięciu wirtualnego przycisku OFF ?

Próbowałem z BistableRelay, lecz nie mam żadnego sygnału zwrotnego z przekaźnika, który by informował o statusie przełączenia. Tradycyjna klasa Relay nie obsługuje z kolei załączania czasowego, a na tym mi głównie zależy.

Czy jest jakiś sposób dla biblioteki SuplaDevice na uzyskaniu takiego efektu?
User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Możesz coś w tym stylu ustawić na zwykłym Relay, tylko w Cloud ustawiasz funkcję "schodowy" i określasz czas 5 s. Tylko to będzie działało dla włączania. Off nie będzie nic załączać.

Bistabilny działa tak że ustawia krótki impuls na wyjściu (nie pamiętam teraz ale coś koło 0,5 s) aby wyłączyć lub wyłączyć.
Jednak bistabilny wymaga podłączenia czegoś informującego o stanie wyjścia, aby widzieć czy jest włączony czy nie.

Co chcesz tym wysterować?
marcin_77
Posts: 15
Joined: Sun Aug 08, 2021 1:23 pm

Post

Ogólnie, pisząc o przekaźnikach, uprościłem nieco mój schemat.

Funkcjonalność załączania i wyłączania stanu wysokiego pinów w Arduino potrzebuję do realizacji wysterowania układu ESP32 TTGO i za pośrednictwem Lora wysłania z nadajnika do odbiornika impulsu (pakietu danych), który po stronie odbiorczej spowoduje załączenie przekaźnika w trybie monostabilnym.

Dlatego kombinuję z Supla::Control::Relay, żeby taki jeden krótki impuls wygenerować, zamiast podawać na stałe stan wysoki lub niski. W przypadku ciągłego stanu wysokiego, czyli po załączeniu wirtualnego przycisku w stan ON - układ ESP wysyłałby w sposób ciągły informację do odbiornika, a tego chcę uniknąć, żeby nie blokować częstotliwości Lora.

Innymi słowy - chciałbym zamienić tryb działania Supla::Control::Relay z bistabilnego na monostabilny.

Sposób, który podałeś, czyli wykorzystanie automatu schodowego, rozwiązuje ten problem tylko połowicznie, gdyż nawet ustawiając minimalną wartość, jaka jest możliwa w tym przypadku do ustawienia, czyli 0,5s, zadziała mi to tylko dla ON.

Dlatego przydałby się przycisk w aplikacji mobilnej typu monostabilnego, z możliwością ustawienia czasu impulsu sterującego.
Coś w stylu BistableRelay, lecz bez odczytywania stanów przekaźnika.

Niestety nie czuję się na siłach w C++, żeby uzyskać dla Arduino taką funkcjonalności programowo, na bazie obecnej biblioteki SuplaDevice.
User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

A nie możesz po prostu wstawić kodu wysyłającego wiadomość na lora gdy przekaźnik jest włączany i analogicznie innej wiadomości gdy przekaźnik ma być wyłączony?

Takie wstawki można łatwo zrobić pisząc obsługę wirtualnego gpio na klasie do obsługi wejść, albo nadpisując odpowiednie metody w klasie Relay.

Jeśli dobrze zrozumiałem co chcesz zrobić to daj znać, to poszukam podpowiedzi jak to zrobić.
marcin_77
Posts: 15
Joined: Sun Aug 08, 2021 1:23 pm

Post

Tak właśnie zamierzam zrobić. W układzie nadawczym ESP32 chcę wysłać JEDNĄ wiadomość o treści powiedzmy "relay_1_ON" do drugiego układu ESP32 będącego odbiornikiem Lora. Jednakże obecnie, podczas załączenia przycisku i wywołania Supla::Control::Relay wiadomość ta jest wysyłana w sposób ciągły, a nie w postaci jednej wiadomości.

Mam coś takiego:

Arduino:

Code: Select all

auto relay1 = new Supla::Control::Relay(44, true);
ESP32 TX:

Code: Select all

#include <SPI.h>
#include <LoRa.h>

#define ss 18
#define rst 14
#define dio0 2

const int RELAY_1_ON = 16;
const int RELAY_1_OFF = 17;

void setup() 
{
  pinMode(RELAY_1_ON, INPUT_PULLUP);
  pinMode(RELAY_1_OFF, INPUT_PULLUP);
  
  Serial.begin(115200);
  while (!Serial);

  LoRa.setPins(ss, rst, dio0);
  
  while (!LoRa.begin(868E6)) 
  {
    Serial.println(".");
    delay(500);
  }
  LoRa.crc();
  LoRa.setSignalBandwidth(125E3);
  Serial.println("LoRa Initializing OK!");
}

void loop() 
{
  int R_1_ON = digitalRead(RELAY_1_ON);
  if (R_1_ON == HIGH)
  {
    LoRa.beginPacket();
    LoRa.print("RELAY_1_ON");
    Serial.println("Relay 1 ON");
    LoRa.endPacket();
  }

  int R_1_OFF = digitalRead(RELAY_1_OFF);
  if (R_1_OFF == HIGH)
  {
    LoRa.beginPacket();
    LoRa.print("RELAY_1_OFF");
    Serial.println("Relay 1 OFF");
    LoRa.endPacket();
  }
}
ESP32 RX:

Odwrotna sytuacja, czyli po odebraniu pakietu z treścią "RELAY_1_ON" podaje stan wysoki na jakiś pin, co załącza przekaźnik w trybie bistabilnym. Analogicznie dla RELAY_1_OFF.
User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

W tym kodzie co wkleiłeś, możesz wstawić dodatkową zmienną "bool loraSendHigh" i oznaczać nią czy wysłałeś w high czy low. Coś w stylu:

Code: Select all

#include <SPI.h>
#include <LoRa.h>

#define ss 18
#define rst 14
#define dio0 2

const int RELAY_1_ON = 16;
const int RELAY_1_OFF = 17;

bool loraSendHigh = false;

void setup() 
{
  pinMode(RELAY_1_ON, INPUT_PULLUP);
  pinMode(RELAY_1_OFF, INPUT_PULLUP);
  
  Serial.begin(115200);
  while (!Serial);

  LoRa.setPins(ss, rst, dio0);
  
  while (!LoRa.begin(868E6)) 
  {
    Serial.println(".");
    delay(500);
  }
  LoRa.crc();
  LoRa.setSignalBandwidth(125E3);
  Serial.println("LoRa Initializing OK!");
}

void loop() 
{
  int R_1_ON = digitalRead(RELAY_1_ON);
  if (R_1_ON == HIGH && !loraSendHigh)
  {
    loraSendHigh = true;
    LoRa.beginPacket();
    LoRa.print("RELAY_1_ON");
    Serial.println("Relay 1 ON");
    LoRa.endPacket();
  }

  int R_1_OFF = digitalRead(RELAY_1_OFF);
  if (R_1_OFF == HIGH && loraSendHigh)
  {
    loraSendHigh = false;
    LoRa.beginPacket();
    LoRa.print("RELAY_1_OFF");
    Serial.println("Relay 1 OFF");
    LoRa.endPacket();
  }
}
Ta dodatkowa flaga spowoduje, że kod z "ifów" wykona się tylko raz po zmianie stanu z HIGH na LOW oraz z LOW na HIGH.
marcin_77
Posts: 15
Joined: Sun Aug 08, 2021 1:23 pm

Post

Wielkie dzięki za pomoc!
Zadziałało, lecz musiałem zamienić :

int R_1_OFF = digitalRead(RELAY_1_OFF);
if (R_1_OFF == HIGH && loraSendHigh)

na

int R_1_OFF = digitalRead(RELAY_1_ON);
if (R_1_OFF == LOW && loraSendHigh)

a najlepiej, po prostu:

Code: Select all

  int R_1_ON = digitalRead(RELAY_1);
  if (R_1_ON == HIGH && !loraSendHigh)

  int R_1_OFF = digitalRead(RELAY_1);
  if (R_1_OFF == LOW && loraSendHigh)

Return to “Arduino IDE”