Skocz do zawartości

Sporadyczne błędy przy odczycie z 5-ciu DS18B20 - za długie przewody.


Pomocna odpowiedź

Dam Ci przykład reakcji programu na błąd termometrów.

Program steruje piecem dwuobiegowym CO, starając się utrzymać minimalną założoną temperaturę.

Jeśli padnie zewnętrzny termometr, pobiera dane z serwisu pogodowego. Mniej precyzyjne, ale przynajmniej wie czy na zewnątrz jest 0 czy -30.

Jeśli padnie również połączenie z netem, zakłada że jest zero. Jeśli będzie mniej, po prostu piec włączy się za późno i za późno dojdzie do właściwej temperatury.

Jeśli padnie termometr w pomieszczeniu kontrolnym, używa termometru w pomieszczeniu obok (różnica ok. 1 stopnia)

Jeśli padnie również termometr w pomieszczeniu obok, używa wmontowanego w skrzynkę BMP180. Co prawda temperatura nie jest taka jak przy odczycie z właściwego termometru, ale różnica poniżej 2 stopni przy całkowitej awarii DS-ów jest tym co mnie najmniej interesuje.

Jeśli padnie również BMP lub w ogóle zdechnie mi cały system - wyłączy się (lub w ogóle nie włączy) przekaźnik przełączający sterowanie pieca z awaryjnego. Spowoduje to co prawda niepotrzebne zwiększenie zużycia gazu, ale przynajmniej zimą mi rury nie pozamarzają.

Termometry są odczytywane co minutę, jeśli wystąpił błąd brany jest pod uwagę poprzedni odczyt. Po trzecim błędzie termometr jest uznany za niesprawny.

Ponieważ odczyty ze wszystkich trzech termometrów są wyświetlane na ekranie "pogodynki", łatwo zauważyć że któryś wyświetla czerwony znak zapytania zamiast temperatury.

Jak widzisz - przewidziane są chyba wszystkie sytuacje...

A teraz pomyśl co by było, gdybym chciał czekać w pętli aż aniołki z nieba przylecą i naprawią zepsuty termometr jak ja będę bawił na wczasach w Alpach...

 

 

  • Lubię! 1

Treker; _LM_ - dzięki. Jest realna szamsa, że jak to poczytam to będę mniej głupich pytań zadawał 🙂

ethanak - to co opisałeś kojarzy mi się z promem kosmicznym 🙂
W każdym razie podobnie się ma w stosunku do mojej instalacji.
U mnie jest piec CO na paliwo stałe, instalacja hydrauliczna obiegu pieca z konieczności /logika i przepisy/ typu otwartego.
Jedynie dalej rozbudowana poprzez wymienniki ciepła na bojler, akumulator ciepła, podłogówkę i kolektor słoneczny - całkowicie oddzielone obiegi bo z przyczyn oczywistych nie wolno ich łączyć.
Zaś "specyfika" użytkowania budynku /jak i całego gospodarstwa/ wyklucza pozostawienie bez nadzoru na dłużej jak parę godzin /psy, koty, konie itp./ więc "Alpy" odpadają 🙂
Nie liczę więc na "aniołki", które zresztą pewnie i tak mnie ominą z różnych innych powodów - wystarczy informacja /głośna/, że coś jest nie tak i następująca w jej wyniku manualna reakcja któregoś z domowników /reset lub zmiana sterowania na ręczne/.
Jak pewnie zauważyłeś w moim "kodzie" jest możliwość za naciśnięciem któregoś z "guzików" zablokowania określonej pompy. Podobnie na obudowie /czego w kodzie nie ma bo i po co/ są dodatkowe "prztyczki" do włączania poszczególnych pomp z całkowitym pominięciem Arduino i czujników.
Reasumując:
1. Gazu/ prądu nie zeżre bez opamiętania bo... go nie używa - wypali się wszystko co w piecu i tyle /albo zadusi piec wyłączenie wentylatora jego własnymi zabezpieczeniami/.
2. O awarii "programatora" dowie się ktoś i zareaguje najpóźniej po paru godzinach - a jeśli się będzie darł jakiś alarm to zapewne wcześniej.
3. Temperatur w budynku czy bojlerze pilnują ograniczające/odcinające zawory "termostatyczne" działające mechanicznie.
Tak więc celem działania całej tej mojej kombinacji jest jedynie pompowanie wody przez określone obiegi kiedy jest wystarczająco gorąca i zaprzestanie jak ostygnie /gdzie obieg pieca sam utrzymuje zadaną maksymalną/.
A w drugiej "konfiguracji" /kiedy w piecu nie palę a świeci słońce/ robić to samo nagrzewając przy okazji tzw. "akumulator ciepła" czyli ~500 litrowy dobrze izolowany termicznie zbiornik.
Tak więc jak widzisz i jak to ktoś gdzieś ładnie napisał /nie wiem nawet czy nie Ty przypadkiem/ nie jest mi tu potrzebny "fotel kapitana z Enterprise" ... bo wystarczy "korbka" 🙂

