SOYER Napisano Luty 18, 2023 Udostępnij Napisano Luty 18, 2023 Cześć. Taki problem do rozpisania. 5 czujników temperatury, jeśli na jakimkolwiek z nich pojawi się przekroczenie ustawionej górnej granicy temperatury, ma włączyć się przekaźnik. Przekaźnik wyłącza się tylko wtedy, kiedy na wszystkich czujnikach odczyt jest mniejszy od ustawionej dolnej granicy. Więc mamy: t1, t2, t3, t4, t5 i tMIN, tMAX. Jak to najprościej napisać. Pewnie to jakoś zrobię, ale jestem ciekaw wskazówek. Szczególnie uwielbiam te w stylu, jak wszystko jest na nie, to wtedy to jedno na pewno na tak:-). Link do komentarza Share on other sites More sharing options...
SOYER Luty 18, 2023 Autor tematu Udostępnij Luty 18, 2023 (edytowany) if((t1||t2||t3||t4||t5)>tempMax){ relay1=1; } else if((t1&&t2&&t3&&t4&&t5)<tempMin){ relay=0; } W sumie łatwo było..., można jeszcze inaczej? EDIT: poprawiłem & na &&. Edytowano Luty 18, 2023 przez SOYER Link do komentarza Share on other sites More sharing options...
jand Luty 18, 2023 Udostępnij Luty 18, 2023 Sprytne. Trzeba tylko mieć nadzieje, że temperatura nie spadnie poniżej zera. Link do komentarza Share on other sites More sharing options...
SOYER Luty 18, 2023 Autor tematu Udostępnij Luty 18, 2023 Dlaczego? Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
SOYER Luty 18, 2023 Autor tematu Udostępnij Luty 18, 2023 if(((t1) || (t2) || (t3) || (t4) || (t5)) > tempMax){ przek1=1; } else if(((t1) && (t2) && (t3) && (t4) && (t5)) < tempMin){ przek1=0; } Mam tak i nie działa... Dlaczego? Kiedy robię if-a na pojedynczym odczycie jest ok, kiedy tak jak wyżej to ni hu hu. Czego nie widzę? Link do komentarza Share on other sites More sharing options...
jand Luty 18, 2023 Udostępnij Luty 18, 2023 niech: t1 = 12 czyli 1100 t2 = 3 czyli 0011 a tempMax = 14 Suma logiczna t1 i t2 wynosi #FF, czyli 15 - a więc więcej niż tempMax 1 godzinę temu, SOYER napisał: Dlaczego? W zapisie uzupełnień do dwóch małe liczby ujemne są bardzo duże, jeśli je potraktować jako całkowite. Link do komentarza Share on other sites More sharing options...
SOYER Luty 18, 2023 Autor tematu Udostępnij Luty 18, 2023 if((t1>tempMax) || (t2>tempMax) || (t3>tempMax) || (t4>tempMax) || (t5>tempMax)){ przek1=1; } if((t1<tempMin) && (t2<tempMin) && (t3<tempMin) && (t4<tempMin) && (t5<tempMin)){ przek1=0; } Tak działa. Link do komentarza Share on other sites More sharing options...
SOYER Luty 18, 2023 Autor tematu Udostępnij Luty 18, 2023 2 minuty temu, jand napisał: niech: t1 = 12 czyli 1100 t2 = 3 czyli 0011 a tempMax = 14 Suma logiczna t1 i t2 wynosi #FF, czyli 15 - a więc więcej niż tempMax W zapisie uzupełnień do dwóch małe liczby ujemne są bardzo duże, jeśli je potraktować jako całkowite. Nie bardzo rozumiem, nigdzie nie napisałem ile ustawiłem tempMax, a było to 30. Druga sprawa dla tempMax mialem operatory OR. AND dla tempMin. Pewnie masz rację, tylko napisz trochę jaśniej proszę bo nie łapię. Link do komentarza Share on other sites More sharing options...
jand Luty 18, 2023 Udostępnij Luty 18, 2023 Użyte przeze mnie wartości temperatur są całkiem przykładowe i rozpatruję tylko operator OR (jak jest z AND to nie wiem). Chciałem pokazać, że są takie przypadki, gdy algorytm zawodzi: temperatury t1 = 12 oraz t2 = 3 są obie mniejsze od tempMax = 14, ale po zastosowaniu sumy logicznej otrzymujemy wartość = 15, czyli >14. Link do komentarza Share on other sites More sharing options...
ethanak Luty 18, 2023 Udostępnij Luty 18, 2023 operatory && i || w C++ zwracają true/false, a nie jakieś sumy bitowe. W Pythonie jest inaczej, ale i tak 7 || 70 to 7, czyli też nie zadziała. 2 Link do komentarza Share on other sites More sharing options...
jand Luty 18, 2023 Udostępnij Luty 18, 2023 Słusznie. Kontekst narzucał myślenie o bitach i podświadomie przyjąłem, że operator jest właściwy. 1 Link do komentarza Share on other sites More sharing options...
ethanak Luty 18, 2023 Udostępnij Luty 18, 2023 To jeszcze jako ciekawostkę mogę podać, że istnieje (dzisiaj już nieużywany) język, w którym instrukcja: if (t1 | t2 | t3 | t4 | t5) > tmax then przek := 1; działa dokładnie w taki sposób jak kolega @SOYER sobie wymarzył 🙂 ... i chyba tylko ten jeden. 1 Link do komentarza Share on other sites More sharing options...
Popularny post Elvis Luty 18, 2023 Popularny post Udostępnij Luty 18, 2023 @SOYER O ile rozumiem w tym przedziwnym przykładzie chodziło o uniknięcie wielokrotnego powtarzania prawie identycznego warunku, czyli: Cytat if((t1>tempMax) || (t2>tempMax) || (t3>tempMax) || (t4>tempMax) || (t5>tempMax)){ Zamiast wymyślać nowy język programowania, można chwilę zastanowić się nad pierwotnym zadaniem: 4 godziny temu, SOYER napisał: 5 czujników temperatury, jeśli na jakimkolwiek z nich pojawi się przekroczenie ustawionej górnej granicy temperatury, ma włączyć się przekaźnik. Przekaźnik wyłącza się tylko wtedy, kiedy na wszystkich czujnikach odczyt jest mniejszy od ustawionej dolnej granicy. Sprawdzenie, czy na jakimkolwiek czujniku jest wynik wyższy od górnej granicy można zrealizować nieco inaczej - policzmy maksymalną wartość odczytów, czyli max(t1, t2, ..., t5), a następnie porównajmy z tempMax. Jeśli którykolwiek przekracza limit, to i maksimum przekracza, więc na razie w pseudokodzie mamy coś takiego: t = max(t1, t2, t3, t4, t5) if (t > tempMax) przek1 = 1; Teraz druga część, czyli sprawdzanie, czy wszystkie odczyty mają wartość poniżej dolnej granicy. Możemy ponownie wykorzystać maksymalny odczyt, wystarczy go porównać z tempMin. Jeśli max(t1,..,t5) jest mniejsze od tempMin, to na pewno wszystkie odczyty są też mniejsze od tempMin: t = max(t1, t2, t3, t4, t5) if (t < tempMin) przek1 = 0; Łatwo zauważyć, że maksimum musimy obliczyć tylko raz, a warunki są już bardzo proste. Napisanie funkcji liczącej maksimum to chyba nic trudnego, a w przypadku C++ nie trzeba nawet nic pisać: auto t = std::max({t1, t2, t3, t4, t5}); if (t > tempMax) przek1 = 1; else if (t < tempMin) przek1 = 0; 2 1 Link do komentarza Share on other sites More sharing options...
ethanak Luty 18, 2023 Udostępnij Luty 18, 2023 22 minuty temu, Elvis napisał: Zamiast wymyślać nowy język programowania E... jaki nowy? Link do komentarza Share on other sites More sharing options...
jand Luty 18, 2023 Udostępnij Luty 18, 2023 1 godzinę temu, Elvis napisał: Przed tym: 1 godzinę temu, Elvis napisał: if (t < tempMin) przek1 = 0; musimy dodać t = min(t1, t2, t3, t4, t5) 1 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »