Světelná tyč - malování světlem

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Wrchi
Příspěvky: 24
Registrován: 19 dub 2019, 23:31
Reputation: 0

Světelná tyč - malování světlem

Příspěvek od Wrchi » 31 kvě 2020, 18:42

Zdravím.
Chtěl bych vás poprosit o pomoc s kódem k výrobě světlené tyče. Mám už jednu klasickou verzi obyčejných RGB ledek s ovladáním barev. Tahle tyč umí svítit ale jen jednou navolenou barvou (plus různé druhy blikání a přechodů) Celé je to ale řešeno bez programování arduinem ale klasickým ovladačem k RGB ledkám s přepínáním IR dálkovým ovladačem z čínského shopu.
Druhá verze tyče co chci vytvořit by měla mít možnost nastavit libovolnou barvu na libovolný počet ledek. Prozatím mám na zkoušení Arduino UNO, napojený malý programovatelný LED pásek s 8mi ledkama (zbytek co jsem našel doma). Finální verze bude cca 1m dlouhá tyč se 120 programovatelnýma ledkama (celkové je to 2m led pásek, 60led na 1m, v půlce ohnutý zpátky) a použít chcu Arduino NANO. Stačí mi když budou jen svítit, nemusejí blikat nebo se měnit přechody barev. Pomocí kódu níže umím přiřadit barvy jednotlivým ledkám (8LED). Napsal bych si tak jednotlivé barevné varianty pro 120LED a pak jen podle potřeby nahrál danou barevnou variantu a tyč zapnul. Jen je to tak časově náročnější, když bych chtěl změnit barvu v terénu v místě focení. Buď předem v PC nebo přes mobil. Chtěl bych si tu změnu barevných kombinací ale trochu ulehčit. Napadla mě jestli je možná varianta nahrání třeba 5ti různých barevných kombinací, které by se jedním tlačítkem přepínaly. Tz. zapnu tyč a bude svítit varianta 1. zmáčknu tlačítko a změní se na variantu 2 atd... Co jsem zatím hledal na webech tak jim ty pásky, jen pořád blikají, mění se atd. Nebo se mi nedaří to správně pojmenovat abych našel něco co bych uměl použít Nejsem profi fotograf, mám to jen jako koníčka. A když není zrovna jasná obloha, tak bych chtěl vyplnit čas. Byl by prosím někdo kdo by mi s takovým kodem pomohl, nebo mě nějak nasměroval? Díky :)



použitý kód pro 8 LED - (6x bílá barva a 2x modrá):
---------------------------------------------------

Kód: Vybrat vše

#include <FastLED.h>
#define LED_PIN     6
#define NUM_LEDS    8
CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  
}
void loop() {
  
  leds[0] = CRGB(255, 255, 255);      //Red, green, blue
   FastLED.show();
  delay(0);  
  leds[1] = CRGB(255, 255, 255);
   FastLED.show();
  delay(0);
  leds[2] = CRGB(255, 255, 255);
   FastLED.show();
  delay(0);
  leds[3] = CRGB(255, 255, 255);
   FastLED.show();
  delay(0);
  leds[4] = CRGB(255, 255, 255);
   FastLED.show();
  delay(0);
  leds[5] = CRGB(255, 255, 255);
   FastLED.show();
  delay(0);
  leds[6] = CRGB(0, 0, 255);
   FastLED.show();
  delay(0);  
  leds[7] = CRGB(0, 0, 255);
  delay(0);
}

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Re: Světelná tyč - malování světlem

Příspěvek od ArduXPP » 02 čer 2020, 17:26

Stačí najít návod na ovladač a budeš vědět co dál :)

Uživatelský avatar
kiRRow
Příspěvky: 710
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 02 čer 2020, 17:49

Prozkoumej cyklus FOR a zjisti si něco o datových polích. Bliká a cykluje a mění se jim to, protože to mají napsáno v kódu. Když to tam nenapíšeš, tak ti to nebude blikat.

Wrchi
Příspěvky: 24
Registrován: 19 dub 2019, 23:31
Reputation: 0

Re: Světelná tyč - malování světlem

Příspěvek od Wrchi » 07 čer 2020, 20:55

Díky za nasměrování ;) Vypadá to, že se mi to povedlo. Teď jen pořešit nějaké vhodné 5V napájení aby vydrželo zátěž těch 120 ledek. Pokud bych tam měl nějaké nesmysly tak budu rát za upozornění. Zkombinoval jsem dva příklady z FastLED a NeoPixel.
Mám to vyzkoušené s tímhle kódem. Nastaveno mám jen 60 ledek a 4 kombinace barev jen pro příklad:

Kód: Vybrat vše

#include <FastLED.h>

