Krtstian Napisano Kwiecień 2, 2021 Udostępnij Napisano Kwiecień 2, 2021 Automatycznie włączająca się pompa umieszczona w zbiorniku na deszczówkę. Między pompą a kranem zamocowany jest czujnik przepływu hallotronowy. Zasada działania tego układu polega na tym że: Podczas otwarcia kranu woda leje się z przepływem ok 10l/h (zbiornik jest wyżej od kranu dzięki czemu woda leje się sama). W tym momencie powinna się włączyć pompa, przepływ wynosi wtedy ok 1200l/h bez obciążenia. Gdy zamknę kran lub myjka ciśnieniowa nie pracuje (nie pobiera wody), następuje wtedy wzrost ciśnienia i przepływ spada gwałtownie do wartości 400l/h a nawet mniej. W tej sytuacji pompa powinna się wyłączyć. Problem Mojego programu jest taki że w czasie otwarcia kranu (włączenia pompy), zamknięcia kranu (wyłączenie pompy) powinien być czas na ustabilizowanie się przepływu (wartości odczytanej). Przy włączeniu 1,5s i przy wyłączeniu 5s (jeśli nagle wartość przepływu wynosi 300 powinno nastąpić wyłączenie na 5s niezależnie czy w ciągu 1s wartość zmieni się na 40 co powoduje włączenie się. Nie wiem jak to zrobić, roszę o pomoc. volatile int NbTopsFan; int przeplyw; int hallsensor = 2; //Sensor unsigned long aktualnyCzas = 0; unsigned long zapamietanyCzas = 0; void rpm () { NbTopsFan++; } void setup() { pinMode(10, OUTPUT); pinMode(hallsensor, INPUT); Serial.begin(9600); attachInterrupt(0, rpm, RISING); } void loop () { aktualnyCzas = millis(); NbTopsFan = 0; sei(); if (aktualnyCzas - zapamietanyCzas >= 1000UL) { zapamietanyCzas = aktualnyCzas; cli(); przeplyw = (NbTopsFan * 60 / 7.5); Serial.print (przeplyw, DEC); Serial.print (" L/godzr\r\n"); if (przeplyw > 1 && przeplyw < 50 ){ //otwarcie kranu - włączenie pompy na 1,5s zostaje włączona pompa niezależnie od zmiany wartości digitalWrite(10, HIGH); delay(1500); // ta przerwa na 1,5s nie działa } if (przeplyw > 411){ //pompa pracuje digitalWrite(10, HIGH); } if (przeplyw > 51 && przeplyw < 410 ){ //zamknięcie kranu - wyłączenie pompy na 5s zostaje wyłączona pompa niezależnie od zmiany wartości digitalWrite(10,LOW); delay(5000); // ta przerwa na 5s nie działa } } } Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 3, 2021 Udostępnij Kwiecień 3, 2021 (edytowany) A moze lepiej by bylo wywalic to przerwanie bo jest w tym kodzie nie potrzebne(przez sekunde i tak sprawdzasz tylko stan pinu, a po wejsciu do if przestajesz) i do if'ow dorzucic zmienna ktora bedzie zarzadzac w jakiej kolejnosci maja sie te if'y wykonywac?? Edytowano Kwiecień 3, 2021 przez farmaceuta Cytuj Link do komentarza Share on other sites More sharing options...
Krtstian Kwiecień 3, 2021 Autor tematu Udostępnij Kwiecień 3, 2021 (edytowany) 26 minut temu, farmaceuta napisał: A moze lepiej by bylo wywalic to przerwanie bo jest w tym kodzie nie potrzebne(przez sekunde i tak sprawdzasz tylko stan pinu, a po wejsciu do if przestajesz) i do if'ow dorzucic zmienna ktora bedzie zarzadzac w jakiej kolejnosci maja sie te if'y wykonywac?? To przerwanie na 1s musi być bo bez tego są błędne dane z liczenia impulsów przepływu wody. Jak program wykonuje jeden z trzech warunków to cały czas monitor portu szeregowego pokazuje aktualne wartości zmieniające się co 1s. Edytowano Kwiecień 3, 2021 przez Krtstian Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 3, 2021 Udostępnij Kwiecień 3, 2021 14 minut temu, Krtstian napisał: To przerwanie na 1s musi być bo bez tego są błędne dane z liczenia impulsów przepływu wody. Pewnie dlatego ze kod wykonuje petle za szybko i podczas jednego impulsu ten zostaje wykryty kilka razy...mozna to rozwiazac tak.. if (czujnik == HIGH && stan == 0) { przeplyw++; stan = 1; } if (czujnik == LOW) { stan = 0; } Teraz jeden stan wysoki jest wykryty tylko raz..ponownie dopiero wtedy gdy przejdzie w niski i znow w wysoki... Taki program zapewne przez ta sekunde wykona sie ciut wiecej razy niz 150 (impulsow)(1200l) Cytuj 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
Krtstian Kwiecień 3, 2021 Autor tematu Udostępnij Kwiecień 3, 2021 26 minut temu, farmaceuta napisał: Pewnie dlatego ze kod wykonuje petle za szybko i podczas jednego impulsu ten zostaje wykryty kilka razy...mozna to rozwiazac tak.. if (czujnik == HIGH && stan == 0) { przeplyw++; stan = 1; } if (czujnik == LOW) { stan = 0; } Teraz jeden stan wysoki jest wykryty tylko raz..ponownie dopiero wtedy gdy przejdzie w niski i znow w wysoki... Taki program zapewne przez ta sekunde wykona sie ciut wiecej razy niz 150 (impulsow)(1200l) Dziękuję za radę. Wymyśliłem trochę inny sposób ale spróbuje też wykorzystać kod powyżej. Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 3, 2021 Udostępnij Kwiecień 3, 2021 Dnia 2.04.2021 o 17:05, Krtstian napisał: volatile int NbTopsFan; int przeplyw; Jeśli później robisz działanie: Dnia 2.04.2021 o 17:05, Krtstian napisał: przeplyw = (NbTopsFan * 60 / 7.5); To te zmienne powinny być typu float chociaż radzę unikać 😉 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Kwiecień 3, 2021 Udostępnij Kwiecień 3, 2021 1 godzinę temu, _LM_ napisał: To te zmienne powinny być typu float A niby to dlaczego? Ja bym raczej dał coś w stylu: przeplyw = NbTopsFan * 8; // ciekawe, ile to jest 60/7.5 Jakby szybsze i na jedno wychodzi... Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 3, 2021 Udostępnij Kwiecień 3, 2021 56 minut temu, ethanak napisał: A niby to dlaczego? Napisałem też trzeba unikać operacji na float a tego już nie zacytowałeś. 57 minut temu, ethanak napisał: Jakby szybsze i na jedno wychodzi... Proste i skuteczne 1 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Kwiecień 3, 2021 Udostępnij Kwiecień 3, 2021 (edytowany) 9 minut temu, _LM_ napisał: Napisałem też trzeba unikać operacji na float a tego już nie zacytowałeś. Chodziło mi dokładnie o to co napisałem: dlaczego Twoim zdaniem te zmienne powinny być typu float. Koniec. Kropka. Ja nie widzę powodu dlaczego miałyby być typu float, jeśli nawet gdzieś po drodze w obliczeniach ów float występuje, więc może wyjaśnisz dlaczego Twoim zdaniem jest inaczej. Tutaj jeśli nawet nie byłoby możliwe sprowadzenie działania do intów doczepiłbym się nawiasowania (bo może wystąpić przepełnienie), ale nie do typu zmiennych. I nieważne czy trzeba floatów unikać czy nie, bo na małych Arduinkach owszem, ale np. na ESP32 ze sprzętowym wspomaganiem działań na floatach już nie. Tyle, że nie ma to nic do rzeczy. Edytowano Kwiecień 3, 2021 przez ethanak 1 Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Kwiecień 3, 2021 Udostępnij Kwiecień 3, 2021 (edytowany) 27 minut temu, ethanak napisał: Chodziło mi dokładnie o to co napisałem: dlaczego Twoim zdaniem te zmienne powinny być typu float Bo nie każda liczba podzielona przez 8 da w wyniku liczbę naturalną a skoro kolega @Krtstian dzieli przez 7.5 to oznacza że spodziewa się wyniku zmiennoprzecinkowego przeplyw = (NbTopsFan * 60 / 7.5); Upssss tu jest mnożenie, przepraszam mój błąd. Faktycznie nie trzeba floatów zakręciłem się. Jeszcze raz przepraszam za zamiesznie Edytowano Kwiecień 3, 2021 przez _LM_ Cytuj Link do komentarza Share on other sites More sharing options...
Krtstian Kwiecień 3, 2021 Autor tematu Udostępnij Kwiecień 3, 2021 (edytowany) Już tłumaczę z kąd to 7,5. 1l wody przepływający przez czujnik przepływu halla obraca łopatki tego czujnika 450 razy. 450 podzielone przez 60=1godzina, daje częstotliwość 7,5. Z tąd też wynik jest w l/h Edytowano Kwiecień 3, 2021 przez Krtstian Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 3, 2021 Udostępnij Kwiecień 3, 2021 6 minut temu, Krtstian napisał: 1l wody przepływający przez czujnik przepływu halla obraca łopatki tego czujnika 450 razy. Az tyle?? Z twojego kodu wynika ze jeden impuls na sekunde jest rowne 8 litrom na godzine.. Cytuj Link do komentarza Share on other sites More sharing options...
Krtstian Kwiecień 3, 2021 Autor tematu Udostępnij Kwiecień 3, 2021 (edytowany) Mój błąd 60=1 minuta a 7,5×60 to wtedy jest w l/h Edytowano Kwiecień 3, 2021 przez Krtstian Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Kwiecień 3, 2021 Udostępnij Kwiecień 3, 2021 (edytowany) Ja sie pogubilem...😉 napisz konkretnie ile impulsow masz przy przeplywie jednego litra np. I cos sie wymysli z tym kodem... Ok zalapalem...te 450 to jest ilosc impulsow w ciagu godziny przy przeplywie 1l/h..no i to by sie zgadzalo z powyzszym kodem...no i jakos rozwiazales problem kodu czy nie? I druga sprawa to z tego co mi wiadomo to funkcja delay() nie bedzie dzialac poprawnie po wywolaniu cli() bo wylaczasz wszystkie przerwania a delay() na nich dziala.. Edytowano Kwiecień 3, 2021 przez farmaceuta 1 Cytuj Link do komentarza Share on other sites More sharing options...
Krtstian Kwiecień 3, 2021 Autor tematu Udostępnij Kwiecień 3, 2021 2 minuty temu, farmaceuta napisał: Ja sie pogubilem...😉 napisz konkretnie ile impulsow masz przy przeplywie jednego litra np. I cos sie wymysli z tym kodem... 1l wody to 450 impulsów, 450 podzielone przez 60 daje częstotliwość 7,5 wyni w tedy jest w l/min a 7,5 razy 60 daje wtedy wynik w l/h 13 minut temu, farmaceuta napisał: Ja sie pogubilem...😉 napisz konkretnie ile impulsow masz przy przeplywie jednego litra np. I cos sie wymysli z tym kodem... Ok zalapalem...te 450 to jest ilosc impulsow w ciagu godziny przy przeplywie 1l/h..no i to by sie zgadzalo z powyzszym kodem...no i jakos rozwiazales problem kodu czy nie? I druga sprawa to z tego co mi wiadomo to funkcja delay() nie bedzie dzialac poprawnie po wywolaniu cli() bo wylaczasz wszystkie przerwania a delay() na nich dziala.. Kod poprawiłem w mniejszym stopniu, musze to jeszcze przetestować. W najbliższych dniach wstawie cały program. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!