Matrix neopixel - ovladani

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.
cz_marek
Příspěvky: 104
Registrován: 31 led 2018, 09:01
Reputation: 0

Matrix neopixel - ovladani

Příspěvek od cz_marek » 22 říj 2021, 14:48

Ahoj, potřeboval bych pomoct s projektem hodin a řešenim jak ovladat programovatelne LEDky (SK6812) v poli. Je to pole 11 x 10 ledek.
Potřebuji nejak lip ovladat skupiny tech ledek. Udelal jsem si prototyp kdy to zapinam "hloupe" vyctem cele skupiny "cisel" ktere potřebuji zapnout ale je to takove slozite a dlouhe. Urcite je mozne to resit nejak lip - kdyby jste meli nekdo tip jak na to pomohlo by mi to.

Pole vypada takhle - cisla jsou poradove cisla LEDky

Kód: Vybrat vše

100 101 102 103 104 105 106 107 108 109 110
 89  90  91  92  93  94  95  96  97  98  99
 78  79  80  81  82  83  84  85  86  87  88
 67  68  69  70  71  72  73  74  75  76  77
 56  57  58  59  60  61  62  63  64  65  66
 45  46  47  48  49  50  51  52  53  54  55 
 34  35  36  37  38  39  40  41  42  43  44
 23  24  25  26  27  28  29  30  31  32  33 
 12  13  14  15  16  17  18  19  20  21  22
  1   2   3   4   5   6   7   8   9  10  11
Jedna se o to ze potrebuji v nejakem case rozsvitit skupinu ledek. Pro testovani jsem to udelal tak že jsem nacpal vsechny cisla do funkce - pro testovani mi to stacilo ale je to slozite a je mi jasne ze to neni dobre udelane.

Kód: Vybrat vše

    pixels.setPixelColor(100, pixels.Color(255,255,255)); 
    pixels.setPixelColor(101, pixels.Color(255,255,255));
    pixels.show(); 
    pixels.setPixelColor(100, pixels.Color(0,0,0)); 
    pixels.setPixelColor(101, pixels.Color(0,0,0));
Snazil jsem se udelat neco jako pole ktere se ma sepnout v jeden okamzik:

Kód: Vybrat vše

int hod_1 [7]= {100, 101, 106, 107, 108, 109, 110}   
int hod_2 [7]= {102, 103, 104, 105, 97, 98, 99}                
int hod_3 [7]= {102, 103, 104, 105, 71, 72, 73}           
int hod_4 [9]= {102, 103, 104, 105, 45, 46, 47, 48, 49}

void loop() {
  for (int LEDon = 0; LEDon < pocetLED; LEDon++) {
     pixels.setBrightness(10);
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show();
        delay(10);
 }

 } 
Je to nejake zvlastni - krome LEDek z pole mi to zapne i LEDku 0 a pak asi 4 LEDky z pole ktere nejsou obsažené v "hod_4" - nechapu to

Muj plan je takovy ze to bude sepnute než se změni čas a prekne mi to jine pole. Smazani a sepnutit jineho pole je asi OK mate me ze se mi zapinaji i jine LEDky nez z pole.

Hledal jsem hodne na netu a je hodne přistupů jak to kdo řeší, ale jsem amater a chtel bych jit cestou kterou pochopim než okopirovat kod který nechapu.

Diky za pripadne tipy jak to udelat fukční a ne moc složite :-)

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

Re: Matrix neopixel - ovladani

Příspěvek od kiRRow » 22 říj 2021, 15:14

Nikdy jsem si s těmahle diodama nehrál, ale

Kód: Vybrat vše

  for (int LEDon = 0; LEDon < pocetLED; LEDon++) {
     pixels.setBrightness(10); // proč to nastavovat furt znovu a znovu - nemá to být v setupu ?
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); // jak svítí černá barva ?
     pixels.show(); // zobrazit to chci až když provedu veškeré změny
        delay(10); // je opravdu třeba delay ve smyčce ?
 }

Kód: Vybrat vše

for (int LEDon = 0; LEDon < pocetLED; LEDon++) {
	pixels.setPixelColor(hod_4[LEDon], pixels.Color(255,255,255,255)); // bílá barva
	delay(10); // je opravdu třeba delay ve smyčce ?
}
pixels.show(); // zobrazit to chci až když provedu veškeré změny

cz_marek
Příspěvky: 104
Registrován: 31 led 2018, 09:01
Reputation: 0

Re: Matrix neopixel - ovladani

Příspěvek od cz_marek » 22 říj 2021, 15:29

Komentáře jsem dal do kodu:

Kód: Vybrat vše

  for (int LEDon = 0; LEDon < pocetLED; LEDon++) {
     pixels.setBrightness(10); // proč to nastavovat furt znovu a znovu - nemá to být v setupu ? - ne nema, svitivost se meni dle okolního světla
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); // jak svítí černá barva ? - neni to černa barva ale bilý kanál, je to RGBNW
     pixels.show(); // zobrazit to chci až když provedu veškeré změny 
        delay(10); // je opravdu třeba delay ve smyčce ? - tohle je pozustatek ze staršího kodu, nemusi to tam být
 }

Kód: Vybrat vše

for (int LEDon = 0; LEDon < pocetLED; LEDon++) {
	pixels.setPixelColor(hod_4[LEDon], pixels.Color(255,255,255,255)); // bílá barva - viz výše - bila barva je ten 4. kanál
	delay(10); // je opravdu třeba delay ve smyčce ?
}
pixels.show(); // zobrazit to chci až když provedu veškeré změny - zkusim to posunout jestli to bude lepsi i kdyz mam pocit ze jsem to uz zkousel a nepomohlo to

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Matrix neopixel - ovladani

Příspěvek od peterple » 22 říj 2021, 19:40

Koľko je pocetLED? 9?

cz_marek
Příspěvky: 104
Registrován: 31 led 2018, 09:01
Reputation: 0

Re: Matrix neopixel - ovladani

Příspěvek od cz_marek » 23 říj 2021, 07:28

peterple píše:
22 říj 2021, 19:40
Koľko je pocetLED? 9?
Pocet LED je celkový pocet tzn 110 tzn cele pole

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Matrix neopixel - ovladani

Příspěvek od peterple » 23 říj 2021, 09:19

potom nerozumiem ako si myslel toto

Kód: Vybrat vše

int hod_4 [9]= {102, 103, 104, 105, 45, 46, 47, 48, 49}

  for (int LEDon = 0; LEDon < pocetLED; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255));  //hod_4[LEDon] ?? pre hodnoty >9
 }
V úvode píšeš o poli čo má 110 prvkov. Tu ale indexuješ pole čo má 9 prvkov a index ide od 0 do 110. Tým pádom vyťahuješ údaje ktoré sa nachádzajú za tvojim poľom a tie nie sú nikde definované. Teda ani strnky netušia aké sú. Kludne sa tam vie nájsť hodnota 0, prípadne ďalšie v rozsahu 0-110 ktoré potom náhodne zapínajú LED.

cz_marek
Příspěvky: 104
Registrován: 31 led 2018, 09:01
Reputation: 0

Re: Matrix neopixel - ovladani

Příspěvek od cz_marek » 23 říj 2021, 12:37

Sakra to je pravda- jak se v tom furt hrabu tak mi to vubec nedoslo.

Da se nejak nahradit "pocetLED" za promenou ktera mi plni pocet prvku pole? Abych to nemusel natvrdo psat...

Díky

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Matrix neopixel - ovladani

Příspěvek od peterple » 23 říj 2021, 12:46


cz_marek
Příspěvky: 104
Registrován: 31 led 2018, 09:01
Reputation: 0

Re: Matrix neopixel - ovladani

Příspěvek od cz_marek » 01 lis 2021, 14:56

Dal jsem do kupy program ale nejak se nedokazi vyhrabat z jednoho problemu a to je prekresleni pixelu.
Mam to ted udelane tak ze mi vsechno najednou zhasne a hned se zobrazi dalsi "stav" - toto se dej kazdou minutu. Spatne je ze to blikne - vsechny zapnute pixely na okamzik bliknou. Pokud se pixely posunou neni to patrne a je to v pohode ale např. hodina se neposouva a jen blikne a to vypada dost blbe.
Zkoušel jsem ruzne varianty a moznosti ale nedari se mi to udelat tak aby to neblikalo cele.

Tady je kod - je to udelano tak aby se minuta posouvala kazdou sekundu, mam to kvuli ladeni... :

Kód: Vybrat vše


#include <Adafruit_NeoPixel.h>

int hod_1 [7]= {100, 101, 106, 107, 108, 109, 110};   // prefix JE + hodina 1
int hod_2 [7]= {102, 103, 104, 105, 97, 98, 99};                // prefix JSOU + hodina 2
int hod_3 [7]= {102, 103, 104, 105, 71, 72, 73};                // prefix JSOU + hodina 3
int hod_4 [9]= {102, 103, 104, 105, 45, 46, 47, 48, 49};        // prefix JSOU + hodina 4
int hod_5 [5]= {100, 101, 94, 95, 96};                // prefix JE + hodina 5
int hod_6 [6]= {100, 101, 74, 75, 76, 77};            // prefix JE + hodina 6
int hod_7 [6]= {100, 101, 78, 79, 80, 81};            // prefix JE + hodina 7
int hod_8 [5]= {100, 101, 56, 57, 58};                // prefix JE + hodina 8
int hod_9 [7]= {100, 101, 89, 90, 91, 92, 93};        // prefix JE + hodina 9
int hod_10 [7]= {100, 101, 67, 68, 69, 70, 71};       // prefix JE + hodina 10
int hod_11 [10]= {100, 101, 59, 60, 61, 62, 63, 64, 65, 66};   // hodina 11
int hod_12 [9]= {100, 101, 82, 83, 84, 85, 86, 87, 88};   // hodina 12

