• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pętla w pętli

Object Storage Arubacloud
0 głosów
502 wizyt
pytanie zadane 29 marca 2022 w C i C++ przez trafo13 Nowicjusz (120 p.)

Witam.

Niedawno zakupiłem i rozpocząłem przygodę z Arduino UNO. Na razie korzystałem z gotowych programów i przykładów. Ale czas iść nieco naprzód... Próbuję poznać język Arduino (jestem jeszcze bardzo "zielony" z programowania C++ - czytam książki, poradniki, oglądam filmiki. I tu utknąłem... 

Otóż mam problem (nie wiem jak je ugryźć) z pętlami i pętlami w pętli i jeszcze bardziej zagnieżdżonymi...

Chciałbym zrobić układ sterujący wykorzystujący PWM. Układ miałby pracować w cyklu:
wyjścia PWM 1, PWM 2, PWM 3 (oczywiście wartości będą większe)
0,0,0
1,0,0
2,0,0
3,0,0
2,0,0
1,0,0
0,1,0
1,1,0
2,1,0
3,1,0
2,1,0
1,1,0
0,2,0
1,2,0
2,2,0
3,2,0
2,2,0
1,2,0
0,3,0

itd

Fragment kodu:

31 void loop() { //pętla główna programu
32 for (int i = 0; i < 3; i++) //pętla wykonywana 3
33 {
34 analogWrite(PWM1, i); //nastawa wypełnienia PWM1
35 delay(time); //opóźnienie
36 }
37 for (int i = 3; i > 0; i--) //pętla wykonywana 3 razy
38 {
39 analogWrite(PWM1, i); //nastawa wypełnienia PWM1
40 delay(time); //opóźnienie
41 }

Kod zwiększa a potem zmniejsza mi wartość PWM1. TU jest ok.

znalazłem alternatywę tegoż kodu:

void loop() {
  static int i;
  static int increment = 1;
 
  if (i == 0) {increment = 1;}
  else if (i == 3) {increment = -1;}
 
  i = i + increment;
} 

I chodzi mi o to, żeby po każdym wykonaniu tej pętli (zwiększania i zmiejszania współczynnika) zwiększało zawartość zmiennej (j) sterującej wyjściem analogWrite(PWM2, j) o jeden, ALE po dojściu do wartości 3 wykonywało odejmowanie (zmniejszanie wartości wypełnienia PWM2) do zera - ale co jeden w każdym zwiększeniu i zmiejszeniu współczynnika analogWrite(PWM1, i).
I żeby ta sama zależność występowała w analogWrite(PWM3, k) w stosunku do analogWrite(PWM2, j).
Jak to ująć w kod i gdzie go wkleić? Czy możecie naprowadzić mnie na trop?

Pozdrawiam.

komentarz 29 marca 2022 przez Oscar Nałogowiec (29,320 p.)
edycja 29 marca 2022 przez Oscar

Jeśli dopiero zaczynasz z programowaniem, IMHO lepiej jest zacząć od normalnych środowisk desktopowych, nauczyć się programowania a następnie przejść na Arduino. Jest ono dość specyficzne i chyba w tą stronę jest łatwiej.

O ile wiem w środowisku arduino program składa się z 2 funkcji - setup() i loop(). Pierwsza jest wołana raz na starcie i powinna wszystko ustawić (np. kierunki portów, timery itp) a druga jest wołana potem.

Oba kody powinny działać podobnie, pierwszy wykonuje cały cykl w góre i w dół za jednym wykonaniem funkcji, drugi na jednym wywołaniem wykonuje jedną zmianę.

Brakuje mu jedynie wpisania wyniku do PWM i jakiegoś opóźnienia określającego tempo zmian - gdzieś tuż przed zamykającą klamerką.

Osobiście zaproponowałbym jeszcze inny kod:

void loop() {
  static int idx = 0;
  static const int wave[] = {0, 1, 2, 3, 2, 1}
  
  idx ++;
  if (idx >= (sizeof(wave)/sizeof(wave[0])))
      idx = 0;
  analogWrite(PWM1, wave[idx]);
  delay(time);
}

W ten sposób masz możliwość zdefiniowania sekwencji wartości PWM w dowolny sposób.

To jest oczywiście odpowiednik tego co pokazałeś. By natomiast sterować kilkoma PWM w sposób taki jak rosną cyferki w liczniku trzeba ten kod zagłębić:

void loop() {
  static int idx1 = 0;
  static int idx2 = 0;
  static int idx3 = 0;
  static const int wave[] = {0, 1, 2, 3, 2, 1}
  
  idx1 ++;
  if (idx1 >= (sizeof(wave)/sizeof(wave[0])))
  {
      /* przepelnienie cyklu pierwszego licznika - inkrementacja drugiego */
      idx1 = 0;
      idx2 ++;
      if (idx2 >= (sizeof(wave)/sizeof(wave[0])))
      {
          /* przepelnienie cyklu drugiego licznika - inkrementacja trzeciego */
          idx2 = 0;
          idx3++;
          if (idx3 >= (sizeof(wave)/sizeof(wave[0])))
          {
             /* przepelnienie cyklu trzeciego licznika - czwartego juz nie ma */
             idx3 = 0;
          }
          analogWrite(PWM3, wave[idx3]);
      }
      analogWrite(PWM2, wave[idx2]);
  }
  analogWrite(PWM1, wave[idx1]);
  delay(time);
}

Tutaj wszystkie liczniki realizują taki sam cykl bo wszystkie korzystają z tej samej tablicy, ale można to też rozdzielić.

Kodów nie sprawdzałem - więc jeśli wystąpiły jakieś błędy to przepraszam.

komentarz 29 marca 2022 przez VBService Ekspert (253,340 p.)

Pisząc  (tekst na czerwono)

wyjścia PWM 1, PWM 2, PWM 3 (oczywiście wartości będą większe)

co masz na myśli?

komentarz 29 marca 2022 przez Oscar Nałogowiec (29,320 p.)
Zgaduję, że chodzi o to, że PWM akceptuje zwykle wartości 0-255 albo 0-16384, zależnie jaki timer jest użyty.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
2 odpowiedzi 978 wizyt
pytanie zadane 22 stycznia 2021 w C i C++ przez Karson Obywatel (1,000 p.)
0 głosów
3 odpowiedzi 1,004 wizyt
pytanie zadane 2 maja 2020 w Python przez lenzo1 Początkujący (360 p.)
0 głosów
1 odpowiedź 765 wizyt
pytanie zadane 24 czerwca 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...