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

Pętla w pętli

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
767 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,340 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 (256,320 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,340 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 1,266 wizyt
pytanie zadane 22 stycznia 2021 w C i C++ przez Karson Obywatel (1,000 p.)
0 głosów
3 odpowiedzi 1,162 wizyt
pytanie zadane 2 maja 2020 w Python przez lenzo1 Początkujący (360 p.)
0 głosów
1 odpowiedź 957 wizyt
pytanie zadane 24 czerwca 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)

93,182 zapytań

142,196 odpowiedzi

322,002 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1889p. - dia-Chann
  2. 1864p. - Łukasz Piwowar
  3. 1847p. - CC PL
  4. 1843p. - Łukasz Eckert
  5. 1805p. - Tomasz Bielak
  6. 1785p. - Michal Drewniak
  7. 1777p. - Łukasz Siedlecki
  8. 1774p. - rucin93
  9. 1744p. - rafalszastok
  10. 1724p. - Adrian Wieprzkowicz
  11. 1684p. - Mikbac
  12. 1624p. - Anonim 3619784
  13. 1520p. - Marcin Putra
  14. 1368p. - ssynowiec
  15. 1258p. - Dawid128
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...