Jak sprawdzać dwa czujniki w tym samym czasie?

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();  
}
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ć).

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

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

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