Skocz do zawartości

Reakcja na potwierdzone zdarzenie. Kod.


SOYER

Pomocna odpowiedź

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 przez SOYER
Link do komentarza
Share on other sites

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ę?

 

Link do komentarza
Share on other sites

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. 

 

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

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

 

  • Lubię! 1
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

(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 przez SOYER
  • Lubię! 1
Link do komentarza
Share on other sites

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.

 

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

(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 przez SOYER
Link do komentarza
Share on other sites

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

 

Link do komentarza
Share on other sites

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 przez farmaceuta
  • Lubię! 1
Link do komentarza
Share on other sites

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

 

 

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

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?

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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