Stránka 2 z 6

Re: Pomoc se výkladem kodu

Napsal: 21 lis 2018, 19:39
od daton
Už je to jasné colorWipe chtělo jen důkladněji prostudovat.

Re: Pomoc se výkladem kodu

Napsal: 21 lis 2018, 20:15
od Vladimir66
a ja mam opet jednu laickou otazku.. :)
jak se ulozi ten prvni parametr strip.Color(0, 25, 0) do promenne uint32_t c ?
bude to 000 000 025 000 ?

-V66

Re: Pomoc se výkladem kodu

Napsal: 21 lis 2018, 20:43
od fulda
Vladimir66 píše: 21 lis 2018, 20:15 a ja mam opet jednu laickou otazku.. :)
jak se ulozi ten prvni parametr strip.Color(0, 25, 0) do promenne uint32_t c ?
To ví jen knihovník z knihovny <Adafruit_NeoPixel.h>
Od té tu kód nemáme. Ale pokud je to například TAHLE, tak to bude asi na řádku 2108
return ((uint32_t)r << 16) | ((uint32_t)g << 8) | b;
a potom to tedy bude 6400.

(což je tedy 152,4× víc než 42)

Re: Pomoc se výkladem kodu

Napsal: 21 lis 2018, 21:05
od daton
No a ted se tedy zase zeptám já, můžeš prosím ten výraz přeložit tak, abych věděl jak jsi k tomu 6400 došel?

Re: Pomoc se výkladem kodu

Napsal: 21 lis 2018, 21:55
od fulda
Já jsem jen udělal 25*256, ale to je jen zkratka pro hloupé kalkulačky a líné prsty.
Správně bych měl udělat 0 << 16 (číslo 0, rotace doleva o 16 bitů) + 25 << 8 (číslo 25, rotace doleva o 8 bitů) + 0.
Teď nevím do jaké jít hloubky. To že 0, 25, 0 jsou parametry té funkce v pořadí r,g,b je asi jasné, takže máme dvě nuly, ty jsou jasné a přeskočíme je.
Zůstalo nám 25 (desítkově) posunuto doleva o 8 bitů (bitový posun je nutné dělat dvojkově).

Takže matematikou bez násobení, ale s převodem si vezmeme číslo 25 desítkově a převedeme si jej na dvojkové 00000000000000000000000000011001.
Posun doleva znamená, že na levé straně ubíráme nuly a vracíme je na pravou stranu.
dostaneme číslo: 00000000000000000001100100000000 a to je desítkově 6400

Nebo matematikou s násobením - posun doleva o jeden bit znamená násobení 2. (sleduj rozdíl mezi 01 a 10 binárně), takže vezmeme číslo 25 a 8× jej vynásobíme *2

Mno a já jsem si jednou předpočítal, že když něco 8× udělám *2, tak je to vlastně jako 2^8 a to ke 256, takže proto 25*256

Ono by to bylo mnohem čitelnější, pokud by to celé proběhlo hexa. To bychom měli 0x00, 0x19, 0x00 přepsáno na 0x00001900 protože posun o 8 bitů je jednoduše následující bajt.

Re: Pomoc se výkladem kodu

Napsal: 21 lis 2018, 22:02
od Vladimir66
tak to vim,

je to cislo 25, ktere je odrolovano o 8 pozic doleva (nahoru).
prepni si kalkulacku ve windows na programatorskou a udelej 8x RoL s cislem 25

a je to tak, jak jsem si myslel 000 000 025 000 (ctyri bajty) = 00 00 19 00 hex

Re: Pomoc se výkladem kodu

Napsal: 22 lis 2018, 10:30
od daton
Jasně matematiku bych asi zvládl ale ta syntaxe toho výrazu... tam jsem nevěděl. Tak moc dík za úplný výklad :-)

Re: Pomoc se výkladem kodu

Napsal: 22 lis 2018, 15:18
od daton
Zdravím
dnes se to trochu vymkne nadpisu ale při troše dobré vůle se to tam dá napasovat. Potřeboval bych poradit s decrementem. Napsal jsem program kde se postupně rozsvěcí dvě a dvě neoled a taky tak se mají zhášet. Jenže to nepracuje do konce. Rozsvítí se dobře první dvě zhasnou také ale ty dvě poslední ne a ne donutit zhasnout tak maximálně jen tu jednu ale poslední se nechce zhášet. Myslím že mám něco špatně v cyklu for ale nemohu přijít na to co. Mohl by mi s tím někdo pomoci ?

Kód: Vybrat vše

#include <Adafruit_NeoPixel.h>
#define PIN            6  
Adafruit_NeoPixel strip = Adafruit_NeoPixel(4, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  
   strip.begin();
   strip.show();

}

void loop() {
 
    //pásek napůl

    for(uint16_t i=0; i<2; i++) {  
    strip.setPixelColor(i, 655360) ;
    strip.show();
    delay(500);}
    delay (2000);
    for(uint16_t i=1; i<4; i++) {  
    strip.setPixelColor(i, 655360) ;
    strip.show();
    delay(500);}
    delay (2000);
    for(uint16_t i=3; i>1; i--) {  
    strip.setPixelColor(i,0) ;
    strip.show();
    delay(500);}
 delay (2000);
    for(uint16_t i=1; i<0; i--) {  
    strip.setPixelColor(i,0) ;
    strip.show();
    delay(500);}
    delay(1000);
  
}




Re: Pomoc se výkladem kodu

Napsal: 22 lis 2018, 17:55
od DavidO
Jestli mě paměť neklame, neopixely jsou počítané od 0 do počet-1, 0 je nejblíž Arduinu. Tak jak to máš napsané, tak první cyklus rozsvítí první dvě, počká se 2s, rozsvítí se druhá, třetí, čtvrtá, počká se 2s, zhasne se čtvrtá, třetí, počká se 2sec a pak to je blbě, protože to startuješ s 1, ale test je jestli to je <0 a to není nikdy, protože proměnná i je typu uint16_t neboli nezáporné číslo, 0-něco, tedy nikdy není <0.

Re: Pomoc se výkladem kodu

Napsal: 22 lis 2018, 17:58
od DavidO
Jo a do funkce setPixelColor můžeš posílat jednotlivé složky, to je pro tebe asi jednodušší: strip.setPixelColor(n, red, green, blue);