Stránka 2 z 3

RGB led driver

Napsal: 17 úno 2021, 18:46
od vogeer97
No vím jak rozblikat jednotlivé barvy ledek postupně po sobě atd ale nevím jak mám dosáhnout toho že to budu přepínat přes přepínače postupně tak jak chci já. Docela by se hodil nejaký návrh kodu který bych si upravil podle sebe

Re: RGB led driver

Napsal: 17 úno 2021, 18:52
od ondraN
Podívej se třeba na příkaz switch
V něm můžeš podle toho co je stisknuté (načteš do řídící proměnné příkazu switch) provést jednotlivé efekty.

RGB led driver

Napsal: 17 úno 2021, 19:38
od vogeer97
Tak zatím se mi povedlo vykoumat tohle ale nějak jsem se zasekl na tom že nevím jak udělat aby se příkazy po stisku tlačítka opakovali pořád do kola. Teď jsem dosáhl pouze toho že zmáčknu tlačítko to provede akci jednou ale neopakuje ji.

Re: RGB led driver

Napsal: 17 úno 2021, 20:21
od AstroMiK
Ty dlouhý pauzy jsou v tomhle případě nesmysl.
Pro změnu funkce bys musel držet tlačítko tak dlouho, než by došlo k ukončení jednoho blikacího cyklu.

Program se dá napsat tisícem způsobů.
Já bych na to šel asi nějak takhle (neodzkoušeno - je to jen princip):

V hlavní smyčce by se co nejrychleji testoval stav tlačítek.
Každý stisk by nastavil do proměnné požadovanou funkci.
Hned potom by se podle té proměnné funkce vykonala.

V případě nějaké blikací funkce bych zavedl počítadlo cyklů a při dosažení požadovaného čísla cyklu by se vykonala další fáze blikání.
Dá se to dělat i pomocí funkce millis(), ale mně se to takhle zdá jednodušší.

Kód: Vybrat vše


void loop(void)
  {
    if (digitalRead(tlacitko1) == HIGH)  funkce = 1;    // rozsvit jen cervenou
    if (digitalRead(tlacitko2) == HIGH)  funkce = 2;    // rozsvit jen zelenou
    if (digitalRead(tlacitko3) == HIGH)  funkce = 3;    // rozsvit jen modrou
    if (digitalRead(tlacitko4) == HIGH)  funkce = 4;    // vsechno zhasni
    if (digitalRead(tlacitko5) == HIGH)                 // nejaka blikaci funkce
      {
        funkce = 5;    
        casovani = 0;    
      }

/// tady by byly dalsi testy tlacitek nebo jejich kombinace 


// a hned potom vykonani zvolene funkce:

    switch (funkce)
      {
        case 1:
          rozsvit_jen_cervenou();
          break;

        case 2:
          rozsvit_jen_zelenou();
          break;

        case 3:
          rozsvit_jen_modrou();
          break;

        case 4:
          vsechno_zhasni();
          break;

        case 5:                                         // tahle funkce bude mit periodu 1800ms
          if (casovani ==   0)  rozsvit_jen_cervenou(); // hned na zacatku cyklu se rozsviti cervena 
          if (casovani ==  60)  rozsvit_jen_zelenou();  // po 0,6 sekunde se rozsviti zelena
          if (casovani == 120)  rozsvit_jen_modrou();   // po dalsi 0,6 sekunde se rozsviti modra
          casovani ++;
          if (casovani == 180) casovani = 0;            // po dalsi 0,6 sekunde se casovani vynuluje a blikaci cyklus zacne od zacatku
          delay(10);                                    // jedna smycka v teto funkci bude trvat 10ms
          break;                                        //      to je jeste dostatecne rychle pro bezproblemove cteni tlacitek

//  .... dalsi funkce


      }
   

  }




RGB led driver

Napsal: 17 úno 2021, 21:02
od vogeer97
Jo a taky mi došlo že používat digitální piny asi není uplně ideální hlavně když bych chtěl udělat fade effect

Re: RGB led driver

Napsal: 17 úno 2021, 22:03
od AstroMiK
Jas se dá regulovat přes PWM a na to jsou vyhrazené jen některé piny na Arduinu (v závislosti na typu):

https://www.arduino.cc/reference/en/lan ... alogwrite/

Re: RGB led driver

