{"id":2162,"date":"2019-11-18T07:17:00","date_gmt":"2019-11-18T07:17:00","guid":{"rendered":"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=2162"},"modified":"2019-11-28T19:03:53","modified_gmt":"2019-11-28T19:03:53","slug":"ws2812b-oraz-millis-3","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=2162","title":{"rendered":"Ws2812b oraz potencjometr"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Kolejne spotkanie z kolorowymi paskami LED\u00f3w WS2812B &#8211; tym razem sterowane potencjometrem. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><a href=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1285\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"98\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/06\/tinkercad-logo2-1-300x98.png\" alt=\"\" class=\"wp-image-1314\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/06\/tinkercad-logo2-1-300x98.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2018\/06\/tinkercad-logo2-1.png 393w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">UWAGA: TinkerCAD (czyli &#8222;wirtualne Arduino&#8221;) zosta\u0142 wzbogacony w\u0142a\u015bnie o omawiane modu\u0142y RGB. Trzeba przyzna\u0107, \u017ce dzia\u0142aj\u0105 ca\u0142kiem fajnie &#8212; dlatego zach\u0119cam do zabawy nawet dla os\u00f3b, kt\u00f3re nie maj\u0105 ich w realu!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zadanie do wykonania<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Za\u015bwieci\u0107 LEDem o numerze zgodnym z ustawion\u0105 warto\u015bci\u0105 na potencjometrze. Inne LEDy maj\u0105 by\u0107 wy\u0142\u0105czone. Kr\u0119cimy potencjometrem &#8211; &#8222;przesuwamy&#8221; LEDa. Kolor LEDa? Tw\u00f3j ulubiony \ud83d\ude09<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"680\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-potencjometr-1024x680.png\" alt=\"\" class=\"wp-image-2163\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-potencjometr-1024x680.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-potencjometr-300x199.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-potencjometr-768x510.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-potencjometr.png 1113w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Pozycj\u0119 potencjometru odczytujemy przez funkcj\u0119 analogRead(A0) &#8211; o ile \u015brodkowy pin potencjometru zosta\u0142 pod\u0142\u0105czony do pinu A0 w\u0142a\u015bnie. W potencjometrze pod\u0142\u0105czone s\u0105 tak\u017ce piny do GND i 5V w Arduino &#8211; zgodnie z powy\u017cszym rysunkiem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Numer LEDa &#8211; dzielenie ca\u0142kowite!<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">analogRead(a) zwraca warto\u015b\u0107 z przedzia\u0142u 0..1023, natomiast my mamy tylko (a\u017c?) 16 LED\u00f3w. Nale\u017cy wi\u0119c przeliczy\u0107 warto\u015b\u0107 a analogRead() na numer pinu&#8230; w prosty spos\u00f3b: <\/p>\n\n\n\n<pre class=\"wp-block-verse\">nr = analogRead(A0)*16\/1024;    \/\/dobrze!<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wa\u017cna jest tutaj kolejno\u015b\u0107 oblicze\u0144, bo gdy napiszemy<\/p>\n\n\n\n<pre class=\"wp-block-verse\">nr = 16\/1024*analogRead(A0);   \/\/\u017ale :-(<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">to cho\u0107 z matematycznego punktu widzenia oba wyra\u017cenia s\u0105 r\u00f3wnowa\u017cne, to jednak w drugim przypadku najpierw wykonuje si\u0119 dzielenie &#8211; a jest tutaj <strong>dzielenie ca\u0142kowite<\/strong> (bo zar\u00f3wno 16 jak i 1024 s\u0105 liczbami ca\u0142kowitymi) wi\u0119c wynosi <strong>zero<\/strong>. A zero mno\u017cone przez cokolwiek da zawsze zero. Pierwszy wzorek jest poprawny, bo najpierw wykonamy mno\u017cenie analogRead(A0)*16 a dopiero potem wynik tego iloczynu dzielimy (dzielenie ca\u0142kowite, ale teraz nie przeszkadza) &#8211; i otrzymujemy liczb\u0119 z przedzia\u0142u 0..15.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dyskoteka &#8211; czyli efekt stroboskopu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Skoro mamy ju\u017c ustalony numer LEDa, to teraz mo\u017cemy zgasi\u0107 wszystkie inne, a potem za\u015bwieci\u0107 tego konkretnego &#8211; o numerze nr w\u0142a\u015bnie. Ale ale&#8230; za chwilk\u0119 ponownie ustalimy po\u0142o\u017cenie potencjometru, ponownie wyliczmy nr LEDa i co &#8211; ponownie zgasimy wszystkie, aby w\u0142\u0105czy\u0107 ten o numerze nr? Obawiam si\u0119, \u017ce w zwi\u0105zku z wy\u0142\u0105czaniem i w\u0142\u0105czaniem otrzymamy efekt &#8222;<strong>dyskoteka<\/strong>&#8221; (<strong>stroboskopu<\/strong>). Poza tym to nieprofesjonalne \ud83d\ude1b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Adafruit_NeoPixel.h>\n     \n#define PIN 7 \n#define NDIOD 16 \nint delta=1024\/NDIOD;\n\nAdafruit_NeoPixel pixels = Adafruit_NeoPixel(NDIOD, PIN, NEO_GRB + NEO_KHZ800);\n\nint nr,poprzedni;\n\nvoid setup() {\n    Serial.begin(9600);\n    pixels.begin(); \n\n    nr=analogRead(A0)\/delta;\n    pixels.setPixelColor(nr, 10, 0, 0);\n    pixels.show();\n    poprzedni = nr;\n}\n\nvoid loop() {\n    nr=analogRead(A0)\/delta;\n\/\/    Serial.println(nr); \n        \n    if(nr != poprzedni){\n      \/\/AKCJA!\n      Serial.print(\"zmiana! nr=\"); \n      Serial.println(nr); \n      pixels.setPixelColor(poprzedni, 0, 0, 0);\n      poprzedni = nr;\n      pixels.setPixelColor(nr, 10, 0, 0);\n      pixels.show();\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Powy\u017cszy kod rozwi\u0105zuje efekt stroboskopu &#8211; dzi\u0119ki dodatkowej zmiennej <em>poprzedni<\/em> zapami\u0119tujemy, kt\u00f3ry LED by\u0142 ostatnio w\u0142\u0105czony. W g\u0142\u00f3wnej p\u0119tli programu ustalamy numer LEDa zgodnego z ustawieniami potencjometru, ale &#8222;akcja&#8221; dzieje si\u0119 tylko w\u00f3wczas, gdy zmienili\u015bmy ustawienia potencjometra. Dobrze doda\u0107 wypisywanie na monitor szeregowy informacji <strong>tylko w\u00f3czas<\/strong>, gdy dzieje si\u0119 &#8222;akcja&#8221; &#8211; dzi\u0119ki temu mamy pewno\u015b\u0107, \u017ce napisy (a tym samym i sama &#8222;akcja&#8221;) wykonuje si\u0119 jedynie w przypadku zmian ustawie\u0144 potencjometru.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Uwaga #1 &#8211; int VS float<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, \u017ce zar\u00f3wno zmienna <em>nr <\/em>jak i zmienna <em>poprzedni<\/em> s\u0105 zadeklarowane jako <strong>int<\/strong>, co w zupe\u0142no\u015bci wystarczy &#8211; nie ma potrzeby u\u017cywa\u0107 arytmetyki liczb rzeczywistych (powolnych, szczeg\u00f3lnie na Arduino). <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Uwaga #2 &#8211; by\u0107 bardziej PRO \ud83d\ude1b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zwr\u00f3\u0107 uwag\u0119, \u017ce wywo\u0142uj\u0119 funkcj\u0119 <em>pixels.show() <\/em>tylko w\u00f3wczas, gdy co\u015b si\u0119 zmieni\u0142o &#8211; niby  po co mia\u0142bym wo\u0142a\u0107 t\u0105 funkcj\u0119 za ka\u017cdym razem w <em>loop()-<\/em>ie, niezale\u017cnie od tego, czy co\u015b si\u0119 zmieni\u0142o czy nie? W ko\u0144cu <em>pixels.show() <\/em><strong>programuje<\/strong> LEDy zgodnie ze wcze\u015bniejszymi ustawieniami <em>pixels.setPixelColor()<\/em>, wi\u0119c nie ma senesu wo\u0142a\u0107 j\u0105 bez potrzeby.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zadanie #2  (tak\u017ce tinkercad)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zmieni\u0107 kod tak, by \u015bwieci\u0142y si\u0119 LEDy od pierwszego do tego konkretnego, zgodnego z ustawieniami potencjometru. Unika\u0107 efektu &#8222;dysko&#8221;.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-6.png\" alt=\"\" class=\"wp-image-2171\" width=\"195\" height=\"169\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-6.png 422w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-6-300x259.png 300w\" sizes=\"auto, (max-width: 195px) 100vw, 195px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-5.png\" alt=\"\" class=\"wp-image-2170\" width=\"186\" height=\"171\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-5.png 406w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-5-300x276.png 300w\" sizes=\"auto, (max-width: 186px) 100vw, 186px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-7.png\" alt=\"\" class=\"wp-image-2172\" width=\"190\" height=\"170\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-7.png 405w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2019\/11\/ws2812-7-300x269.png 300w\" sizes=\"auto, (max-width: 190px) 100vw, 190px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"has-text-align-left wp-block-heading\">Zadanie #3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=1068\">Joystick<\/a> to dwa potencjometry &#8211; mo\u017cna tu go wykorzysta\u0107 i oprogramowa\u0107 tak, by ruch na osi X zmienia\u0142 numer LEDa (jak dotychczas), a ruch na osi Y zmienia\u0142 kolor &#8211; w jaki\u015b zabawny spos\u00f3b (mo\u017ce t\u0119cza?). Prosz\u0119 si\u0119 pochwali\u0107 wynikami!<\/p>\n\n\n\n<p class=\"has-text-align-right wp-block-paragraph\">(c) <em>K.G. 2019<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kolejne spotkanie z kolorowymi paskami LED\u00f3w WS2812B &#8211; tym razem sterowane potencjometrem. UWAGA: TinkerCAD (czyli &#8222;wirtualne Arduino&#8221;) zosta\u0142 wzbogacony w\u0142a\u015bnie o omawiane modu\u0142y RGB. Trzeba przyzna\u0107, \u017ce dzia\u0142aj\u0105 ca\u0142kiem fajnie &#8212; dlatego zach\u0119cam do zabawy nawet dla os\u00f3b, kt\u00f3re nie maj\u0105 ich w realu! Zadanie do wykonania Za\u015bwieci\u0107 LEDem o numerze zgodnym z ustawion\u0105 warto\u015bci\u0105 [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":2163,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[52],"tags":[366,177,269],"class_list":["post-2162","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fibot","tag-delay","tag-millis","tag-ws2812","post-with-thumbnail","post-with-thumbnail-large"],"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/2162","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2162"}],"version-history":[{"count":9,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/2162\/revisions"}],"predecessor-version":[{"id":2206,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/2162\/revisions\/2206"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/2163"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}