blog.ijacek007.cz

Blog o všem trochu jinak.

Dnes si ukážeme základní práci s RGB páskem ws2812 a pomocí velmi jednoduchých podmínek vytvoříme vánoční dekoraci.

Jak to celé bude vypadat a fungovat. Led pásek ws2812 je krásný v tom, že obsahuje diody se třemi krystaly, jejichž kombinací můžeme vytvořit velkou paletu barev. Navíc je každé pole s trojicí diod možné ovládat zvlášť, takže můžeme mít například několik modrých a za nimi další skupinu žlutých atd. Pro tento Led pásek je pak možné využít předpřipravených knihoven a tím nechat diody například automaticky měnit barvu. My si však ukážeme něco jiného. Vytvoříme „světelného“ hada, který bude náš obrazec postupně rozžínat a zhasínat.


Schéma zapojení desky Arduino a LED pásku WS2812.

Nejprve zapojení. To je dnes velmi jednoduché, protože k ovládání všech diod, v příkladu jich je 155, ale počet je samozřejmě na Vás, budeme potřebovat pouze jediný datový kabel. Takto bude vypadat zapojení.

Zde bych rád upozornil na nutnost silného zdroje

Mějte prosím na paměti, že pokud použijeme velké množství diod a rozsvítíme je najednou, například bílou barvou, která kombinuje všechny tři krystaly, neúměrně tím roste energetická zátěž na zdroj. Já při testování využíval laboratorní zdroj a některé obrazce si při mém počtu diod řekly i o více jak 2 A. Proto je v kódu jas snížen. Ale i tak si obrazovka řekne i o 1 A při svitu všech diod. Bez kvalitního zdroje energie se celé zapojení rozbliká a zastaví. Může také dojít k poškození přetíženého zdroje nebo Arduina.


Detail spojení Led diod které musely byt s pásku odstřiženy. Bez oddělení by se nedal udělat oblouk.

Pomocí pásku jsem tedy vytvořil dárek. Ten je vlastně jen hromada WS2810 připojených za sebou. Náš dárek se tak skládá z jednoho kusu, který tvoří tři hlavní části obrázku. Obdélník samotného dárku. Vnitřní pásku dárku a v poslední řadě mašle. Mašle bude nejsložitější, protože pásek není zrovna přívětivý k zatáčkám. Pro efekt mašle jsem tak musel 5 led diod z pásku ustřihnout a nalepit jej samostatně. Poté je pomocí pocínovaného odizolovaného kabelu spojit s ostatními. Náš program tedy bude postupně rozsvěcet diody v pořadí, jak jsou zapojeny, a v případě přeskočení na další část obrázku může změnit barvu. Nebo také nemusí. Jakmile se celý dárek rozsvítí, program počká přesně tak dlouho, jak dlouho trvalo postupné rozsvěcení a pak začne zase od začátku obrázek zhasínat.


Detail zapojení středu

Samozřejmě nemusíte zůstat jen u jediné kombinace, ale můžete barvy v části dárečku libovolně kombinovat. Já jsem například využil dceru, aby si „naprogramovala“ vlastní barvy pomocí pastelek. Jakmile viděla, že její barvy skutečně jsou vidět na dárku, chopila se pastelek a vytvořila více, jak 20 návrhu barev.


Dceřin barevný nákres programů a jejich číslo.

Programy se tak vlastně opakují a mění se jen barva obrázku. V samotných programech jsem nepoužíval nic složitého, jen jednoduché podmínky. Základem je proměna poc, což je počítadlo. Každou smyčkou se připočte jednička. Počítadlo je tady de facto jako adresa a pomocí něj se mění stav diod. Pokud je počítadlo na větší, než je počet diod, pak se začíná zhasínat. Jakmile je vše zhasnuto, funkce programu vrátí hodnotu změny a ve smyčce loop se změní program.


Pohled na rozsvícený dárek v žluté barvě.

