Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[LUA] Pomiar temperatury maksymalnej

22 Mar 2020 18:37 183 5
  • Poziom 21  
    Witam, potrzebuję pomocy z następującym problemem. Posiadam czujnik temperatury który zamontowany jest na wyjściu z pieca gazowego.
    Zależy mi aby spełniał następujące funkcje :

    1. Kiedy temperatura wzrośnie powyżej 30stC wyślij powiadomienie o załączeniu pieca (co udało mi się napisać)
    2. Odczyt temperatury maksymalnej i zapisanie do zmiennej (również w kodzie jest i działa)
    3. I tutaj pojawia się mój problem : skrypt ma odczytać maksymalną temperaturę i w momencie spadku poniżej 3 stopni od maksymalnej wysłać powiadomienie o wyłączeniu pieca.

    Nie liczę na gotowe rozwiązanie ale będę wdzięczny za wszelkie podpowiedzi.
    Kod: lua
    Zaloguj się, aby zobaczyć kod
  • Poziom 31  
    Możesz przyjąć, że jeśli przekroczy 30st. to piec zapalił ustawiasz znacznik

    Piec_wlaczony = true

    A jeśli temperatura zmaleje o 3 st.C

    Piec_wylaczony = true

    i teraz dalej jeśli pali się piec tempMAX będzie rosła do jakiejś wartości, bo działa ten warunek

    if (temperatura > tempMAX) -- Jeśli aktualna temperatura jest niższa od minimalnej
    then
    tempMAX = temperatura -- to ustaw aktualną, jako maksymalną.
    end


    Ale jednocześnie sprawdzasz czy nie zaczyna maleć:

    If (Piec_wlaczony and (temperatura < (tempMAX- 3))) // jeśli zmniejszy sie o 3 st.C zadziała to

    then Piec_wlaczony == false; tempMAX==0;

    I znowu po zapaleniu temperatura zacznie rosnąć do 30 st.C

    Ale pomimo, ze temp. zmalała o 3 st. to i tak może byc większa niż 30st. (bo wzrosła do 40st.C) i znowu nam zapali się znacznik, że piec jest załączony,

    Więc może lepiej byłoby kontrolować, czy temp. rośnie i jeśli tak, to załączamy znacznik Piec_wlaczony

    Warto byłoby dodać znacznik czasu, jeśli w danym czasie wzrośnie o 3 st.C to piec zapalony
    a jak zmaleje, to piec wyłączony.
  • Poziom 21  
    Dziękuję za szybką odpowiedź. Na chwilę obecną mam napisany taki oto kod.
    Pętla programu powtarzana jest co minutę, jutro sprawdzę czy będzie poprawnie wszystko działać. Obawiam się że będę otrzymywać powiadomienia o włączeniu / wyłączeniu pieca co minutę.

    Kod: lua
    Zaloguj się, aby zobaczyć kod
  • Poziom 31  
    Powinno zadziałać.

    jeśli ma się zmniejszyć o 3, to (tempMAX- 2) bo (tempMAX- 1) to zmiana o 2 st. czyli:

    if (Piec_wlaczony == false and (temperatura < (tempMAX- 2)))


    Taki drobiazg jak piec wyłączony to zmienna Piec_wlaczony = false; a jak zał. to Piec_wlaczony = true;

    u ciebie jest odwrotnie.

    No i to co już pisałem, jeśli tempMAX osiągnie np. 40 st.C to po obniżeniu do 37 zmienna Piec_wlaczony się zmieni
    ale 37 > 30 więc znowu przyjmie wartość że piec załaczony przy 34 sytuacja się powtórzy
    i dopiero gdy temp spadnie poniżej 30 st. C zmienna Piec_wlaczony na stałe przyjmie wartosc piec wyłaczony

    Dodano po 19 [minuty]:

    Może coś takiego...
    local tempMAX = 0 -- Aktualna temperatura maksymalna
    local tempMIN = 100 -- Aktualna temperatura minimalna

    if (temperatura > tempMAX) -- Jeśli aktualna temperatura jest niższa od minimalnej
    then
    tempMAX = temperatura -- to ustaw aktualną, jako maksymalną.
    if (tempMAX > tempMIN+3) tempMIN= tempMAX piec zapalony grzeje
    end

    if (temperatura < tempMIN) -- Jeśli aktualna temperatura jest niższa od minimalnej
    then
    tempMIN = temperatura -- to ustaw aktualną, jako minimalną.
    if (tempMAX > tempMIN+3) tempMAX = tempMIN piec zgaszony temp spada
    end
  • Poziom 21  
    Zrobiłem to tak jak sugerowałeś ale dalej nie działa. Zamieszczam kod :

    Kod: lua
    Zaloguj się, aby zobaczyć kod


    W debugerze mam takie o to wartości :

    Kod: lua
    Zaloguj się, aby zobaczyć kod


    Co pętla to do trzech zmiennych są zapisane te same wartości, powiadomienia nie przychodzą.
  • Poziom 31  
    Wygląda jakby się zawsze wykonywał wewnętrzny if

    albo błąd składni, albo bład interpretatora, co to za kompilator (język), którego używasz ?

    if (tempMAX > tempMIN+3) może zastapić if (tempMAX > (tempMIN+3))


    Może wpisz tak:


    fibaro:debug(tempMIN);fibaro:debug(" ---- Dane przed ----");
    fibaro:debug("Aktualna : ");fibaro:debug(temp);fibaro:debug("MAX : ");fibaro:debug(tempMAX);fibaro:debug("MIN : ");



    if (temp > tempMAX) -- Jeśli aktualna temperatura jest większa od Tmax
    then tempMAX = temp; -- to ustaw aktualną, jako maksymalną.
    if (tempMAX > (tempMIN+3))
    then tempMIN = tempMAX; --piec zapalony grzeje
    fibaro:debug("Piec włączony");
    fibaro:call(68, "sendDefinedPushNotification", "225"); -- wtedy wyślij powiadomienie "Piec włączony"
    end
    end

    if (temp < tempMIN) -- Jeśli aktualna temperatura jest niższa od minimalnej
    then tempMIN = temp -- to ustaw aktualną, jako minimalną.
    if (tempMAX > (tempMIN+3))
    then tempMAX = tempMIN --piec zgaszony temp spada
    fibaro:debug("Piec wyłączony");
    fibaro:call(68, "sendDefinedPushNotification", "226"); -- wtedy wyślij powiadomienie "Piec wyłączony"
    end
    end


    fibaro:debug(tempMIN);fibaro:debug(" ---- Dane po sprawdzeniu ----");
    fibaro:debug("Aktualna : ");fibaro:debug(temp);fibaro:debug("MAX : ");fibaro:debug(tempMAX);fibaro:debug("MIN : ");


    albo zapisać tak (dodatkowa histereza 1 st.C)


    if (temp > (tempMAX+1)) -- Jeśli aktualna temperatura jest większa od Tmax o 1 st.C
    then tempMAX = temp; -- to ustaw aktualną, jako maksymalną.
    if (tempMAX > (tempMIN+3)) fibaro:debug("Piec włączony");
    end

    if (temp < (tempMIN-1)) -- Jeśli aktualna temperatura jest niższa od minimalnej 0 1st.C
    then tempMIN = temp -- to ustaw aktualną, jako minimalną.
    if (tempMAX > (tempMIN+3)) fibaro:debug("Piec wyłączony");
    end


    if (tempMAX > (tempMIN+3)) --- tempMAX większy o 3 st.C od tempMIN
    then tempMAX = tempMIN -- zrównujemy MAX i MIN
    end