Skocz do zawartości

Obsługa wyjścia przez dwa porty


omnixcrs

Pomocna odpowiedź

Panowie i Panie, proszę o pomoc z kodem programu bo już nie wiem co źle robię.

Dysponuję płytką arduino yun + ekspander PCF8574, komunikacja IC2 - tu wszystko działa ok.

i teraz tak:

Mam podpiętego leda pod wyjście ekspandera. Napisałem kod do zaplalnia tego leda przy użyciu przycisku zwierającego do masy w taki sposób że jak nacisnę raz to zapalam leda, a jak nacisnę drugi raz to go gaszę i tu wszyto również działa bez problemu. Chciałem jednak dodać do tego coś takiego że po pojawieniu się stanu HIGH na wejściu nr 13 Led się zapala, a po zniknięciu tego stanu gasi. i napisałem drugi kod niestety coś chyba schrzaniłem bo po podaniu HIGH na 13 led się zapala ale po zniknięciu HIGH z 13 nie gaśnie. Rzucie okiem czy coś robię nie tak. z góry dzięki:

Kod pierwszy bez obsługi portu 13, który działa:

reading = expander3.digitalRead(4);

 if (reading == LOW && previous == HIGH && millis() - time > debounce) 
 {
    if (state == LOW)
     state = HIGH;
   else
     state = LOW;

   time = millis();    
 }


  expander1.digitalWrite(0, state);
   previous = reading;

drugi kod:

reading = expander3.digitalRead(4);

 if (digitalRead(13) == HIGH || reading == LOW && previous == HIGH && millis() - time > debounce) 
 {
    if (state == LOW || digitalRead(13) == HIGH)
     state = HIGH;
   else
     state = LOW;

   time = millis();    
 }


  expander1.digitalWrite(0, state);
   previous = reading;
Link do komentarza
Share on other sites

Zauważ, że w warunku sprawdzasz, czy stan na pinie 13 jest wysoki. Zatem, gdy jest to wykonuje się kod zawarty w klamrach (negacja zmiennej state). Dlatego led się zapali, gdy był zgaszony. Lecz w warunku nie sprawdzasz, czy stan na pinie jest niski, więc gdy jest to warunek nie jest prawdziwy i kod w środku się nie wykona, zatem LED się nie zgasi.

Link do komentarza
Share on other sites

no ale przecież jest zadany warunek że state = HIGH gdy 13 == high, a jeżeli warunek jest nie spełniony(czyli 13 nie jest == HIGH) to state = low tak ??, kurczę chyba nie do końca daję z tym radę, możesz napisać jak to powinno być ??

Link do komentarza
Share on other sites

Zastanów się kiedy wykona się kod w klamrach wewnątrz pierwszego if'a. Czyli kiedy wyrazenie w pierwszym if'ie jest prawdziwe. Krócej mówiąc zastanów się kiedy wykonuje się kod zmieniający stan zmiennej state.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

no tak.... rzeczywiście to nie ma prawa gasnąc, a masz może pomysł jak to napisać bo ja już próbuje od 2 dni i nie mogę dać rady - niestety nie jestem programistą tylko elektrotechnikiem a potrzebuje tego do jednego projektu.

Link do komentarza
Share on other sites

Problem jest w tym, że nie możesz po prostu dodac kolejnego warunku, by wchodzić do pętli również, gdy dioda jeat zgaszona, bo wtedy wartość zmiennej stan bedzie tak naprawde tylko zależna od tego czy dioda jest zapalona czy nie i nie bylbys w stanie jej dodatkowo zmienic za pomoca przycisku. Tak szczerze mówiąc to nie rozumiem jak to sobie wyobrażasz sterowanie taka dioda.

Chcesz ja zaswiecic gdy inna sie swieci.

Zgasic gdy inna jest zgaszona.

A dodatkowo wlaczac i wylaczac ja przyciakiem.

Zastanów się co w przypadku gdy dioda na pinie 13 sie swici. Ty naciskasz przycisk, zmieniasz stan na low, ale przez to ze dioda na pinie 13 dalej sie swieci to automatycznie znowu ustawi wartosc zmiennej state na high.

