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

Powtarzanie kilka razy Arduino

Ultraszybki serwer VPS NVMe START
0 głosów
87 wizyt
pytanie zadane 29 września w Arduino przez Wojciech Radtke Obywatel (1,210 p.)

Chciałbym powtórzyć po kilka razy 2 rzeczy w pętli. Czy ktoś mógłby powiedzieć czym zastąpić nieprawidłowe void loop(20)? i usunąć ewentualne błędy? Proszę chociaż o naprowadzenie na właściwe rozwiązanie.
 

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(4, 6, 8, 10, 12);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO1_GLCD_WIDTH
#define LOGO2_GLCD_WIDTH

#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16

static const unsigned char PROGMEM logo1_glcd_bmp[] =
{ B00000000, B10000000,
  B00000000, B10000000,
  B00000000, B10000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B00001111, B11111000,
  B11111111, B11111111,
  B00001111, B11111000,
  B00000011, B11100000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000000, B10000000,
  B00000000, B10000000,
  B00000000, B10000000,
  B00000000, B10000000 };
  static const unsigned char PROGMEM logo2_glcd_bmp[] =
{ B00000000, B10000000,
  B00001111, B11100000,
  B00111111, B11111000,
  B00111111, B11111000,
  B00011111, B11110000,
  B00000111, B11000000,
  B00000001, B00000000,
  B00000011, B10000000,
  B00000001, B00000000,
  B00000010, B00000000,
  B00000001, B10000000,
  B00000000, B10000000,
  B00000000, B01000000,
  B00000000, B01000000,
  B00000000, B10000000,
  B00000000, B10000000 };

void setup()   {

  display.begin();
  display.setContrast(50);
  display.invertDisplay(true);
  delay(1000); 
  display.invertDisplay(false);
  delay(1000); 
  testdrawbitmap(logo1_glcd_bmp, LOGO1_GLCD_WIDTH, LOGO1_GLCD_HEIGHT);
  testdrawbitmap(logo2_glcd_bmp, LOGO2_GLCD_WIDTH, LOGO2_GLCD_HEIGHT);
}


void loop(20) {
    display.setRotation(0);
  void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  uint8_t icons[NUMFLAKES][3];
  randomSeed(666);     // whatever seed
 
  // initialize
  for (uint8_t f=0; f< NUMFLAKES; f++) {
    icons[f][XPOS] = random(display.width());
    icons[f][YPOS] = 0;
    icons[f][DELTAY] = random(5) + 1;
  }

  while (1) {
    // draw each icon
    for (uint8_t f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo1_glcd_bmp, w, h, BLACK);
    }
    display.display();
    delay(200);
    
    // then erase it + move it
    for (uint8_t f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS],  logo1_glcd_bmp, w, h, WHITE);
      // move it
      icons[f][YPOS] += icons[f][DELTAY];
      // if its gone, reinit
      if (icons[f][YPOS] > display.height()) {
  icons[f][XPOS] = random(display.width());
  icons[f][YPOS] = 0;
  icons[f][DELTAY] = random(5) + 1;
      }
    }
   }
}
}
void loop(20) {
    display.setRotation(2);
  void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  uint8_t icons[NUMFLAKES][3];
  randomSeed(666);     // whatever seed
 
  // initialize
  for (uint8_t f=0; f< NUMFLAKES; f++) {
    icons[f][XPOS] = random(display.width());
    icons[f][YPOS] = 0;
    icons[f][DELTAY] = random(5) + 1;
  }

  while (1) {
    // draw each icon
    for (uint8_t f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo2_glcd_bmp, w, h, BLACK);
    }
    display.display();
    delay(200);
    
    // then erase it + move it
    for (uint8_t f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS],  logo2_glcd_bmp, w, h, WHITE);
      // move it
      icons[f][YPOS] += icons[f][DELTAY];
      // if its gone, reinit
      if (icons[f][YPOS] > display.height()) {
  icons[f][XPOS] = random(display.width());
  icons[f][YPOS] = 0;
  icons[f][DELTAY] = random(5) + 1;
      }
    }
   }
}
}

 

2 odpowiedzi

0 głosów
odpowiedź 10 listopada przez Michał Kozłowski Obywatel (1,380 p.)
wybrane 10 listopada przez Wojciech Radtke
 
Najlepsza

Tak jak napisał shead loop pozostaw bez zmian - niech sobie ona działa :) (ta pętla)
Wielozadaniowość możesz uzyskać poprzez umiejętne wykorzystanie funkcji 
millis()

Funkcja ta zwraca stan wewnętrznego licznika (liczony w ms) zliczającego od początku włączenia platformy Arduino. 
Czyli możesz co jakiś czas pobierać tę wartość i zapisywać do zmiennej. 
Następnie porównywać tę zmienną z tym co zwróci millis() - jeżeli wartość przekroczy powiedzmy 1000ms (1s) - to co ten wskazany czas możesz coś wykonać - np. pobrać wartość z czujnika temp. i wyświetlić na wyświetlaczu.  

 

unsigned long przechwyconyCzas = millis(); 
void loop()
{

if (millis() - przechwyconyCzas >= 1000)
    {
     unsigned long przechwyconyCzas = millis(); // taki reset by znów zliczać cyklicznie czas
     //coś się dzieje fajowego :) 
    }

}


Polecam też przeczytać ten materiał (zdarzenia).
http://www.plociennik.info/index.php/informatyka/systemy-wbudowane/arduino/877-wielozadaniowosc-w-arduino

komentarz 10 listopada przez Wojciech Radtke Obywatel (1,210 p.)
Dzięki
+1 głos
odpowiedź 29 września przez shead VIP (141,060 p.)

Przede wszystkim loop() nie przyjmuje żadnych argumentów (patrz dokumentacja).

Następnie nie powinieneś używać w tej funkcji pętli które są nieskończone (while (1) jest niepoprawne)

Podobne pytania

0 głosów
1 odpowiedź 73 wizyt
0 głosów
3 odpowiedzi 546 wizyt
pytanie zadane 30 sierpnia 2015 w Arduino przez diablol Nałogowiec (25,160 p.)
0 głosów
2 odpowiedzi 131 wizyt
pytanie zadane 21 września w C i C++ przez Resmittieno Początkujący (280 p.)

41,548 zapytań

80,592 odpowiedzi

159,504 komentarzy

19,827 pasjonatów

Przeglądających: 130
Pasjonatów: 2 Gości: 128

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...