Skocz do zawartości

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


andris

Pomocna odpowiedź

Mam już zmontowane i  działające urządzonko, które na podstawie odczytów z 5-ciu czujników /jak w temacie/ steruje pompami podłogówki, pieca i kolektora słonecznego.
Daruję sobie opis hydrauliki bo nie dość, że układ nieźle zagmatwany to nie jego dotyczy problem.
Czujników jest 5, każdy gdzie indziej, na przewodach o długościach od 2 do aż 20-tu metrów.
Wszystkie na 3 żyłach, pod A5 i oczywiście rezystor wspólny 4,7k.
Problem taki, że co jakiś czas któryś czujnik /zazwyczaj najdalszy/ zwraca -127.
Zrobiłem parę prób z różnego rodzaju przewodami i na zwykłym "telefonicznym" z żyłami 0,25 jest najlepiej.
Co oznacza, że błąd/zanik odczytu występuje dość sporadycznie /raz na parę, parędziesiąt minut/.
Jednak specyfika całego "sterownika", wzajemne zależności reakcji w odpowiedzi na zmiany temperatur zmuszone uwzględniać bezwładność termiczną poszczególnych "modułów" instalacji hydraulicznej powoduje, że takie losowe "strzały" z któregoś czujnika potrafią zaburzyć cały proces regulacji.
Np włączyć/wyłączyć którąś z pomp kiedy nie potrzeba i wynikowo kazać jej pracować bez sensu /chłodząc to co wcześniej nagrzane/ aż bezwładność instalacji umożliwi powrót do stanu wyjściowego.
Do brzegu...
W swoim niepoprawnym zarozumialstwie, kiedy urządzonko zadziałało już jak należy, nie czekając paru dni na ew błędy...
Pomocowałem wiele elementów na stałe, niektóre wręcz zalewając termo-klejem dla izolacji i ochrony przed wilgocią /całość jest w kotłowni/.
Trochę więc za późno /za trudno/ na doświadczenia np. ze zmianą rezystora 4,7k na "lżejszy".
Mam więc pewien pomysł /jeśli durny to powiedzcie dla czego/ :
Jako, że nie zależy mi na jakiejś wyjątkowej prędkości odczytu i sygnału dla przekaźników zamierzam dołożyć do programu zaraz na początku '
void loop()' pętlę 'while' uparcie dręczącą czujniki dokąd nie zwrócą odczytu.

float td = 0;                        //Utworzenie Zmiennej dla czujnika w podłodze
float tb = 0;                        //Utworzenie Zmiennej dla czujnika w bojlerze
float tp = 0;                        //Utworzenie Zmiennej dla czujnika w piecu 
float sPo = 0;                       //Utworzenie Zmiennej dla czujnika na Powrocie z Solara
float sWy = 0;                       //Utworzenie Zmiennej dla czujnika na Wyjściu z Solara

void setup() 
{                     
 
}


void loop() 
{
       
  while ((td < 0) || (tb < 0) || (tp < 0) || (sPo < 0) || (sWy < 0))
  {
  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);
  }


I dopiero dalej reszta programu z porównywaniem wartości zmiennych i konkretnymi reakcjami na jego wyniki.
Czy pętla będzie się wykonywać "w kółko" dokąd każdy czujnik nie zwróci wartości dodatniej i dopiero wówczas program pójdzie dalej z przypisanymi wartościami dla każdej zmiennej?

Nie wnikając jak bardzo to "koszerne" lub nie - zadziała? Czy zdziwią mnie jakieś niespodzianki?

Link do komentarza
Share on other sites

Miałem kiedyś podobny problem przy tylko jednym czujniku, ale raz na parę dni. Błąd był sygnalizowany dopiero po trzech kolejnych błędnych odczytach, a do tego czasu do obliczeń była brana ostatnia prawidłowa wartość.

Czekanie w pętli na dobry odczyt nie jest dobrym rozwiązaniem, bo np. przy uszkodzeniu się jednego czujnika zawiesi się sterowanie całością.

Link do komentarza
Share on other sites

Polecam się zapoznać https://www.analog.com/en/technical-articles/guidelines-for-reliable-long-line-1wire-networks.html z artykułu wynika że topologia gwiazdy nie jest zbyt dobrym rozwiązaniem dla rozległych sieci. Chcąc zastosować mniejszą rezystancje podciągania możesz dolutowac rezystor równolegle, zwiększanie oporu pullupu na pewno sprawy nie naprawi. 