int min_1 [1]= {113};         // minuty 1,6
int min_2 [1]= {112};         // minuty 2,7
int min_3 [1]= {111};         // minuty 3,8
int min_4 [1]= {114};         // minuty 4,9

int min_5 [3]= {9, 10, 11};                    // minuty 5,25,35,45,55
int min_10 [5]= {51, 52, 53, 54, 55};        // minuty 10
int min_15 [7]= {23, 24, 25, 26, 27, 28, 29}; // minuty 15
int min_20 [6]= {34, 35, 36, 37, 38, 39};    // minuty 20
int min_25 [9]= {34, 35, 36, 37, 38, 39, 9, 10, 11};    // minuty 25
int min_30 [6]= {39, 40, 41, 42, 43, 44};    // minuty 30
int min_35 [9]= {39, 40, 41, 42, 43, 44, 9, 10, 11};    // minuty 35
int min_40 [8]= {14, 15, 16, 17, 18, 19, 20, 21};  // minuty 40
int min_45 [11]= {14, 15, 16, 17, 18, 19, 20, 21, 9, 10, 11};  // minuty 45
int min_50 [7]= {1, 2, 3, 4, 5, 6, 7};     // minuty 50
int min_55 [10]= {1, 2, 3, 4, 5, 6, 7, 9, 10, 11};     // minuty 55

int pocetLED = 115;     //pocet LED pixelu 
int hodina = 1;
int minuta = 1;
int jas = 10;

unsigned long interval = 1000;        
unsigned long previousMillis = 0; 

#define PIN 12
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(pocetLED, PIN, NEO_GRBW + NEO_KHZ800);

void setup() {
  Serial.begin(9600);
  pixels.begin(); 
}

void loop(){
       
   pixels.setBrightness(jas);
    
   unsigned long currentMillis = millis();
   if (currentMillis - previousMillis >= interval) {
       previousMillis = currentMillis;
	  
     minuta = minuta + 1;
     pixels.clear();                      // vypne všechny pixely
	}

	if (minuta == 60) {
	   hodina = hodina + 1;
	   minuta = 0; 
	}	
	
    if (hodina == 13) {
	   hodina = 1; 
	}	
	  
   CAShod();
   CASmin();

} 