I když by šlo počítadlo mazat nebo měnit uvnitř programu a tím vytvářet složité podprogramy a obrazce, já nechal všechny programy téměř stejné. Vždy se tedy pomalu dárek rozsvítí a poté zase zhasne. Vycházím totiž ze zapojení, které před více, jak 25 lety zapojil můj otec. Ten totiž podobný „dárek“ složil jen pomocí posuvného registru kupou diod a hromadě kabelů. Jeho předloha samozřejmě nemohla měnit barvy a musela rozsvěcet vždy stejně. I tak to byla ale velmi originální dekorace a tak já mam letos její vylepšenou verzi.


pohled na ruzné barvy v obrázku.

Mimochodem většina fotek a video vznikly v době, kdy jsem zapojení testoval na stole a laboratorním zdroji. Jakmile jsem jej chtěl dokončit do fáze, kdy by nepřipomínal malou jadernou elektrárnu a mohl se tento dárek umístit do okna, zjistil jsem několik problémů. První předpoklad byl, že dám Arduino a stabilizátor mimo dárek a budu pomocí trojice kabelu přenášet jen napájení a signál. Věděl jsem, že při plném rozsvícení i při snížení jasu si diody řeknou téměř o 1A a tak jsem hledal zdroj napájení, který by to zvládl. Na 5 voltu jsem doma žádný takový neměl a tak jsem se rozhodl použít 12V 2A napáječ. Stabilizátor jsem umístil do krabičky z Arduinem, udělal jsem asi 2,5m dlouhý kabel a led pásek přidal k němu. Ač měl zdroj deklarovanou zátěž 2A při první obrazovce se zasekl. Celý obrazec se rozblikal a po pár chvílích odešlo Arduino do křemíkového nebe.

Rozhodl jsem se nakonec nahradit zdroj spínaným zdrojem s deklarovanou životností, propojil jsem druhé Arduino a zjistil jsem, že celé zapojení nefunguje. Po delším laborování jsem zjistil, že problém je v onom 2,5m přívodním kabelu, který posílal signál, buď docházelo k rušení, nebo byl kabel někde poškozen. Ať tak či tak, musel jsem zapojení změnit a Arduino přimontovat ze zadní strany plexisklové desky, na kterou jsem celý obrazec vytvořil. Také jsem při krátkém testování zjistil, že i když diody svítí jen na omezený jas, dovede jejich počet směle suplovat několik led žárovek. Možná budu jas ještě průběžně snižovat.

// RGB LED modul WS2811

// připojení potřebné knihovny
#include <Adafruit_NeoPixel.h>
// nastavení propojovacího pinu
#define pinDI 5
// nastavení počtu LED modulů
#define pocetLED 155

int pocet_c = pocetLED;
int poc =-1;
int smer = 1; // smer 1 rozinej 0 / zhasinej
int krok;
int nech_roznute = 50 ;
int program = 0;
int zmena = 0;

// inicializace LED modulu z knihovny
Adafruit_NeoPixel rgbWS = Adafruit_NeoPixel(pocetLED, pinDI, NEO_GRB + NEO_KHZ800);

void setup() {

  Serial.begin(9600);  // zapnutí seriové komunikace

  // zahájení komunikace s LED modulem
  rgbWS.begin();

  nastavRGB(0  , 0  , 0  , 1);
  delay(500);
}
void loop() {

 Serial.print("Krok: ");
 Serial.print(poc);
 Serial.print(" program: ");
 Serial.print(program);
 zmena = programF ( program , poc);
 Serial.print(" zmena: ");
 Serial.println(zmena);

 if ( zmena == 1 )
 {


 zmena = 0;
 poc = -1;

 if(program > 25) {program = 1; }else {program ++;}

 }


poc ++;
delay(50);



}

int cervena ( int poc) {
 // cervena
  nastavRGB(100, 0, 0, poc);
}

int zluta ( int poc) {
 //zluta
  nastavRGB(60, 60, 0, poc);
 }

 int zelena ( int poc) {
 //zelena
  nastavRGB(0, 100, 0, poc);
 }

 int modra ( int poc) {
 //zelena
  nastavRGB(0, 0, 100, poc);
 }

  int bila ( int poc) {
 //bila
  nastavRGB(40, 40, 40, poc);
 }