(edytowany)
16 minut temu, andris napisał:

to co opisałeś kojarzy mi się z promem kosmicznym

To fragment algorytmu działania mojego domowego kontrolera pieca - a zaręczam, że w promie kosmicznym nie mieszkam 🙂

 

  

13 minut temu, andris napisał:

Jak pewnie zauważyłeś w moim "kodzie" jest możliwość za naciśnięciem któregoś z "guzików" zablokowania określonej pompy.

A, rozumiem że jak program będzie się kręcił w pętli while(termometry_nie_dzialaja) to wciśnięcie guzika spowoduje magiczne przerwanie pętli?

15 minut temu, andris napisał:

nie jest mi tu potrzebny "fotel kapitana z Enterprise" ... bo wystarczy "korbka"

Tylko korbka musi być do czegoś podłączona żeby działała.

Edytowano przez ethanak
(edytowany)
39 minut temu, ethanak napisał:

"...to wciśnięcie guzika spowoduje magiczne przerwanie pętli?(...)Tylko korbka musi być do czegoś podłączona żeby działała."

No niestety nie /przeczytałem już sporo marzycieli co by chcieli pętlę przerwać/ - wówczas pozostaje wtyczka z kontaktu.
Tylko fajnie by było gdyby się głośno o tą wtyczkę dopominał.
Czyli /pozostając przy "korbce"/ już ją mam - pozostaje zawołać "korbkowego" żeby pokręcił.
Da się to jakoś zrobić kiedy pętla "zawiśnie"?
Guziki są tylko po to żeby zablokować pompę /dowolną/ kiedy program każe jej pracować a ja nie chcę - np piec się zbyt wolno rozpala /nie uwzględniając awarii czujnika/
//ponowne naciśnięcie resetuje i od nowa czeka na właściwe temperatury//

Edytowano przez andris
(edytowany)
11 minut temu, andris napisał:

Da się to jakoś zrobić kiedy pętla "zawiśnie"?

A po jakiego grzyba ta pętla? Termometr albo działa, albo dostał czkawki i na chwile zapomniał o działaniu, albo nie działa. Zrób podobnie jak ja: jeśli termometr nie zadziałał to weź poprzedni odczyt, a jeśli nie zadziałał drugi raz to znaczy że jest zepsuty, wyłącz pompę i odpal syrenę informującą korbkowego że ma przyjść 🙂

Coś w stylu:

int readRealTemp(termometr)
{
  static intu_t wynik = 0;
  static int8_t bledy = 2;
  int teraz = readTemperature(termometr); // to rzeczywista funkcja 
  if (teraz == -127) {
    if (bledy < 2) {
      bledy++;
      return wynik;
    }
    else {
      return -127;
    }
  }
  else {
    wynik = teraz;
    bledy = 0;
    return wynik;
  }
}

// a potem w kodzie:
    cośtam = readRealTemp(termometr);
    if (cośtam == -127) {
      włącz_syrenę();
      wyłącz_pompę();
    }
    else {
      // tu kawałek kodu co włącza/wyłącza pompę w zależności od temperatury
    }
      
    
  

 

Edytowano przez ethanak
  • Lubię! 1
  • Pomogłeś! 1

Przede wszystkim pozbądź się tej pętli dla pomiarów i zrób to na funkcji millis. 

10 minut temu, andris napisał:

Da się to jakoś zrobić kiedy pętla "zawiśnie"?

Zatrudnij psa 😉 kolejny termin do poznania watch dog 

  • Pomogłeś! 1

Ups - pojawiły się nowe "słowa" /o to mi właśnie chodziło/ - wielkie dzięki a teraz muszę znów poczytać i pomyśleć żeby zrozumieć.
Ale chwilowo mózg mi się już lasuje i na dokładkę coś rży ponaglająco za oknem = muszę Wam chwilowo przerwać zawracanie głowy i iść odstresować "na widłach".
Wrócę jak trochę "zmądrzeję" 🙂

  • Lubię! 2
