Jak sprawdzać dwa czujniki w tym samym czasie?

Odpowiedz Nowy wątek
2018-12-17 18:33
0

Mam program który sprawdza dwa czujniki. Chciałbym, żeby sprawdzał dwa jednocześnie. Gdy jeden zmini stan to chce to wypisać na konsole to samo gdy drugi czujnik zmini stan. Ale program wykonuje tylko pierwszą wywołaną funkcję (drugą pomija- nie wykonuje jej). więc jak wywołać te funkcje żeby sprawdzały się cały czas?

int czujnik_SW520D = 2;
int det_lasera_o = 6;

boolean odczyt1;
boolean stan1;

boolean odczyt;
boolean stan;

void setup() {

  Serial.begin(9600);

    pinMode(czujnik_SW520D, INPUT);
    pinMode(det_lasera_o, INPUT);
}

void Funk1(){

    odczyt = digitalRead(czujnik_SW520D);
    if (odczyt) stan = 1; else stan = 0;
    delay(500);
    while(1){

        odczyt = digitalRead(czujnik_SW520D);

        if(odczyt){
            if (stan){
                delay(500);
                continue;
                }
            else{
                stan = 1;
                Serial.println("przewrocony!\n");
                delay(500);
                continue;
            }
        }
        else {
            if (! stan){
                delay(500);
                continue;
            }
            else{
                stan = 0;
                Serial.println("ok!\n");
                delay(500);
                continue;
            }   
        } 
    }
    delay(10);
}

void Funk2(){

    odczyt1 = digitalRead(det_lasera_o);
    if (odczyt1) stan1 = 1; else stan1 = 0;
    delay(500);
    while(1){

        odczyt1 = digitalRead(det_lasera_o);

        if(odczyt1){
            if (stan1){
                delay(500);
                continue;
                }
            else{
                stan1 = 1;
                Serial.println("zabrali!\n");
                delay(500);
                continue;
            }
        }
        else {
            if (! stan1){
                delay(500);
                continue;
            }
            else{
                stan1 = 0;
                Serial.println("pelny!\n");
                delay(500);
                continue;
            }   
        } 
    }

  delay(10);

}

void loop() {

   Funk1();
   Funk2();  
}
edytowany 3x, ostatnio: furious programming, 2018-12-17 20:48

Pozostało 580 znaków

2018-12-17 19:28
0

On nie pomija drugiej funkcji - zdaje się, że on jej nigdy nie uruchomi, bo masz w pierwszej (w drugiej zresztą też) funkcji nieskończoną pętlę (while(1)). Zrezygnuj z niej (funkcja loop() po zakończeniu uruchamia się jeszcze raz, możesz z tego skorzystać).

continue statement not within a loop, czyli musi być w innej pętli? - Shark167 2018-12-17 19:45
continue powoduje zakończenie tego obiegu pętli i wejście do kolejnego. Zamiast tego możesz spróbować we wnętrzu funkcji zrobić return, które też zakończy funkcję. - Ktos 2018-12-17 19:48
zamiast continue return(0)? dalej nie mam pojecia jak te 2 funkcje wywołać :| - Shark167 2018-12-17 19:56
@Shark167: pytania na temat zadawaj w postach. - furious programming 2018-12-17 20:49

Pozostało 580 znaków

2018-12-17 20:59
0

dodał bym sposób programowania z delay() nie pozwala na dobrą jednoczesną obsługę więcej niż jednego elementu. Trzeba się przesiąść na odpytywanie milisekund milis(), wtedy można spreawdzać praktycznie jednocześnie wiele warunków. Jest to dość znana wskazówka w świecie arduino, znajdziesz w sieci wiele tematów.

Zarazem to głęboko zmienia styl budowania kodu Arduino, nie podejmuję się w jednym poście tego naświetlić.

edytowany 2x, ostatnio: AnyKtokolwiek, 2018-12-17 21:02
dodałbym, że sposób... - bardziej po polsku :p - abrakadaber 2018-12-17 21:50

Pozostało 580 znaków

2018-12-17 21:49
1

zamiast programować metodą kopiego pastla zacznij myśleć - masz dwie funkcję, pomijając nawet fakt, że w obu masz nieskończoną pętlę to wywołanie którejkolwiek trwa 1010ms (czyli ponad sekundę). Przepisz je tak aby dana funkcja sprawdzała stan w danym momencie, porównywała z poprzednim i go zwracała, bez delay, while, Serial.println. Całą logikę "czekania" i "wyświetlania" zrealizuj w głównej pętli


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0