Edytowano przez _LM_
  • Pomogłeś! 1
Link do komentarza
Share on other sites

_LM_  - Angielski 😞 Trochę potrwa zanim przebrnę ale i tak dzięki za wskazanie kierunku.
A tak na szybko - coś bliżej na temat rezystora równolegle, w sensie orientacyjna wartość i dokładnie gdzie /między czym a czym/?


jand - W sumie to nie wiem po ilu odczytach u mnie "błyska" błąd bo dowiaduję się o nim dopiero z wyświetlacza LCD.
Jednak w moim przypadku to czy jeden z czujników padnie czy tylko puści błąd jest bez różnicy - całość i tak zgłupieje.
Jedynie przy zepsutym samo nie "wstanie" kiedy bezwładność instalacji już na to pozwoli.
W instalacji porobiłem inne, całkowicie niezależne od Arduino zabezpieczenia żeby np. nie zagotować pieca.
Teraz głównie zależy mi na "wygaszeniu" błędów żeby cały program nie głupiał bo marnuje energię /opał, słońce, prąd/.

Przyglądam się temu swojemu "kodowi", czytam o pętlach i zastanawiam się czy mój błąd nie polega na zastosowaniu 'while' zamiast do...while.
Tzn. czy tak jak jest i warunek nie zostanie spełniony to kod pójdzie dalej z wartościami czujników czy bez odczytu?

 

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

Możesz przecież uruchomić translator na tej stronie.

Co do rezystora, chodzi o zmniejszenie wartości z 4.7k do np: 2.2k. Napisałeś że masz wszystko poskładane więc pomyślałem że można połączyć jeszcze jeden 4k7 od linii zasilania do sygnałowej wtedy wypadkowa rezystancja spadnie do 2k3. Jeśli to nie pomoże próbowałbym najdłuższą linię podłączyć do innego gpio, myślę że jest to najprostsze rozwiązanie problemu. 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Właśnie chodziło mi o przebrnięcie /zrozumienie/ po translatorze 🙂
Czyli rezystor taki sam jak poprzedni i tak samo podłączony już poza "puszką" na kablach?
Spróbuję.
Przełączenie linii na inny pin to niestety prucie całości = wolę uniknąć.

A wracając do pętli /opcja jeśli rezystor nie wystarczy i dodatkowe zabezpieczenie od nawet bardzo rzadkich błędów/-
Czy w takim razie aby program poszedł dalej kiedy żaden z czujników nie zwróci '-127' ale z zapamiętanymi wartościami zmiennych nie powinno to wyglądać tak?

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));


 

Link do komentarza
Share on other sites

Przebrnąłem przez artykuł i po poukładaniu sobie w głowie wszystkich "podległych niewolników w lekkich sieciach" 🙂 sporo mi "rozjaśnił".
Spróbuję najpierw z rezystorem jak podpowiedziałeś, następnie widzę techniczna możliwość /dość łatwo/ przeróbki "topologii" z gwiazdy na zdecydowanie bardziej liniową "sieć'.
Ale za podpowiedź co do pętli programu i tak będę wdzięczny bo chciałbym ją dołożyć jako "drugi grzybek w barszczu" niezależnie od niezawodności do jakiej uda się doprowadzić "sieć" czujników.
Na tej samej w sumie zasadzie wg której w instalacji hydraulicznej oprócz zaworu bezpieczeństwa /nadmiarowego ciśnienia/ i tak siedzi jeszcze bimetaliczny wyłącznik termiczny wentylatora pieca.

Link do komentarza
Share on other sites

7 godzin temu, andris napisał:

Ale za podpowiedź co do pętli programu i tak będę wdzięczny bo chciałbym ją dołożyć jako "drugi grzybek w barszczu" niezależnie od niezawodności do jakiej uda się doprowadzić "sieć" czujników.

Podpowiedź pierwsza i ostatnie: nigdy nie stosuj tego typu pętli. Jak już Ci powiedział kolega @jand - awaria pojedynczego czujnika zatrzyma cały program i w efekcie może doprowadzić do awarii całego urządzenia z zagmatwaną hydrauliką na czele.

7 godzin temu, andris napisał:

Na tej samej w sumie zasadzie wg której w instalacji hydraulicznej oprócz zaworu bezpieczeństwa /nadmiarowego ciśnienia/ i tak siedzi jeszcze bimetaliczny wyłącznik termiczny wentylatora pieca.

