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.
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.
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.
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.
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.
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.
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
Honzik1
2019-12-29 17:06:05Pě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
Honzik1
2019-12-29 18:34:29Odkaz nefungoval, protože se na to namáčklo slovo Pro. https://pastebin.com/TNwKkXFy
Vložit komentář
* - vyžadované údaje. RSS kanál s komentáři