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