Arduino + Supla + Sterowanie Przyciskiem (jak wyświetlić aktualny stan Pinu)
-
alankedzior
- Posts: 114
- Joined: Mon Jun 18, 2018 5:38 pm
Jakbyś mógł od początku pokazać co trzeba zdefiniować żeby działal jeden przekaznik z tą funkcja relay on z przyciskiem fizycznym chwilowym
-
pzygmunt
- Posts: 20302
- Joined: Tue Jan 19, 2016 9:26 am
- Location: Paczków
- Been thanked: 59 times
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
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
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
-
daniel
- Posts: 34
- Joined: Thu Feb 15, 2018 7:29 am
Po niewielkich modyfikacjach ten kodpzygmunt wrote: Mon Jun 25, 2018 11:07 amCode: 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[]
-
alankedzior
- Posts: 114
- Joined: Mon Jun 18, 2018 5:38 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
-
daniel
- Posts: 34
- Joined: Thu Feb 15, 2018 7:29 am
Usuń warunek: 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.
Code: Select all
if ( digitalRead(btn[a].relay_pin) > 0 )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
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
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
-
pzygmunt
- Posts: 20302
- Joined: Tue Jan 19, 2016 9:26 am
- Location: Paczków
- Been thanked: 59 times
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.
-
pzygmunt
- Posts: 20302
- Joined: Tue Jan 19, 2016 9:26 am
- Location: Paczków
- Been thanked: 59 times
Ale tak na prawdę aby sensownie obsłużyć furtkę to powinno być tak
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.
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.