Nie, to zupełnie co innego. Bimetal w razie awarii wyłącza piec. Taka genialna pętla powoduje, że całość przestanie reagować na odczyty i np. włączona pompa pozostanie włączona mimo że absolutnie nie powinna (albo odwrotnie, pozostanie wyłączona jeśli nawet musiałaby się włączyć). Mało tego, w żaden sposób nie zostaniesz poinformowany że coś jest nie tak (np. wyświetlacz będzie wyświetlał wartości sprzed tygodnia, które nie mają nic wspólnego z bieżącym stanem).

Tutaj nie wystarczy jakaś prosta pętla. Ale przede wszystkim pytanie: czy program przewiduje, że czujnik uległ awarii? Jeśli tak, to jaka jest reakcja? Jeśli nie to dlaczego?

Link do komentarza
Share on other sites

W razie awarii czujnika biblioteka powinna zwrócić flagę czy cokolwiek że jest błąd. Stosowanie zależności że temperatura wynosi minus coś tam jest błędne. Fabryczne AKPiA zależnie od tego który czujnik nawali, podejmują pewne akcje z automatu, np: pada ten od ładowania ciepłej wody to ogranicza przepływ w tym obwodzie lub całkowicie go zamyka. Ogólnie mam w obsłudze kilka różnych systemów automatyki i nie spotkałem się tam z czujkami 1wire. Zawsze są to pt100 lub pt1000 i każdy z nich ma swoje wejście pomiarowe, w razie awarii - zwarcia nie blokuje się w ten sposób cały system. 

Link do komentarza
Share on other sites

 Widzę, że kolektywnie postanowiliście wybić mi z głowy pomysł z tą pętlą a ja zwyczajnie z braku wiedzy nie mogę załapać czemu to aż tak istotne 😞
Spróbuję odpowiedzieć na pytania a na koniec wsadzę cały /jak dotąd działający/ program - jeśli któremuś z Was starczy cierpliwości żeby przebrnąć przez moją "twórczość" to może tak wyjaśnię o co mi chodzi.
Tak więc co do zabezpieczeń/reakcji, czy przewiduje awarię czujnika:
- i tak i nie i nie wiem 😞
"Ulepiłem" to coś na zasadzie porównywania wskazań różnych czujników w różnych momentach i wymaganej reakcji na otrzymany wynik.
Starałem się przewidzieć każdą możliwą do zaistnienia sytuację i zrobić stosowną reakcję - jedyne co mi "psuje koncept" to właśnie te losowe zaniki /-127/.
Zaznaczam, że jedynymi konsekwencjami "zgłupienia" programu mogą być 1. niepotrzebne wychłodzenie któregoś z obiegów /są 3 niezależne w oparciu o wymienniki ciepła/ 2. zużycie prądu przez niepotrzebnie kręcące pompy /30, 60 i 80W/.
Żadne wybuchy lub pożary instalacji nie grożą bo od tego są całkowicie niezależne zabezpieczenia.

#include <LiquidCrystal.h>           //Dołączenie bilbioteki wyświetlacza
#include <OneWire.h>                 //Dołączenie bilbioteki transmisji
#include <DallasTemperature.h>       //Dołączenie bilbioteki czujników

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
OneWire oneWire(A5);                 //Określenie pinu transmisji
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki

int pD = 0;                          //Zmienna przycisku pompy dolnej - z pinu 9
int pG = 0;                          //Zmienna przycisku pompy górnej - z pinu 11
int solar = 0;                       //Zmienna do przełączania na obsługę solara - z pinu 1

float td = 0;                        //Utworzenie Zmiennej dla czujnika w podłodze
float tb = 0;                        //Utworzenie Zmiennej dla czujnika w bojlerze
float tp = 0;                        //Utworzenie Zmiennej dla czujnika w piecu 
float sPo = 0;                       //Utworzenie Zmiennej dla czujnika na Powrocie z Solara
float sWy = 0;                       //Utworzenie Zmiennej dla czujnika na Wyjściu z Solara

void(* resetFunc) (void) = 0;        //Wywołanie funkcji Reset i zadeklarowanie pod adresem 0