int zhasni ( int poc) {
 //zhasni
  nastavRGB(0, 0, 0, poc);
 }

void nastavRGB (byte r, byte g, byte b, int cislo) {
  // vytvoření proměnné pro ukládání barev
  uint32_t barva;
  // načtení barvy do proměnné
  barva = rgbWS.Color(r, g, b);
  // nastavení barvy pro danou LED diodu,
  // číslo má pořadí od nuly
  rgbWS.setPixelColor(cislo, barva);
  // aktualizace barev na všech modulech
  rgbWS.show();
}

int programF (int program , int poc) {
  // program (cisloprogramu , pocitadlo)
  int zmena = 0;

  if (program == 1){
    // program anetky 1

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat
    zluta( poc);

    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }


    } else if (program == 2){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat

  if (poc > -1 and poc < 80 ){

  zluta( poc);

  }else if (poc > 79 and poc < 115){

  zelena(poc);


  }else{

  cervena(poc);

  }

    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }


    }else if (program == 3){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat

  if (poc > -1 and poc < 80 ){
  modra( poc);

  }else if (poc > 79 and poc < 115){

  zelena( poc);

  }else{

  zluta(poc);

  }

    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }



    }else if (program == 4){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat

    if (poc > -1 and poc < 80 ){
    zelena(poc);

    }else if (poc > 79 and poc < 115){

    modra(poc);


    }else{

    zelena( poc);

  }

     }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }

    }else if (program == 5){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat

  if (poc > -1 and poc < 80 ){
  modra( poc);

  }else if (poc > 79 and poc < 115){

  cervena( poc);

  }else{

   zluta( poc);

  }

     }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }

    } else if (program == 6){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat

  if (poc > -1 and poc < 80 ){
   cervena ( poc);

  }else if (poc > 79 and poc < 115){

  cervena( poc);

  }else{

    zluta(poc);

  }

      }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }


   }else if (program == 7){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


   modra( poc);

     }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
}else if (program == 8){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


   zelena( poc);

     }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }

 }else if (program == 9){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


   cervena( poc);

    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }

   }else if (program == 10){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
  modra( poc);

  }else if (poc > 79 and poc < 115){

  modra( poc);

  }else{

   cervena( poc);

  }
     }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }

   }else if (program == 11){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
  modra(poc);

  }else if (poc > 79 and poc < 115){

  modra( poc);

  }else{

zelena( poc);

  }
      }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }

   }else if (program == 12){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
  modra( poc);

  }else if (poc > 79 and poc < 115){

    zelena( poc);

  }else{

 modra( poc);

  }
    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
     }else if (program == 13){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
 zelena( poc);

  }else if (poc > 79 and poc < 115){

    cervena( poc);

  }else{

    zluta( poc);

  }
    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
       }else if (program == 14){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
 cervena( poc);

  }else if (poc > 79 and poc < 115){

   zluta( poc);

  }else{

    zelena( poc);

  }
    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
        }else if (program == 15){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
 zelena( poc);

  }else if (poc > 79 and poc < 115){

    cervena( poc);

  }else{

    modra( poc);

  }
     }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
         }else if (program == 16){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
 modra( poc);

  }else if (poc > 79 and poc < 115){

    zluta( poc);

  }else{

    cervena( poc);

  }
    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
           }else if (program == 17){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
 cervena( poc);

  }else if (poc > 79 and poc < 115){

  modra( poc);

  }else{

    zluta( poc);

  }
     }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
             }else if (program == 18){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
  modra( poc);

  }else if (poc > 79 and poc < 115){

    cervena( poc);

  }else{

   zelena( poc);

  }
     }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
             }else if (program == 19){
    // program hvezda

    if (poc < (16) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat

     if (poc == 1  ){nastavRGB(20, 20, 0, (90));}
     else if (poc ==2) {nastavRGB(40, 30, 0, (90));nastavRGB(20, 20, 0, (89));nastavRGB(20, 20, 0, (91));nastavRGB(20, 20, 0, (107));nastavRGB(20, 20, 0, (108));}
     else if (poc ==3) {nastavRGB(80, 80, 0, (90));nastavRGB(40, 40, 0, (89));nastavRGB(40, 40, 0, (91));nastavRGB(40, 40, 0, (107));nastavRGB(40, 40, 0, (108));nastavRGB(20, 20, 0, (120));nastavRGB(20, 20, 0, (121));nastavRGB(20, 20, 0, (148));nastavRGB(20, 20, 0, (149));}
     else if (poc ==4) {nastavRGB(100, 100, 0, (90));nastavRGB(60, 60, 0, (89));nastavRGB(60, 60, 0, (91));nastavRGB(60, 60, 0, (107));nastavRGB(60, 60, 0, (108));nastavRGB(40, 40, 0, (120));nastavRGB(40, 40, 0, (121));nastavRGB(40, 40, 0, (148));nastavRGB(40, 40, 0, (149));nastavRGB(20, 20, 0, (88));;nastavRGB(20, 20, 0, (92));;nastavRGB(20, 20, 0, (106));;nastavRGB(20, 20, 0, (109));;nastavRGB(20, 20, 0, (119));;nastavRGB(20, 20, 0, (122));;nastavRGB(20, 20, 0, (134));;nastavRGB(20, 20, 0, (135));nastavRGB(20, 20, 0, (147));nastavRGB(20, 20, 0, (150));}
     else if (poc ==5) {nastavRGB(120, 120, 0, (90));nastavRGB(80, 80, 0, (89));nastavRGB(80, 80, 0, (91));nastavRGB(80, 80, 0, (107));nastavRGB(80, 80, 0, (108));nastavRGB(60, 60, 0, (120));nastavRGB(60, 60, 0, (121));nastavRGB(60, 60, 0, (148));nastavRGB(60, 60, 0, (149));nastavRGB(40, 40, 0, (88));;nastavRGB(40, 40, 0, (92));;nastavRGB(40, 40, 0, (106));;nastavRGB(40, 40, 0, (109));;nastavRGB(40, 40, 0, (119));;nastavRGB(40, 40, 0, (122));;nastavRGB(40, 40, 0, (134));;nastavRGB(40, 40, 0, (135));;nastavRGB(40, 40, 0, (147));nastavRGB(40, 40, 0, (150));nastavRGB(20, 20, 0, (87));nastavRGB(20, 20, 0, (93));nastavRGB(20, 20, 0, (105));nastavRGB(20, 20, 0, (110));nastavRGB(20, 20, 0, (118));nastavRGB(20, 20, 0, (123));nastavRGB(20, 20, 0, (133));nastavRGB(20, 20, 0, (136));nastavRGB(20, 20, 0, (146));nastavRGB(20, 20, 0, (151));}
     else if (poc ==6) {nastavRGB(140, 140, 0, (90));nastavRGB(100, 100, 0, (89));nastavRGB(100, 100, 0, (91));nastavRGB(100, 100, 0, (107));nastavRGB(100, 100, 0, (108));nastavRGB(80, 80, 0, (120));nastavRGB(80, 80, 0, (121));nastavRGB(80, 80, 0, (148));nastavRGB(80, 80, 0, (149));nastavRGB(60, 60, 0, (88));;nastavRGB(60, 60, 0, (92));;nastavRGB(60, 60, 0, (106));;nastavRGB(60, 60, 0, (109));;nastavRGB(60, 60, 0, (119));;nastavRGB(60, 60, 0, (122));;nastavRGB(60, 60, 0, (134));;nastavRGB(60, 60, 0, (135));;nastavRGB(60, 60, 0, (147));nastavRGB(60, 60, 0, (150));nastavRGB(40, 40, 0, (87));nastavRGB(40, 40, 0, (93));nastavRGB(40, 40, 0, (105));nastavRGB(40, 40, 0, (110));nastavRGB(40, 40, 0, (118));nastavRGB(40, 40, 0, (123));nastavRGB(40, 40, 0, (133));nastavRGB(40, 40, 0, (136));nastavRGB(40, 40, 0, (146));nastavRGB(40, 40, 0, (151));nastavRGB(20, 20, 0, (86));nastavRGB(20, 20, 0, (94));nastavRGB(20, 20, 0, (104));nastavRGB(20, 20, 0, (111));nastavRGB(20, 20, 0, (117));nastavRGB(20, 20, 0, (124));nastavRGB(20, 20, 0, (132));nastavRGB(20, 20, 0, (137));nastavRGB(20, 20, 0, (145));nastavRGB(20, 20, 0, (152));}
     else if (poc ==7) {nastavRGB(160, 160, 0, (90));nastavRGB(120, 120, 0, (89));nastavRGB(120, 120, 0, (91));nastavRGB(120, 120, 0, (107));nastavRGB(120, 120, 0, (108));nastavRGB(100, 100, 0, (120));nastavRGB(100, 100, 0, (121));nastavRGB(100, 100, 0, (148));nastavRGB(100, 100, 0, (149));nastavRGB(80, 80, 0, (88));;nastavRGB(80, 80, 0, (92));;nastavRGB(80, 80, 0, (106));;nastavRGB(80, 80, 0, (109));;nastavRGB(80, 80, 0, (119));;nastavRGB(80, 80, 0, (122));;nastavRGB(80, 80, 0, (134));;nastavRGB(80, 80, 0, (135));;nastavRGB(80, 80, 0, (147));nastavRGB(80, 80, 0, (150));nastavRGB(60, 60, 0, (87));nastavRGB(60, 60, 0, (93));nastavRGB(60, 60, 0, (105));nastavRGB(60, 60, 0, (110));nastavRGB(60, 60, 0, (118));nastavRGB(60, 60, 0, (123));nastavRGB(60, 60, 0, (133));nastavRGB(60, 60, 0, (136));nastavRGB(60, 60, 0, (146));nastavRGB(60, 60, 0, (151));nastavRGB(40, 40, 0, (86));nastavRGB(40, 40, 0, (94));nastavRGB(40, 40, 0, (104));nastavRGB(40, 40, 0, (111));nastavRGB(40, 40, 0, (117));nastavRGB(40, 40, 0, (124));nastavRGB(40, 40, 0, (132));nastavRGB(40, 40, 0, (137));nastavRGB(40, 40, 0, (145));nastavRGB(40, 40, 0, (152));nastavRGB(20, 20, 0, (85));;nastavRGB(20, 20, 0, (95));;nastavRGB(20, 20, 0, (103));;nastavRGB(20, 20, 0, (112));;nastavRGB(20, 20, 0, (116));;nastavRGB(20, 20, 0, (125));;nastavRGB(20, 20, 0, (131));;nastavRGB(20, 20, 0, (138));;nastavRGB(20, 20, 0, (144));;nastavRGB(20, 20, 0, (153));}
     else if (poc ==8) {nastavRGB(140, 140, 0, (90));nastavRGB(100, 100, 0, (89));nastavRGB(100, 100, 0, (91));nastavRGB(100, 100, 0, (107));nastavRGB(100, 100, 0, (108));nastavRGB(80, 80, 0, (120));nastavRGB(80, 80, 0, (121));nastavRGB(80, 80, 0, (148));nastavRGB(80, 80, 0, (149));nastavRGB(60, 60, 0, (88));;nastavRGB(60, 60, 0, (92));;nastavRGB(60, 60, 0, (106));;nastavRGB(60, 60, 0, (109));;nastavRGB(60, 60, 0, (119));;nastavRGB(60, 60, 0, (122));;nastavRGB(60, 60, 0, (134));;nastavRGB(60, 60, 0, (135));;nastavRGB(60, 60, 0, (147));nastavRGB(60, 60, 0, (150));nastavRGB(40, 40, 0, (87));nastavRGB(40, 40, 0, (93));nastavRGB(40, 40, 0, (105));nastavRGB(40, 40, 0, (110));nastavRGB(40, 40, 0, (118));nastavRGB(40, 40, 0, (123));nastavRGB(40, 40, 0, (133));nastavRGB(40, 40, 0, (136));nastavRGB(40, 40, 0, (146));nastavRGB(40, 40, 0, (151));nastavRGB(20, 20, 0, (86));nastavRGB(20, 20, 0, (94));nastavRGB(20, 20, 0, (104));nastavRGB(20, 20, 0, (111));nastavRGB(20, 20, 0, (117));nastavRGB(20, 20, 0, (124));nastavRGB(20, 20, 0, (132));nastavRGB(20, 20, 0, (137));nastavRGB(20, 20, 0, (145));nastavRGB(20, 20, 0, (152));nastavRGB(0, 0, 0, (85));;nastavRGB(0, 0, 0, (95));;nastavRGB(0, 0, 0, (103));;nastavRGB(0, 0, 0, (112));;nastavRGB(0, 0, 0, (116));;nastavRGB(0, 0, 0, (125));;nastavRGB(0, 0, 0, (131));;nastavRGB(0, 0, 0, (138));;nastavRGB(0, 0, 0, (144));;nastavRGB(0, 0, 0, (153));}
     else if (poc ==9) {nastavRGB(120, 120, 0, (90));nastavRGB(80, 80, 0, (89));nastavRGB(80, 80, 0, (91));nastavRGB(80, 80, 0, (107));nastavRGB(80, 80, 0, (108));nastavRGB(60, 60, 0, (120));nastavRGB(60, 60, 0, (121));nastavRGB(60, 60, 0, (148));nastavRGB(60, 60, 0, (149));nastavRGB(40, 40, 0, (88));;nastavRGB(40, 40, 0, (92));;nastavRGB(40, 40, 0, (106));;nastavRGB(40, 40, 0, (109));;nastavRGB(40, 40, 0, (119));;nastavRGB(40, 40, 0, (122));;nastavRGB(40, 40, 0, (134));;nastavRGB(40, 40, 0, (135));;nastavRGB(40, 40, 0, (147));nastavRGB(40, 40, 0, (150));nastavRGB(20, 20, 0, (87));nastavRGB(20, 20, 0, (93));nastavRGB(20, 20, 0, (105));nastavRGB(20, 20, 0, (110));nastavRGB(20, 20, 0, (118));nastavRGB(20, 20, 0, (123));nastavRGB(20, 20, 0, (133));nastavRGB(20, 20, 0, (136));nastavRGB(20, 20, 0, (146));nastavRGB(20, 20, 0, (151));nastavRGB(0, 0, 0, (86));nastavRGB(0, 0, 0, (94));nastavRGB(0, 0, 0, (104));nastavRGB(0, 0, 0, (111));nastavRGB(0, 0, 0, (117));nastavRGB(0, 0, 0, (124));nastavRGB(0, 0, 0, (132));nastavRGB(0, 0, 0, (137));nastavRGB(0, 0, 0, (145));nastavRGB(0, 0, 0, (152));}
     else if (poc ==10) {nastavRGB(100, 100, 0, (90));nastavRGB(60, 60, 0, (89));nastavRGB(60, 60, 0, (91));nastavRGB(60, 60, 0, (107));nastavRGB(60, 60, 0, (108));nastavRGB(40, 40, 0, (120));nastavRGB(40, 40, 0, (121));nastavRGB(40, 40, 0, (148));nastavRGB(40, 40, 0, (149));nastavRGB(20, 20, 0, (88));;nastavRGB(20, 20, 0, (92));;nastavRGB(20, 20, 0, (106));;nastavRGB(20, 20, 0, (109));;nastavRGB(20, 20, 0, (119));;nastavRGB(20, 20, 0, (122));;nastavRGB(20, 20, 0, (134));;nastavRGB(20, 20, 0, (135));;nastavRGB(20, 20, 0, (147));nastavRGB(20, 20, 0, (150));nastavRGB(0, 0, 0, (87));nastavRGB(0, 0, 0, (93));nastavRGB(0, 0, 0, (105));nastavRGB(0, 0, 0, (110));nastavRGB(0, 0, 0, (118));nastavRGB(0, 0, 0, (123));nastavRGB(0, 0, 0, (133));nastavRGB(0, 0, 0, (136));nastavRGB(0, 0, 0, (146));nastavRGB(0, 0, 0, (151));}
     else if (poc ==11) {nastavRGB(80, 80, 0, (90));nastavRGB(40, 40, 0, (89));nastavRGB(40, 40, 0, (91));nastavRGB(40, 40, 0, (107));nastavRGB(40, 40, 0, (108));nastavRGB(20, 20, 0, (120));nastavRGB(20, 20, 0, (121));nastavRGB(20, 20, 0, (148));nastavRGB(20, 20, 0, (149));nastavRGB(0, 0, 0, (88));;nastavRGB(0, 0, 0, (92));;nastavRGB(0, 0, 0, (106));;nastavRGB(0, 0, 0, (109));;nastavRGB(0, 0, 0, (119));;nastavRGB(0, 0, 0, (122));;nastavRGB(0, 0, 0, (134));;nastavRGB(0, 0, 0, (135));;nastavRGB(0,0, 0, (147));nastavRGB(0, 0, 0, (150));}
     else if (poc ==12) {nastavRGB(60, 60, 0, (90));nastavRGB(20, 20, 0, (89));nastavRGB(20, 20, 0, (91));nastavRGB(20, 20, 0, (107));nastavRGB(20, 20, 0, (108));nastavRGB(0, 0, 0, (120));nastavRGB(0, 0, 0, (121));nastavRGB(0, 0, 0, (148));nastavRGB(0, 0, 0, (149));}
     else if (poc ==13) {nastavRGB(40, 40, 0, (90));nastavRGB(0, 0, 0, (89));nastavRGB(0, 0, 0, (91));nastavRGB(0, 0, 0, (107));nastavRGB(0, 0, 0, (108));}
     else if (poc ==14) {nastavRGB(20, 20, 0, (90));}
     else if (poc ==15) {nastavRGB(0, 0, 0, (90));}


  }else{
 zmena= 1;
  }

               }else if (program == 20){
     // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 cervena( poc);

  }else if( poc > (pocetLED) and poc < ((pocetLED+1)*2) ){
  // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

  modra((poc-pocetLED));


  }else if( poc > (pocetLED) and poc < ((pocetLED+1)*3) ){
  // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

 bila(poc-(pocetLED*2)-1);


  }else if( poc > (pocetLED) and poc < ((pocetLED+1)*4) ){
  // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

  zhasni( poc-(pocetLED*3)-3);

  }else{
 zmena= 1;

  }
   } else if (program == 21){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
  bila( poc);

  }else if (poc > 79 and poc < 115){

    zluta( poc);

  }else{

   modra( poc);

  }
    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
    }else if (program == 22){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
  modra( poc);

  }else if (poc > 79 and poc < 115){

    zelena( poc);

  }else{

   bila( poc);

  }
    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
    }else if (program == 23){
    // program anetky

    if (poc < (pocetLED+1) ){
    // pokud je pocet kroku mensi nez diody budeme vse rozinat


 if (poc > -1 and poc < 80 ){
  modra( poc);

  }else if (poc > 79 and poc < 115){

    modra( poc);

  }else{

   bila( poc);

  }
    }else if( poc > (pocetLED * 2 ) and poc < ((pocetLED+1)*3) ){
    // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

    zhasni(poc-(pocetLED*2)-1);

  }else if ( poc > (pocetLED * 3 +1 )){
  zmena= 1;
  }
  }else {
      // pokud neni definován progam pockej nekolik kroku
      // a pak zvol program 1 a vynuluj pocitadlo

      if (poc > 5 ){
        zmena= 1;


      }

   }

 return zmena;
 }

