{"id":368873,"date":"2024-05-21T03:51:23","date_gmt":"2024-05-21T03:51:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=368873"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T03:51:23","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=368873","title":{"rendered":"<span>\u0418\u0433\u0440\u0430 \u0437\u043c\u0435\u0439\u043a\u0430 \u043d\u0430 \u0430\u0440\u0434\u0443\u0438\u043d\u043e<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u044b \u0437\u043c\u0435\u0439\u043a\u0430 \u043d\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u0410\u0440\u0434\u0443\u0438\u043d\u043e \u043d\u0430\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u0414\u0436\u043e\u0439\u0441\u0442\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 WS2812b 8&#215;8 (3\u0448\u0442)<\/p>\n<\/li>\n<li>\n<p>\u0411\u043b\u043e\u043a \u043f\u0438\u0442\u0430\u043d\u0438\u044f 5v 1a<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043f\u0430\u044f\u0442\u044c 3 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u043c\u0435\u0441\u0442\u0435. (\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0434\u043d\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438 \u043f\u043e\u0434\u043a\u043e\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u043e \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0438\u0433\u0440\u044b \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u0437\u044f\u043b 3\u0448\u0442) \u043f\u0430\u044f\u0435\u043c \u043f\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u043a\u0435 \u0438 \u0441\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b(\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0435\u0438\u043b \u043d\u0430 \u0441\u0443\u043f\u0435\u0440 \u043a\u043b\u0435\u0439): dout \u2013 din, 5v \u2013 5v, gnd \u2013 gnd.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/687\/41c\/358\/68741c358d36afb0a8eff4d4a454b51f.jpg\" width=\"4608\" height=\"3456\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/687\/41c\/358\/68741c358d36afb0a8eff4d4a454b51f.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u041b\u0438\u0446\u0435\u0432\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0432\u044b\u0439\u0434\u0435\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/257\/e8f\/5b2\/257e8f5b299872b881ad8a4a1ad8a6e5.jpg\" width=\"4608\" height=\"3456\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/257\/e8f\/5b2\/257e8f5b299872b881ad8a4a1ad8a6e5.jpg\" data-blurred=\"true\"\/><\/figure>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435:<\/p>\n<p>gnd \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430 \u2013 gnd \u0430\u0440\u0434\u0443\u0438\u043d\u043e \u043d\u0430\u043d\u043e, 5v \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430 \u2013 5v \u0430\u0440\u0434\u0443\u0438\u043d\u043e \u043d\u0430\u043d\u043e, VRX \u2013 A0, VRY \u2013 A1, SW \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c.<\/p>\n<p>din \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u2013 D6, 5v \u2013 \u043f\u043b\u044e\u0441\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u043e\u0434 \u0431\u043b\u043e\u043a\u0430 \u043f\u0438\u0442\u0430\u043d\u0438\u044f(\u0442\u0430\u043a \u043a\u0430\u043a \u0430\u0440\u0434\u0443\u0438\u043d\u0435 \u0442\u044f\u0436\u0435\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443), gnd \u2013 gnd \u0430\u0440\u0434\u0443\u0438\u043d\u043e &#8212; \u043c\u0438\u043d\u0443\u0441\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u043e\u0434 \u0431\u043b\u043e\u043a\u0430 \u043f\u0438\u0442\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0421\u043a\u0435\u0442\u0447<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u043a\u0435\u0442\u0447 \u043d\u0430 \u0430\u0440\u0434\u0443\u0438\u043d\u043e \u043d\u0430\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">#include &lt;FastLED.h>    \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b  #define LED_PIN 6  #define NUM_LEDS 192  #define WIDTH 8  #define HEIGHT 24  #define BRIGHTNESS 50  #define LED_TYPE WS2812B  #define COLOR_ORDER GRB  CRGB leds[NUM_LEDS];    \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430  #define JOY_X A0  #define JOY_Y A1    \/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0433\u0440\u044b \"\u0417\u043c\u0435\u0439\u043a\u0430\"  int snakeLength;  int snakeX[NUM_LEDS], snakeY[NUM_LEDS];  int foodX, foodY;  int headX, headY;  int dirX, dirY;  bool gameOver;  unsigned long lastUpdate = 0;  const int updateInterval = 200; \/\/ \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445    void setup() {   Serial.begin(9600);   FastLED.addLeds&lt;LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);   FastLED.setBrightness(BRIGHTNESS);   initGame();  }    void loop() {   if (!gameOver &amp;&amp; millis() - lastUpdate > updateInterval) {   lastUpdate = millis();   readJoystick();   moveSnake();   checkFoodCollision();   drawFrame();   FastLED.show();   } else if (gameOver) {   showGameOver();   delay(2000); \/\/ \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0430 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b   initGame();   }  }    void initGame() {   snakeLength = 5;   headX = 4;   headY = 12;   dirX = 1;   dirY = 0;   gameOver = false;     for(int i = 0; i &lt; snakeLength; i++) {   snakeX[i] = headX - i;   snakeY[i] = headY;   }     generateFood();  }    void generateFood() {   foodX = random(WIDTH);   foodY = random(HEIGHT);  }    void readJoystick() {   int joyXValue = analogRead(JOY_X);   int joyYValue = analogRead(JOY_Y);     if (joyXValue &lt; 400 &amp;&amp; dirX == 0) {   dirX = -1;   dirY = 0;   } else if (joyXValue > 600 &amp;&amp; dirX == 0) {   dirX = 1;   dirY = 0;   } else if (joyYValue &lt; 400 &amp;&amp; dirY == 0) {   dirY = -1;   dirX = 0;   } else if (joyYValue > 600 &amp;&amp; dirY == 0) {   dirY = 1;   dirX = 0;   }  }    void moveSnake() {   for (int i = snakeLength; i > 0; i--) {   snakeX[i] = snakeX[i - 1];   snakeY[i] = snakeY[i - 1];   }   headX += dirX;   headY += dirY;     if (headX &lt; 0) headX = WIDTH - 1;   else if (headX >= WIDTH) headX = 0;   if (headY &lt; 0) headY = HEIGHT - 1;   else if (headY >= HEIGHT) headY = 0;     snakeX[0] = headX;   snakeY[0] = headY;     checkSelfCollision();  }    void checkFoodCollision() {   if (headX == foodX &amp;&amp; headY == foodY) {   snakeLength = min(snakeLength + 1, NUM_LEDS);   generateFood();   }  }    void checkSelfCollision() {   for (int i = 1; i &lt; snakeLength; i++) {   if (snakeX[i] == headX &amp;&amp; snakeY[i] == headY) {   gameOver = true;   break;   }   }  }    void drawFrame() {   fill_solid(leds, NUM_LEDS, CRGB::Black);     \/\/ \u0420\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043c\u0435\u0439\u043a\u0438   for (int i = 0; i &lt; snakeLength; i++) {   leds[XY(snakeX[i], snakeY[i])] = CRGB::Green;   }     \/\/ \u0420\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u044f\u0431\u043b\u043e\u043a\u0430   leds[XY(foodX, foodY)] = CRGB::Red;  }    void showGameOver() {   fill_solid(leds, NUM_LEDS, CRGB::Red);   FastLED.show();  }    uint16_t XY(uint8_t x, uint8_t y) {   return (y * WIDTH) + x;  }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0433\u0440\u0430 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0435. <\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/65d61186ee339fd48bc82be0\" data-style=\"\" id=\"65d61186ee339fd48bc82be0\" width=\"\"><\/div>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0438\u0433\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u0430, \u043f\u043e\u0435\u0434\u0430\u044f \u044f\u0431\u043b\u043e\u043a\u0438 \u0437\u043c\u0435\u0439\u043a\u0430 \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434, \u0435\u0441\u043b\u0438 \u0437\u043c\u0435\u0439\u043a\u0430 \u043d\u0430\u0442\u044b\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f \u0442\u043e \u0432\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u0433\u043e\u0440\u0430\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0441\u043d\u044b\u043c\u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430\u043c\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044f \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0433\u0440\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/795395\/\"> https:\/\/habr.com\/ru\/articles\/795395\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u044b \u0437\u043c\u0435\u0439\u043a\u0430 \u043d\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u0410\u0440\u0434\u0443\u0438\u043d\u043e \u043d\u0430\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u0414\u0436\u043e\u0439\u0441\u0442\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 WS2812b 8&#215;8 (3\u0448\u0442)<\/p>\n<\/li>\n<li>\n<p>\u0411\u043b\u043e\u043a \u043f\u0438\u0442\u0430\u043d\u0438\u044f 5v 1a<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043f\u0430\u044f\u0442\u044c 3 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u043c\u0435\u0441\u0442\u0435. (\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0434\u043d\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438 \u043f\u043e\u0434\u043a\u043e\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u043e \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0438\u0433\u0440\u044b \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u0437\u044f\u043b 3\u0448\u0442) \u043f\u0430\u044f\u0435\u043c \u043f\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u043a\u0435 \u0438 \u0441\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b(\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0435\u0438\u043b \u043d\u0430 \u0441\u0443\u043f\u0435\u0440 \u043a\u043b\u0435\u0439): dout \u2013 din, 5v \u2013 5v, gnd \u2013 gnd.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041b\u0438\u0446\u0435\u0432\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0432\u044b\u0439\u0434\u0435\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><\/figure>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435:<\/p>\n<p>gnd \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430 \u2013 gnd \u0430\u0440\u0434\u0443\u0438\u043d\u043e \u043d\u0430\u043d\u043e, 5v \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430 \u2013 5v \u0430\u0440\u0434\u0443\u0438\u043d\u043e \u043d\u0430\u043d\u043e, VRX \u2013 A0, VRY \u2013 A1, SW \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c.<\/p>\n<p>din \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u2013 D6, 5v \u2013 \u043f\u043b\u044e\u0441\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u043e\u0434 \u0431\u043b\u043e\u043a\u0430 \u043f\u0438\u0442\u0430\u043d\u0438\u044f(\u0442\u0430\u043a \u043a\u0430\u043a \u0430\u0440\u0434\u0443\u0438\u043d\u0435 \u0442\u044f\u0436\u0435\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443), gnd \u2013 gnd \u0430\u0440\u0434\u0443\u0438\u043d\u043e &#8212; \u043c\u0438\u043d\u0443\u0441\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u043e\u0434 \u0431\u043b\u043e\u043a\u0430 \u043f\u0438\u0442\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0421\u043a\u0435\u0442\u0447<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u043a\u0435\u0442\u0447 \u043d\u0430 \u0430\u0440\u0434\u0443\u0438\u043d\u043e \u043d\u0430\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">#include &lt;FastLED.h>    \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b  #define LED_PIN 6  #define NUM_LEDS 192  #define WIDTH 8  #define HEIGHT 24  #define BRIGHTNESS 50  #define LED_TYPE WS2812B  #define COLOR_ORDER GRB  CRGB leds[NUM_LEDS];    \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u0430  #define JOY_X A0  #define JOY_Y A1    \/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0433\u0440\u044b \"\u0417\u043c\u0435\u0439\u043a\u0430\"  int snakeLength;  int snakeX[NUM_LEDS], snakeY[NUM_LEDS];  int foodX, foodY;  int headX, headY;  int dirX, dirY;  bool gameOver;  unsigned long lastUpdate = 0;  const int updateInterval = 200; \/\/ \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445    void setup() {   Serial.begin(9600);   FastLED.addLeds&lt;LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);   FastLED.setBrightness(BRIGHTNESS);   initGame();  }    void loop() {   if (!gameOver &amp;&amp; millis() - lastUpdate > updateInterval) {   lastUpdate = millis();   readJoystick();   moveSnake();   checkFoodCollision();   drawFrame();   FastLED.show();   } else if (gameOver) {   showGameOver();   delay(2000); \/\/ \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u0430 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b   initGame();   }  }    void initGame() {   snakeLength = 5;   headX = 4;   headY = 12;   dirX = 1;   dirY = 0;   gameOver = false;     for(int i = 0; i &lt; snakeLength; i++) {   snakeX[i] = headX - i;   snakeY[i] = headY;   }     generateFood();  }    void generateFood() {   foodX = random(WIDTH);   foodY = random(HEIGHT);  }    void readJoystick() {   int joyXValue = analogRead(JOY_X);   int joyYValue = analogRead(JOY_Y);     if (joyXValue &lt; 400 &amp;&amp; dirX == 0) {   dirX = -1;   dirY = 0;   } else if (joyXValue > 600 &amp;&amp; dirX == 0) {   dirX = 1;   dirY = 0;   } else if (joyYValue &lt; 400 &amp;&amp; dirY == 0) {   dirY = -1;   dirX = 0;   } else if (joyYValue > 600 &amp;&amp; dirY == 0) {   dirY = 1;   dirX = 0;   }  }    void moveSnake() {   for (int i = snakeLength; i > 0; i--) {   snakeX[i] = snakeX[i - 1];   snakeY[i] = snakeY[i - 1];   }   headX += dirX;   headY += dirY;     if (headX &lt; 0) headX = WIDTH - 1;   else if (headX >= WIDTH) headX = 0;   if (headY &lt; 0) headY = HEIGHT - 1;   else if (headY >= HEIGHT) headY = 0;     snakeX[0] = headX;   snakeY[0] = headY;     checkSelfCollision();  }    void checkFoodCollision() {   if (headX == foodX &amp;&amp; headY == foodY) {   snakeLength = min(snakeLength + 1, NUM_LEDS);   generateFood();   }  }    void checkSelfCollision() {   for (int i = 1; i &lt; snakeLength; i++) {   if (snakeX[i] == headX &amp;&amp; snakeY[i] == headY) {   gameOver = true;   break;   }   }  }    void drawFrame() {   fill_solid(leds, NUM_LEDS, CRGB::Black);     \/\/ \u0420\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043c\u0435\u0439\u043a\u0438   for (int i = 0; i &lt; snakeLength; i++) {   leds[XY(snakeX[i], snakeY[i])] = CRGB::Green;   }     \/\/ \u0420\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u044f\u0431\u043b\u043e\u043a\u0430   leds[XY(foodX, foodY)] = CRGB::Red;  }    void showGameOver() {   fill_solid(leds, NUM_LEDS, CRGB::Red);   FastLED.show();  }    uint16_t XY(uint8_t x, uint8_t y) {   return (y * WIDTH) + x;  }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0433\u0440\u0430 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0435. <\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/65d61186ee339fd48bc82be0\" data-style=\"\" id=\"65d61186ee339fd48bc82be0\" width=\"\"><\/div>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0438\u0433\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u0430, \u043f\u043e\u0435\u0434\u0430\u044f \u044f\u0431\u043b\u043e\u043a\u0438 \u0437\u043c\u0435\u0439\u043a\u0430 \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434, \u0435\u0441\u043b\u0438 \u0437\u043c\u0435\u0439\u043a\u0430 \u043d\u0430\u0442\u044b\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f \u0442\u043e \u0432\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u0433\u043e\u0440\u0430\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0441\u043d\u044b\u043c\u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430\u043c\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044f \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0433\u0440\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/795395\/\"> https:\/\/habr.com\/ru\/articles\/795395\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-368873","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/368873","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=368873"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/368873\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=368873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=368873"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=368873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}