#define BUTTON_PIN   2
#define LED_PIN     6
#define NUM_LEDS    60

CRGB leds[NUM_LEDS];

bool oldState = HIGH;
int showType = 0;


void setup() {
  
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop() {
  bool newState = digitalRead(BUTTON_PIN);  
  if (newState == LOW && oldState == HIGH) {
    delay(20);
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 4)
        showType=0;
      startShow(showType);
    }
  }
  oldState = newState;
}

void startShow(int i) {
  switch(i){
    case 0:  for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 0, 0, 255);
    FastLED.show();
    delay(00);
  }
  for (int i = 50; i <= 59; i++) {
    leds[i] = CRGB ( 0, 255, 0);
    FastLED.show();
    delay(00);
  }  break;

    case 1: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 0, 0, 255);
    FastLED.show();
    delay(00);
  }
  for (int i = 50; i <= 59; i++) {
    leds[i] = CRGB ( 255, 0, 0);
    FastLED.show();
    delay(00);
  } 
            break;

      case 2: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 0, 0);
    FastLED.show();
    delay(00);
  }
  for (int i = 50; i <= 59; i++) {
    leds[i] = CRGB ( 0, 255, 0);
    FastLED.show();
    delay(00);
  } 
            break;
          
      case 3: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 0, 0);
    FastLED.show();
    delay(00);
  }
  for (int i = 50; i <= 59; i++) {
    leds[i] = CRGB ( 0, 0, 255);
    FastLED.show();
    delay(00);
  } 
            break;
  }
}

Uživatelský avatar
kiRRow
Příspěvky: 710
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 08 čer 2020, 12:33

Vypadá jako kus funkčního kódu :) pěkně :)

delay(00); je nějakej nesmysl

Moc tu knihovnu neznám, tak se omlouvám jestli nemám pravdu, ale já bych to zapsal spíš takto :

Kód: Vybrat vše


void startShow(int i) {
  switch(i){ // přepnu si v jakem modu jsem
    case 0:  
      for (int i = 0; i < NUM_LEDS; i++) { // proběhnu kompletně všechny ledky které mám - a na co si definuješ NUM_LEDS, když to pak nevyužiješ, když tam nedám <= ale jen < ,tak to pojede od 0 do NUM_LEDS-1
        if(i < 50){ // pokud nastavuji prvních 0-49
          leds[i] = CRGB ( 0, 0, 255); // 0-49
        } else { // jinak nastavuji 50-59 resp 50 až NUM_LEDS-1
          leds[i] = CRGB ( 0, 255, 0); // 50-59
        }
      }
    break;
    
    ... další case
    ... další case
  }
  FastLED.show(); // až mám nastavené kompletně všechny ledky jak potřebuji, zavolám funkci FastLED.show()
}

Nemám možnst ověřit funkčnost kódu, jde spíše o princip. Tak jak to máš ty, tak voláš funkci FastLED.show po každé nastavené diodě. Je to opravdu nutné ?

Wrchi
Příspěvky: 24
Registrován: 19 dub 2019, 23:31
Reputation: 0

Re: Světelná tyč - malování světlem

Příspěvek od Wrchi » 08 čer 2020, 22:42

Díky za info :) Trochu jsem to ještě upravil. Teď to mám na všech 120 ledek (2m pásek v půlce ohnuý zpátky tz 1m týč svítící z obou stran) Proto mám nastavené dvě barvy kde se to v půlce zrcadlí. Vyzkoušel jsem to s napájením ze 3 článkové lipol baterie přes tento měnič https://www.gme.cz/modul-dc-dc-step-down-1-25-32v-5a a i při plné zátěži (všech 120 led na bílou barvu to jede jak má :)

Jak to ještě zpracuju po mechanické stránce vše nějak rozumně do použitelného stavu s vypínačema, baterií, arduinem a měničem v rukojeti hodím sem fotku s díly a odkazy na jednotlivé komponenty.

delay(00) byl překlep kdy jsem vymazal jen první dvě číslice z "1000"

Kód: Vybrat vše

#include <FastLED.h>

#define BUTTON_PIN   2
#define LED_PIN     6
#define NUM_LEDS    120

CRGB leds[NUM_LEDS];

bool oldState = HIGH;
int showType = 0;


void setup() {
  
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop() {
  bool newState = digitalRead(BUTTON_PIN);  
  if (newState == LOW && oldState == HIGH) {
    delay(20);
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 2)  // Počet barevných variant k přepnutí (case)
        showType=0;
      startShow(showType);
    }
  }
  oldState = newState;
}

void startShow(int i) {
  switch(i){
    case 0:  for (int i = 0; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  break;

    case 1: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 255, 0, 0);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
 break;
  
  
    ... další case
    ... další case
  
  
  }
      FastLED.show();
}

