Przycisk + Przekaźnik aktywny po rozłączeniu WIFI

emerce23
Posts: 36
Joined: Sat Dec 16, 2017 10:46 pm

Post

Witam, bardzo często mi się zdarza ze po prostu nie mam internetu, nie mieszkam w mieście i powody braku internetu są różne dlatego (kiedyś miałem taki sposób na to) ze gdy straciłem połączenie miałem alternatywna opcje ze przycisk mi działał normalnie, poniżej wrzucę kod (częśc w loop jest z poprzedniej biblioteki Supla Arduino), natomiast pozostała część to nowa wersja kodu, czy dało by rade jakoś rozwiązać ten problem ?

Code: Select all

#include <SuplaDevice.h>
#include <Arduino.h>
#include <supla/sensor/DS18B20.h>
#include <supla/sensor/Thermometer.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/roller_shutter.h>
#include <supla/control/relay.h>
#include <supla/control/button.h>
#include <supla/control/action_trigger.h>
#include <supla/device/status_led.h>
#include <supla/storage/littlefs_config.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/html/device_info.h>
#include <supla/network/html/protocol_parameters.h>
#include <supla/network/html/status_led_parameters.h>
#include <supla/network/html/wifi_parameters.h>
#include <supla/network/html/security_certificate.h>
#include <supla/device/supla_ca_cert.h>
#include <supla/events.h>

int pinsw = 4;  // Przelacznik

int stan_przekaznika = LOW;
int stan_przycisku;             
int ostatni_stan_przycisku = HIGH; 
long lastDebounceTime = 0; 
long czas_drgania = 10;   
byte ile = 1;

Supla::ESPWifi wifi("xxx", "xxx");

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

    pinMode(pinsw, INPUT_PULLUP);
    pinMode(5, OUTPUT);
  
    // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
    char GUID[SUPLA_GUID_SIZE] = {xxxxx};
    // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
    char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {xxxxx};

    // Przekazniki i przyciski
    
    auto r1 = new Supla::Control::Relay(5);
    //auto r2 = new Supla::Control::Relay(13);
    auto button1 = new Supla::Control::Button(4, true, true);
    //auto button2 = new Supla::Control::Button(12, true, true);

    button1->addAction(Supla::TOGGLE, *r1, Supla::ON_PRESS);
    //button2->addAction(Supla::TOGGLE, *r2, Supla::ON_PRESS);

    auto at1 = new Supla::Control::ActionTrigger();
    
    at1->setRelatedChannel(r1);
    //at1->setRelatedChannel(r2);
   
    SuplaDevice.begin(GUID, "svrXXX.supla.org", "xxxxxxx", AUTHKEY);
}

void loop() 
{
    if (WiFi.status() == WL_CONNECTED) 
    {
        SuplaDevice.iterate();
        TSD_SuplaChannelNewValue value1; //Set value name
        
        value1.SenderID = 0; // Notify other users that your smartphone opens a blind. In case of actuators is to be 0
        value1.ChannelNumber = 0; // Need enter the relay channel number
        value1.DurationMS = 0; //turn on time
            
        int odczyt = digitalRead(pinsw); 
      
        if (odczyt != ostatni_stan_przycisku) 
        {
            lastDebounceTime = millis();
        }
          
        if ((millis() - lastDebounceTime) > czas_drgania) 
        {
            if (odczyt != stan_przycisku) 
            {
               stan_przycisku = odczyt;
          
               if (stan_przycisku == LOW) 
               { 
                   //stan_przekaznika = !stan_przekaznika; 
                   value1.value[0] = !value1.value[0]; 
                   SuplaDevice.channelSetValue(&value1);
               }
           }
       }
      
       //digitalWrite(5, stan_przekaznika); 
       ostatni_stan_przycisku = odczyt;
    }
    else
    {
        int odczyt = digitalRead(pinsw); 
      
        if (odczyt != ostatni_stan_przycisku) 
        {
            lastDebounceTime = millis();
        }
          
        if ((millis() - lastDebounceTime) > czas_drgania) 
        {
            if (odczyt != stan_przycisku) 
            {
                stan_przycisku = odczyt;
        
                if (stan_przycisku == LOW) 
                { 
                    stan_przekaznika = !stan_przekaznika; 
                }
            }
        }
        
        digitalWrite(5, stan_przekaznika); 
        ostatni_stan_przycisku = odczyt;
        
    }      
}
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Czemu nie możesz mieć po prostu przycisku działającego cały czas?
Najlepsze suple dla Twojego domu :mrgreen:
emerce23
Posts: 36
Joined: Sat Dec 16, 2017 10:46 pm