Aktualizace 31.12.2019
Díky zveřejnění odkazu na tento článek na portálu žive.cz se našel Honza který muj umyslně neoptimalizovaný kód přepsal. Novcý kód je tak o více jak 500 řádku kratší dovolím si jej zde zveřejnit i když odkaz naleznete i v komentářích níže. Honzovy za optimalizaci moc děkuji.

void (*spustProgram[])(int) = {
  bila,
  cervena,
  modra,
  zelena,
  zluta
};

int poleProgramu[22][3] = {
    { 4, 4, 4 },
    { 4, 3, 1 },
    { 2, 3, 4 },
    { 3, 2, 3 },
    { 2, 1, 4 },
    { 1, 1, 4 },
    { 2, 2, 2 },
    { 3, 3, 3 },
    { 1, 1, 1 },
    { 2, 2, 1 },
    { 2, 2, 3 },
    { 2, 3, 2 },
    { 3, 1, 4 },
    { 1, 4, 3 },
    { 3, 1, 2 },
    { 2, 4, 1 },
    { 1, 2, 4 },
    { 2, 1, 3 },
    { 1, 2, 0 },
    { 0, 4, 2 },
    { 2, 3, 0 },
    { 2, 2, 0 }

  };
int  programF2(int program, int poc)
{

    if (poc < (pocetLED + 1)) {
      // pokud je pocet kroku mensi nez diody budeme vse rozinat

      if (poc > -1 and poc < 80) {

         (*spustProgram[poleProgramu[program][0]])(poc);

      } else if (poc > 79 and poc < 115) {

       (*spustProgram[poleProgramu[program][1]])(poc);

      } else {

        (*spustProgram[poleProgramu[program][2]])(poc);

      }

    } else if (poc > (pocetLED * 2) and poc < ((pocetLED + 1) * 3)) {
      // pokud je pocet vetsi a zaroven mensi nez 2x pocet pak budeme zhasinat

      zhasni(poc - (pocetLED * 2) - 1);

    } else if (poc > (pocetLED * 3 + 1)) {
      zmena = 1;
    }
    return zmena;
}

