Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Stroboskop power led pod Arduino

13 Nov 2019 13:30 585 10
  • Level 3  
    Witam serdecznie.
    Jest to mój pierwszy post tutaj więc proszę o wyrozumiałość. Od krótkiego czasu bawię sie mikrokontrolerem Arduino Uno r3, zakupiłem pakiet startowy i przeszedłem samouczek.
    Chciałbym stworzyć policyjny stroboskop do auta na akumulator dla mojego dziecka. Zakupiłem diody power LED 3W 700mA czerwone i niebieskie. Niebieskie-Napięcie zasilania 3.2V-3.7V. czerwone-Napięcie zasilania 2.2V-2.6V.
    W sumie po 4 sztuki z każdego koloru, po dwa na przód i dwa na tył. Samochód zasilany jest akumulatorem 12v.
    Pomóżcie jak to podłączyć żeby działało:)
    Na pewno potrzebuje tranzystory lub przekaźniki nie wiem do końca tylko jakie:)
    Czego jeszcze mi brakuje (poza wiedzą)?
    Z góry dziękuję za pomoc.
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • Helpful post
    Level 41  
    Witam,
    podejść jest kilka, możesz posłużyć się gotowymi modułami i sugerując się, jak są one zbudowane rozwinąć to co masz.
    Można podejść od zera i wtedy:
    - nie da się obciążyć arduino takimi mocami, więc potrzebujesz dodatkowe tranzystory, mogą być zarówno npn, jak i mosfet, tu nie walczymy o jakieś super rozwiązanie. Jeżeli chodzi o parametry, to wybrany tranzystor musi bez problemu wytrzymać zadane warunki najlepiej z zapasem, czyli u ciebie 12V/700mA. Jeżeli łączysz diody równolegle to odpowiednio większy prąd. Masz 4 diody danego koloru, w przypadku niebieskich wygląda, że powinieneś dać 2 LED szeregowo i dwa takie układy równolegle z małym rezystorem ograniczającym prąd.
    - Z kodem sobie poradzisz? Jeżeli ma to tylko migać, to wystarczy zwykły delay(), jeżeli zmienna częstotliwość, dodaj potencjometr na ADC i jego wartość wpływa na długość delay(). Bardziej rozbudowany np. ze ściemnianiem czy płynnym przechodzeniem jak wyżej, ale sterowanie nie stanem H/L a PWM.
    https://learn.sparkfun.com/tutorials/transistors/applications-i-switches
    http://www.bajdi.com/dimming-power-leds-with-arduino/
    http://blog.funtronics.it/index.php?id=drive-a-led-strip-with-arduino
    Pozdrawiam
  • Level 3  
    Po pierwsze dziękuję za odpowiedź.
    Po drugie myślę że z kodem sobie poradzę (jak coś to już wiem gdzie mogę poprosić o pomoc)
    Myślę że samo miganie wystarczy, chodź pewno po pewnym czasie będę chciał to ulepszyć znając siebie:)
    Co do tranzystorów co myślisz o tym:
    AO3423 TRANZYSTOR P-MOSFET -20V -2A 900mW SOT23
    Lub:
    IRLB8721 N-MOSFET 30V 62A 65W
    To jest ten z linka który podałeś.
    Ps. Podałbym linki do allegro ale mam za mało postów więc nie mogę
  • Level 38  
    Adamevo8 wrote:
    Po pierwsze dziękuję za odpowiedź.
    Po drugie myślę że z kodem sobie poradzę (jak coś to już wiem gdzie mogę poprosić o pomoc)
    Myślę że samo miganie wystarczy, chodź pewno po pewnym czasie będę chciał to ulepszyć znając siebie:)
    Co do tranzystorów co myślisz o tym:
    AO3423 TRANZYSTOR P-MOSFET -20V -2A 900mW SOT23
    Lub:
    IRLB8721 N-MOSFET 30V 62A 65W
    To jest ten z linka który podałeś.
    Ps. Podałbym linki do allegro ale mam za mało postów więc nie mogę


    Myślę że napotkasz więcej problemów niż się spodziewasz.
    Ten pierwszy tranzystor (MOSFET-P-type), odrzuc/zrezygnuj z niego, bo tu się on nie nadaje.
    Musiałbyś go włączyc po stronie wysokiej - taka potrzeba tu nie występuje, ponadto potrzebowałbyś drugi tranzystor aby nim sterować.
    Ten drugi mosfet typu N(Logic Level) będzie bardziej stosowny.
    Problem jednak wystąpi w zasilaniu samych diod LED.
    Nie jest sensowne stosowanie dodatkowych rezystorów ograniczających prąd bo to będą raczej grzejniki.
    Rezystory ograniczające prąd spełniają swoją rolę przy diodach sygnalizacyjnych, gdzie prąd nie przekracza 20 mA.
    U ciebie ten prąd będzie raczej wielokrotnie wyższy i celowym byłoby zastosowanie odpowiednich driverow LED pracujących w stylu przełączającym (switching PWM) dostarczający prąd i napięcie o stałej wartości doregulowane do wymogów odbiornika.
    Nie musisz w tym momencie wnikać w szczegóły ich pracy.
    Przestudiuj ten Y/T video-clip:
    https://www.youtube.com/watch?v=piET0Biqo0

    Wtedy tranzystor zastosujesz jako klucz przełączający (migacz)..
    --------------------------
    Edit:
    Skoro z góry zakładasz przerókę/upgrade projektu, to warto byłoby zainteresować się diodami typu: WS2812 RGB, które nawet przy zasilaniu 5V dają relatywnie dużo światła i co dość tu istotne; dowolny kolor(!). Mając źródlo 12-Voltowe, nie jest problemem uzyskać relatywnie tanim kosztem dostatecznie wydajne źródło 5-Voltowe do zasilenia kilku/nawet kilkunastu WS2812B. Zasilacz należy liczyć 60mA na 1 diodę RGB
    Nie będą tu potrzebne żadne dodatkowe sterowniki, tranzystory, etc.
    Sterowanie bezpośrednie z Arduino (przez jeden rezystor 330 ohmów (małej mocy)- jedna tylko linia + zasilanie 5V.
    Patrz projekt:
    https://www.hackster.io/bigboystoys13/led-emergency-lights-using-ws2812-rgb-led-module-9800de

    e marcus
  • Level 3  
    emarcus wrote:

    Skoro z góry zakładasz przerókę/upgrade projektu, to warto byłoby zainteresować się diodami typu: WS2812 RGB, które nawet przy zasilaniu 5V dają relatywnie dużo światła i co dość tu istotne; dowolny kolor(!). Mając źródlo 12-Voltowe, nie jest problemem uzyskać relatywnie tanim kosztem dostatecznie wydajne źródło 5-Voltowe do zasilenia kilku/nawet kilkunastu WS2812B. Zasilacz należy liczyć 60mA na 1 diodę RGB
    Nie będą tu potrzebne żadne dodatkowe sterowniki, tranzystory, etc.
    Sterowanie bezpośrednie z Arduino (przez jeden rezystor 330 ohmów (małej mocy)- jedna tylko linia + zasilanie 5V.
    Patrz projekt:

    marcus


    Dziękuję bardzo.

    Myślę że pójdę tym tropem, zaraz zamawiam diody WS2812, rezystor 330 ohmów mam.
    planuję 6 diod na przód i 6 na tył (po trzy diody na lewą i prawą stronę auta).
    aby zejść napięciem z 12V na 5V co proponujesz??
  • Helpful post
    Level 41  
    Witam,
    do czego te 5V, na Arduino masz stabilizator 5V i możesz go wykorzystać, oczywiście kilkadziesiat-100mA do paru LED się nada, jeżeli większe prądy to zewnętrzny 7805 lub podobny na ewentualnym radiatorze przy większych prądach.
    Na portalu dalekowschodnim są takie moduły, może być impulsowy, wtedy się będzie mniej grzał np. jakiś LM2576.
    Pozdrawiam
  • Helpful post
    Level 38  
    Adamevo8 wrote:


    Myślę że pójdę tym tropem, zaraz zamawiam diody WS2812 (*), rezystor 330 ohmów mam.
    planuję 6 diod na przód i 6 na tył (po trzy diody na lewą i prawą stronę auta).
    aby zejść napięciem z 12V na 5V co proponujesz??


    Możesz jeszcze dalej uprościć ten projekt, rezygnując ze specjalnego 5-Voltowego zasilacza dla diod i zastosować diody (*) 12-Voltowe WS2815 . Te są minimalnie droższe niż te poprzednie.
    Za 1-metrowy (30 diod) pasek nieuszczelniony od wilgoci (naturalnie najtańszy), zapłacisz około $5; być może z darmową przesyłką.
    Możesz ten pasek ciąć i układać segmenty w dowolnej konfiguracji i później połączyć w jedną ciągłośc.

    Jeżeli jednak pozostaniesz przy 5 Voltach to przyzwoity zasilacz byłby wystarczający: Max DC-DC XL4005E1 Step 5A Down Adjustable Power Supply Module LED Lithium Charger board . Znajdziesz taki za tanie pieniądze; jednak mogą coś doliczyć za wysyłkę.
    Albo nawet XH-M404 4-40V 8A Module Digital PWM Adjustabl DC-DC Step Down DC ; ten jest troche droższy, lecz wyraźnie wydajniejszy prądowo. Jeżeli majsterkujesz w electronice to oba będą przydatne. Zamawiając części z tego samego miejsca, koszt przesyłki jest doliczany tylko jeden raz.

    e marcus
  • Level 3  
    A to się nada??
    allegro*pl/oferta/przetwornica-dc-dc-step-down-xl4015e1-0-5a-0-8-30v-8446861218

    Lub ten 7805??
    Co lepsze??
  • Helpful post
    Level 38  
    Adamevo8 wrote:
    A to się nada??
    allegro*pl/oferta/przetwornica-dc-dc-step-down-xl4015e1-0-5a-0-8-30v-8446861218

    Lub ten 7805??
    Co lepsze??

    W dzisiejszym czasie ludzie powinni zapomnieć o liniowych regulatorach napięcia typu 7805.
    Goły taki regulator potrzebuje dodatkowo kilka kondensatorów aby na nim zbudować zasilacz.
    Wymagana nadwyżka napięcia nie może być zbyt mała bo nie będzie pracował, a także nie może być zbyt duża bo wystąpią duże straty przeznaczone na grzanie. Różnica napięć, razy prąd obciążenia to czyste straty.
    Ta oferta wyżej to przetwornica w trybie przełączającym z dodatkową w relatywnie szerokim zakresie regulacją napięcia wyjściowego, co wpływa na jej universalność. Dodatkowa opcja regulacji maxymalnego prądu jest przydatna w zastosowaniu jako ładowarka ogniw.
    W twoim zastosowaniu ta opcja nie będzie potrzebna/wykorzystana.

    P.s. ta przytoczona aukcja ma 'nie-przeciętne' przebicia cenowe (!!!) ...
    Blisko 20 zł, za "coś" co inni oferują za nie wiele ponad $2; również po wliczonym koszcie wysyłki.
    Porównaj, idenyczny ten sam produkt:
    https://www.aliexpress.com/item/32992636885.h...chweb0_0,searchweb201602_5,searchweb201603_55
    To porównanie nie jest oczywiście żadnym supportem tych ogłoszeń handlowych dla przykładowych dystrybutorów.

    e marcus
  • Level 3  
    Rozumiem. Zamówione z aliexpress teraz tylko czekać na dostawę.
    Dam znać jak przyjdzie i to ogarnę.
    Póki co dzięki wielkie za pomoc.
  • Level 3  
    Witam. Odziwo szybko przyszła przesyłka. Dziś zająłem się podłączaniem. Na przód dałem 8 diod a na tył 4.
    Zaopatrzyłem się w między czasie w matrycę LED tak aby z tyłu autka wyświetlać napis: POLICJA JEDŹ ZA MNĄ . :)

    Teraz opiszę kolejny mój kłopot i zarazem pytanie:
    Chciałbym pod jeden pin w Arduino podłączyć ledy przednie, pod drugi pin ledy tylnie i pod kolejne matrycę LED.
    Mam trzy osobne programy i każdy z nich działa zgodnie z moimi oczekiwaniami. Czy Arduino ogarnie wszystkie trzy programy na raz a jeśli tak to jak je połączyć??

    Dodano po 1 [minuty]:

    diody przód:
    /*
    * NOTE: The code below is based on the "strandtest" example that comes with
    * the Adafruit NeoPixel library. I left in most of the original comments.
    */

    // Left as-is from the example
    #include <Adafruit_NeoPixel.h>
    #ifdef __AVR__
    #include <avr/power.h>
    #endif
    #define PIN 6

    // All of this stuff below is from the example
    // Parameter 1 = number of pixels in strip
    // Parameter 2 = Arduino pin number (most are valid)
    // Parameter 3 = pixel type flags, add together as needed:
    // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
    // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
    // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
    // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800);

    //NOTE: I tested this code with an 8 LED module, but you should be able to daisy chain multiple modules
    //NOTE: Try changing the "8" to "4" to see how it reacts.

    // This warning is from the example, probably worth considering
    // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
    // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
    // and minimize distance between Arduino and first pixel. Avoid connecting
    // on a live circuit...if you must, connect GND first.

    void setup() {
    // This stuff is from the example, I commented it out since I am not using a Trinket
    // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
    //#if defined (__AVR_ATtiny85__)
    // if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
    //#endif
    // End of trinket special code
    strip.begin();
    strip.show();
    }

    void loop() {
    /*
    * For strip.Color(R, G, B), use 0-255 to set intensity
    * for each color (R)ed, (G)reen, (B)lue
    *
    * The last number is a delay 0-255 range.
    */

    // These are left/right signals


    // These are side to side or wig/wag

    WigWag(strip.Color(0, 0, 255), 127); // Blue medium
    WigWag(strip.Color(0, 0, 255), 255); // Blue slowest

    ClearLights();
    delay(1000);
    // This is a 2 color wigwag
    WigWag2(strip.Color(0, 0, 255), strip.Color(255, 0, 0), 200); // Blue and Red
    ClearLights();
    delay(1000);



    }

    void ArrowRight(uint32_t c, uint8_t wait) {
    for (int j = 0; j < 4; j++) { // The j<# determines how many cycles
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
    }
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);
    }
    }

    void ArrowLeft(uint32_t c, uint8_t wait) {
    for (int j = 0; j < 4; j++) { // The j<# determines how many cycles
    for (uint16_t i = strip.numPixels(); i + 1 > 0 ; i--) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
    }
    for (uint16_t i = strip.numPixels(); i + 1 > 0 ; i--) {
    strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);
    }
    }

    void WigWag(uint32_t c, uint8_t wait) {
    for (int j = 0; j < 10; j++) { // The j<# determines how many cycles
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, c);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);

    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, c);
    }
    strip.show();
    delay(wait);
    }
    }


    void WigWag2(uint32_t c, uint32_t c2, uint8_t wait) {
    for (int j = 0; j < 20; j++) { // The j<# determines how many cycles
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, c);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);

    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, c2);
    }
    strip.show();
    delay(wait);
    }
    }

    void ClearLights() {
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0); //turn every pixel off
    }
    strip.show();
    }

    void BlinkOuter(uint32_t c, uint8_t wait) {
    for (int j = 0; j < 10; j++) { // The j<# determines how many cycles
    strip.setPixelColor(strip.numPixels() - 1, c);
    strip.setPixelColor(0, c);
    strip.show();
    delay(wait);
    strip.setPixelColor(strip.numPixels() - 1, 0);
    strip.setPixelColor(0, 0);
    strip.show();
    delay(wait);
    }
    }

    void OnOuter(uint32_t c) {
    strip.setPixelColor(strip.numPixels() - 1, c);
    strip.setPixelColor(0, c);
    strip.show();
    delay(3000);
    }


    diody tył:

    /*
    * NOTE: The code below is based on the "strandtest" example that comes with
    * the Adafruit NeoPixel library. I left in most of the original comments.
    */

    // Left as-is from the example
    #include <Adafruit_NeoPixel.h>
    #ifdef __AVR__
    #include <avr/power.h>
    #endif
    #define PIN 4

    // All of this stuff below is from the example
    // Parameter 1 = number of pixels in strip
    // Parameter 2 = Arduino pin number (most are valid)
    // Parameter 3 = pixel type flags, add together as needed:
    // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
    // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
    // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
    // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(4, PIN, NEO_GRB + NEO_KHZ800);

    //NOTE: I tested this code with an 8 LED module, but you should be able to daisy chain multiple modules
    //NOTE: Try changing the "8" to "4" to see how it reacts.

    // This warning is from the example, probably worth considering
    // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
    // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
    // and minimize distance between Arduino and first pixel. Avoid connecting
    // on a live circuit...if you must, connect GND first.

    void setup() {
    // This stuff is from the example, I commented it out since I am not using a Trinket
    // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
    //#if defined (__AVR_ATtiny85__)
    // if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
    //#endif
    // End of trinket special code
    strip.begin();
    strip.show();
    }

    void loop() {
    /*
    * For strip.Color(R, G, B), use 0-255 to set intensity
    * for each color (R)ed, (G)reen, (B)lue
    *
    * The last number is a delay 0-255 range.
    */

    // These are left/right signals


    // These are side to side or wig/wag

    WigWag(strip.Color(255, 0, 0), 200); // Blue medium
    WigWag(strip.Color(255, 0, 0), 200); // Blue slowest

    ClearLights();
    delay(1000);
    // This is a 2 color wigwag




    }

    void ArrowRight(uint32_t c, uint8_t wait) {
    for (int j = 0; j < 4; j++) { // The j<# determines how many cycles
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
    }
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);
    }
    }

    void ArrowLeft(uint32_t c, uint8_t wait) {
    for (int j = 0; j < 4; j++) { // The j<# determines how many cycles
    for (uint16_t i = strip.numPixels(); i + 1 > 0 ; i--) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
    }
    for (uint16_t i = strip.numPixels(); i + 1 > 0 ; i--) {
    strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);
    }
    }

    void WigWag(uint32_t c, uint8_t wait) {
    for (int j = 0; j < 10; j++) { // The j<# determines how many cycles
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, c);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);

    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, c);
    }
    strip.show();
    delay(wait);
    }
    }


    void WigWag2(uint32_t c, uint32_t c2, uint8_t wait) {
    for (int j = 0; j < 20; j++) { // The j<# determines how many cycles
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, c);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);

    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, c2);
    }
    strip.show();
    delay(wait);
    }
    }

    void ClearLights() {
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0); //turn every pixel off
    }
    strip.show();
    }

    void BlinkOuter(uint32_t c, uint8_t wait) {
    for (int j = 0; j < 10; j++) { // The j<# determines how many cycles
    strip.setPixelColor(strip.numPixels() - 1, c);
    strip.setPixelColor(0, c);
    strip.show();
    delay(wait);
    strip.setPixelColor(strip.numPixels() - 1, 0);
    strip.setPixelColor(0, 0);
    strip.show();
    delay(wait);
    }
    }

    void OnOuter(uint32_t c) {
    strip.setPixelColor(strip.numPixels() - 1, c);
    strip.setPixelColor(0, c);
    strip.show();
    delay(3000);
    }

    Napis:

    // Program to demonstrate the MD_Parola library
    //
    // Display messages in the zones. Wait for each zone to display before continuing
    //
    // Animation speed can be controlled using a pot on pin SPEED_IN
    //
    // MD_MAX72XX library can be found at https://github.com/MajicDesigns/MD_MAX72XX
    //

    #include <MD_Parola.h>
    #include <MD_MAX72xx.h>
    #include <SPI.h>

    #include "Parola_Fonts_data.h"

    // Define the number of devices we have in the chain and the hardware interface
    // NOTE: These pin numbers will probably not work with your hardware and may
    // need to be adapted
    #define HARDWARE_TYPE MD_MAX72XX::FC16_HW
    #define MAX_DEVICES 5
    #define NUM_ZONES 1

    #define ZONE_SIZE (MAX_DEVICES/NUM_ZONES) // integer multiple works best

    #define CLK_PIN 13
    #define DATA_PIN 11
    #define CS_PIN 10

    // Hardware SPI connection
    MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
    // Arbitrary output pins
    // MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

    #define SPEED_TIME 25
    #define PAUSE_TIME 1000

    // Turn on debug statements to the serial output
    #define DEBUG 1

    #if DEBUG
    #define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
    #define PRINTS(x) Serial.print(F(x))
    #define PRINTX(x) Serial.println(x, HEX)
    #else
    #define PRINT(s, x)
    #define PRINTS(x)
    #define PRINTX(x)
    #endif

    // Global variables
    uint8_t curText;
    const char *pc[] =
    {
    "POLICJA",
    "JEDZ",
    "ZA",
    "MNA",
    "POLICE",
    "FOLLOW",
    "ME",
    "! ! ! ! !",


    };


    uint8_t curFX = 0;
    textEffect_t effect[] =
    {
    PA_PRINT,
    PA_SCAN_HORIZ,
    PA_SCROLL_LEFT,
    PA_WIPE,
    PA_RANDOM,
    PA_SCROLL_UP_LEFT,
    PA_SCROLL_UP,
    PA_FADE,
    PA_OPENING_CURSOR,
    PA_GROW_UP,
    PA_SCROLL_UP_RIGHT,
    PA_BLINDS,
    PA_MESH,
    PA_CLOSING,
    PA_GROW_DOWN,
    PA_SCAN_VERT,
    PA_SCROLL_DOWN_LEFT,
    PA_WIPE_CURSOR,
    PA_DISSOLVE,
    PA_OPENING,
    PA_CLOSING_CURSOR,
    PA_SCROLL_DOWN_RIGHT,
    PA_SCROLL_RIGHT,
    PA_SLICE,
    PA_SCROLL_DOWN,
    };

    void setup(void)
    {
    #if DEBUG
    Serial.begin(57600);
    PRINTS("[Parola Zone Mesg Demo]");
    #endif

    P.begin(NUM_ZONES);
    P.setInvert(false);

    for (uint8_t i=0; i<NUM_ZONES; i++)
    {
    P.setZone(i, ZONE_SIZE*i, (ZONE_SIZE*(i+1))-1);
    PRINT("\nZ", i);
    PRINT(" from ", ZONE_SIZE*i);
    PRINT(" to ", (ZONE_SIZE*(i+1))-1);
    }
    }

    void loop(void)
    {
    static uint8_t curZone = 0;
    uint8_t inFX = (curFX + 1) % ARRAY_SIZE(effect);
    uint8_t outFX = (curFX + 1) % ARRAY_SIZE(effect);

    PRINT("\nNew Z", curZone);
    PRINT(": ", pc[curText]);
    PRINT(" @ ", millis());
    P.displayZoneText(curZone, pc[curText], PA_CENTER, SPEED_TIME, PAUSE_TIME, effect[inFX], effect[outFX]);

    // Check for individual zone completion. Note that we check the status of the zone rather than use the
    // return status of the displayAnimate() method as the other unused zones are completed, but we
    // still need to call it to run the animations.
    while (!P.getZoneStatus(curZone))
    P.displayAnimate();

    // increment for next time
    curText = (curText + 1) % ARRAY_SIZE(pc);
    curZone = (curZone + 1) % NUM_ZONES;
    }