void setup() 
{                     
  Serial.begin(9600);                  //Ustawienie prędkoci transmisji
  sensors.begin();                     //Inicjalizacja czujników
  pinMode(8, OUTPUT);                  //Wyjście na przekaźnik pompy dolnej
  digitalWrite(8, LOW);                //Domyślnie wyłączony
  pinMode(10, OUTPUT);                 //Wyjście na przekaźnik pompy górnej
  digitalWrite(10, LOW);               //Domyślnie wyłączony
  pinMode(13, OUTPUT);                 //Konfiguracja pinu 13 jako wyjście dla diody czerwonej - blokada pompy górnej
  pinMode(12, OUTPUT);                 //Konfiguracja pinu 12 jako wyjście dla diody żółtej - blokada pompy dolnej
  pinMode(11, INPUT_PULLUP);           //Przycisk jako wejście na pinie 11 - blokada pompy Dolnej
  pinMode(9, INPUT_PULLUP);            //Przycisk jako wejście na pinie 9 - blokada pompy Górnej
  pinMode(1, INPUT_PULLUP);            //Przełącznik 0/1 jako wejście na pin 1 - zmiana kodu na Solar  
}


void loop() 
{
  digitalWrite(13, LOW);               //Żółta dioda od blokady pompy dolnej zgaszona
  digitalWrite(12, LOW);               //Czerwona dioda od blokady pompy górnej zgaszona
 

        //Odczyt czujników - w kółko dokąd któryś będzie zwracał błąd (zazwyczaj -127)
        
  while ((td > 0) && (tb > 0) && (tp > 0) && (sPo > 0) && (sWy < 0))
  {
  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);
  }


  Serial.print("pD.");                            //Podgląd na monitorze-tekst
  Serial.print(pD);                               //Podgląd na monitorze-przycisk blokady pompy dolnej 0 lub 1
  Serial.print("  pG.");                          //Podgląd na monitorze-tekst
  Serial.print(pG);                               //Podgląd na monitorze-przycisk blokady pompy górnej 0 lub 1
  Serial.print("\n");                             //Odstęp - nowa linia

  Serial.print("Temp.Bojler.");                   //Podgląd na monitorze-tekst
  Serial.println(sensors.getTempCByIndex(1), 0);  //Wartość z czujnika na dole Bojlera
  Serial.print("Temp.Podl.");                     //Podgląd na monitorze-tekst
  Serial.println(sensors.getTempCByIndex(0), 0);  //Wartość z czujnika w podłodze
  Serial.print("Temp.Piec.");                     //Podgląd na monitorze-tekst
  Serial.println(sensors.getTempCByIndex(2), 0);  //Wartość z czujnika w piecu
  Serial.print("Solar Powrót.");                  //Podgląd na monitorze-tekst
  Serial.println(sensors.getTempCByIndex(3), 0);  //Wartość z czujnika na górze Bojlera
  Serial.print("\n");                             //Odstęp - nowa linia
  Serial.print("Solar Wyjście");                  //Podgląd na monitorze-tekst
  Serial.println(sensors.getTempCByIndex(4), 0);  //Wartość z czujnika na wyjściu z Solara
  
  
                                //Podgląd na monitorze-przycisk blokady pompy górnej 0 lub 1

  lcd.begin(16, 2);                            //Deklaracja typu-LCD
  lcd.setCursor(0, 0);                         //Ustawienie kursora-na początku pierwszej linii
  lcd.clear();

  if (digitalRead(1) == HIGH)  
  { lcd.clear(); 
                   //lcd.print("i cos zrobil tym");       // Głupie------------//
                   //lcd.setCursor(0, 1);                 //-------------------//
                   //lcd.print("mokrym paluchem!");       //-------------------//
                   //delay(2000);                         //-------------------//
                   //lcd.clear();                         // napisy------------//

  lcd.print("Bojl.");                          //Wyświetlenie tekstu
  lcd.print(sensors.getTempCByIndex(1), 0);    //Wartości dolnego czujnika w bojlerze
  lcd.print("  Podl.");                        //Wyświetlenie tekstu
  lcd.print(sensors.getTempCByIndex(0), 0);    //Wartości czujnika w podłodze

  lcd.setCursor(0, 1);                         //Ustawienie kursora-na początku drugiej linii
  
  lcd.print("Piec.");                          //Wyświetlenie tekstu
  lcd.print(sensors.getTempCByIndex(2), 0);    //Wartości czujnika w piecu
  
  lcd.print("  D.");                           //Wyświetlenie tekstu
  if (pD == 1)                                 //Sprawdzenie blokady pompy dolnej
  {lcd.print("0");}                            //Wywietl 0 jeśli Zablokowana
  else if (pD < 1)                             //Sprawdzenie blokady pompy dolnej
  {lcd.print("1");}                            //Wywietl 1 jeśli NIE zablokowana

  lcd.print(" G.");                            //Wyświetlenie tekstu
  if (pG == 1)                                 //Sprawdzenie blokady pompy górnej
  {lcd.print("0");}                            //Wywietl 0 jeśli Zablokowana
  else if (pG < 1)                             //Sprawdzenie blokady pompy górnej
  {lcd.print("1");}                            //Wywietl 1 jeśli NIE zablokowana

  if (pD > 1 || pG > 1)                        //Sprawdzenie czy któraś z blokad naciśnięta ponownie
  { lcd.clear();                               //Czyszczenie wyświetlacza
    lcd.print("    R E S E T");}               //Wyświetlenie tekstu
  delay(1500);                                 //Zwłoka 1,5 sekundy
  
  lcd.noCursor();                              //Wyącznie kursora
  delay(1500);                                 //Zwłoka 1,5 sekundy
  }


  /* tp-temp.pieca; tb-temp.bojlera; td-temp.podłogi; p1-pompa bojlera; p2- pompa podłogi
  pG-zmienna blokady pompy dolnej; pD-zmienna blokady pompy górnej; sPo-temp.na wyjściu z Solara
  sPo-temp. na powrocie z Solara */

                      //zmiana do obsługi Solara//

  if (digitalRead(1) == LOW)                   //Jeśli przycisk Solara naciśnięty
  {solar = solar + 1;}                         //Nadajemy Zmiennej wartość 1
   else if (digitalRead(1) == HIGH)            //Jeśli przycisk Solara NIE naciśnięty
  {solar = 0;}                                 //Nadajemy Zmiennej wartość 0

  if ((sWy > sPo + 15) && solar == 1)           //Jeśli w Solarze cieplej o 3 niż w Bojlerze i Solar włączony
  {digitalWrite(8, HIGH);}                      //Włącz pompę Dolną
   else if ((sWy < sPo + 14) && solar == 1)     //Jeśli w Solarze zimniej o 1 niż w Bojlerze i Solar włączony
  {digitalWrite(8, LOW);}                       //Wyłącz pompę Dolną



  if (solar == 1)                              //Jeśli przycisk Solara naciśnięty
  { lcd.clear();                               //Czyszczenie wyświetlacza
    lcd.print("    S O L A R");                //Wyświetlenie tekstu
    lcd.setCursor(0, 1);                       //Ustawienie kursora-na początku drugiej linii
    lcd.print("Bojl.");                        //Wyświetlenie tekstu
    lcd.print(sensors.getTempCByIndex(3), 0);  //Wartość górnego czujnika w Bojlerze
    lcd.print("  Sol.");                       //Wyświetlenie tekstu
    lcd.print(sensors.getTempCByIndex(4), 0);  //Wartość czujnika w Solarze
  }
    lcd.noCursor();                            //Wyącznie kursora
  


                      //pompa na p1 - Bojler

  if (solar == 1)
  {delay(500);}

   else if (digitalRead(11) == LOW)                //Jeśli przycisk blokady pompy Dolnej naciśnięty
     {pD = pD + 1;                                 //Nadajemy Zmiennej pD wartość 1
      digitalWrite(13, HIGH);                      //Włączamy diodę żółtą  
      delay(1500);}                                //Zwłoka żeby zareagował na przycisk
   else if (pD == 1)                               //Jeśli Zmienna pD = 1
     {digitalWrite(8, LOW);}                       //Wyłącz p1-pompę Dolną

   else if (tp >= (tb + 5) && tp >= 40 && pD < 1 && solar == 0)         //Jeśli piec cieplejszy o 5 stopni-
                           // -lub więcej niż bojler i przycisk prawy NIE naciśnięty i Solar Nie naciśnięty
     {digitalWrite(8, HIGH);}                                           //Włącz p1-pompę Dolną

   else if (tp <= (tb + 4) && ((tb + 4) < td) && solar == 0)            //Jeśli piec wystygł i próbuje-
                        // -wyssać z bojlera oraz boiler jest zimniejszy niż podłoga i Solar Nie naciśnięty
     {digitalWrite(8, LOW);}                                            //Wyłącz p1-pompę Dolną

   else if ((tp <= tb) && ((tb - 4) >= td) && (pD < 1) && (solar == 0)) //Jeśli piec jest zimniejszy-
                                       // -od bojlera a bojler cieplejszy od podłogi i Solar Nie naciśnięty
     {digitalWrite(8, HIGH);}                                           //Włącz p1-pompę Dolną


                      //pompa na p2 - podłoga

  if (solar == 1)
  {delay(500);}

  else if (digitalRead(9) == LOW)             //Jeśli przycisk blokady pompy Górnej naciśnięty 
     {pG = pG + 1;                            //Nadajemy Zmiennej pG wartość 1
      digitalWrite(12, HIGH);                 //Włączamy diodę czerwoną  
      delay(1500);}                           //Zwłoka żeby zareagował na przycisk }
   else if (pG == 1)                          //Jeśli Zmienna pG = 1
     {digitalWrite(10, LOW);}                 //Wyłącz p2-pompę Górną

   else if (tb >= 40 && pG < 1 && solar == 0) //Jeśli w bojlerze jest co najmniej 40 C i przycisk-
                                              // -lewy NIE naciśnięty i Solar Nie naciśnięty
     {digitalWrite(10, HIGH);}                //Włącz p2-pompę Górną

   else if (td >= tb && solar == 0)           //Jeśli podłoga jest cieplejsza-równa bojlerowi-
                                              // -i Solar Nie naciśnięty
     {digitalWrite(10, LOW);}                 //Wyłącz p2-pompę Górną
     

  if (pD > 1 || pG > 1)                        //Sprawdzenie czy któraś z blokad naciśnięta ponownie
     {resetFunc();}

   solar = 0;                                 //wyzeruj zmienną Solar
}



