Biblioteki Supla

marcin_77
Posty: 15
Rejestracja: ndz sie 08, 2021 1:23 pm

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

Kod: Zaznacz cały

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

Kod: Zaznacz cały

auto relay = new Supla::Control::BistableRelay(33, 44, true, true, true);
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

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++.
Widzimy się na Supla Offline Party vol. 2 :!:
marcin_77
Posty: 15
Rejestracja: ndz sie 08, 2021 1:23 pm

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

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ć?
Widzimy się na Supla Offline Party vol. 2 :!:
marcin_77
Posty: 15
Rejestracja: ndz sie 08, 2021 1:23 pm

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

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ć.
Widzimy się na Supla Offline Party vol. 2 :!:
marcin_77
Posty: 15
Rejestracja: ndz sie 08, 2021 1:23 pm

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:

Kod: Zaznacz cały

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

Kod: Zaznacz cały

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

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:

Kod: Zaznacz cały

#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.
Widzimy się na Supla Offline Party vol. 2 :!:
marcin_77
Posty: 15
Rejestracja: ndz sie 08, 2021 1:23 pm

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:

Kod: Zaznacz cały

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

Wróć do „Arduino IDE”