Arduino + Supla + Sterowanie Przyciskiem (jak wyświetlić aktualny stan Pinu)

alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Jakbyś mógł od początku pokazać co trzeba zdefiniować żeby działal jeden przekaznik z tą funkcja relay on z przyciskiem fizycznym chwilowym
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Code: Select all

#define BTN_COUNT 1

typedef struct {
  int pin;
  int relay_pin;
  int channel;
  char last_val;
  unsigned long last_time;
} _btn_t;

_btn_t btn[BTN_COUNT];

void supla_timer() {
  char v;
  unsigned long now = millis();
  
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        v = digitalRead(btn[a].pin);
        if (v != btn[a].last_val && now - btn[a].last_time ) {
           btn[a].last_val = v;
           btn[a].last_time = now;
           if (v==0)
             {
                 if ( digitalRead(btn[a].relay_pin) > 0 ) {
                  SuplaDevice.relayOff(btn[a].channel);
                 } else {
                  SuplaDevice.relayOn(btn[a].channel, 0);
                 }        
             }
        }
  
    }
}

void supla_btn_init() {
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        pinMode(btn[a].pin, INPUT_PULLUP); 
        btn[a].last_val = digitalRead(btn[a].pin);
        btn[a].last_time = millis();
    }
}

Code: Select all

void setup() {
  memset(btn, 0, sizeof(btn));
  btn[0].pin = 53;
  btn[0].relay_pin = 37;
  btn[0].channel = 0;
  supla_btn_init();
  SuplaDevice.setTimerFuncImpl(&supla_timer);
}

btn[0].pin - pin pod którym masz przycisk (wewnętrzny PULLUP)
btn[0].relay_pin - pin pod który podłączony jest przekaźnik
btn[0].channel - numer kanału na którym jest przekaźnik

Możesz dodać więcej przycisków zmieniając #define BTN_COUNT i odpowiednio ustawiając btn[]
SUPLA.... Nareszcie w domu.
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Dziękuje Ci bardzo wszystko śmiga elegancko, mam jeszcze jedno pytanko do Ciebie, jak w Arduino na sztywno przypisywać do danego przekażnika numer kanału żeby miało to ręce i nogi.

Załóżmy dodaje

SuplaDevice.addRelay(40);
SuplaDevice.addRollerShutterRelays(48, 49, false);

i chce przypisać do nich kanał na sztywno wpisując liczbę przed przecinkiem w zwykłym przekaźniku nic mi się nie zmienia, a przy rolecie brakuje mi INT
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Kolejność dodawania == numerowi kanału licząc od 0
SUPLA.... Nareszcie w domu.
daniel
Posts: 34
Joined: Thu Feb 15, 2018 7:29 am

Post

pzygmunt wrote: Mon Jun 25, 2018 11:07 am

Code: Select all

#define BTN_COUNT 1

typedef struct {
  int pin;
  int relay_pin;
  int channel;
  char last_val;
  unsigned long last_time;
} _btn_t;

_btn_t btn[BTN_COUNT];

void supla_timer() {
  char v;
  unsigned long now = millis();
  
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        v = digitalRead(btn[a].pin);
        if (v != btn[a].last_val && now - btn[a].last_time ) {
           btn[a].last_val = v;
           btn[a].last_time = now;
           if (v==0)
             {
                 if ( digitalRead(btn[a].relay_pin) > 0 ) {
                  SuplaDevice.relayOff(btn[a].channel);
                 } else {
                  SuplaDevice.relayOn(btn[a].channel, 0);
                 }        
             }
        }
  
    }
}

void supla_btn_init() {
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        pinMode(btn[a].pin, INPUT_PULLUP); 
        btn[a].last_val = digitalRead(btn[a].pin);
        btn[a].last_time = millis();
    }
}

Code: Select all

void setup() {
  memset(btn, 0, sizeof(btn));
  btn[0].pin = 53;
  btn[0].relay_pin = 37;
  btn[0].channel = 0;
  supla_btn_init();
  SuplaDevice.setTimerFuncImpl(&supla_timer);
}

btn[0].pin - pin pod którym masz przycisk (wewnętrzny PULLUP)
btn[0].relay_pin - pin pod który podłączony jest przekaźnik
btn[0].channel - numer kanału na którym jest przekaźnik

Możesz dodać więcej przycisków zmieniając #define BTN_COUNT i odpowiednio ustawiając btn[]
Po niewielkich modyfikacjach ten kod :roll: świetnie działa na wemos d1 mini z popularnym czujnikiem ruchu HC-SR501 :D
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