Napsal: 18 úno 2021, 16:44
od kiRRow
To bude na hudbu ? Já začal tím, že jsem si jako první stvořil "generátor kroků", ten podle BPM dané písničky generoval kdy má dojít ke změně světel. Ovládal se několika tlačítky BPM+ BPM- a pak měl ještě tlačítka co fungovaly jen když byly drženy ... HOLD a jako děliče 2 a 4, nebo násobiče 2, 4, 8 , 16 a 32. Potenciometr, kterým se zkracovala doba svitu jednoho kroku.
Efekty jsem rozhodně neprogramoval na tvrdo, ale měl jsem uloženo v jakém kroku efektu má co jak jasně svítit. Přednastavené efekty byly v EEPROMce, ládovalo se to tam do ní přes seriovou linku a ten řetězec mi vytvořil napsaný program v C++. On to tam i poslal.
Ovládáno bylo 2x5 RGB diod (3PWM výstupy + 5 select digidálních pinů + 1 digitální pin co přes NOT hradlo přepínal mezi jednou pěticí a druhou pěticí)
Nedostatek pinů řešilo připojení vícero tlačítek na analogové vstupy.

Bohužel už je to 10let zpátky a sketch je na 8let nefunkčním notebooku, součástky vytahány z nepájivého pole a zabaleny do sáčku a zahozeny do šuplíku :D

RGB led driver

Napsal: 18 úno 2021, 17:13
od vogeer97
Prostě bych chtěl něco ve stylu dmx mixu, takže že bych měl 7 tlačítek na různé barvy ale zároveň nezávislé na tom abych mohl měnit efekty. Takže aby volba barev a efektu bylo nezávislé na sobě. Co jsem zatím zkoušel tak vždy jsem dosáhl toho že při změně barvy se vypl i daný efekt a naopak. Co se týká zapojení tak s tím není problém 3 mosfety na míchaní rgb barev a další 3 nebo více na spínaní efektů

Re: RGB led driver

Napsal: 18 úno 2021, 21:59
od gilhad
Hele, já si udělal něco na mačkání kláves a klikání myší do jedne gamesy, ale obecně by se ti to mohlo hodit jako inspirace

http://micro-corner.gilhad.cz/blog/Ardu ... ouse3.html

jde o jednoduché stavové automaty (což zní učeně, ale prostě si pamatuju, kde jsem a kdy mám udělat něco dalšího a procházím tím různé cykly a podmínky - s tím, že mi pro každý krok stačí pár instrukcí a znova se to volá teprve až nastane "správný čas", takže loop() většinu času cykluje naprázdno a jen čeká na správné millis. A je tudíž schopen jet i řadu "efektů" naráz nezávisle.

běží tam 2 nezávislé smyčky přez sebe - jedna čte tlačítka a plánuje co dál, druhá provádí "efekty", s tím, že daný "efekt" při změně vždy doběhne do "stabilního stavu" a pak se teprve spustí další naplánovaný.

Čtení tlačítek (s debouncingem) by šlo přepsat i líp a jde celkem snadno rozšířit - já používám 3 - A a B spouští příslušný "efekt", C ho zastaví (pokud "efekt" běží), nebo přepne (cyklicky) na další sadu "efektů" pokud žádný efekt neběží

Zkopírováním (a přejmenováním proměnných) bloku "next state" můžeš snadno získat víc paralelně běžících "efektů" (co já vím pomalu se měnící modrou, rychle se měnící červenou a občasné bliknutí všeho)

Pokud jedeš jen 3 barvy (a třeba intenzity) tak to můžeš mít jako nějakou globální/sdílenou proměnnou a nějaký efekt bude třeba blikat (zapínat/vypínat proměnnou OnOff ) a jiný měnit barevné složky (měnit intenzity barev v těch globálech) (a další klidně může dělat PWM tak, že si bude dokola načítat proměnnou a když bude její hodnota menší než intenzita a zároveň bude zapnuté OnOff, tak sepne mosfet, jinak ho rozepne)

Když si to ovládání takhle rozdělíš (nezávisle nastavovat intenzitu jednotlivých barev, přepínat pořadí barev v tabulce, zapínat/vypínat, ovládat mosfet ...), tak můžeš každou složku měnit zvlášť a plynule číst tlačítka a navíc vybrané efekty nechat doběhnout do nějakého rozumněho stavu než se přepnou, zatímco jiné měnit třeba okamžitě

Re: RGB led driver

Napsal: 19 úno 2021, 14:20
od pavel1tu
vogeer97 píše:
18 úno 2021, 17:13
Prostě bych chtěl něco ve stylu dmx mixu, takže že bych měl 7 tlačítek na různé barvy ale zároveň nezávislé na tom abych mohl měnit efekty. Takže aby volba barev a efektu bylo nezávislé na sobě. Co jsem zatím zkoušel tak vždy jsem dosáhl toho že při změně barvy se vypl i daný efekt a naopak. Co se týká zapojení tak s tím není problém 3 mosfety na míchaní rgb barev a další 3 nebo více na spínaní efektů
Já bych šel cestou NEOPIXEL, pokud chceš něco takového
https://www.youtube.com/watch?v=RZ_UWYBOj8M

Nebo myslíš něco jako světlo ?
https://www.youtube.com/watch?v=pdFtoTRiQ-M