Arduino Polska Forum

Pełna wersja: Zawarcie kilku pętli uruchamianych osobno i nigdy jednocześnie
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam.

W Arduino, jak i w programowanie jestem zielony jak ten szczypiorek, niemniej jednak postanowiłem zabrać się za swój pierwszy kod. Cały plan wygląda mniej więcej tak: mam dwa MOSFET-y połączone z dwoma silnikami, po jednym microswitchu dla nich, trzy microswitche odpowiadające za czas ich poruszania się oraz spust. Naciśnięcie jednego microswitcha od silnika, jednego od prędkości i spustu powinno dać mi określony czas poruszania się tego silnika. Jednak czytałem, że nie da się zawrzeć kilku pętli jednocześnie w kodzie. A jeśli miałyby się uruchamiać osobno? Da się coś z tym zrobić?

Kod:
// PRZYPISYWANIE PINÓW
int MOSFET_1 = 6; //MOSFET AK
int MOSFET_2 = 7; //MOSFET SKORPION
int TRIGGER_PIN = A0; //SPUST
int SWITCH_PIN_1 = 2; //SELEKTOR BURST
int SWITCH_PIN_2 = 3; //SELEKTOR POJEDYŃCZY
int SWITCH_PIN_3 = 4; //SELEKTOR CIĄGŁY
int SELEKTOR_AK = 9; //WYBÓR AK
int SELEKTOR_SKORPION = 10; //WYBÓR SKORPION
float R1 = 100; //ROZDZIELACZ NAPIĘCIA REZYSTOR R1
float R2 = 10; //ROZDZIELACZ NAPIĘCIA REZYSTOR R2

// CZAS BURSTA
int MAX_MOSFET_1 = 200;
int MAX_MOSFET_2 = 180;

// CZAS POJEDYŃCZY
int MAX_MOSFET_1_SIN = 60;
int MAX_MOSFET_2_SIN = 70;

// CZAS POJEDYŃCZY
int MAX_MOSFET_1_AUTO = 999;
int MAX_MOSFET_2_AUTO = 999;

//POCZĄTKOWE DANE
int TriggerStatus = LOW; //STATUS SPUSTU NA POCZĄTKU
int TriggerReadValue = 0; //DANE CZYTANE PRZEZ PIN A0 => 0-1024
int CurrentSleepTime = 0; //CZAS W JAKIM MOSFET BYŁ WŁĄCZONY

//WCZYTYWANIE PINÓW JAKI INPUT/OUTPUT
void setup() {
  pinMode(13, OUTPUT); //PIN LED
  pinMode(MOSFET_1, OUTPUT); //PIN MOSFETU AK JAKO SYGNAŁOWY
  pinMode(MOSFET_2, OUTPUT); //PIN MOSFETU SCORPION JAKO SYGNAŁOWY
  pinMode(SWITCH_PIN_1,INPUT); //PIN SELEKTORA BURST JAKO ZASILANIE
  pinMode(SWITCH_PIN_2,INPUT); //PIN SELEKTORA POJEDYŃCZY JAKO ZASILANIE
  pinMode(SWITCH_PIN_3,INPUT); //PIN SELEKTORA CIĄGŁY JAKO ZASILANIE
  digitalWrite(MOSFET_1,LOW); //UPEWNIĆ SIĘ CZY MOSFET_1 NIE JEST ZASILANY
  digitalWrite(MOSFET_2,LOW); //UPEWNIĆ SIĘ CZY MOSFET_2 NIE JEST ZASILANY
  digitalWrite(13,LOW); //UPEWNIĆ SIĘ CZY LED NIE JEST ZASILANY
}

// CZYTANIE POZYCJI SPUSTU
void ReadTrigger()
{
  int TriggerReadValue = analogRead(TRIGGER_PIN);
   
  TriggerStatus = LOW;
  if(TriggerReadValue > 20) {
      TriggerStatus = HIGH;
  }
}

// CZYTANIE POZYCJI MOSFET_1
void SetMosfet_1(int val)
{
  digitalWrite(13, val);            // CZY LED WŁĄCZONY/WYŁĄCZONY ŻEBY SPRAWDZIĆ CO ROBI MOSFET_1
  digitalWrite(MOSFET_1, val);    // CZY MOSFET_1 WŁĄCZONY/WYŁĄCZONY
}

// CZYTANIE POZYCJI MOSFET_2
void SetMosfet_2(int val)
{
  digitalWrite(13, val);            // CZY LED WŁĄCZONY/WYŁĄCZONY ŻEBY SPRAWDZIĆ CO ROBI MOSFET_2
  digitalWrite(MOSFET_2, val);    // turn the Monfet on / off
}
//RODZAJE OGNIA REPLIK

