Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

funkcja IF źle działa Arduino ESP8266

maystero 08 Jan 2020 22:28 609 25
  • #1
    maystero
    Level 24  
    Witam,

    tworze projekt, czerpie wiedze że źródła:
    https://platformio.org/lib/show/1089/IRremoteESP8266

    Popełniłem oto taki kod.

    Code: c
    Log in, to see the code


    Monitor portu szeregowego zwraca:
    Code: ini
    Log in, to see the code


    czyli funkcja wykrywa kod: 800 a mimo to nie zmienia stanu output5.
    I nie wiem czemu od razu wchodzi w:
    Code: c
    Log in, to see the code



    Koledzy co źle robie?
    Pomóżcie bo się zakopałem....
  • Helpful post
    #2
    Ture11
    Level 38  
    maystero wrote:
    if (results.value = 800)

    tym poleceniem wpisałeś do results.value wartość 800.
    Porównanie robi się podwójnym "równa się":

    Quote:
    if (results.value == 800)
  • #3
    maystero
    Level 24  
    Faktycznie. Chochlik się wplątał.
    Poprawiłem kod ale dalej nie działa jak trzeba :(

    Code: c
    Log in, to see the code


    Monitor portu:
    Code: c
    Log in, to see the code
  • #4
    krzysiek_krm
    Level 40  
    Chyba powinieneś opublikować cały kod.
    Możliwe, że gdzieś użyłeś nieodpowiednich typów zmiennych.
  • #5
    maystero
    Level 24  
    Oto cały kod:

    Code: c
    Log in, to see the code



    oraz zrzut monitora szeregowego:

    Code: ini
    Log in, to see the code
  • #6
    szelus
    Level 34  
    maystero wrote:
    Code: c
    Log in, to see the code

    Czegoś nie rozumiem. Ustawiasz output na "on" tylko wtedy, jeżeli już jest "on", czyli nigdy...
    Nawiasem mówiąc, typ string do przechowywania stanu to nietypowy, bo niezbyt efektywny pomysł.
  • #7
    maystero
    Level 24  
    Hym.... poprawiłem.

    Code: c
    Log in, to see the code

    Dalej nie działa.

    Może źle kombinuje ale wg mnie powinno to działać tak:
    jeżeli results.value == 800 i jeżeli output5State == "off"
    to ustaw:
    output5 na HIGH
    output5State na "on"
    i wyświetl napis HIGH
    w przeciwny wypadku:
    output5 na LOW
    output5State na "off"
    i wyświetl napis LOW

    nie rozumiem czemu to nie działa.... :(
  • #8
    khoam
    Level 41  
    maystero wrote:
    eżeli results.value == 800 i jeżeli output5State == "off"

    Niezupełnie.
    Jeżeli (results.value == 800) oraz (output5 == HIGH && output5State == "on") to wtedy output5 ustawia na HIGH.
    Jeżeli (results.value == 800) oraz (output5 != HIGH || output5State != "on") to wtedy output5 ustawia na LOW.
    W każdym innym wypadku nic nie robi z output5.
  • #9
    maystero
    Level 24  
    Drugi wariant:
    Code: c
    Log in, to see the code


    oraz monitor portu:

    Code: ini
    Log in, to see the code


    i wchodzi w ostatni warunek.
  • #10
    khoam
    Level 41  
    Sporządź prosta tabelkę i napisz, co chcesz uzyskać w zależności od stanów zmiennych: results.value, output5State oraz output5.
  • #11
    maystero
    Level 24  
    khoam wrote:
    Sporządź prosta tabelkę i napisz, co chcesz uzyskać w zależności od stanów zmiennych: results.value, output5State oraz output5.


    funkcja IF źle działa Arduino ESP8266
  • #12
    krzysiek_krm
    Level 40  
    Popatrz na tabelkę, po spełnieniu warunku "zmieniasz" HIGH/on na HIGH/on, coś to jest bez sensu.
    Rozumiem, że chcesz zmieniać stan na przeciwny czyli HIGH/on na LOW/off oraz odwrotnie.
    Albo po prostu neguj znacznik i "wysyłaj" jego wartość na wyjście.
  • #13
    maystero
    Level 24  
    krzysiek_krm wrote:
    Popatrz na tabelkę, po spełnieniu warunku "zmieniasz" HIGH/on na HIGH/on, coś to jest bez sensu.
    Rozumiem, że chcesz zmieniać stan na przeciwny czyli HIGH/on na LOW/off oraz odwrotnie.
    Albo po prostu neguj znacznik i "wysyłaj" jego wartość na wyjście.


    Czyli jeśli dobrze cie rozumiem - powinno być tak?
    funkcja IF źle działa Arduino ESP8266
  • #14
    krzysiek_krm
    Level 40  
    Moim zdaniem - tak.
    Poza tym uważam, że badanie dwóch warunków (iloczyn logiczny) jest nadmiarowe.
  • #15
    maystero
    Level 24  
    krzysiek_krm wrote:
    Moim zdaniem - tak.
    Poza tym uważam, że badanie dwóch warunków (iloczyn logiczny) jest nadmiarowe.



    Poprawiłem. O to koledzie chodziło?
    Code: c
    Log in, to see the code


    mam wrażenie że wogóle nie wchodzi w if

    Code: ini
    Log in, to see the code


    wyświetla tylko wartość: serialPrintUint64(results.value, HEX);
  • #16
    krzysiek_krm
    Level 40  
    Tak na pierwszy rzut oka wkradła Ci się literówka Off vs. off.
  • #17
    maystero
    Level 24  
    krzysiek_krm wrote:
    Tak na pierwszy rzut oka wkradła Ci się literówka Off vs. off.


    poprawiłem, to samo :(
  • #18
    szelus
    Level 34  
    maystero wrote:
    Code: c
    Log in, to see the code

    Jeżeli dobrze rozumiem (bo nie znam Arduino), to wypisujesz odebraną wartość szesnastkowo. Czyli odbierasz 0x800 (2048 dziesiętne), a porównanie jest na 800 dziesiętne. Nic dziwnego, że nie wchodzi do if-a.
  • #19
    maystero
    Level 24  
    Biblioteka którą używam zwraca poleceniem serialPrintUint64(results.value, HEX)
    właśnie liczbę 800.
    tu jest źródło:
    https://platformio.org/lib/show/1089/IRremoteESP8266

    Zmieniłem oczywiście serialPrintUint64(results.value, BIN) i sprawdziłem efekt działania. Też nie nie wchodzi w funkcje if.

    Code: ini
    Log in, to see the code
  • Helpful post
    #20
    khoam
    Level 41  
    maystero wrote:
    Zmieniłem oczywiście serialPrintUint64(results.value, BIN) i sprawdziłem efekt działania.

    Użyj po prostu serialPrintUint64(results.value)
  • #21
    maystero
    Level 24  
    khoam wrote:
    maystero wrote:
    Zmieniłem oczywiście serialPrintUint64(results.value, BIN) i sprawdziłem efekt działania.

    Użyj po prostu serialPrintUint64(results.value)


    Pomogło:) działa!
    Code: c
    Log in, to see the code
  • #22
    maystero
    Level 24  
    Szanowny kolego khoam może pomożesz mi jeszcze w tej części kodu.
    Jak już udało się opanować funkcje if postanowiłem rozszerzyć kod aby przełączać 4x LED-y. Do tego celu użyłem funkcji switch...case
    https://www.arduino.cc/reference/en/language/structure/control-structure/switchcase/

    oto moja komplikacja:
    Code: c
    Log in, to see the code


    a zoleji na monitorze portu szeregowego leci w nieskończoność
    funkcja IF źle działa Arduino ESP8266

    Wydaje mi się dobrze zastosowałem switch...case ale może znów mi się wkradł jakiś chochlik i nie chce się ujawnić.
  • #23
    khoam
    Level 41  
    Przede wszystkim, zamiast:
    Code: c
    Log in, to see the code
    powinno być:
    Code: c
    Log in, to see the code
    Dodatkowe sprawdzanie stanu zmiennej 'results.value' jest niepotrzebne, skoro:
    Code: c
    Log in, to see the code
    już to robi.

    W switch..case zwykle umieszcza się również etykietę 'default:' na wypadek, gdy żadne z wcześniejszych warunków nie wystąpiło i też trzeba podjąć akcję - masz to opisane w linku, który podałeś.
  • #24
    maystero
    Level 24  
    O to kolejna moje kombinacja:

    Code: c
    Log in, to see the code


    Jest lepiej. Po nacisnięciu klawisza na pilocie, który powinien być =2049
    układ wykrywa go jako =3268448703.
    Załączony zrzut z monitora portu:
    Code: ini
    Log in, to see the code

    oczywiście całość sie zapętla i nie wychodzi z switch..case.
  • #25
    khoam
    Level 41  
    maystero wrote:
    Jest lepiej. Po nacisnięciu klawisza na pilocie, który powinien być =2049 układ wykrywa go jako =3268448703.

    W którym miejscu switch...case wysyłasz na Serial wartość results.value? Chodzi mi o powyższy kod.

    maystero wrote:
    oczywiście całość sie zapętla i nie wychodzi z switch..case.

    Wychodzi, inaczej nie byłoby serii komunikatów "jakis blad".
  • #26
    maystero
    Level 24  
    Naprawiłem kod programu w nocy. Jak dzieci poszły spać.
    Problemem okazał się irrecv.resume(); // Receive the next value:
    Code: c
    Log in, to see the code

    przenieosłem to na zewnątrz funkcij switch...case

    Code: c
    Log in, to see the code


    Na tą chwile program działa zgodnie z założeniami. Po testuje kilka dni i jeśli nic nie wyskoczy to chyba temat wyczerpany.