Post

tzn poprostu chodzi mi o to jeśli np nie mam wifi, czy np. router jest rozlaczony z serwerem, mysle po po prostu jaka opcja bedzie lepsza
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Niestety nie rozumiem co chcesz zrobić.

Napisz proszę jak chciałbyś aby się zachowywał przycisk i przekaźnik gdy jest Wi-Fi i gdy nie ma Wi-Fi.
Najlepsze suple dla Twojego domu :mrgreen:
emerce23
Posts: 36
Joined: Sat Dec 16, 2017 10:46 pm

Post

ok to tak, gdy mamy połączenie z Wifi to przycisk ma działać ON/OFF przez moduł dotykowy który daje impuls, gdy nie mam polaczenie z wifi, gdy, router zostaje wyłączony z prądu (router mam na innym piętrze i tak naprawdę z osobnego prądu, korzystam z niego lecz nie mam dostępu w razie braku połączenia czy resetu urządzenia, mniejsza z tym), generalnie chciałbym aby przycisk działał tak samo i zeby zapamiętał ostatni stan (ON czy OFF), zeby pozniej po połączeniu z wifi miec w aplikacji stan przekaznika ON czy OFF
emerce23
Posts: 36
Joined: Sat Dec 16, 2017 10:46 pm

Post

tutaj

Code: Select all

auto r1 = new Supla::Control::Relay(5, true);
w ten sposób ustale stan przekaznika na właczony ?

gdybym wiedział jak odczytac stan przekaźnika było by mi znacznie łatwiej to zrobic
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Z Twojego opisu wnioskuję, że chcesz mieć normalny przycisk, który steruje przekaźnikiem niezależnie od tego czy jest Wi-Fi, czy też nie ma.
Chcesz też, aby po odzyskaniu połącznia, w Supli był wyświetlony prawidłowy stan przekaźnika.

Dokładnie tak działa zwykły przekaźnik i przycisk w Supli.

Code: Select all

// w setup:
  auto r1 = new Supla::Control::Relay(RELAY_GPIO);
  auto b1 =
    new Supla::Control::Button(BUTTON_GPIO, true, true);
  b1->addAction(Supla::TOGGLE, r1, Supla::ON_PRESS);
Klasa Relay w konstruktorze przyjmuje:

Code: Select all

   Relay(int pin, bool highIsOn = true, _supla_int_t functions = (0xFF ^ SUPLA_BIT_FUNC_CONTROLLINGTHEROLLERSHUTTER));
czyli: nr GPIO, odwracanie logiki (true = stan wysoki oznacza włączony przekaźnik, false = stan niski oznacza włączony przekaźnik), oraz funkcje raportowane do serwera).

Klasa Button w konstruktorze ma:

Code: Select all

   Button(int pin, bool pullUp = false, bool invertLogic = false);
Czyli: nr GPIO, czy włączyć internal pullup, czy odwracać logikę (true = stan niski na wejściu oznacza wciśnięty przycisk, false = stan wysoki na wejściu oznacza wciśnięty przycik).

Stan przekaźnika możesz pobrać np. tak:

Code: Select all

// zakładam, że przekaźnik to kanał #0 w Supli
auto channelR1 = Supla::Element::getElementByChannelNumber(0)->getChannel();
if (channelR1->getValueBool()) {
  // przekaźnik jest włączony
} else {
  // przekaźnik jest wyłączony
}
Najlepsze suple dla Twojego domu :mrgreen:
emerce23
Posts: 36
Joined: Sat Dec 16, 2017 10:46 pm

Post

Super, kolejny raz mi pomogłeś, bardzo ci dziękuje bo wyjaśniłeś fajnie działanie przekaźnika i przycisku, będę tworzyć dalej, mam dużo pomysłów, dzięki jeszcze raz :)

Return to “Pomoc”