void loop() {
 
  //LOOP CZYTANIA BURSTA AK

ReadTrigger();
  int TriggerSelector_1_1 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_AK); //SPRAWDŹ CZY SPUST I SELEKTOR AK SĄ WŁĄCZONE
  if (TriggerSelector_1_1 == HIGH) //JEŚLI POWYŻSZE SĄ PRAWDĄ                              
  {
    SetMosfet_1(HIGH); //WŁĄCZ MOSFET
    while (TriggerSelector_1_1 == HIGH)
    {
      int isBurstMode_1 = digitalRead(SWITCH_PIN_1);
      if(isBurstMode_1 == HIGH)               //JEŻELI SELEKTORY SĄ WŁĄCZONE MAMY BURSTA       
      {        
        if(CurrentSleepTime < MAX_MOSFET_1) //JEŻELI NIE DOKOŃCZYŁ CYKLU
        {         
          CurrentSleepTime = CurrentSleepTime + 1;   //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
        } else {
          SetMosfet_1(LOW);                            //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
        }
        delay(1);                                   //CZEKAJ JEDNĄ MILISEKUNDE
      }
      ReadTrigger();                               //SPRAWDZ CZY SPUST WYŁĄCZONY
    }
    SetMosfet_1(LOW);                               //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
    CurrentSleepTime = 0;                          //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
  }
//LOOP CZYTANIA BURSTA SKORPION
ReadTrigger();
  int TriggerSelector_2_1 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_SKORPION); //SPRAWDŹ CZY SPUST I SELEKTOR SKORPIONA SĄ WŁĄCZONE
  if (TriggerSelector_2_1 == HIGH)        //JEŚLI POWYŻSZE SĄ PRAWDĄ                
  {
    SetMosfet_2(HIGH);              //WŁĄCZ MOSFET                
    while (TriggerSelector_2_1 == HIGH)
    {
      int isBurstMode_2 = digitalRead(SWITCH_PIN_1);
      if(isBurstMode_2 == HIGH)      //JEŻELI SELEKTORY SĄ WŁĄCZONE MAMY BURSTA                
      {        
        if(CurrentSleepTime < MAX_MOSFET_2)//JEŻELI NIE DOKOŃCZYŁ CYKLU
        {         
          CurrentSleepTime = CurrentSleepTime + 1;   //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
        } else {
          SetMosfet_2(LOW);                            //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
        }
        delay(1);                                   //CZEKAJ JEDNĄ MILISEKUNDE
      }
      ReadTrigger();                               //SPRAWDZ CZY SPUST WYŁĄCZONY
    }
    SetMosfet_2(LOW);                               //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
    CurrentSleepTime = 0;                          //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
  }

   //LOOP CZYTANIA POJEDYŃCZEGO AK

ReadTrigger();
  int TriggerSelector_1_2 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_AK); //SPRAWDŹ CZY SPUST I SELEKTOR AK SĄ WŁĄCZONE
  if (TriggerSelector_1_2 == HIGH) //JEŚLI POWYŻSZE SĄ PRAWDĄ                              
  {
    SetMosfet_1(HIGH); //WŁĄCZ MOSFET
    while (TriggerSelector_1_2 == HIGH)
    {
      int isSingleMode_1 = digitalRead(SWITCH_PIN_2);
      if(isSingleMode_1 == HIGH)               //JEŻELI SELEKTORY SĄ WŁĄCZONE MAMY POJEDYNCZY       
      {        
        if(CurrentSleepTime < MAX_MOSFET_1_SIN) //JEŻELI NIE DOKOŃCZYŁ CYKLU
        {         
          CurrentSleepTime = CurrentSleepTime + 1;   //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
        } else {
          SetMosfet_1(LOW);                            //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
        }
        delay(1);                                   //CZEKAJ JEDNĄ MILISEKUNDE
      }
      ReadTrigger();                               //SPRAWDZ CZY SPUST WYŁĄCZONY
    }
    SetMosfet_1(LOW);                               //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
    CurrentSleepTime = 0;                          //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
  }
 
//LOOP CZYTANIA POJEDYŃCZEGO SKORPION
ReadTrigger();
  int TriggerSelector_2_2 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_SKORPION); //SPRAWDŹ CZY SPUST I SELEKTOR SKORPIONA SĄ WŁĄCZONE
  if (TriggerSelector_2_2 == HIGH)        //JEŚLI POWYŻSZE SĄ PRAWDĄ                
  {
    SetMosfet_2(HIGH);              //WŁĄCZ MOSFET                
    while (TriggerSelector_2_2 == HIGH)
    {
      int isSingleMode_2 = digitalRead(SWITCH_PIN_2);
      if(isSingleMode_2 == HIGH)      //JEŻELI SELEKTOR JEST WŁĄCZONY MAMY POJEDYNCZY                
      {        
        if(CurrentSleepTime < MAX_MOSFET_2_SIN) //JEŻELI NIE DOKOŃCZYŁ CYKLU
        {       
          CurrentSleepTime = CurrentSleepTime + 1;   //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
        } else {
          SetMosfet_2(LOW);                            //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
        }
        delay(1);                                   //CZEKAJ JEDNĄ MILISEKUNDE
      }
      ReadTrigger();                               //SPRAWDZ CZY SPUST WYŁĄCZONY
    }
    SetMosfet_2(LOW);                               //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
    CurrentSleepTime = 0;                          //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
  }
     //LOOP CZYTANIA CIĄGŁEGO AK