ps. chwilowo steruje tylko 2 pompami a trzeci obwód dołączam "manualnie" przestawiając zawory /tak do wizyty w sklepie i dokończenia hydrauliki/.
 

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Aj! przemknął się błąd - oczywiście :
 

  while ((td > 0) && (tb > 0) && (tp > 0) && (sPo > 0) && (sWy > 0))

edit:
"...Podpowiedź pierwsza i ostatnie: nigdy nie stosuj tego typu pętli. Jak już Ci powiedział kolega @jand - awaria pojedynczego czujnika zatrzyma cały program i w efekcie może doprowadzić do awarii całego urządzenia z zagmatwaną hydrauliką na czele..."
Hydraulice NIE jest w stanie zaszkodzić, cokolwiek program by nie wymodził.
Ale /o ile dobrze zrozumiałem/ przy awarii któregoś czujnika program stanie w nieskończonej pętli...
Czy nie można z tego skorzystać /jakiś dodatkowy warunek np./ i uruchomić alarm? Jeśli np. minie ileś czasu zawieszenia lub ilość wykonanych pętli?

Edytowano przez andris
Link do komentarza
Share on other sites

Wywal te wszechobecne delaye, zamiast pętli uruchom timer programowy ( funkcja millis) i co sekundę rób odczyty. Czyli uruchamiasz pomiar od wszystkich, uruchamiasz timer, po zadanym czasie zlecasz odczyt temperatury. Chętnie napisałbym to bardziej obrazowo ale niestety dzisiaj jestem ograniczony do korzystania z telefonu tylko. 