a czy macie może jakiś pomysł jak w minimalistyczny sposób zdefiniować jeden z przycisków fizycznych tak, żeby działa nie na podtrzymaniu a tylko w momencie trzymania przycisku, chodzi mi tu o przycisk do furtki
daniel
Posts: 34
Joined: Thu Feb 15, 2018 7:29 am

Post

Usuń warunek:

Code: Select all

if ( digitalRead(btn[a].relay_pin) > 0 )
w funkcji supla_timer() w kodzie który podał kolega @pzygmunt,
wtedy będziesz mógł zmienić stan przekaźnika za każdą zmianą stanu na pinie przycisku.
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Wykonałem to trochę w prostszy sposób i działa tylko na suchym programie z suplą w loopie nie chcie działać, dla furtki żeby nie tracić kolejności pinow musiałem stworzyć "wirtualny przycisk" odpowiedzialny za furtkę uzyłem PINU 0 Arduino, nie wiem dlaczego, ale Supla dziwnie numeruje kanały, jeżeli póżniej wstawisz przyciski nie pokolei w programie za żadne skarby to nie ruszy, mój przykład:


SuplaDevice.addRelay(21); // kanal 8 salon led k21
SuplaDevice.addRelay(11); // kanal 9 girlanda k02
SuplaDevice.addRelay(12); // kanal 10 brama wjazd otworz kdc11
SuplaDevice.addRelay(13); // kanal 11 brama wjazd zamknij kdc12
SuplaDevice.addRelay(14); // kanal 12 akwarium k22


jeżeli nie ma się fizycznego przycisku i tak trzeba jakoś go zdefiniować w programie żeby reszta działała jak powinna,

np.


btn[7].pin =24 ; // przycisk salon led s9
btn[7].relay_pin = 21; // przekaznik salon led k21
btn[7].channel = 8; // numer kanału

btn[8].pin =46 ; // przycisk girlanda s6
btn[8].relay_pin = 11; // przekaznik girlanda k02
btn[8].channel = 9; // numer kanału


btn[9].pin =0 ; // przycisk brama
btn[9].relay_pin = 0; // przekaznik brama wirtualny
btn[9].channel =10 ; // numer kanału


btn[10].pin =0 ; // przycisk brama
btn[10].relay_pin = 0; // przekaznik brama wirtualny
btn[10].channel = 11; // numer kanału

btn[11].pin =29 ; // przycisk akwarium s11
btn[11].relay_pin =14 ; // przekaznik akwarium k22
btn[11].channel = 12; // numer kanału




co do furtki to sterowanie obszefłem tak samo jako "wirtualne" a fizyczny przycisk który bedzie działał na zasadzie domofonu zrobiłem najprościej jak się da za pomocą digital write if>else

Jak to zrobić w Loopie
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

alankedzior wrote: Fri Jun 29, 2018 7:06 pm a czy macie może jakiś pomysł jak w minimalistyczny sposób zdefiniować jeden z przycisków fizycznych tak, żeby działa nie na podtrzymaniu a tylko w momencie trzymania przycisku, chodzi mi tu o przycisk do furtki

Code: Select all

void supla_timer() {
  char v;
  unsigned long now = millis();
  
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        v = digitalRead(btn[a].pin);
        if (v != btn[a].last_val && now - btn[a].last_time ) {
           btn[a].last_val = v;
           btn[a].last_time = now;

           if ( v==0 ) {
                  SuplaDevice.relayOff(btn[a].channel);
            } else {
                  SuplaDevice.relayOn(btn[a].channel, 0);
            }        

        }
  
    }
}
SUPLA.... Nareszcie w domu.
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Ale tak na prawdę aby sensownie obsłużyć furtkę to powinno być tak

Code: Select all

void supla_timer() {
  char v;
  unsigned long now = millis();
  
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        v = digitalRead(btn[a].pin);
        if (v != btn[a].last_val && now - btn[a].last_time ) {
           btn[a].last_val = v;
           btn[a].last_time = now;
           if (v==0)
             {
                  SuplaDevice.relayOn(btn[a].channel, 3000);
             }
        }
  
    }
}


Wtedy w cloudzie ustawiasz funkcję przekaźnika na "Otwieranie furtki", a zamiast 3000 wstawiasz tam tyle samo milisekund to
masz w cloudzie przy konfiguracji kanału. Wtedy przycisk w telefonie będzie tak samo reagował jak przycisk na ścianie.
SUPLA.... Nareszcie w domu.

Return to “Pomoc”