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

Powtarzanie kilka razy Arduino

0 głosów
233 wizyt
pytanie zadane 29 września 2017 w Arduino przez Wojciech Radtke Bywalec (2,270 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 2017 przez Michał Kozłowski Obywatel (1,440 p.)
wybrane 10 listopada 2017 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 2017 przez Wojciech Radtke Bywalec (2,270 p.)
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ź 102 wizyt
pytanie zadane 15 października 2017 w Grafika i multimedia przez DODO Bywalec (2,820 p.)
0 głosów
2 odpowiedzi 426 wizyt
pytanie zadane 21 września 2017 w C i C++ przez Resmittieno Początkujący (280 p.)
+1 głos
2 odpowiedzi 237 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,850 p.)
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

54,387 zapytań

98,241 odpowiedzi

202,064 komentarzy

26,700 pasjonatów

Przeglądających: 177
Pasjonatów: 5 Gości: 172

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.

...