I jeszcze jedno: jak nawali któryś z dsów i będziesz musiał go wymienić to równocześnie trzeba przeprogramować cały układ? No bo w jakiś sposób program musi wiedzieć który ID za co odpowiada tak?

Edytowano przez _LM_
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Super - dzięki za cierpliwość!!! /i wyrozumiałość 🙂
Nie ogarniam wszystkiego co napisałeś /np. licznik czasu/ ale skwapliwie doczytam w tym kierunku.
Na spokojnie, jak znajdziesz czas i chęć będę bardzo wdzięczny za wszelkie "ściągawki", które zrobią z tego mojego "bur*elu" przyzwoicie wyglądający i działający program.

 

  • Lubię! 1
Link do komentarza
Share on other sites

9 minut temu, _LM_ napisał:

I jeszcze jedno: jak nawali któryś z dsów i będziesz musiał go wymienić...No bo w jakiś sposób program musi wiedzieć który ID za co odpowiada tak?

Tak wychodzi 🙂
Myślałem nad zrobieniem tego z podaniem indywidualnych adresów każdego czujnika /i pewnie docelowo trzeba tak przerobić/ ale chwilowo, dokąd wędrowałem z kablami po dachu i kotłowni - tak było mi łatwiej bo po prostu zobaczyłam który gdzie wylądował.

Link do komentarza
Share on other sites

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...

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.