ReadTrigger();
  int TriggerSelector_1_3 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_AK); //SPRAWDŹ CZY SPUST I SELEKTOR AK SĄ WŁĄCZONE
  if (TriggerSelector_1_3 == HIGH) //JEŚLI POWYŻSZE SĄ PRAWDĄ                              
  {
    SetMosfet_1(HIGH); //WŁĄCZ MOSFET
    while (TriggerSelector_1_3 == HIGH)
    {
      int isSingleMode_1 = digitalRead(SWITCH_PIN_3);
      if(isSingleMode_1 == HIGH)               //JEŻELI SELEKTOR JEST WŁĄCZONY MAMY CIĄGŁY       
      {        
        if(CurrentSleepTime < MAX_MOSFET_1_AUTO) //JEŻELI NIE DOKOŃCZYŁ CYKLU
        {         
          CurrentSleepTime = CurrentSleepTime + 1;   //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
        } else {
          SetMosfet_1(LOW);                            //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
        }
        delay(1);                                   //CZEKAJ JEDNĄ MILISEKUNDE
      }
      ReadTrigger();                               //SPRAWDZ CZY SPUST WYŁĄCZONY
    }
    SetMosfet_1(LOW);                               //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
    CurrentSleepTime = 0;                          //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
  }
 
//LOOP CZYTANIA CIĄGŁEGO SKORPION
ReadTrigger();
  int TriggerSelector_2_3 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_SKORPION); //SPRAWDŹ CZY SPUST I SELEKTOR SKORPIONA SĄ WŁĄCZONE
  if (TriggerSelector_2_3 == HIGH)        //JEŚLI POWYŻSZE SĄ PRAWDĄ                
  {
    SetMosfet_2(HIGH);              //WŁĄCZ MOSFET                
    while (TriggerSelector_2_3 == HIGH)
    {
      int isSingleMode_2 = digitalRead(SWITCH_PIN_3);
      if(isSingleMode_2 == HIGH)      //JEŻELI SELEKTOR JEST WŁĄCZONY MAMY CIĄGŁY                
      {        
        if(CurrentSleepTime < MAX_MOSFET_2_AUTO) //JEŻELI NIE DOKOŃCZYŁ CYKLU
        {       
          CurrentSleepTime = CurrentSleepTime + 1;   //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
        } else {
          SetMosfet_2(LOW);                            //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
        }
        delay(1);                                   //CZEKAJ JEDNĄ MILISEKUNDE
      }
      ReadTrigger();                               //SPRAWDZ CZY SPUST WYŁĄCZONY
    }
    SetMosfet_2(LOW);                               //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
    CurrentSleepTime = 0;                          //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
  }
}
Z góry dziękuję za pomoc
(26-06-2019, 13:35)jano20 napisał(a): [ -> ]W Arduino, jak i w programowanie jestem zielony jak ten szczypiorek,
Zacznij więc od https://forbot.pl/blog/kurs-arduino-srod...owac-id936

(26-06-2019, 13:35)jano20 napisał(a): [ -> ]Jednak czytałem, że nie da się zawrzeć kilku pętli jednocześnie w kodzie.
Głupoty czytałeś albo źle zrozumiałeś.

(26-06-2019, 13:35)jano20 napisał(a): [ -> ]niemniej jednak postanowiłem zabrać się za swój pierwszy kod.
i porwałeś się z motyką na księżyc.
Jeśli nie potrafisz kierować samochodem, to naukę zaczynasz na autostradzie z prędkością 200km/h?
Naukę języka obcego rozpoczynasz od pisania powieści?

Zacznij od prostych rzeczy, które znajdziesz w kursie, później dopiero zajmij się poważniejszymi programami.
Przede wszystkim przerób kurs jak radzi ES2. W kursie nauczysz się jak odmierzać czas, jeśli nie naucz się i tak. W Arduino od razu dostajesz do dyspozycji systemowy "tick" w us i ms w postaci funkcji micros() i millis(). Wystarczy ustawić start z określonymi parametrami i potem odliczać czas do zakończenia działania. Odliczanie czasu to sprawdzanie jaką wartość zwróciła funkcja millis teraz, a ile przy uruchomieniu zdarzenia - jeśli odpowiednio dużo to reagujesz.