SOYER Napisano Styczeń 11, 2022 Udostępnij Napisano Styczeń 11, 2022 (edytowany) Cześć, taki problem, sprawdzamy czujkę PIR, jest ruch ale nic nie robimy, odpalamy stoper, jeśli po 5 sekundach na PIR nadal jest ruch i minęło od ostatniej reakcji 10 minut to ponownie odpalamy funkcję. Takie coś wysmarowałem, ale jakoś mi to zbyt skomplikowane na tak prosty temat, czy mi się wydaje? if((digitalRead(pir)==HIGH) && (stillMove==0)){ //jesli jest ruch i sprawdzamy to pierwszy raz sekund5.restart(); // stoper start stillMove=1; // zaznaczamy, że raz sprawdzone } if((sekund5.available())&&(digitalRead(pir)==HIGH)){ // jak dalej ruch i minęło 5 sekund mowa=1;// zmienna mówiąca, że od 5 sekund mamy ruch } if((sekund5.available())&&(digitalRead(pir)==LOW)){ // 5sek minęło ale ruchu juz nie ma stillMove=0; // mowa=0; } if((minut10.available())&& (mowa==1)){ // minęło 10 min od ostatniej reakcji i od 5 sek mamy znowu ciągły ruch cosTam_cosTam; minut10.restart(); stillMove=0; mowa=0; } Kod działa jak powinien, ale da się to jakoś zgrabniej czy nie? Edytowano Styczeń 11, 2022 przez SOYER Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 11, 2022 Udostępnij Styczeń 11, 2022 6 minut temu, SOYER napisał: jeśli po 5 sekundach na PIR nadal jest ruch i minęło od ostatniej reakcji 10 minut to ponownie odpalamy funkcję. Trochę to takie niezbyt jasne... Jaką funkcję? Czy to oznacza, że jeśli funkcja została uruchomiona, to przez 10 minut olewamy czujkę? Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 11, 2022 Autor tematu Udostępnij Styczeń 11, 2022 6 minut temu, ethanak napisał: Czy to oznacza, że jeśli funkcja została uruchomiona, to przez 10 minut olewamy czujkę? Tak dokładnie to do mojego "asystenta" mówiącego przy piecu CO. Ma ignorować krótkie wywołania, jakiś kot, ruch drzwi, a reagować dopiero po potwierdzeniu ruchu przez 5sek. No i nie wybudzamy gadacza częściej niż co 10min, by nie gadał na okrągło gdy ktoś wszedł na kilka minut. 1 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 11, 2022 Udostępnij Styczeń 11, 2022 A może coś w stylu: bool ruchy() { static bool ruch = false; static bool stan = false; static uint32_t stoper; bool czujka = digitalRead(pin); if (!czujka) { if (ruch) ruch = false; return false; } if (stan) { if (millis() - stoper > minut10) stan = false; else return false; } if (!ruch) { ruch = true; stoper = millis(); return false; } if (stoper < sekund5) return false; stoper = millis(); stan = true; return true; } Nawet w klasę to można ładnie opakować... Albo prosta maszyna stanów (READY, MOVING, RELAX)... 1 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
SOYER Styczeń 11, 2022 Autor tematu Udostępnij Styczeń 11, 2022 nic z tego nie rozumiem😭 2 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 11, 2022 Udostępnij Styczeń 11, 2022 No taka funkcja... void loop() { if (ruchy()) gadaj(); // reszta kodu } Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 11, 2022 Autor tematu Udostępnij Styczeń 11, 2022 25 minut temu, ethanak napisał: No taka funkcja... void loop() { if (ruchy()) gadaj(); // reszta kodu } tyle to łapie, daj mi moment... Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 11, 2022 Autor tematu Udostępnij Styczeń 11, 2022 (edytowany) bool ruchy() { static bool ruch = false; static bool stan = false; static uint32_t stoper; bool czujka = digitalRead(pin); if (!czujka) { if (ruch) ruch = false; return false; } // jak pir jest low to nie włączamy gadania if (stan) { if (millis() - stoper > minut10) stan = false; else return false; }// jak stan jest true to idziemy dalej, jak stan jest false to nie włączamy gadania, jak stan jest true i minęło 10min to stan=false if (!ruch) { ruch = true; stoper = millis(); return false; }// jak ruch jest false to robimy ruch=true, resetujemy stoper, nie właczamy gadania if (stoper < sekund5) return false; stoper = millis(); stan = true; return true; }// jak od resetu stopera nie minęło 5sek to nie włączamy gadania, resetujemy stoper, stan=true(DLACZEGO?), włączamy gadanie(DLACZEGO?). Nie widzę ścieżki dlaczego w końcu zwracamy true i gadamy... Edytowano Styczeń 11, 2022 przez SOYER 1 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 11, 2022 Udostępnij Styczeń 11, 2022 Bo kiedyś przecież trzeba pogadać... Czyli nie zaczynamy gadać jeśli: nic się nie rusza nie minęło 10 minut od ostatniego gadania nie minęło 5 sekund od rozpoczęcia ruchu W przeciwnym razie gadamy i tu już nie trzeba nic sprawdzać bo nie ma innych możliwości Ot, takie odwrócenie wszystkich Twoich warunków. 1 1 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 11, 2022 Autor tematu Udostępnij Styczeń 11, 2022 (edytowany) Kurde, po Twoim ostatnim poście siedzę 30min i w końcu załapałem. Genialne odwrócenie mojego toku myślenia😁👍👍👍. Pewnie dlatego tak trudno mi to było załapać. Najdłużej kombinowałem gdzie jest zależność między pierwszym ruchem a drugim po 5s. Ale jest oczywiście. Kod bezbłędny, choć postawiony na głowie😀. Dzięki. Teraz widzę, że to "proste". Jak czujka nic nie widzi to nie ma reakcji i niepotrzebnych dalszych ifów. Jak coś widzi to sprawdzamy czy minęło 10min, jak nie, to znowu nie robimy nic więcej. Jak jest ruch i minęło 10min to resetujemy licznik. Wreszcie jak jest ruch, minęło 10 min i 5 sec od ostatniego wywołania ruchem to odpalamy gadanie. Najlepsze, że jeśli odpalamy gadanie to po drodze wszystkie ify są niespełnione😁😁😁. Dobre, naprawdę fajne. Dzięki za łamigłówkę.🍺 Edytowano Styczeń 11, 2022 przez SOYER Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 11, 2022 Udostępnij Styczeń 11, 2022 2 minuty temu, SOYER napisał: odwrócenie mojego toku myślenia Zasada Sherlocka Holmesa - trzeba odrzucić wszystko co się nie zgadza, ostatnia możliwość to ta o którą nam chodzi 🙂 Tak przy okazji - akurat zaczynam robótkę z nowym gadającym sterownikiem do pieca (tyle że gazowego i na RPi) 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Styczeń 11, 2022 Udostępnij Styczeń 11, 2022 (edytowany) A jak juz nabazgralem to wrzuce mimo ze kolega @SOYER juz znalazl swoja droge...😉 bool activ1 == false; bool activ2 == true; bool stan = 0; if (pir == HIGH) { czas5s = millis(); stan = 1; } if (millis() - czas5s > 5000UL && stan == 1) { stan = 0; if (pir == HIGH) { activ1 = true; } } else { activ1 = false; } if (activ1 == true && activ2 == true) { gadaj(); activ2 = false; activ1 = false; czas10m = millis(); } if (millis() - czas10m > 10minutUL) { activ2 = true; } } Edytowano Styczeń 11, 2022 przez farmaceuta 1 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 11, 2022 Autor tematu Udostępnij Styczeń 11, 2022 1 godzinę temu, ethanak napisał: akurat zaczynam robótkę z nowym gadającym sterownikiem do pieca (tyle że gazowego i na RPi) 🙂 jakie funkcjonalności? Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 11, 2022 Udostępnij Styczeń 11, 2022 10 minut temu, SOYER napisał: jakie funkcjonalności? Właściwie to unowocześniony sterownik który kiedyś zrobiłem. Tamten był programowany wyłącznie przez interfejs WWW. Nowy ma mieć klawiaturkę i wyświetlacz. A tak ogólnie to maksymalna oszczędność - utrzymywanie minimalnej możliwej nastawionej temperatury i odpowiednio wcześniejsze włączenie pieca jeśli temperatura ma wzrosnąć (np. z 16 stopni w nocy do 20 kiedy wstajemy - sterownik na podstawie aktualnej temperatury w domu oraz temperatury na zewnątrz oblicza kiedy ma się włączyć piec). Tym razem rezygnacja z plątaniny kabli, termometry połączone przez esp-now (na płytce jest już ESP8266 podłączony serialem do RPi z możliwością zaprogramowania z malinki). Oczywiście nie rezygnuję z WWW, ale muszę to dopracować bazując na tym czego mi poprzednio brakowało i co jest niepotrzebne. Do tego kilka dodatkowych funkcji - korzystając z tego, że mam RPi włączonego 24/7 robi to za mini-centralkę (automatyczne zasłony, "inteligentne" sterowanie kilkoma punktami świetlnymi z możliwością symulacji obecności w czasie dłuższej nieobecności, parę prywatnych pierdółek które jeszcze muszę dopracować). Planuję odpalić to dopiero po sezonie grzewczym - dotychczasowy na razie działa, a zmiana na nowy jest raczej nieodwracalna (co prawda mam eurostera, przełączenie jest automatyczne w razie awarii, ale on jest jakiś mało oszczędny i niespecjalnie wygodnie się programuje). 2 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 12, 2022 Autor tematu Udostępnij Styczeń 12, 2022 18 godzin temu, ethanak napisał: Nowy ma mieć klawiaturkę i wyświetlacz Dlaczego nie dotykowy? 18 godzin temu, ethanak napisał: utrzymywanie minimalnej możliwej nastawionej temperatury i odpowiednio wcześniejsze włączenie pieca jeśli temperatura ma wzrosnąć (np. z 16 stopni w nocy do 20 kiedy wstajemy - sterownik na podstawie aktualnej temperatury w domu oraz temperatury na zewnątrz oblicza kiedy ma się włączyć piec). Ten piec nie ma swojego sterownika? Mam piec CO, sterownik jakiś tam symbol, firmy zdaje się Tatarek, ale dedykowany do tego pieca. Da się dokupić moduł internetowy do połączenia sterownika z siecią i sterowania nim przez telefon. Pytanie, bez dostępu do informacji producenta na temat sposobu komunikacji między modułami, nie ma możliwości "wywnioskowania" o tym sposobie komunikacji i zbudowania swojego sterownika przez net? 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!