Uživatelský avatar
kiRRow
Příspěvky: 710
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 09 čer 2020, 08:31

Nepochopil jsi mě. Ten kód není kompletní a slouží jen pro ilustraci řešení problému.

Wrchi
Příspěvky: 24
Registrován: 19 dub 2019, 23:31
Reputation: 0

Re: Světelná tyč - malování světlem

Příspěvek od Wrchi » 09 čer 2020, 08:47

Asi ne úplně :). Myslíš změnit tu část kódu, který říká jaké ledky mají svítit a jakou barvou? Celý kód viz níže mám nahraný v NANU a vše funguje jak má. Jediné co by se mi tam ještě hodilo je aby to začlo svítit na poslední zvolené barevné variantě. Teď tam mám klasické tlačítko napojené k napájení kvůli zapnutí/vypnutí. Ale když to vypnu a znova zapnu tak musím proklikat všechny varianty než se dostanu na tu poslední použitou.

Takhle to mám teď nahrané včetně barevných variant:

Kód: Vybrat vše

#include <FastLED.h>

#define BUTTON_PIN   2
#define LED_PIN     6
#define NUM_LEDS    120

CRGB leds[NUM_LEDS];

bool oldState = HIGH;
int showType = 0;


void setup() {
  
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop() {
  bool newState = digitalRead(BUTTON_PIN);  
  if (newState == LOW && oldState == HIGH) {
    delay(20);
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 7)
        showType=0;
      startShow(showType);
    }
  }
  oldState = newState;
}

void startShow(int i) {
  switch(i){
    case 0:  for (int i = 0; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  break;


    case 1: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 255, 0, 0);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
 break;

      case 2: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
 break;
          
      case 3: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 0, 0, 255);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  }
 break;

      case 4: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 255, 0, 0);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 255, 0, 0);
  }
break;

      case 5: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 255, 255, 255);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
 break;

      case 6: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 255, 0, 255);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
            break;
                    case 7: 
 for (int i = 0; i <= 49; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
  for (int i = 50; i <= 69; i++) {
    leds[i] = CRGB ( 0, 255, 255);
  } 
 for (int i = 70; i <= 119; i++) {
    leds[i] = CRGB ( 0, 255, 0);
  }
            break;
  
  }
      FastLED.show();
}

Uživatelský avatar
kiRRow
Příspěvky: 710
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Světelná tyč - malování světlem

Příspěvek od kiRRow » 09 čer 2020, 14:48

Pokud si chceš uchovat informaci i po vypnutí napájení, musíš ji uložit do eeprom (pozor ta paměť má omezený počet zápisů) nebo jiného druhu paměti, který si uchovává svůj obsah i po vypnutí napájení. Další možnost, jestli to máš jen kvůli focení a krátkodobě to potřebuješ vypnout, tak vypnout jen ty ledky a nechat běžet jen procesor. Popř ho uspat.

PS: Ještě k tomu define ... když si nadefinuji někde, že NUM_LEDS 120 ... tak to tam mám z toho důvodu, že nikde už nikdy nechci psát < 120 ... nebo nedej boha moj <= 119 ... už chci psát jen jedině NUM_LEDS. Jednoho krásného dne to budu chctít udělat pro 80diod, tak jen přepíšu NUM_LEDS 80. Ty budeš muset prošťourat celý kód a dohledat kde všude máš 120 a 119 ... a divím se že ne 121 :D

Wrchi
Příspěvky: 24
Registrován: 19 dub 2019, 23:31
Reputation: 0

Re: Světelná tyč - malování světlem

Příspěvek od Wrchi » 20 čer 2020, 21:55

Tak jsem měl dneska možnost na tom trochu dělat.

kiRRow Zkusil jsem to napojit s tlačítkem tak aby se vyply jen ledky a zbytek normálně dál jel. Nejde to ale tak jak by mělo. Když vypnu tlačítkem napájení ledek (přerušuju plusový vodič co vede přímo k LED pásku, arduino samotné je stále napájené) Tak když ho znova zapnu tak se ledky znova nerozsvítí na stejné barevné variantě, na které byly, ale jsou zhasnuté. Musím zmáčknout znova druhé tlačítko na změnu barevných variant. Pak se Ledky rozsvítí ale zároveň se hned posunou na další variantu. Dá se změnit jen něco v kódu, nebo to musím i předrátkovat. Nenapadá mě teď co s tím. Variantu s ukládáním do paměti bych viděl jako náhradní možnost, kdyby tohle nešlo. Díky za radu
Přílohy
IMG_20200620_214347.jpg
IMG_20200620_214234.jpg
IMG_20200620_214314.jpg

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů