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

Powtarzanie kilka razy Arduino

Object Storage Arubacloud
0 głosów
1,256 wizyt
pytanie zadane 29 września 2017 w Mikrokontrolery przez niezalogowany

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 2017 przez Michał Kozłowski Obywatel (1,440 p.)
wybrane 10 listopada 2017
 
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 2017 przez niezalogowany
Dzięki
+1 głos
odpowiedź 29 września 2017 przez niezalogowany

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ź 910 wizyt
pytanie zadane 15 października 2017 w Grafika i multimedia przez DODO Bywalec (2,950 p.)
0 głosów
2 odpowiedzi 6,985 wizyt
pytanie zadane 21 września 2017 w C i C++ przez Resmittieno Początkujący (280 p.)
+1 głos
2 odpowiedzi 1,364 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...