Pomoc se výkladem kodu

daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek od daton »

Už je to jasné colorWipe chtělo jen důkladněji prostudovat.
Vladimir66
Příspěvky: 385
Registrován: 02 dub 2014, 15:30

Re: Pomoc se výkladem kodu

Příspěvek 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
Uživatelský avatar
fulda
Příspěvky: 1359
Registrován: 04 led 2016, 17:18

Re: Pomoc se výkladem kodu

Příspěvek od fulda »

Vladimir66 píše: 21 lis 2018, 21: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)
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek 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?
Uživatelský avatar
fulda
Příspěvky: 1359
Registrován: 04 led 2016, 17:18

Re: Pomoc se výkladem kodu

Příspěvek 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.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
Vladimir66
Příspěvky: 385
Registrován: 02 dub 2014, 15:30

Re: Pomoc se výkladem kodu

Příspěvek 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
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek 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 :-)
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek 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);
  
}



DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek 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.
Naposledy upravil(a) DavidO dne 22 lis 2018, 19:40, celkem upraveno 1 x.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek 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);
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Odpovědět