9 minut temu, _LM_ napisał:

Zatrudnij psa

Oj, można na wiele sposobów... tyle, że jakoś wszystkie sposoby w połączeniu z tą nieszczęsną pętlą przypominają mi anegdotkę o komunizmie i Ubuntu: oba doskonale radzą sobie z problemami, które poza nimi nigdzie nie występują 🙂

 

Powiem tak -
nachodziłem się aż mi nogi w *** weszły ale jakoś wiedzy od tego wiele nie przybyło 😞

Co do owej "nieszczęsnej pętli" - bardzo chętnie zrobię jej "Jesień Ludów" ale jak dotąd nie wiem jak sobie bez niej poradzić.
Twój przykład /ze zmiennymi statycznymi itp./ jest jak na razie dla mnie całkowicie nie do ogarnięcia i nawet wujek gógel nie pomaga 😞

Natomiast hoddog /tfu!/ WatchDog wygląda wręcz rewelacyjnie.
Czy dobrze zrozumiałem, że po "odpaleniu" go w setupie, nie trafiwszy w porę na swój 'reset' - zrestartuje całe Arduino, nawet zacięte na dowolnej pętli?
 Bo jeśli tak to problem niemal z głowy się wydaje a kiedy dodam też w setupie jednorazowy sygnał "buzerka" ... to drący się np. co 2 sekundy wystarczy żeby przywołać "korbkowego" żeby wyłączył, przełączył pompy na ręczne i ... spokojnie szukał winnego.
Cieszę się przedwcześnie bo czegoś nie załapałem?
Oczywiście rozumiem już czemu trzeba się pozbyć 'delay-ów' - bo z tego co rozumiem '
millis' się z psem nie pogryzą?

Teraz nie mogę robić doświadczeń bo chodzi piec i raczej nie zgaśnie zanim zasnę.
Oczywiście nadal jeszcze na tej "komunistycznej" pętli tylko trochę przerobionej:

  do{
     sensors.requestTemperatures();            //Pobranie temperatury czujników
     td = sensors.getTempCByIndex(0);          //Zmienna = odczytowi czujnika w podłodze  
     tb = sensors.getTempCByIndex(1);          //Zmienna = odczytowi czujnika w bojlerze
     tp = sensors.getTempCByIndex(2);          //Zmienna = odczytowi czujnika w piecu 
     sPo = sensors.getTempCByIndex(3);         //Zmienna = odczytowi czujnika na powrocie z Solara
     sWy = sensors.getTempCByIndex(4);         //Zmienna = odczytowi czujnika na wyjściu z Solara
     delay(500);
    }
    while ((td < 0) || (tb < 0) || (tp < 0) || (sPo < 0) || (sWy < 0));

Że błędy z czujników się trafiają wiem bo dla wyświetlacza został dalej kolejny odczyt czujników - ale przekaźniki nie pykają więc chyba jakoś toto chwilowo działa.

 

9 minut temu, andris napisał:

Czy dobrze zrozumiałem, że po "odpaleniu" go w setupie, nie trafiwszy w porę na swój 'reset' - zrestartuje całe Arduino, nawet zacięte na dowolnej pętli?

Dokładnie tak działa, nie dasz mu żreć to cię ugryzie ( zresetuje uP) ALE to jest obejście problemu a nie jego rozwiązanie. 

W sumie prawdziwym rozwiązaniem będzie rezystor, o którym pisałeś i "wyprostowanie" gwiazdy /jeśli wystarczy/.
Nie zapomniałem i zrobię to w pierwszej wolnej chwili.
Wtedy może się okazać, że wszelkie cuda w kodzie siedzą jedynie dla ozdoby.
Ale niech sobie siedzą - miejsca dość 🙂
A! Przypomniało mi się to spytam -
Odnośnie kabli do czujników
.
Nie miałem pod ręką telefonicznego/sterowniczego 3 żyłowego więc dałem dwa dwużyłowe razem.
Nie mając jeszcze pojęcia o zjawisku "wagi" sieci skupiłem się wyłącznie na ew stratach napięcia /teraz wiem że bez sensu bo biorą ledwie co a żyła 0,25 to świat i ludzie/. Jednak tak "na zaś" i nie mogąc patrzeć na marnującą się pustą żyłę skręciłem podwójną akurat na sygnał.
Nie pogorszyłem tym aby czasem?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...