//#########################################################################################
void CAShod() {

Serial.println(hodina);

    if (hodina == 1) {       
  for (int LEDon = 0; LEDon < 7; LEDon++) {
     pixels.setPixelColor(hod_1[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show();
 }
 } 
    if (hodina == 2) {
  for (int LEDon = 0; LEDon < 7; LEDon++) {
     pixels.setPixelColor(hod_2[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show();
 }
 }
     if (hodina == 3) {
   for (int LEDon = 0; LEDon < 7; LEDon++) {
     pixels.setPixelColor(hod_3[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show();
 }
 }
    if (hodina == 4) {
  for (int LEDon = 0; LEDon < 9; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
    if (hodina == 5) {
  for (int LEDon = 0; LEDon < 5; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
    if (hodina == 6) {
  for (int LEDon = 0; LEDon < 6; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
     if (hodina == 7) {
  for (int LEDon = 0; LEDon < 6; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
     if (hodina == 8) {
  for (int LEDon = 0; LEDon < 5; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
    if (hodina == 9) {
  for (int LEDon = 0; LEDon < 7; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
     if (hodina == 10) {
  for (int LEDon = 0; LEDon < 7; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
     if (hodina == 11) {
  for (int LEDon = 0; LEDon < 10; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
     if (hodina == 12) {
  for (int LEDon = 0; LEDon < 9; LEDon++) {
     pixels.setPixelColor(hod_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }

}

//#########################################################################################
void CASmin() {
	
   Serial.println(minuta);
	
	// jednotky minut
	
     if (minuta == 1 || (minuta == 6 || (minuta == 11 || (minuta == 16 || (minuta == 21 || (minuta == 26 || (minuta == 31 || (minuta == 36 || (minuta == 41 || (minuta == 46 || (minuta == 51 || (minuta == 56 )))))))))))){     
  for (int LEDon = 0; LEDon < 1; LEDon++) {
     pixels.setPixelColor(min_1[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show();
 } 
 }
     if (minuta == 2 || (minuta == 7 || (minuta == 12 || (minuta == 17 || (minuta == 22 || (minuta == 27 || (minuta == 32 || (minuta == 37 || (minuta == 42 || (minuta == 47 || (minuta == 52 || (minuta == 57 )))))))))))) {    
  for (int LEDon = 0; LEDon < 1; LEDon++) {
     pixels.setPixelColor(min_2[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show();
 }
 } 
 
     if (minuta == 3 || (minuta == 8 || (minuta == 13 || (minuta == 18 || (minuta == 23 || (minuta == 28 || (minuta == 33 || (minuta == 38 || (minuta == 43 || (minuta == 48 || (minuta == 53 || (minuta == 58 )))))))))))) {    
  for (int LEDon = 0; LEDon < 1; LEDon++) {
     pixels.setPixelColor(min_3[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show();
 }
 } 
 
     if (minuta == 4 || (minuta == 9 || (minuta == 14 || (minuta == 19 || (minuta == 24 || (minuta == 29 || (minuta == 34 || (minuta == 39 || (minuta == 44 || (minuta == 49 || (minuta == 54 || (minuta == 59 )))))))))))) {    
  for (int LEDon = 0; LEDon < 1; LEDon++) {
     pixels.setPixelColor(min_4[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show();
 }
 } 

     // minuty po 5
	 
     if ((minuta >= 5) && (minuta < 10)) {
  for (int LEDon = 0; LEDon < 3; LEDon++) {
     pixels.setPixelColor(min_5[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }

     if ((minuta >= 10) && (minuta < 15)) {
  for (int LEDon = 0; LEDon < 5; LEDon++) {
     pixels.setPixelColor(min_10[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 
      if ((minuta >= 15) && (minuta < 20)) {
  for (int LEDon = 0; LEDon < 7; LEDon++) {
     pixels.setPixelColor(min_15[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 
      if ((minuta >= 20) && (minuta < 25)) {
  for (int LEDon = 0; LEDon < 6; LEDon++) {
     pixels.setPixelColor(min_20[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 
      if ((minuta >= 25) && (minuta < 30)) {
  for (int LEDon = 0; LEDon < 9; LEDon++) {
     pixels.setPixelColor(min_25[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 
      if ((minuta >= 30) && (minuta < 35)) {
  for (int LEDon = 0; LEDon < 6; LEDon++) {
     pixels.setPixelColor(min_30[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 
      if ((minuta >= 35) && (minuta < 40)) {
  for (int LEDon = 0; LEDon < 9; LEDon++) {
     pixels.setPixelColor(min_25[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 
      if ((minuta >= 40) && (minuta < 45)) {
  for (int LEDon = 0; LEDon < 8; LEDon++) {
     pixels.setPixelColor(min_40[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 
      if ((minuta >= 45) && (minuta < 50)) {
  for (int LEDon = 0; LEDon < 11; LEDon++) {
     pixels.setPixelColor(min_45[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 
      if ((minuta >= 50) && (minuta < 55)) {
  for (int LEDon = 0; LEDon < 7; LEDon++) {
     pixels.setPixelColor(min_50[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 
      if ((minuta >= 55) && (minuta < 60)) {
  for (int LEDon = 0; LEDon < 10; LEDon++) {
     pixels.setPixelColor(min_55[LEDon], pixels.Color(0,0,0,255)); 
     pixels.show(); 
 }
 }
 }

Zkoušel jsem variantu ze dam:

Kód: Vybrat vše

     pixels.setPixelColor(min_55[LEDon], pixels.Color(0,0,0,0)); 
za kazde zobrazeni (skupina ktera se zapina) ale to mi pixely palo na okamzik a hned vyplo, zkoušel jsem to dat na konec bloku minut ale to taky nejak nefungovalo.
Jak se v tom pořád hrabu tak se na to už neumím podivat s nadhledem a točím se jen na sptných řešeních :-(

Diky za případnou pomoc

edit: jeste me napadlo udelat pole "minuty" do ktereho bych dal vsechny pixely pro minuty a to zhasinat ale nevim jestli nema nekdo lepsi napad.

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

Re: Matrix neopixel - ovladani

Příspěvek od kiRRow » 01 lis 2021, 16:35

No ty si budeš muset "nějak" umět vypočíst jen změny nového zobrazení oproti starému a tomu pásku pak poslat jen to co má nově zhasnout a co má nově rožnout. Přistupoval bych k tomu jako k displeji, takže mít uloženo v operační paměti to, co právě zobrazuji. Ve statické paměti pak data jednotlivých znaků na jednotlivých pozicích. Ve zobrazovací funkci pak projet to co chci zobrazit versus to co mám uloženo, v případě rozdílů změnit data v paměti a poslat příkaz příslušné ledce.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: luger a 12 hostů