void loop() {

  Serial.print("Krok: ");
  Serial.print(poc);
  Serial.print(" program: ");
  Serial.print(program);


  //zmena = programF(program, poc);
   zmena = programF2(program, poc);
  Serial.print(" zmena: ");
  Serial.println(zmena);

  if (zmena == 1) {

    zmena = 0;
    poc = -1;

    if (program > 25) {
      program = 1;
    } else {
      program++;
    }

  }

  poc++;
  delay(50);

}

Mohlo by Vás zajímat

Oprava vánoční výzdoby do okna


Štítky článku elektronika | programovani | zabava |
Autor Ijacek.007 02.12.2019 Opravil(a) sokorka zobrazeno 2 833x
Předchozí článek Arduino elektronická hrací kostka pomocí Nodemcu a 8x8 Led displejem
Minimalistický wifi kontrolér k led pásku WS2812 Další článek


1

Honzik1

2019-12-29 17:06:05

Pěkné, jen jsem se divil, že je to na tolik řádků. Myslím si, že spoustu věcí se v programu opakuje, takže bych to přepsal nějak takto a ušetří se cca 500 řádků kódu! https://pastebin.com/TNwKkXFyPro menší nároky na proud doporučuji na Aliexpresu pořídit pásek WS2815, který má 12V, takže pro stejný výkon ve watech stačí menší proud (P=U*I). Delší datový kabel může být problém, pak už je to jedno protože po průchodu každou LED se signál obnoví, ale 2,5m je hodně. Mezi Arduino a pásek dej rezistor 330–470 ohm: https://forum.arduino.cc/index.php


2

Honzik1

2019-12-29 18:34:29

Odkaz nefungoval, protože se na to namáčklo slovo Pro. https://pastebin.com/TNwKkXFy


gravatar

Vložit komentář

Nick *:
WWW:
Email * (nezobrazuje se ):
Gravatar:
Pamatuj si mě:
Komentář článku *:
Opiš následující text: *

* - vyžadované údaje. RSS kanál s komentáři

Přihlášení



Audioknihy

Jsme milovníci audio knížek, kterých aktuálně máme zakoupených 426. Poslech všech dohromady zabral přes 5945 hodin.

Z tohoto množství jsme si již stihli poslechnout téměř 48% tedy 203 audioknih.

Aktuálně poslouchaná audioknihakniha je Orlova kořist

Poslední hodnocenou audioknihou je Marek Dvořák: Mezi nebem a pacientem Hodnocení audioknihy 4/5.

Nejlépe hodnocenou audioknihou je Astronautův průvodce životem na Zemi Hodnocení audioknihy 4/5.

Reklama