Albo musisz nadac czemus wyzszy priorytet, ale w tym tez nie widze sensu, ale rozwazyc jeszcze raz zalozenia projektu.

Link do komentarza
Share on other sites

No to może inaczej, ta dioda to tylko przykład bo tak naprawdę chodzi o przekaźnik załączający dalej dane urządzenie. I obsługa tego przekaźnika musi się odbywać zarówno z przycisku jak i z internetu. Pin 13 będę ustawiał w stan wysoki z neta i dlatego chciałem to skojarzyć.

Link do komentarza
Share on other sites

Gość es2
No to może inaczej, ta dioda to tylko przykład bo tak naprawdę chodzi o przekaźnik załączający dalej dane urządzenie. I obsługa tego przekaźnika musi się odbywać zarówno z przycisku jak i z internetu. Pin 13 będę ustawiał w stan wysoki z neta i dlatego chciałem to skojarzyć.

Czy przekaźnik, czy dioda reguła ta sama.

Błąd jaki popełniłeś to to, ze zacząłeś pisać program zamiast najpierw napisać algorytm. Zacząłeś, jak to sie mówi, od duuuu...y strony.

Jeśli chcesz sterować przekaźnikiem z kilku źródeł to program musi reagować na zmianę poziomu a nie jego stan.

PS

Adruino, zacny cel, niestety wywołało odwrotny skutek i sztuka programowania zanika.

Link do komentarza
Share on other sites

Omnixcrs zrób to na zmiennej zmiennej zmienianej przez neta, oraz czytanie stanu przycisku. Sam to przerabiałem i działa pięknie:

https://www.forbot.pl/forum/topics61/arduino-mega-i-blynk-lcd-odchodzi-do-lamusa-vt15147.htm

U mnie jest tak:

void kontrola_lampa_ogrod(){
  if((button_lampa_ogrod == 1) || (digitalRead(lampa_ogrod_wlacznik) == HIGH) || (lampa_ogrod_enkoder == true)){
   lampa_ogrod = true;
  }
  else if(button_lampa_ogrod == 0){
   lampa_ogrod = false;
  }
Link do komentarza
Share on other sites

Gość es2
Omnixcrs zrób to na zmiennej zmiennej zmienianej przez neta, oraz czytanie stanu przycisku. Sam to przerabiałem i działa pięknie:

https://www.forbot.pl/forum/topics61/arduino-mega-i-blynk-lcd-odchodzi-do-lamusa-vt15147.htm

U mnie jest tak:

void kontrola_lampa_ogrod(){
  if((button_lampa_ogrod == 1) || (digitalRead(lampa_ogrod_wlacznik) == HIGH) || (lampa_ogrod_enkoder == true)){
   lampa_ogrod = true;
  }
  else if(button_lampa_ogrod == 0){
   lampa_ogrod = false;
  }

Ten kod, ustawi lampa_ogrod gdy button_lampa_ogrod (to pewnie Internet) wejście lampa_ogrod_wlacznik lub lampa_ogrod_enkoder jest aktywne. Skasowanie zmiennej jest możliwe TYLKO przez nieaktywny button_lampa_ogrod (Internet). Nie ma więc możliwości skasowania zmiennej lampa_ogrod przez włącznik czy enkoder.

Link do komentarza
Share on other sites

es2, ma masz rację, aplikacja internetowa ma priorytet. Jeśli włączono lampę przez internet, to nie ma możliwości wyłączenia przez enkoder i włącznik. Jeśli mam telefon ze sobą to steruję telefonem, jeśli zapomniałem to włącznikiem, a enkoder to raczej był dla bajeru i nauki obsługi i programowania...

Oczywiście można to oprzeć na zmiennej włączającej lampę, która będzie ustawiana true-false przez wszystkie rodzaje "włączników", to by wymagało dodatkowo kontroli, czy stan włączników się zmienił w ostatnim czasie(stan_poprzedni != stan), ale u siebie zrobiłem tak, bo tak mi pasowało.

P.S. es2 czy mogę mieć do Ciebie pytanie co do Bramotela ze Slicana który mam zainstalowany w domu? Potrzebuję spiąć go z bramką GSM żeby mi dzwonił telefon komórkowy, a nie zwykły... da się?

Przepraszam za offtopic... 😳

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.