{"id":284501,"date":"2017-04-05T23:55:03","date_gmt":"2017-04-05T19:55:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=284501"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=284501","title":{"rendered":"GPS \u0438 \u0441\u0431\u043e\u043a\u0443 \u0431\u0430\u043d\u0442\u0438\u043a. \u041c\u043d\u043e\u0433\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 GPS Logger. \u0427\u0430\u0441\u0442\u044c 2"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/geektimes\/post_images\/23c\/d47\/e0f\/23cd47e0f2c8676913e23a1541d4833e.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>  \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u044f \u0437\u0430\u0433\u043e\u0440\u0435\u043b\u0441\u044f \u0438\u0434\u0435\u0435\u0439 \u043f\u0440\u043e\u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0435\u0440\u043d\u044b\u0439 \u0438 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 GPS \u043b\u043e\u0433\u0433\u0435\u0440 Holux M241. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u0447\u0435\u0433\u043e \u043d\u0438\u0431\u0443\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043d\u0430 \u0440\u044b\u043d\u043a\u0435, \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u044c \u043c\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u043a\u043e\u043f\u043d\u0443\u0442\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, NMEA GPS \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, USB \u0438 SD Card \u043f\u0440\u0435\u043c\u0443\u0434\u0440\u043e\u0441\u0442\u0435\u0439, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0435\u0439 \u043c\u0435\u0447\u0442\u044b.<\/p>\n<p>  \u0427\u0442\u043e \u0436\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u044f \u0441\u0442\u0440\u043e\u044e <a href=\"https:\/\/geektimes.ru\/post\/286348\/\">\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043b \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a>. \u041d\u0430 \u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044f \u043f\u0440\u0438\u0441\u0442\u0440\u0435\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c \u2014 \u0449\u0443\u043f\u0430\u043b Arduino \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0430 \u043d\u044e\u0430\u043d\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430\u0445 \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0442. \u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043c\u0430\u0441\u0441\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0438\u043d\u043f\u0443\u0442\u0430, \u0437\u0430 \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0412\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0447\u0435\u0433\u043e \u043d\u0438\u0431\u0443\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u043d\u044c\u043a\u043e\u0435.<\/p>\n<p>  \u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0438. \u041a\u0430\u043a \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u042f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e \u043f\u043e \u0445\u043e\u0434\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c GPS. \u0410 \u0435\u0449\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u2014 FreeRTOS \u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 STM32. \u041d\u0443 \u0438 \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e.<\/p>\n<p>  \u041f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h2>GPS&#8217;\u0438\u043c<\/h2>\n<p>  \u041a \u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0431\u044b\u043b \u043a\u0430\u0440\u043a\u0430\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u0441\u0435 \u043a\u0440\u0443\u0442\u0438\u043b\u043e\u0441\u044c \u043d\u0430 Arduino Nano \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 ATMega328. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043c\u043e\u0439 GPS \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a <a href=\"https:\/\/www.aliexpress.com\/item\/Best-seller-High-quality-Beitian-BN-880-GLONASS-Flight-Control-Dual-GPS-Module-With-Cable-for\/32758938693.html\">Beitan BN-880<\/a>.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043c\u044b\u0441\u043b\u0438 \u043f\u0440\u043e UART<\/b><\/p>\n<div class=\"spoiler_text\">\u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u0432\u0437\u044f\u0442\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a UART \u043a\u0430\u043a \u043a \u043d\u0438\u0437\u043a\u043e\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0432\u0435\u043a\u0430. \u0420\u0430\u0437\u0443\u043c\u043e\u043c \u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u0430\u043a 3 \u043a\u043e\u043f\u0435\u0439\u043a\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435\u043c \u0447\u0442\u043e \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f. \u0427\u0442\u043e \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e? \u0415\u0449\u0435 \u044f \u043f\u0440\u0435\u0434\u0432\u0437\u044f\u0442\u043e \u043e\u0442\u043d\u043e\u0448\u0443\u0441\u044c \u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c \u2014 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0436\u0435 \u0435\u0449\u0435 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e. \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0433\u043e\u043d\u044f\u0442\u044c \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c \u0432\u0438\u0434\u0435? \u0414\u0430 \u0435\u0449\u0435 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438? \u0412\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0438\u0445 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u0442. \u0410 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u041d\u0443 \u0442\u043e \u044f \u0442\u0430\u043a, \u0436\u0443\u0436\u0436\u0443.  <\/div>\n<\/div>\n<p>  \u0423\u0432\u0438\u0434\u0435\u0432 \u043d\u043e\u0433\u0438 SDA \u0438 SCK \u0442\u043e\u0440\u0447\u0430\u0449\u0438\u0435 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f \u043c\u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043a \u043d\u0438\u043c \u043f\u0440\u0438\u0446\u0435\u043f\u0438\u0442\u044c\u0441\u044f. \u041f\u0440\u0438\u0446\u0435\u043f\u0438\u043b\u0441\u044f \u0438\u2026. \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435 \u0442\u0430\u043a \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u042f \u0434\u0430\u0436\u0435 \u0438 \u043d\u0435 \u0437\u043d\u0430\u044e \u043a\u0430\u043a. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f UART, \u0442\u043e GPS \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0441\u044b\u043f\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u043f\u0430\u0440\u0441\u0438\u0442 \u0447\u0442\u043e \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e. I2C \u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0445\u043e\u0441\u0442\u0430. \u0422.\u0435. \u043d\u0443\u0436\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442. \u041d\u043e \u043a\u0430\u043a\u043e\u0439?<\/p>\n<p>  \u0413\u0443\u0433\u043b\u0435\u0436 \u043d\u0430 \u0442\u0435\u043c\u0443 BN-880 I2C \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043f\u0430\u0440\u044b \u0447\u0430\u0441\u043e\u0432 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043d\u0435 \u0434\u0430\u043b. \u041d\u0430\u0440\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 UART, \u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043e\u043a \u0432\u0435\u043b\u0430 \u043d\u0430 \u0444\u043e\u0440\u0443\u043c\u044b \u043a\u0432\u0430\u0434\u0440\u043e\u043a\u043e\u043f\u0442\u0435\u0440\u0449\u0438\u043a\u043e\u0432 \u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0438\u0441\u044c \u0442\u0430\u043c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u0432\u0430\u0434\u0440\u043e\u043a\u043e\u043f\u0442\u0435\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  \u041d\u0430 \u0434\u0430\u0442\u0430\u0448\u0438\u0442\u044b \u0432\u044b\u0439\u0442\u0438 \u0431\u044b\u043b\u043e \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. \u0422.\u0435. \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0430\u0442\u0430\u0448\u0438\u0442. \u041f\u043e \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430\u043c \u044f \u0432\u044b\u044f\u0441\u043d\u0438\u043b, \u0447\u0442\u043e \u0437\u0430 GPS \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c UBlox NEO-M8N. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u0443\u043c\u0435\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0438\u0447, \u0447\u0442\u043e \u043c\u0430\u043c\u0430 \u043d\u0435 \u0433\u043e\u0440\u044e\u0439 (\u0442\u0430\u043c \u0434\u0430\u0436\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043e\u0434\u043e\u043c\u0435\u0442\u0440 \u0438 \u043b\u043e\u0433\u0433\u0435\u0440 \u0435\u0441\u0442\u044c). \u041d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0438 \u043c\u043d\u043e\u0433\u043e \u043d\u0438 \u043c\u0430\u043b\u043e 350 \u0441\u0442\u0440\u0430\u043d\u0438\u0446.<\/p>\n<p>  \u041f\u043e\u043b\u0438\u0441\u0442\u0430\u0432 \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430 \u0434\u0430\u0442\u0430\u0448\u0438\u0442 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441 \u043d\u0430\u0441\u043a\u043e\u043a\u0443 \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0435 \u0432\u0437\u044f\u0442\u044c. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u043d\u0430 \u0433\u043e\u0440\u043b\u043e \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u0443\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u043c\u0443 UART. \u0418 \u0442\u0443\u0442 \u0436\u0435 \u0432\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443: \u043d\u0430 \u0430\u0440\u0434\u0443\u0438\u043d\u0435 UART \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d, \u0438 \u0442\u043e\u0442 \u0442\u043e\u0440\u0447\u0438\u0442 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043a\u043e\u043c\u043f\u0430 (\u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438). \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 SoftwareSerial.<\/p>\n<p>  \u041d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u201c\u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u0442\u043e\u0440\u201d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u043f\u043e\u0440\u0442\u0430 GPS \u0432 UART.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u0442\u043e\u0440<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">SoftwareSerial gpsSerial(10, 11); \/\/ RX, TX   void setup() {         \tSerial.begin(9600);         \tgpsSerial.begin(9600); }   void loop() {         \tif (gpsSerial.available()) {                     \tSerial.write(gpsSerial.read());         \t} }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u0441\u044b\u043f\u0430\u043b\u0438\u0441\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043d\u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0438 \u0441\u043b\u043e\u0432\u0438\u0442\u044c \u0442\u0430\u043a \u0438 \u043d\u0435 \u0441\u043c\u043e\u0433. \u0425\u043e\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u0431\u044b\u043b\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435.<br \/>  <code>$GNRMC,203954.00,V,,,,,,,,,,N*6A<br \/>  $GNVTG,,,,,,,,,N*2E<br \/>  $GNGGA,203954.00,,,,,0,00,99.99,,,,,,*71<br \/>  $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E<br \/>  $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E<br \/>  $GPGSV,1,1,02,02,,,21,08,,,09*7B<br \/>  $GLGSV,1,1,00*65<br \/>  $GNGLL,,,,,203954.00,V,N*5D<br \/>  <\/code> <br \/>  GPS \u043f\u0440\u043e\u043b\u0435\u0436\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0430\u0441\u0430 \u0443 \u043e\u043a\u043d\u0430 21 \u044d\u0442\u0430\u0436\u0430 \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u044b\u0434\u0430\u043b \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041f\u0440\u0438\u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0437\u043e\u0440\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u044d\u0442\u0430\u0436\u043d\u043e\u0439 \u0437\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439. \u0415\u0441\u0442\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043d\u0430 \u043e\u043a\u043d\u0430\u0445 \u043d\u0430\u043d\u0435\u0441\u0435\u043d\u043e \u043d\u0435\u043a\u043e\u0435 \u043d\u0430\u043f\u044b\u043b\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0445\u0443\u0434\u0448\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u0412\u043e \u0432\u0441\u044f\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043b\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0438, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e, \u043b\u043e\u0432\u044f\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  \u0420\u0430\u0437 \u0435\u0441\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b, \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0440\u0441\u0438\u0442\u044c. \u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 TinyGPSPlus. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u043d\u0435 \u0431\u0435\u0437 \u0445\u0430\u043a\u043e\u0432. \u0412 ArduinoIDE \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u043e \u0432 Atmel Studio \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0443\u0442\u0438 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435.<\/p>\n<p>  \u041d\u043e \u0442\u0443\u0442 \u0432\u044b\u043b\u0435\u0437\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043a\u0435\u0442\u0447\u0430\u0445 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 TinyGPS+ \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u044d\u0442\u043e \u0432 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c \u0438 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0432\u0441\u0435 \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c. \u0414\u0435\u0432\u0430\u0439\u0441 \u043e\u0449\u0443\u0442\u0438\u043c\u043e \u0442\u0443\u043f\u0438\u043b, \u044f\u0432\u043d\u043e \u043f\u0440\u043e\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u044d\u043a\u0440\u0430\u043d\u0430. \u0412 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435 \u043f\u043e\u0440\u0442\u0430 \u044f \u043d\u0430\u0447\u0430\u043b \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u044c \u043f\u043e\u043a\u043e\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 GPS. <\/p>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e SoftwareSerial \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u0436\u0440\u0430\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442 SoftwareSerial \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u0442\u043e\u043f\u043a\u0443, \u0442.\u043a. \u0434\u043b\u044f \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0439 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438 \u0441 GPS \u043e\u043d \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 (\u0432\u043e \u0432\u0441\u044f\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445). \u042f \u0434\u0430\u0436\u0435 \u0445\u043e\u0442\u0435\u043b \u0432\u044b\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u043d\u0430\u0438\u0437\u043d\u0430\u043d\u043a\u0443: GPS \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u043c\u0443 UART\u2019\u0443 \u0430\u0440\u0434\u0443\u0438\u043d\u044b, \u0430 \u0441\u043e\u0444\u0442\u0432\u0430\u0440\u043d\u044b\u0439 \u0441\u0435\u0440\u0438\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0434\u0435\u0431\u0430\u0433\u0430 (\u0445\u043e\u0442\u044f \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 UART \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0436\u0435 \u0438 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f). \u041d\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 UART \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440 USBAsp.<\/p>\n<p>  \u041d\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e SoftwareSerial \u0448\u0442\u0443\u043a\u0430 \u0445\u043e\u0442\u044c \u0438 \u043f\u0440\u043e\u0436\u043e\u0440\u043b\u0438\u0432\u0430\u044f, \u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0432 \u043d\u0435\u043c, \u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 50-75\u043c\u0441 (\u043f\u043b\u044e\u0441 \u0435\u0449\u0435 \u0447\u0443\u0442\u043e\u043a \u043d\u0430 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b). SoftwareSerial \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u0438\u0435\u043c \u043f\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044e \u043d\u0430 \u043d\u043e\u0433\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0438 \u043c\u043d\u043e\u0433\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c \u0442\u043e, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d. \u041d\u043e \u0443 \u043d\u0435\u0433\u043e \u043f\u0440\u0438\u0435\u043c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0432\u0441\u0435\u0433\u043e 64 \u0431\u0430\u0439\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u0436\u0435 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 9600 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u0430 60\u043c\u0441. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\u0430, \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442 GPS \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u043c\u0438\u043c\u043e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/geektimes\/post_images\/b21\/737\/5db\/b217375db6c812b7249db603d0b670d2.jpg\" alt=\"image\"\/><br \/>  <i>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430. \u0420\u0430\u0437\u0431\u0430\u0432\u043b\u044e \u043a\u0430 \u044f \u0438\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/i><\/p>\n<h2>ARM\u0438\u0440\u0443\u0435\u043c<\/h2>\n<p>  \u0418\u0442\u0430\u043a. \u0421 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u044f \u0443\u043f\u0435\u0440\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439:  <\/p>\n<ul>\n<li>\u0424\u043b\u0435\u0448 \u0438 \u041e\u0417\u0423. \u041d\u0435 \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u043c\u043d\u043e\u0433\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043d\u044f\u0442\u043e, \u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u043c\u043d\u0438\u0442\u044c<\/li>\n<li>\u0412\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d UART. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 SoftwareSerial \u043e\u0449\u0443\u0442\u0438\u043c\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/li>\n<li>\u0412 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0432\u0441\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u044f\u0432\u043d\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f. \u041d\u0443\u0436\u043d\u043e \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447<\/li>\n<\/ul>\n<p>  \u0410 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u043c \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u2014 \u043c\u043d\u0435 \u0436\u0435 \u0435\u0449\u0435 \u0441\u0432\u0435\u0442\u0438\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 USB \u0438 SD \u043a\u0430\u0440\u0442\u044b. <\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u0447\u0442\u043e \u0410\u0440\u0434\u0443\u0438\u043d\u043e \u043e\u0442\u0441\u0442\u043e\u0439 \u0438 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0437\u0430 ARM \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c\u0438 STM32. \u041c\u043d\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0410\u0440\u0434\u0443\u0438\u043d\u043e. \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0443 \u043d\u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439, \u0434\u0430 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b ATMega \u044f \u0442\u043e\u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u044e. <\/p>\n<p>  \u0412 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 STM32 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u043b \u0431\u044b \u0441\u043c\u0435\u043d\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u0446\u0435\u043b\u043e\u043c, \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, IDE \u0438 \u043a\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u0447\u0435\u0433\u043e \u0435\u0449\u0435. \u0422.\u0435. \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u043e \u0438 \u0441\u0440\u0430\u0437\u0443. \u0414\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e \u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f, \u0434\u043e\u043b\u0433\u043e \u0448\u0442\u0443\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441 \u043d\u0443\u043b\u044f. <\/p>\n<p>  \u042f \u043d\u0430\u0447\u0430\u043b \u0449\u0443\u043f\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u044b \u0438\u0437 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043f\u0440\u0438\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u044f\u0441\u044c \u043a \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u0430\u043c \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0435\u0448\u0430\u043b\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u0434\u0430\u0432\u0430\u043b\u043e \u043d\u0435\u043a\u0438\u0439 \u0437\u0430\u0434\u0435\u043b \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 \u043f\u0435\u0440\u0435\u0435\u0437\u0434 \u0432\u0441\u0435\u0433\u043e \u0438 \u0441\u0440\u0430\u0437\u0443. \u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e (\u0432 \u043e\u0431\u0449\u0435\u043c \u0442\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445) \u0432\u0435\u0449\u0435\u0439 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f \u043f\u043e\u043a\u043e\u0432\u044b\u0440\u044f\u043b\u0441\u044f.<\/p>\n<ul>\n<li>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u043a\u043b\u043e\u043d Sparkfun Pro Micro \u043d\u0430 ATMega32u4 (3.3\u0412, 8\u041c\u0413\u0446). \u0412 \u043d\u0435\u043c \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 USB. \u0423 \u043c\u0435\u043d\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0443\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u0443 \u0448\u0442\u0443\u043a\u043e\u0432\u0438\u043d\u0443. \u0428\u0442\u0430\u0442\u043d\u044b\u0439 \u0431\u0443\u0442\u043b\u043e\u0430\u0434\u0435\u0440 \u043a\u0430\u043a \u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0430\u0440\u0434\u0443\u0438\u043d\u043e, \u0430 \u0443\u0436 fuse \u0431\u0438\u0442\u044b \u0438 \u0432\u043e\u0432\u0441\u0435 \u0431\u044b\u043b\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u0430\u043a\u0438\u043c \u0442\u043e \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e USBAsp \u0432\u0448\u0438\u043b \u0431\u0443\u0442\u043b\u043e\u0430\u0434\u0435\u0440 \u043e\u0442 Arduino Leonardo \u0438 \u0432\u0441\u0435 \u0437\u0430\u0432\u0435\u043b\u043e\u0441\u044c.<\/li>\n<li>\u041f\u0440\u0438\u0448\u043b\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0430 \u043d\u0430 ATMega64. \u0412 \u043d\u0435\u0439 \u0432 2 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0438 \u0444\u043b\u0435\u0448\u0430 \u0438 \u041e\u0417\u0423) \u0438 2 uart. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u043a \u043f\u043b\u0430\u0442\u0435 \u043d\u0435 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0442\u0430\u043c \u043a\u0432\u0430\u0440\u0446 \u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u0436\u0435 \u043d\u0435 \u044f\u0441\u043d\u043e. \u041f\u043e\u043a\u0430 \u043e\u0442\u043b\u043e\u0436\u0438\u043b.<\/li>\n<li>\u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c \u043f\u043e\u0440\u0442 FreeRTOS \u043f\u043e\u0434 AVR. \u041d\u043e \u0442\u0443\u0442 \u043a\u0430\u043a\u0443 \u043f\u043e\u0434\u043b\u043e\u0436\u0438\u043b\u0430 Atmel Studio. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0443 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c 2 \u0432\u0438\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0412 \u043e\u0434\u043d\u043e\u043c \u0441\u0442\u0443\u0434\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0410\u0440\u0434\u0443\u0438\u043d\u043e, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0422.\u0435. \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0430\u0436\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c FreeRTOS \u0432 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c include path. \u041e\u043d\u043e \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043e\u0434\u043d\u0443 \u043a\u0443\u0447\u0443, \u0447\u0442\u043e \u043b\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f \u0431\u044b \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u043b\u043e.\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0442\u0438\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Generic C++ Executable. \u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043d\u0430 \u0433\u043e\u043b\u043e\u043c C++. \u0422\u0443\u0442 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0442\u044c \u043a\u0430\u043a \u0434\u0443\u0448\u0435 \u0443\u0433\u043e\u0434\u043d\u043e. \u041d\u043e \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u0442\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0430\u0440\u0434\u0443\u0438\u043d\u043e\u0432\u0441\u043a\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u0430 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0430\u043a \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440. Avrdude \u0443\u043f\u043e\u0440\u043d\u043e \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432 \u0431\u0443\u0442\u043b\u043e\u0430\u0434\u0435\u0440 (\u0445\u043e\u0442\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u044f \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0443 ArduinoIDE \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ProcessMonitor). \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c USBasp, \u043d\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 USB \u043f\u043e\u0440\u0442\u0430 \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 \u0448\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440 \u043a\u0430\u043a \u0442\u043e \u043d\u0435 \u043a\u043e\u043c\u0438\u043b\u044c\u0444\u043e.<\/li>\n<li>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u044f \u0440\u0430\u0441\u043f\u0430\u044f\u043b \u0433\u0440\u0435\u0431\u0435\u043d\u043a\u0443 \u043d\u0430 <a href=\"http:\/\/www.ebay.com\/itm\/STM32F103C8T6-ARM-STM32-Minimum-System-Development-Board-Module-For-Arduino-\/201529768817\">\u043f\u043b\u0430\u0442\u0443 \u0441 STM32F103C8T6<\/a> \u0438 <a href=\"https:\/\/geektimes.ru\/post\/277928\/\">\u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438<\/a> \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b <a href=\"https:\/\/github.com\/rogerclarkmelbourne\/Arduino_STM32\">STM32duino<\/a>. \u041a \u043c\u043e\u0435\u043c\u0443 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u044e \u043c\u043e\u0440\u0433\u0430\u043b\u043a\u0430 \u043d\u0430 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430\u0445 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430. \u041a \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u044e \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0437\u0430\u043d\u044f\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435 10 \u043c\u0438\u043d\u0443\u0442!!! \u0412\u0441\u0435\u0433\u043e \u0442\u043e \u043f\u0430\u0440\u0443 \u0438\u043d\u043a\u043b\u0443\u0434\u043e\u0432 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u0438\u043d\u043e\u0432 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c.<\/li>\n<\/ul>\n<p>  \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u042f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043c\u043e\u0449\u044c STM32 (\u0434\u0430! \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u0432\u0441\u0435\u0433\u043e 18\u043c\u0441!) \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u044f \u043c\u043e\u0433 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u043e\u0432\u043e\u0440\u043a\u043e\u043c \u0430\u0440\u0434\u0443\u0438\u043d\u043e. \u042d\u0442\u043e \u0434\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043b\u0430\u0432\u043d\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u043e\u0432\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043f\u043e\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0432 \u043c\u0435\u0442\u0440\u043e \u0434\u0430\u0442\u0430\u0448\u0438\u0442 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p>  \u041f\u0440\u0438\u0440\u043e\u0441\u0442 \u0444\u043b\u0435\u0448\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u0438\u0437\u0440\u0430\u0447\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435. \u041f\u0440\u043e\u0435\u043a\u0442 \u043a\u0430\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u043b \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0444\u043b\u0435\u0448\u0430 \u043d\u0430 ATmega32, \u0442\u0430\u043a \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043d\u0430 \u043d\u043e\u0432\u043e\u043c STM32 (\u043d\u0443 \u043b\u0430\u0434\u043d\u043e, 26\u043a \u0438\u0437 64\u043a). \u0422\u0430\u043a \u0447\u0442\u043e \u0440\u0430\u0441\u0441\u043b\u0430\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0441\u0442\u043e\u0438\u043b\u043e. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435 (\u043a\u0430\u043a \u043f\u0438\u0448\u0443\u0442 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430\u0445) \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u043c\u0430\u0448\u0438\u0441\u0442 \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043b\u0435\u0448 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 AVR. \u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0437\u0430\u043a\u0430\u0437\u0430\u043b \u043f\u043b\u0430\u0442\u043a\u0443 \u0441 128\u043a \u0444\u043b\u0435\u0448\u0430. <\/p>\n<p>  \u041f\u0440\u0430\u0432\u0434\u0430 \u0442\u0443\u0442 \u043c\u0435\u043d\u044f \u0436\u0434\u0430\u043b \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u044e\u0440\u043f\u0440\u0438\u0437. \u041d\u0430\u0440\u043e\u0434 <a href=\"https:\/\/www.google.com.ua\/webhp?sourceid=chrome-instant&amp;ion=1&amp;espv=2&amp;ie=UTF-8#q=stm32+blue+pill+128k&amp;*\">\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u0438\u0448\u0435\u0442<\/a>, \u0447\u0442\u043e \u0445\u043e\u0442\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u043e \u0434\u0430\u0442\u0430\u0448\u0438\u0442\u0443 \u0438\u043c\u0435\u0435\u0442 64\u043a \u0444\u043b\u0435\u0448\u0430 \u043d\u0430 \u0431\u043e\u0440\u0442\u0443, \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 128\u043a. \u0422.\u0435. \u043f\u043e\u0445\u043e\u0436\u0435 ST \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0447\u0438\u043f, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u043c\u0430\u0440\u043a\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u043a STM32F103C8T6, \u0430 \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u0430\u043a STM32F103CBT6 (\u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u043d\u043e \u0441 128\u043a \u0444\u043b\u0435\u0448\u0430).<\/p>\n<p>  \u041a \u0441\u043b\u043e\u0432\u0443 (follow up \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438). \u0412 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 ARM \u0438 \u0444\u043b\u0435\u0448 \u0438 \u041e\u0417\u0423 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043d\u0446\u044b \u0441 \u0431\u0443\u0431\u043d\u043e\u043c \u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e PROGMEM \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u041f\u043e\u0443\u0431\u0438\u0440\u0430\u043b \u0440\u0430\u0434\u0438 \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u043a\u043e\u0434\u0430. \u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0442\u043e\u0436\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0442.\u043a. \u043e\u043d\u0438 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/geektimes\/post_images\/36a\/2cf\/56c\/36a2cf56cafd7f7ed87c8905cc05a8bf.jpg\" alt=\"image\"\/><br \/>  <i>\u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430. \u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e: \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f (\u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0432\u0438\u0436\u0435\u043c\u0441\u044f), \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430. \u042d\u043a\u0440\u0430\u043d \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u043b\u0438\u0437\u0430\u043d \u0441 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0433\u043e \u0443 Holux M241<\/i><\/p>\n<h2>FreeRTOS&#8217;\u0438\u043c<\/h2>\n<p>  \u0412 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 STM32duino \u0442\u0430\u043a \u0436\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0441\u044f \u043f\u043e\u0440\u0442 FreeRTOS \u043f\u043e\u0434 \u043c\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 (\u043f\u0440\u0438\u0447\u0435\u043c \u0430\u0436 \u0434\u0432\u0430 \u2014 7.0.1 \u0438 8.2.1). \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u043a\u0430\u043c\u0438 \u0442\u0430\u043a \u0436\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438. \u0422\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 FreeRTOS \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0432 \u043f\u0430\u0440\u0443 \u0441\u0442\u0430\u0442\u0435\u0439 (<a href=\"https:\/\/habrahabr.ru\/post\/249273\/\">\u0440\u0430\u0437<\/a>, <a href=\"https:\/\/habrahabr.ru\/post\/261807\/\">\u0434\u0432\u0430<\/a>) \u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043b \u043a\u0430\u043a\u0430\u044f \u043c\u043e\u0449\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u2014 \u043f\u043e\u0442\u043e\u043a\u0438, \u043c\u044e\u0442\u0435\u043a\u0441\u044b, \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0441\u0435\u043c\u0430\u0444\u043e\u0440\u044b \u0438 \u043f\u0440\u043e\u0447\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f. \u0412\u0441\u0435 \u043a\u0430\u043a \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u0445. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b GPS, \u044f \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u0447\u0435\u0433\u043e \u043f\u043e\u043f\u0440\u043e\u0449\u0435 \u2014 \u043a\u043d\u043e\u043f\u043e\u043a. \u0412 \u043a\u0430\u043a\u043e\u043c \u0442\u043e \u0441\u043c\u044b\u0441\u043b\u0435 FreeRTOS \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043a\u043e\u0434 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u043e\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438. \u0422\u0430\u043a, \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043b\u043e\u0436\u0438\u043b\u0430\u0441\u044c \u0432 \u044d\u0442\u0443 \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u044e \u2014 \u0441\u043b\u0443\u0448\u0430\u0439 \u0441\u0435\u0431\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u043d\u0438 \u043d\u0430 \u0447\u0442\u043e \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0439\u0441\u044f. \u0410 \u0443\u0436 \u043a\u0430\u043a \u043d\u0430\u0436\u043c\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u043d\u0438\u0431\u0443\u0434\u044c \u2014 \u043d\u043e\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0439.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0428\u0430\u0433 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443<\/b><\/p>\n<div class=\"spoiler_text\">\u0425\u043e\u0442\u044f \u043f\u043e\u0442\u043e\u043a\u0438 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u043d\u043e, \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0441\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u043f\u0440\u043e\u0441\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u0446\u0438\u043a\u043b\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u2014 \u0432\u0435\u0434\u044c \u0435\u0441\u0442\u044c \u0436\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u043e\u0436\u043a\u0435! \u041d\u0443 \u0430 \u0435\u0449\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 STM32 \ud83d\ude42<\/p>\n<pre><code class=\"cpp\">static void selButtonPinHandler() {        \tstatic uint32 lastInterruptTime = 0;          \tif(digitalRead(SEL_BUTTON_PIN)) \/\/ Falling edge        \t{                \tuint32 cur = millis();                \tuint32 pressDuration = cur - lastInterruptTime;                  \tSerial.print(&quot;DePressed at &quot;);                \tSerial.println(lastInterruptTime);                     \t                \tif(pressDuration &gt; LONG_PRESS_TIMEOUT)                        \tSerial.println(&quot;Sel Long Press&quot;);                \telse                \tif(pressDuration &gt; SHORT_CLICK_TIMEOUT)                        \tSerial.println(&quot;Sel Short Click&quot;);                \telse                \t{                        \tSerial.print(&quot;Click was too short: &quot;);           \t                        \tSerial.println((int)pressDuration);                \t}        \t}         \t         \t        \tlastInterruptTime = millis();          \tif(!digitalRead(SEL_BUTTON_PIN)) \/\/ Raising edge        \t{                \tSerial.print(&quot;Pressed at &quot;);                \tSerial.println(lastInterruptTime);        \t} }  void initButtons() {       \t\/\/ Set up button pins       \tpinMode(SEL_BUTTON_PIN, INPUT_PULLUP); \/\/ TODO: using PullUps is an AVR legacy. Consider changing this to pull down       \tpinMode(OK_BUTTON_PIN, INPUT_PULLUP);  \/\/  so pin state match human logic expectations         \t       \tattachInterrupt(SEL_BUTTON_PIN, selButtonPinHandler, CHANGE); } <\/code><\/pre>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0438\u043d\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0431\u044b\u0442\u044c \u043e\u0442\u0441\u044b\u043b\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e \u043d\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0435.<\/p>\n<p>  \u041d\u043e \u0435\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e (\u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438) \u0434\u0430 \u0435\u0449\u0435 \u0438 \u0443\u0436\u0430\u0441\u043d\u043e \u0433\u043b\u044e\u0447\u043d\u043e. \u041d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0438\u0441\u044c \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u043d\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a\u043e\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f millis() \u043a\u0430\u043a \u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0438 \u043c\u043e\u0433\u043b\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.  <\/div>\n<\/div>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0435\u0439\u0442 \u043c\u0430\u0448\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c \u0438 \u0441\u043b\u0443\u0448\u0430\u043b\u0430 \u043a\u043d\u043e\u043f\u043a\u0438. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0439 \u043d\u0438\u0431\u0443\u0434\u044c \u043b\u043e\u0433\u0438\u043a\u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043a\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043a\u043e\u0434\u0430, \u0430 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u043b\u044f\u0434\u044f \u043d\u0430 \u043a\u043e\u0434 \u043f\u043e\u0434 \u0441\u0438\u043b\u0443 \u0431\u044b\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u0443\u0440\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0435\u0439\u0442 \u043c\u0430\u0448\u0438\u043d. \u041d\u043e \u0440\u0430\u0437 \u0443\u0436 \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0420\u0422\u041e\u0421, \u0442\u043e \u0432\u0441\u0435 \u0432\u044b\u0448\u043b\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0449\u0435. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043d\u043e\u043f\u043e\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">\/\/ Pins assignment const uint8 SEL_BUTTON_PIN = PC14; const uint8 OK_BUTTON_PIN = PC15;   \/\/ Timing constants const uint32 DEBOUNCE_DURATION = 1 \/ portTICK_PERIOD_MS; const uint32 LONG_PRESS_DURATION = 500 \/ portTICK_PERIOD_MS; const uint32 VERY_LONG_PRESS_DURATION = 1000 \/ portTICK_PERIOD_MS; const uint32 POWER_OFF_POLL_PERIOD = 1000 \/ portTICK_PERIOD_MS; \/\/ Polling very rare when power is off const uint32 IDLE_POLL_PERIOD = 100 \/ portTICK_PERIOD_MS;                \t\/\/ And little more frequent if we are on const uint32 ACTIVE_POLL_PERIOD = 10 \/ portTICK_PERIOD_MS;             \t\/\/ And very often when user actively pressing buttons   QueueHandle_t buttonsQueue;  \/\/ Reading button state (perform debounce first) inline bool getButtonState(uint8 pin) { \tif(digitalRead(pin)) \t{ \t\t\/\/ dobouncing \t\tvTaskDelay(DEBOUNCE_DURATION); \t\tif(digitalRead(pin)) \t\t\treturn true; \t} \t \treturn false; }  \/\/\/ Return ID of the pressed button (perform debounce first) ButtonID getPressedButtonID()  { \tif(getButtonState(SEL_BUTTON_PIN)) \t\treturn SEL_BUTTON;  \tif(getButtonState(OK_BUTTON_PIN)) \t\treturn OK_BUTTON;  \treturn NO_BUTTON; }  \/\/ Initialize buttons related stuff void initButtons() { \t\/\/ Set up button pins \tpinMode(SEL_BUTTON_PIN, INPUT_PULLDOWN); \tpinMode(OK_BUTTON_PIN, INPUT_PULLDOWN); \t \t\/\/ Initialize buttons queue \tbuttonsQueue = xQueueCreate(3, sizeof(ButtonMessage)); \/\/ 3 clicks more than enough }   \/\/ Buttons polling thread function void vButtonsTask(void *pvParameters) { \tfor (;;) \t{ \t\t\/\/ Wait for a button \t\tButtonID btn = getPressedButtonID(); \t\tif (btn != NO_BUTTON) \t\t{ \t\t\t\/\/ Button pressed. Waiting for release \t\t\tTickType_t startTime = xTaskGetTickCount(); \t\t\twhile(getPressedButtonID() != NO_BUTTON) \t\t\t\tvTaskDelay(ACTIVE_POLL_PERIOD);  \t\t\t\/\/ Prepare message to send \t\t\tButtonMessage msg; \t\t\tmsg.button = btn; \t\t\t\t \t\t\t\/\/ calc duration \t\t\tTickType_t duration = xTaskGetTickCount() - startTime; \t\t\tif(duration &gt; VERY_LONG_PRESS_DURATION) \t\t\t\tmsg.event = BUTTON_VERY_LONG_PRESS; \t\t\telse \t\t\tif(duration &gt; LONG_PRESS_DURATION) \t\t\t\tmsg.event = BUTTON_LONG_PRESS; \t\t\telse \t\t\t\tmsg.event = BUTTON_CLICK; \t\t\t\t \t\t\t\/\/ Send the message \t\t\txQueueSend(buttonsQueue, &msg, 0); \t\t} \t\t \t\t\/\/ TODO: Use different polling periods depending on global system state (off\/idle\/active) \t\tvTaskDelay(ACTIVE_POLL_PERIOD); \t} }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0441\u0435 \u043e\u0447\u0435\u043d\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435. \u041f\u0440\u043e\u0441\u0442\u043e \u0432 \u0446\u0438\u043a\u043b\u0435 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u042f \u0440\u0435\u0448\u0438\u043b \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0434\u0435\u0442 3 \u0432\u0438\u0434\u0430 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430\u0436\u0430\u0442\u0438\u044f  <\/p>\n<ul>\n<li>\u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430 \u043c\u0435\u043d\u044e<\/li>\n<li>\u0414\u043b\u0438\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0431\u0440\u043e\u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430)<\/li>\n<li>\u041e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u043e\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/li>\n<\/ul>\n<p>  \u042f, \u043a\u0441\u0442\u0430\u0442\u0438, \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043a \u043f\u043b\u044e\u0441\u0443, \u0430 \u043a \u043c\u0438\u043d\u0443\u0441\u0443. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e pull-up \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u043d\u0430 pull-down. \u042f \u043d\u0435 \u0441\u0438\u043b\u0435\u043d \u0432 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0438\u043a\u0435 \u0438 \u043c\u043e\u0433\u0443 \u0442\u0443\u0442 \u043e\u0448\u0438\u0431\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438:  <\/p>\n<ul>\n<li>\u0412 \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u0438\u043d \u043f\u0440\u0438\u0436\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0443\u043b\u044e, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0442\u043e\u043a \u043d\u0435 \u0442\u0435\u0447\u0435\u0442 (\u043f\u0443\u0441\u043a\u0430\u0439 \u0434\u0430\u0436\u0435 \u043c\u0438\u0437\u0435\u0440\u043d\u044b\u0439)<\/li>\n<li>\u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u0438\u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c: 1 \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0430\u0436\u0430\u0442\u0430, 0 \u2014 \u043e\u0442\u043f\u0443\u0449\u0435\u043d\u0430<\/li>\n<\/ul>\n<p>  ScreenManager \u0442\u0430\u043a\u0436\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0441\u044f. \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u044f. \u041f\u043e\u0442\u043e\u043a \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0442 \u043a\u043d\u043e\u043f\u043e\u043a. \u041e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u0434\u0430\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041f\u0440\u0438\u0447\u0435\u043c \u0441\u0430\u043c \u0446\u0438\u043a\u043b \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a \u0436\u0435 \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u043d \u0447\u0435\u0440\u0435\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 xQueueReceive. \u0422.\u0435. \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0436\u0434\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u044d\u043a\u0440\u0430\u043d \u043a\u0430\u043a \u0435\u0441\u0442\u044c<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0442\u043e\u043a \u0434\u0438\u0441\u043f\u043b\u0435\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void vUserInteractionTask(void *pvParameters) {        \tfor (;;)        \t{                \t\/\/ Poll the buttons queue for an event. Process button if pressed, or show current screen as usual if no button pressed                \tButtonMessage msg;                \tif(xQueueReceive(buttonsQueue, &msg, DISPLAY_CYCLE))                        \tprocessButton(msg);                     \t                \t\/\/ Do what we need for current state                \tdrawDisplay();        \t} }<\/code><\/pre>\n<\/p><\/div>\n<\/div>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043e\u0447\u0435\u043d\u044c \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e. \u041f\u043e\u0437\u0436\u0435 \u044f \u0441\u044e\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 (\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0431\u0430\u0442\u0430\u0440\u0435\u0438), \u043d\u043e \u043a\u043e\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043b\u0441\u044f.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0430\u043a \u0436\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0430\u0440\u0441\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void processButton(const ButtonMessage &msg) {       \tif(msg.button == SEL_BUTTON && msg.event == BUTTON_CLICK)                \tgetCurrentScreen()-&gt;onSelButton();                     \t        \tif(msg.button == OK_BUTTON && msg.event == BUTTON_CLICK)                \tgetCurrentScreen()-&gt;onOkButton();          \t\/\/ TODO: process long press here }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f showMessageBox() \u0442\u0430\u043a \u0436\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u0438 \u0441\u0442\u0430\u043b\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043e\u043a\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void showMessageBox(const char * text) {         \/\/Center text         uint8_t x = 128\/2 - strlen_P(text)*6\/2;                                \t         \/\/ Draw the message         display.clearDisplay();         display.setFont(NULL);         display.drawRect(2, 2, 126, 30, 1);         display.setCursor(x, 12);         display.print(text);         display.display();         \t         \/\/ Wait required duration         vTaskDelay(MESSAGE_BOX_DURATION); }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a. \u0427\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u043e\u0440\u0433\u0430\u044e\u0449\u0435\u0439 \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438? \u041d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u041a\u0430\u043a \u0431\u044b \u044d\u0442\u043e \u043d\u0438 \u0441\u043c\u0435\u0448\u043d\u043e \u0431\u044b\u043b\u043e, \u043d\u043e \u043f\u043e \u043c\u043e\u0440\u0433\u0430\u044e\u0449\u0435\u043c\u0443 \u0434\u0438\u043e\u0434\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u0435\u0449\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0438\u043b\u0438 \u0434\u0430\u0432\u043d\u043e \u043f\u043e\u0432\u0438\u0441\u043b\u043e.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Hello FreeRTOS World!<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void vLEDFlashTask(void *pvParameters)  { \tfor (;;)  \t{ \t\tvTaskDelay(2000); \t\tdigitalWrite(PC13, LOW); \t\tvTaskDelay(100); \t\tdigitalWrite(PC13, HIGH); \t} }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<h2>\u041e\u043f\u044f\u0442\u044c GPS&#8217;\u0438\u043c<\/h2>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u0440\u0437\u0430\u0442\u044c GPS. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043b\u0443\u0448\u0430\u0442\u044c GPS \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043e\u043f\u044f\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u0442\u043e\u0440<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0435\u0440\u0435\u043b\u0438\u0432\u0430\u0442\u043e\u0440<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void initGPS() { \t\/\/ GPS is attached to Serial1 \tSerial1.begin(9600); }  void vGPSTask(void *pvParameters) { \tfor (;;) \t{ \t\twhile(Serial1.available())  \t\t{ \t\t\tint c = Serial1.read(); \t\t\tgps.encode(c); \t\t\tSerial.write(c); \t\t} \t\t\t \t\tvTaskDelay(5); \t} }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041d\u043e \u0442\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0441\u0438\u043b\u0438\u0441\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0442 \u0434\u0430\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043a\u0443\u0441\u0438\u0442\u044c \u043e\u0442\u0442\u0443\u0434\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u041a\u0443\u0440\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 TinyGPS \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0442 GPS \u043c\u043e\u0434\u0443\u043b\u044f \u0438 \u0442\u0435\u043c \u0447\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430. <\/p>\n<p>  \u041c\u043e\u0434\u0443\u043b\u044c UBlox \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043d\u0435\u043a\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 NMEA. \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u044f\u0442\u0438\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. <\/p>\n<p>  <code>$GNGGA,181220.00,,,,,0,00,99.99,,,,,,*70<\/code><\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0435 2 \u0431\u0443\u043a\u0432\u044b \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0430 \u0434\u0430\u043d\u043d\u044b\u0435: GP \u0434\u043b\u044f GPS, GL \u0434\u043b\u044f GLONASS, GA \u0434\u043b\u044f GALILLEO. \u0410 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 GN. <\/p>\n<p>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 TinyGPS+ \u043d\u0430 \u0442\u0430\u043a\u043e\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u2014 \u043e\u043d\u0430 \u0443\u043c\u0435\u043b\u0430 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f GP. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0435\u0435 \u0447\u0443\u0442\u043e\u043a \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u2014 \u043f\u043e\u043c\u0435\u043d\u044f\u043b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u0431\u0435\u0436\u0430\u043b\u043e. \u0422\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0442 \u044d\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u043f\u0430\u0445\u0438\u0432\u0430\u043b\u043e \u043a\u0430\u043a\u0438\u043c \u0442\u043e \u0445\u0430\u043a\u043e\u043c. <\/p>\n<p>  \u0422\u043e\u0432\u0430\u0440\u0438\u0449 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0443 \u2014 <a href=\"https:\/\/github.com\/SlashDevin\/NeoGPS\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 NeoGPS<\/a>. \u042d\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0444\u0438\u0447\u0430\u0441\u0442\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430. \u041f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u0443\u043c\u0435\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430\u043c\u0438, \u043e\u043d\u0430 \u0435\u0449\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0430\u0445 (\u043b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u0448\u0442\u0443\u043a\u0438 \u0432 GPS \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430\u0445). \u0415\u0449\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0436\u0443\u0442\u043a\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u044f\u0435\u043c\u0430\u044f \u2014 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043a stm32duino \u0442\u0440\u0443\u0434\u0430 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u0430\u0432\u0434\u0430 \u0447\u0443\u0442\u043e\u043a \u043f\u043e\u0434\u043f\u0438\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0436\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c. \u041d\u043e \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043e\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u043b\u043e \u043d\u0435\u044f\u0441\u043d\u043e \u0432 \u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 GPS. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0430\u0445<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043e\u0431\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0430\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">for (;;) { \twhile(Serial1.available()) \t{ \t\tint c = Serial1.read(); \t\tSerial.write(c); \t\tgpsParser.handle(c); \t}         \tif(gpsParser.available())        \t{                \tmemcpy(satellites, gpsParser.satellites, sizeof(satellites));                \tsat_count = gpsParser.sat_count;        \t}  \tvTaskDelay(10); }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0412\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0430\u0440\u0441\u0435\u0440 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0431\u044b\u043b\u0438 \u2014 \u0437\u0430\u0431\u0438\u0440\u0430\u0439\u0442\u0435. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u044e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0430 \u0432\u043e\u0442 \u0441\u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u0431\u0435\u0434\u0430. \u0417\u0430\u0431\u0438\u0440\u0430\u044e, \u0430 \u0442\u0430\u043c \u043d\u0443\u043b\u0438. \u0418\u043b\u0438 \u043d\u0435 \u043d\u0443\u043b\u0438. \u041a\u0430\u043a \u043f\u043e\u0432\u0435\u0437\u0435\u0442. <\/p>\n<p>  \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e. \u0412\u0441\u0435 \u0434\u0435\u043b\u043e \u0432 \u0434\u0438\u0437\u0430\u0439\u043d\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0412\u043e \u0438\u043c\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043f\u043e \u0445\u043e\u0434\u0443 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430. \u041f\u0440\u0438 \u0447\u0435\u043c \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e \u2014 \u043f\u0440\u0438\u0448\u0435\u043b \u0431\u0430\u0439\u0442, \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e. \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 NeoGPS \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u043d\u0430\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u0443\u043b\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u0417\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 LAST_SENTENCE_IN_INTERVAL<\/p>\n<pre><code class=\"cpp\">\/\/------------------------------------------------------ \/\/ Select which sentence is sent *last* by your GPS device \/\/ in each update interval.  This can be used by your sketch \/\/ to determine when the GPS quiet time begins, and thus \/\/ when you can perform &quot;some&quot; time-consuming operations. #define LAST_SENTENCE_IN_INTERVAL NMEAGPS::NMEA_RMC <\/code><\/pre>\n<p>  \u0422\u0430\u043a \u0432\u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 RMC \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0430\u043c\u044b\u043c \u043f\u0435\u0440\u0432\u044b\u043c \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u043c\u043e\u0439 \u043a\u043e\u0434 \u043c\u043e\u0433 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0448\u0435\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043e\u0431\u043d\u0443\u043b\u0438\u0442\u0441\u044f). \u0418\u043b\u0438 \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0443\u043b\u0438, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u041b\u0435\u0447\u0438\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 \u043e\u0442 GPS \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443 \u043d\u0430\u0441 GLL. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/geektimes\/post_images\/f0d\/caf\/b49\/f0dcafb49da1d4aee8d3876f1b09d071.jpg\" alt=\"image\"\/><br \/>  <i>\u0421\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432 \u043c\u043d\u043e\u0433\u043e, \u0430 \u0444\u0438\u043a\u0441\u0430 \u0432\u0441\u0435 \u043d\u0435\u0442 \u0438 \u043d\u0435\u0442. \u0421\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432 (\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 vs \u043d\u0435\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u2014 \u043d\u0435 \u0437\u043d\u0430\u044e \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442), HDOP\/VDOP, \u0421\u0442\u0430\u0442\u0443\u0441 GPS \u0441\u0438\u0433\u043d\u0430\u043b\u0430 (\u0441\u043b\u043e\u0432\u0438\u043b\u043e\/\u043d\u0435 \u0441\u043b\u043e\u0432\u0438\u043b\u043e)<\/i><\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u0430\u0442\u043e\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c. \u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441. \u042f \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0440\u0430\u043d\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u041e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043c\u0438\u043d\u0443\u0442\u0430\u0445, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043b\u0435\u0433\u043a\u043e \u0432\u044b\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e \u0445\u043e\u0434\u0443<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043e\u043c\u0443 \u0447\u0430\u0441\u043e\u0432\u043e\u043c\u0443 \u043f\u043e\u044f\u0441\u0443<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void TimeZoneScreen::drawScreen() const { \t\/\/ Get the date\/time adjusted by selected timezone value \tgps_fix gpsFix = gpsDataModel.getGPSFix(); \tint16 timeZone = getCurrentTimeZone(); \tNeoGPS::time_t dateTime = gpsFix.dateTime + timeZone * 60; \/\/timeZone is in minutes  \t...  \tprintNumber(dateBuf, dateTime.date, 2); \tprintNumber(dateBuf+3, dateTime.month, 2); \tprintNumber(dateBuf+6, dateTime.year, 2); <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/geektimes\/post_images\/99c\/806\/ae6\/99c806ae6d026cdeef5514bae7f0ffde.jpg\" alt=\"image\"\/><br \/>  <i>\u042d\u043a\u0440\u0430\u043d \u0432\u044b\u0431\u043e\u0440\u0430 \u0447\u0430\u0441\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u044f\u0441\u0430 \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u043b\u0438\u0437\u0430\u043d \u0441 Hulux&#8217;\u0430<\/i><\/p>\n<h2>Model-View&#8217;\u0438\u043c<\/h2>\n<p>  \u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043c \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0422\u0430\u043a, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 GPS: \u0441\u043b\u0443\u0448\u0430\u0435\u0442 Serial \u043f\u043e\u0440\u0442, \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e \u043f\u0430\u0440\u0441\u0438\u0442 \u0438\u0437 \u043d\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u0430\u043a\u0435\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u043d\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u0438\u0435\u043c\u043e\u043c \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u041a\u043e\u0433\u0434\u0430 \u043f\u0430\u043a\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u043d\u044f\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 available. \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u044e\u0442 \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0437\u0430 \u043f\u043e\u043b\u0441\u0435\u043a\u0443\u043d\u0434\u044b (\u0442\u0430\u043c \u0431\u0430\u0439\u0442 600 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 9600). \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043f\u043e\u043b\u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0437\u0430\u0431\u0440\u0430\u0442\u044c, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u044f. \u0426\u0438\u043a\u043b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0435 100-120\u043c\u0441. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0435\u0440\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 GPS \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0447\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0432\u044b\u0441\u043e\u0442\u0443 \u0438\u043b\u0438 \u0447\u0442\u043e \u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0435. \u0418 \u0442\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0435: \u043f\u043e\u0442\u043e\u043a \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u0442\u0438\u0440\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435: \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043a \u0441\u0435\u0431\u0435 \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043c\u0443\u0442\u0435\u043a\u0441\u043e\u043c (<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81\">mutex<\/a>), \u0438\u043d\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u044b \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u041d\u043e \u0432\u043e\u0442 \u0432 \u0447\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 GPS \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0445\u043e\u0442\u044c \u0438 \u0440\u0435\u0434\u043a\u043e, \u043d\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e (\u0442\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043b\u0442\u043e\u0440\u044b \u0441\u043e\u0442\u043d\u0438 \u0431\u0430\u0439\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430), \u043c\u0443\u0442\u0435\u043a\u0441 \u043d\u0430\u0434\u043e\u043b\u0433\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0410 \u0432\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e (\u0434\u043e 20\u043c\u0441). \u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0443\u0442\u0435\u043a\u0441 \u043d\u0430 \u0442\u0430\u043a\u043e\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0432 \u043e\u0431\u0449\u0435\u043c \u0442\u043e, \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e. \u0425\u043e\u0442\u044f \u0438 \u043d\u0435 \u0441\u043c\u0435\u0440\u0442\u0435\u043b\u044c\u043d\u043e, \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u044b\u0441\u0442\u0440\u0435\u043d\u044c\u043a\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0443\u0442\u0435\u043a\u0441, \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438 \u043e\u0442\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u0443\u0442\u0435\u043a\u0441. \u041d\u043e \u044d\u0442\u043e \u0447\u0440\u0435\u0432\u0430\u0442\u043e \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u0445\u043e\u0434\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0449\u0435 \u043f\u043e\u043b\u0442\u043e\u0440\u044b \u0441\u043e\u0442\u043d\u0438 \u0431\u0430\u0439\u0442 \u043f\u0440\u0438 20 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u0430\u0445 \u044d\u0442\u043e \u0444\u0438\u0433\u043d\u044f, \u043d\u043e \u043b\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f \u043d\u0430\u043f\u0440\u044f\u0433\u0430\u0435\u0442 \u0441\u0430\u043c \u0444\u0430\u043a\u0442 \u0442\u0440\u043e\u0439\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438. <\/p>\n<p>  \u0411\u0443\u0444\u0435\u0440, \u043a\u0441\u0442\u0430\u0442\u0438, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u0431\u043e \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430, \u0435\u0441\u043b\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u043e\u0442\u043e\u043a\u0443 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u0438\u0441\u0430\u043b \u0441\u0442\u0435\u043a\u0430 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u044b\u0447\u0438\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0430\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">NMEAGPS::satellite_view_t l_satellites[ NMEAGPS_MAX_SATELLITES ]; uint8_t l_sat_count;   void SatellitesScreen::drawScreen() {    \txSemaphoreTake(xGPSDataMutex, portMAX_DELAY);    \tmemcpy(l_satellites, satellites, sizeof(l_satellites));    \tl_sat_count = sat_count;    \txSemaphoreGive(xGPSDataMutex);    \t  \tdisplay.draw(....)  \t... }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 NMEA \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 NeoGPS \u0438\u0445 \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043f\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0440\u0438\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e (\u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u043f\u0440\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e) \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0435\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u041d\u043e \u0432\u043e\u0442 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. <\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u043b\u0433\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 model-view \u0441\u0445\u0435\u043c\u0435. \u041e\u0431\u044a\u0435\u043a\u0442\u044b-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0438 screen \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u044c\u044e\u0448\u043a\u0430\u043c\u0438 \u2014 \u043e\u043d\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0435\u043b\u0438, \u043d\u043e \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442. \u0412\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 GPSDataModel. \u041e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0445 GPS \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u0435\u0434\u0443\u0442 \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 NeoGPS). \u0422\u0430\u043a \u0436\u0435 \u043e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u044b \u0438\u043b\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u2014 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u0430\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0435\u043b\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">const uint8 ODOMERTERS_COUNT = 3;  \/**  * GPS data model. Encapsulates all the knowledge about various GPS related data in the device  *\/ class GPSDataModel { public: \tGPSDataModel(); \t \tvoid processNewGPSFix(const gps_fix & fix); \tvoid processNewSatellitesData(NMEAGPS::satellite_view_t * sattelites, uint8_t count); \tgps_fix getGPSFix() const; \tGPSSatellitesData getSattelitesData() const; \t \tfloat getVerticalSpeed() const; \tint timeDifference() const; \t \t\/\/ Odometers \tGPSOdometerData getOdometerData(uint8 idx) const; \tvoid resumeOdometer(uint8 idx); \tvoid pauseOdometer(uint8 idx); \tvoid resetOdometer(uint8 idx); \tvoid resumeAllOdometers(); \tvoid pauseAllOdometers(); \tvoid resetAllOdometers(); \t private: \tgps_fix cur_fix; \/\/\/ most recent fix data \tgps_fix prev_fix; \/\/\/ previously set fix data \tGPSSatellitesData sattelitesData; \/\/ Sattelites count and signal power \tGPSOdometer * odometers[ODOMERTERS_COUNT]; \tbool odometerWasActive[ODOMERTERS_COUNT]; \t \tSemaphoreHandle_t xGPSDataMutex; \t \tGPSDataModel( const GPSDataModel &c ); \tGPSDataModel& operator=( const GPSDataModel &c );\t }; \/\/GPSDataModel  \/\/\/ A single instance of GPS data model extern GPSDataModel gpsDataModel;<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422.\u043a. \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u0442\u043e \u0432 \u043d\u0435\u043c \u0436\u0438\u0432\u0435\u0442 \u043c\u0443\u0442\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043f\u043e\u043b\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430. \u041c\u043d\u0435 \u0431\u044b\u043b\u043e \u0436\u0443\u0442\u043a\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e (\u0438 \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e) \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u043b\u044b\u043c\u0438 xSemaphoreTake()\/xSemaphoreGive(), \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0432\u0442\u043e\u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u0435\u043b\u044c (\u0442\u043e\u0447\u043d\u0435\u0435 \u0434\u0430\u0436\u0435 \u0430\u0432\u0442\u043e\u043e\u0442\u043f\u0443\u0441\u043a\u0430\u0442\u0435\u043b\u044c)<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Mutex Locker<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class MutexLocker { public: \tMutexLocker(SemaphoreHandle_t mtx) \t{ \t\tmutex = mtx; \t\txSemaphoreTake(mutex, portMAX_DELAY); \t} \t \t~MutexLocker() \t{ \t\txSemaphoreGive(mutex); \t}  private: \tSemaphoreHandle_t mutex;\t };<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0430\u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e getGPSFix(), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u0440\u043d\u0435\u0442 \u043a\u043e\u043f\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">gps_fix GPSDataModel::getGPSFix() const { \tMutexLocker lock(xGPSDataMutex); \treturn cur_fix;\t } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041a\u043b\u0438\u0435\u043d\u0442\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0430\u0440\u0438\u0442\u0441\u044f \u043f\u0440\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0432\u0441\u0435 \u0442\u0430\u043a\u043e\u0435. \u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0430\u043a \u043d\u0430\u0434\u043e<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043a\u043e\u0434 \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void SpeedScreen::drawScreen() const { \t\/\/ Get the gps fix data \tgps_fix gpsFix = gpsDataModel.getGPSFix(); \t \t\/\/ Draw speed \t... \tprintNumber(buf, gpsFix.speed_kph(), 4, true); <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (cur_fix), \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (prev_fix). \u0422\u0430\u043a \u0447\u0442\u043e, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u043e\u0440 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">float GPSDataModel::getVerticalSpeed() const { \tMutexLocker lock(xGPSDataMutex); \t \t\/\/ Return NAN to indicate vertical speed not available \tif(!cur_fix.valid.altitude || !prev_fix.valid.altitude) \t\treturn NAN; \t \treturn cur_fix.altitude() - prev_fix.altitude(); \/\/ Assuming that time difference between cur and prev fix is 1 second }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0438 \u0436\u0438\u0432\u0443\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 NMEAGPS::satellite_view_t. \u041c\u0430\u0441\u0441\u0438\u0432 \u0432\u0435\u0441\u0438\u0442 150 \u0431\u0430\u0439\u0442 \u0438, \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b, \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 20\u043a\u0431 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u044b, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u044d\u0442\u043e \u0442\u0440\u0438\u0436\u0434\u044b \u043f\u043e 150 \u0431\u0430\u0439\u0442.<\/p>\n<p>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0440\u043e\u0434\u0438\u043b\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0425\u0440\u0430\u043d\u0438\u043b\u043a\u0430 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0430\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class GPSSatellitesData { \t\/\/ Partial copy of NMEAGPS::satellite_view_t trimmed to used data \tstruct SatteliteData \t{ \t\tuint8_t snr; \t\tbool tracked; \t};\t \t \tSatteliteData satellitesData[SAT_ARRAY_SIZE]; \tuint8_t sat_count; \t public: \tGPSSatellitesData();  \tvoid parseSatellitesData(NMEAGPS::satellite_view_t * sattelites, uint8_t count); \t \tuint8_t getSattelitesCount() const {return sat_count;} \tuint8_t getSatteliteSNR(uint8_t sat) const {return satellitesData[sat].snr;} \tbool isSatteliteTracked(uint8_t sat) const {return satellitesData[sat].tracked;} };<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0422\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u043e\u0431\u0438\u0434\u043d\u043e \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 40 \u0431\u0430\u0439\u0442.<\/p>\n<p>  \u0421\u0430\u043c\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u0445\u0435\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043a\u043b\u0430\u0441\u0441 GPSOdometer. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u0430. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441\u044b \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u0430 \u0438 \u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">\/\/ This class represents a single odometer data with no logic around class GPSOdometerData { \t\/\/ GPSOdometer and its data are basically a single object. The difference is only that data can be easily copied \t\/\/ while GPS odometer object is not supposed to. Additionally access to Odometer object is protected with a mutex  \t\/\/ in the model object \t\/\/ In order not to overcomplicte design I am allowing GPS Odometer to operate its data members directly. \tfriend class GPSOdometer; \t \tbool active; \t \tNeoGPS::Location_t startLocation; \tNeoGPS::Location_t lastLocation; \t \tfloat odometer; \tint16 startAltitude; \tint16 curAltitude; \t \tclock_t startTime;\t\t\t\t\/\/\/! When odometer was turned on for the first time \tclock_t sessionStartTime;\t\t\/\/\/! When odometer was resumed for the current session \tclock_t totalTime;\t\t\t\t\/\/\/! Total time for the odometer (difference between now and startTime) \tclock_t activeTime;\t\t\t\t\/\/\/! Duration of the current session (difference between now and sessionStartTime) \tclock_t activeTimeAccumulator;\t\/\/\/! Sum of all active session duration (not including current one) \t \tfloat maxSpeed;  public:\t \tGPSOdometerData(); \tvoid reset();  \t\/\/ getters \tbool isActive() const {return active;} \tfloat getOdometerValue() const {return odometer;} \tint16 getAltitudeDifference() const {return (curAltitude - startAltitude) \/ 100.;} \/\/ altitude is in cm \tclock_t getTotalTime() const {return totalTime;} \tclock_t getActiveTime() const {return activeTimeAccumulator + activeTime;} \tfloat getMaxSpeed() const {return maxSpeed;} \tfloat getAvgSpeed() const; \tfloat getDirectDistance() const; };  \/\/ This is an active odometer object that operates on its odometer data class GPSOdometer { \tGPSOdometerData data;  public: \tGPSOdometer();  \t\/\/ odometer control \tvoid processNewFix(const gps_fix & fix); \tvoid startOdometer(); \tvoid pauseOdometer(); \tvoid resetOdometer(); \t \t\/\/ Some data getters \tGPSOdometerData getData() {return data;} \tbool isActive() const {return data.isActive();} }; \/\/GPSOdometer<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0442 \u0432 \u0447\u0435\u043c. \u041e\u0431\u044a\u0435\u043a\u0442 gps_fix, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043d\u0430\u043c \u043e\u0442 GPS, \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u0440\u0438\u0435\u0434\u0435\u0442, \u0430 \u0432\u044b\u0441\u043e\u0442\u0430 \u043d\u0435\u0442. \u0410 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0444\u0438\u043a\u0441\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c gps_fix \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442. \u041d\u0443\u0436\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432 \u043d\u043e\u0432\u043e\u043c \u0444\u0438\u043a\u0441\u0435, \u0430 \u0447\u0442\u043e \u043d\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0432\u044b\u0441\u043e\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0415\u0436\u0435\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u0440\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void GPSOdometer::processNewFix(const gps_fix & fix) { \tSerial.print(&quot;GPSOdometer: Processing new fix &quot;); \tSerial.println((int32)this);  \tif(data.active) \t{ \t\tSerial.println(&quot;Active odometer: Processing new fix&quot;); \t\t \t\t\/\/ Fill starting position if needed \t\tif(fix.valid.location && !isValid(data.startLocation)) \t\t\tdata.startLocation = fix.location; \t\t\t \t\t\/\/ Fill starting altitude if neede \t\tif(fix.valid.altitude && !data.startAltitude) \/\/ I know altitude can be zero, but real zero cm altutude would be very rare condition. Hope this is not a big deal \t\t\tdata.startAltitude = fix.altitude_cm(); \t\t\t \t\t\/\/ Fill starting times if needed \t\tif(fix.valid.time) \t\t{ \t\t\tif(!data.startTime) \t\t\t\tdata.startTime = fix.dateTime; \t\t\tif(!data.sessionStartTime) \t\t\t\tdata.sessionStartTime = fix.dateTime; \t\t} \t\t\t \t\t\/\/ Increment the odometer \t\tif(fix.valid.location) \t\t{ \t\t\t\/\/ but only if previous location is really valid \t\t\tif(isValid(data.lastLocation)) \t\t\t\tdata.odometer += NeoGPS::Location_t::DistanceKm(fix.location, data.lastLocation); \t\t\t\t \t\t\t\/\/ In any case store current (valid) fix \t\t\tdata.lastLocation = fix.location; \t\t} \t\t \t\t\/\/ Store current altitude \t\tif(fix.valid.altitude) \t\t\tdata.curAltitude = fix.altitude_cm(); \t\t\t \t\t\/\/ update active time values \t\tif(fix.valid.time) \t\t\tdata.activeTime = fix.dateTime - data.sessionStartTime; \t\t \t\t\/\/ update max speed value \t\tif(fix.valid.speed && fix.speed_kph() &gt; data.maxSpeed) \t\t\tdata.maxSpeed = fix.speed_kph(); \t}\t \t \t \/\/Total time can be updated regardless of active state \t if(fix.valid.time && data.startTime) \t\tdata.totalTime = fix.dateTime - data.startTime; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0443 \u043c\u0435\u043d\u044f \u0440\u0435\u0437\u043a\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u043b\u0435\u0448\u0430 \u2014 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 10\u043a\u0431. \u0412 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0438\u043f\u043e\u043b\u0437\u043b\u0430 \u043a\u0443\u0447\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u2014 \u0441\u0438\u043d\u0443\u0441\u044b, \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u044b, \u0442\u0430\u043d\u0433\u0435\u043d\u0441\u044b, \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0435 \u043a\u043e\u0440\u043d\u0438 \u0438 \u0432\u0441\u0435 \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u043e\u0447\u0435\u0435. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u043e\u0433\u0438 \u0440\u0430\u0441\u0442\u0443\u0442 <a href=\"https:\/\/github.com\/SlashDevin\/NeoGPS\/blob\/master\/src\/Location.cpp\">\u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 NeoGPS::Location_t::DistanceKm()<\/a> \u2014 \u0432\u0441\u0435 \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0421\u043a\u0440\u0438\u043f\u044f \u0437\u0443\u0431\u0430\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0441\u044f, \u043d\u043e \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0441\u044f \u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u043d\u0430 Cortex M4 \u2014 \u0442\u0430\u043c \u044d\u0442\u043e \u0445\u0430\u0440\u0434\u0432\u0430\u0440\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c\u0441\u044f.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u043e\u043c<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void GPSOdometer::startOdometer() { \tdata.active = true;  \t\/\/ Reset session values \tdata.sessionStartTime = 0; \tdata.activeTime = 0; }  void GPSOdometer::pauseOdometer() { \tdata.active = false; \t \tdata.activeTimeAccumulator += data.activeTime; \tdata.activeTime = 0; }  void GPSOdometer::resetOdometer() { \tdata.reset(); }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u0430 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 GPSDataModel. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u043c\u0443\u0442\u0435\u043a\u0441\u0443 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435. \u041d\u043e \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0441 \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u0430 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 2 \u043a\u043b\u0430\u0441\u0441\u0430: \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (GPSOdometerData) \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (GPSOdometer) \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0434\u043e\u043c\u0435\u0442\u0440. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441 \u0441\u0434\u0435\u043b\u0430\u0442\u044c friend\u2019\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c\u0443. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044f \u043f\u0435\u0440\u0435\u0441\u043c\u043e\u0442\u0440\u044e \u044d\u0442\u043e\u0442 \u0434\u0438\u0437\u0430\u0439\u043d \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/geektimes\/post_images\/009\/34a\/1ad\/00934a1ad064fef2fc850b7208ca6361.jpg\" alt=\"image\"\/><br \/>  <i>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044d\u043a\u0440\u0430\u043d \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u0430. \u0421\u0438\u043c\u0432\u043e\u043b \u0442\u043e\u0447\u043a\u0438 \u0432 \u0448\u0440\u0438\u0444\u0442 \u0435\u0449\u0435 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u2014 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c 0.42\u043a\u043c. \u0422\u0430\u043a \u0436\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043f\u0430\u0434 \u0432\u044b\u0441\u043e\u0442 \u2014 \u043b\u0435\u0436\u0430 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u043d\u0430 \u043f\u043e\u0434\u043e\u043a\u043e\u043d\u043d\u0438\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0430\u0441\u0442\u044c \u043d\u0430 18 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0442\u0440\u043e\u0432<\/i><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/geektimes\/post_images\/06c\/b41\/fd7\/06cb41fd7e4a78c0bdfc5c5ab911d072.jpg\" alt=\"image\"\/><br \/>  <i>\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u043e\u043c. \u041d\u0430 \u043e\u0434\u0438\u043d \u044d\u043a\u0440\u0430\u043d \u0432\u0441\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u043c\u0435\u0441\u0442\u0438\u043b\u043e\u0441\u044c \u2014 \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c 2 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 3 \u044d\u043a\u0440\u0430\u043d\u0430<\/i><\/p>\n<p>  GPSDataModel \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435\u043c\u0438 \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0441\u0440\u0430\u0437\u0443. \u042d\u0442\u0430 \u0444\u0438\u0447\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0430 \u0432 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u2014 \u0437\u0430\u0448\u0435\u043b \u0432 \u043a\u0430\u0444\u0435, \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u043b \u0432\u0441\u0435 \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u044b \u0441\u0440\u0430\u0437\u0443. \u0412\u044b\u0448\u0435\u043b \u2014 \u0432\u043a\u043b\u044e\u0447\u0438\u043b \u0438\u0445 \u043e\u043f\u044f\u0442\u044c.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0432\u0441\u0435\u043c\u0438 \u0441\u0440\u0430\u0437\u0443<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void GPSDataModel::resumeAllOdometers() { \tMutexLocker lock(xGPSDataMutex);  \tif(odometerWasActive[0]) \t\todometers[0]-&gt;startOdometer(); \tif(odometerWasActive[1]) \t\todometers[1]-&gt;startOdometer(); \tif(odometerWasActive[2]) \t\todometers[2]-&gt;startOdometer(); }  void GPSDataModel::pauseAllOdometers() { \tMutexLocker lock(xGPSDataMutex);  \todometerWasActive[0] = odometers[0]-&gt;isActive(); \todometerWasActive[1] = odometers[1]-&gt;isActive(); \todometerWasActive[2] = odometers[2]-&gt;isActive(); \t \todometers[0]-&gt;pauseOdometer(); \todometers[1]-&gt;pauseOdometer(); \todometers[2]-&gt;pauseOdometer(); }  void GPSDataModel::resetAllOdometers() { \tMutexLocker lock(xGPSDataMutex);  \todometers[0]-&gt;resetOdometer(); \todometers[1]-&gt;resetOdometer(); \todometers[2]-&gt;resetOdometer(); \t \todometerWasActive[0] = false; \todometerWasActive[1] = false; \todometerWasActive[2] = false; }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<h2>\u041e\u043f\u044f\u0442\u044c FreeRTOS&#8217;\u0438\u043c<\/h2>\n<p>  \u0412 \u0446\u0435\u043b\u044f\u0445 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 FreeRTOS \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445. \u0414\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"http:\/\/www.freertos.org\/RTOS-idle-task.html\">ApplicationIdleHook<\/a>. <\/p>\n<p>  \u0423 \u043b\u044e\u0431\u043e\u0439 \u0420\u0422\u041e\u0421 \u0435\u0441\u0442\u044c \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 idle \u043f\u043e\u0442\u043e\u043a. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u043d\u0435\u0447\u0435\u043c \u0441\u0435\u0431\u044f \u0437\u0430\u043d\u044f\u0442\u044c \u2014 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c. FreeRTOS \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438 \u0432 \u044d\u0442\u043e\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0445\u0443\u043a. \u0418\u0434\u0435\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 idle \u043f\u043e\u0442\u043e\u043a\u0435 \u2014 \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 (\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439) \u0440\u0430\u0431\u043e\u0442\u043e\u0439.<\/p>\n<p>  \u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430\u0445 \u044f \u043d\u0430\u0448\u0435\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<br \/>  \u041e\u0434\u043d\u0438 \u0440\u0435\u0431\u044f\u0442\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b\u0438 \u0432 Idle Hook \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0438 \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u00ab\u043d\u0430\u043c\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u00bb. \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u043a\u0438\u0435 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041d\u043e \u0433\u0434\u0435 \u0432\u0437\u044f\u0442\u044c \u044d\u0442\u0443 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0433\u0430\u0441\u0438\u0442\u044c \u0432\u0441\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0438 \u043c\u0435\u0440\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0432 \u043d\u0435\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u041c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 1-2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439, \u043d\u043e \u043b\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f \u0436\u0443\u0442\u043a\u043e \u0431\u0435\u0441\u0438\u0442 \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u00ab\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f\u00bb \u043f\u043e 5-10 \u0441\u0435\u043a\u0443\u043d\u0434 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u043e\u0442\u043e\u0430\u043f\u043f\u0430\u0440\u0430\u0442\u044b-\u043c\u044b\u043b\u044c\u043d\u0438\u0446\u044b. \u0433\u0440\u0440\u0440\u0440).<\/p>\n<p>  \u0412 \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440 \u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u0432\u0445\u043e\u0434\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0442\u043e\u043a\u0430. \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<p>  \u0414\u0430, \u044f \u0441\u043b\u044b\u0448\u0430\u043b \u043e Run Time Stats \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 FreeRTOS. \u041d\u043e, \u043a\u0430\u043a \u0433\u043b\u0430\u0441\u0438\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043e\u043d\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432 <i>\u0434\u0435\u0431\u0430\u0436\u043d\u044b\u0445<\/i> \u0446\u0435\u043b\u044f\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 \u0438 \u0437\u0430 <i>\u0432\u0435\u0441\u044c<\/i> \u043f\u0435\u0440\u0438\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042f \u0436\u0435 \u0445\u043e\u0442\u0435\u043b \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<p>  \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u041d\u0435 \u0437\u043d\u0430\u044e \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043e\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0443 sleep mode. \u041d\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u043f\u043b\u043e\u0445\u043e.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static const uint8 periodLen = 9; \/\/ 2^periodLen ticks - 512 x 1ms ticks    volatile TickType_t curIdleTicks = 0; volatile TickType_t lastCountedTick = 0; volatile TickType_t lastCountedPeriod = 0; volatile TickType_t lastPeriodIdleValue = 0; volatile TickType_t minIdleValue = 1 &lt;&lt; periodLen;   extern &quot;C&quot; void vApplicationIdleHook( void ) {    \t\/\/ Process idle tick counter    \tvolatile TickType_t curTick = xTaskGetTickCount();    \tif(curTick != lastCountedTick)    \t{          \tcurIdleTicks++;          \tlastCountedTick = curTick;    \t}    \t    \t\/\/ Store idle metrics each ~0.5 seconds (512 ticks)    \tcurTick &gt;&gt;= periodLen;    \tif(curTick &gt;  lastCountedPeriod)    \t{          \tlastPeriodIdleValue = curIdleTicks;          \tcurIdleTicks = 0;    \t   \tlastCountedPeriod = curTick;          \t          \t\/\/ Store the max value          \tif(lastPeriodIdleValue &lt; minIdleValue)                 \tminIdleValue = lastPeriodIdleValue;    \t} }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e, \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u0437\u0430 \u043e\u0434\u0438\u043d \u0442\u0438\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u044b (system tick \u044d\u0442\u043e 1\u043c\u0441). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u043b\u043e\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0442\u0438\u043a\u043e\u0432 (\u0430 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432) \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0445\u0443\u043a. \u0412\u0442\u043e\u0440\u043e\u0439 \u0431\u043b\u043e\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043a\u0430\u0436\u0434\u044b\u0435 512 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0442\u0438\u043a\u043e\u0432.<\/p>\n<p>  \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043d\u0435-idle \u0442\u0438\u043a\u043e\u0432 \u043a \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0442\u0438\u043a\u043e\u0432 \u0432 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0441\u0441\u0447\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">float getCPULoad() {    \treturn 100. - 100. * lastPeriodIdleValue \/  (1 &lt;&lt; periodLen); }   float getMaxCPULoad() {    \treturn 100. - 100. * minIdleValue \/  (1 &lt;&lt; periodLen); }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u0430, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e\u0447\u043d\u043e. \u041d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0439 \u0433\u0440\u0443\u0431\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u043f\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u043a\u0430\u0442\u0438\u0442. \u042f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041a \u0441\u043b\u043e\u0432\u0443, \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043e\u043a\u043e\u043b\u043e 12.5% \u0438 \u043f\u043e\u0434\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u0435\u0442 \u0434\u043e 15.5% \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 GPS \u0438 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u043f\u0430\u0440\u0441\u0438\u0442\u044c. \u041f\u0440\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u0435 (\u0445\u043e\u0442\u044f GPS \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f) \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0430\u0434\u0430\u0435\u0442 \u0434\u043e 0. \u042d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e. \u0412\u0438\u0434\u0438\u043c\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433 GPS \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0442\u0438\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043a \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 idle task. \u0412\u0441\u043f\u043b\u0435\u0441\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 3% \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u0438\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u043e\u0439 \u0438\u0445 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a. <\/p>\n<p>  \u0425\u043e\u0442\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044f \u0433\u0434\u0435-\u0442\u043e \u0442\u0443\u0442 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0430\u043a\u043e\u0441\u044f\u0447\u0438\u043b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/geektimes\/post_images\/39a\/a6e\/c58\/39aa6ec5813957451dd92bedcf1190db.jpg\" alt=\"image\"\/><br \/>  <i>\u041f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0421\u0430\u043c \u044d\u043a\u0440\u0430\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0440\u044f\u0442\u0430\u043d \u0433\u0434\u0435 \u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0430\u0445 \u043c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a<\/i><\/p>\n<h2>\u0412\u0441\u044f\u043a\u043e \u0440\u0430\u0437\u043d\u043e<\/h2>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0440\u0435\u0448\u0430\u043b \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0430\u0434\u0438\u044f\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0411\u0435\u0437 \u043a\u0430\u043a\u043e\u0439 \u043b\u0438\u0431\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<ul>\n<li>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f sprintf \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0433\u043e\u0433\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u2014 13k. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Printable. \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u201c\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c\u201d \u0447\u0438\u0441\u043b\u0430 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0438 \u0434\u0430\u0436\u0435 \u0432 Serial. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0435\u043d\u044c\u043a\u043e \u0438 \u0432\u0441\u0435\u0433\u043e \u043f\u0430\u0440\u0443 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u043a\u043e\u0434\u0430.\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">\/\/\/ Helper class to print float numbers according to specified options class FloatPrinter : public Printable { \tchar buf[8]; \/\/ Print numbers no longer than 7 digits including sign and point symbols \tuint8 pos; \/\/ position in the buffer with the first meaningful char \t public: \tFloatPrinter(float value, uint8 width, bool leadingZeros = false, bool alwaysPrintSign = false); \t \tvirtual size_t printTo(Print& p) const; };  FloatPrinter::FloatPrinter(float value, uint8 width, bool leadingZeros, bool alwaysPrintSign) {     \/\/ reserve a space for sign     uint8 minpos = 0;     if(alwaysPrintSign || value &lt; 0) \t\tminpos++;      \/\/ absolute value to print, deal with sign later     float v = value;     if(v &lt; 0) \t\tv = 0. - v;          \/\/ floating point position will depend on the value     uint8 precision = 0;     if(v &lt; 100)     { \t    v *= 10; \t    precision++;     }     if(v &lt; 100) \/\/ doing this twice     { \t    v *= 10; \t    precision++;     }      uint32 iv = v + 0.5; \/\/ we will be operating with integers      \/\/ Filling the buffer starting from the right     pos = width;     buf[pos] = '\\0';     bool onceMore = true; \/\/ Print at least one zero before dot     while((iv &gt; 0 || onceMore) && (pos &gt; minpos))     { \t    pos--; \t    onceMore = false; \t     \t    \/\/ Fill one digit \t    buf[pos] = iv % 10 + '0'; \t    iv \/= 10; \t     \t    \/\/ Special case for printing point \t    \/\/ Trick used: if precision is 0 here it will become 255 and dot will never be printed (assuming the buffer size is less than 255) \t    if(--precision == 0) \t    { \t\t    buf[--pos] = '.'; \t\t    onceMore = true; \t    }     }          \/\/Print sign     if(value &lt; 0) \t\tbuf[--pos] = '-';     else if (alwaysPrintSign) \t    buf[--pos] = '+'; }  size_t FloatPrinter::printTo(Print& p) const { \treturn p.print(buf+pos); }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/li>\n<li>\u041f\u043e\u043a\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0435\u0435 \u043a\u0430\u043a \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c. \u041a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u0435 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0438\u043b\u0438 IDE \u043a\u0440\u043e\u043c\u0435 \u0430\u0440\u0434\u0443\u0438\u043d\u043e (\u0438 Atmel Studio). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u044f \u043f\u0438\u0441\u0430\u043b \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043d\u0430 <a href=\"http:\/\/cpp.sh\/\">cpp.sh<\/a>. \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0435\u0431\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u044e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0432\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u043a\u0430\u043a\u043e\u0439 \u043d\u0438\u0431\u0443\u0434\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438 \u0432\u0441\u0435 \u0442\u0430\u043a\u043e\u0435.\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0435\u0441\u0442\u044c \u0438 \u043c\u0438\u043d\u0443\u0441\u044b. \u041a\u043e\u0434 \u0442\u0435\u0441\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u201c\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u201d \u043a\u043e\u0434\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043a\u043e\u043f\u0438-\u043f\u0430\u0441\u0442\u044b. \u0411\u043b\u0430\u0433\u043e \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0442\u0438\u043f\u0430 \u044e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &lt;stdio.h&gt; #include &lt;string.h&gt;  typedef unsigned char uint8; typedef unsigned int uint32;  \/\/ This is some kind of a unit test for float value print helper. Code under the test is injected into a test function below via simple copy\/paste from FloatPrinter constructor. \/\/ This allows executing the code right at C++-in-browser service (such as http:\/\/cpp.sh) \/\/ I just did not want to set up a development toolchain, create a project file, deal with external libraries, do a dependency injection into tested class, etc :)  void test(const char * expectedValue, float value, uint8 width, bool leadingZeros = false, bool alwaysPrintSign = false) {     char buf[9];     uint8 pos;      printf(&quot;Printing %f... &quot;, value);  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ \/\/ Begin copy from FloatPrinter \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  &lt;Place Function Body Here&gt;  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ \/\/ End copy from FloatPrinter \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/      if(strcmp(expectedValue, buf+pos) == 0)     {         printf(&quot;%s - PASSED\\n&quot;, buf+pos);     }     else     {         printf(&quot;%s - FAILED\\n&quot;, expectedValue);         printf(&quot;Got: %s\\n&quot;, buf+pos);                  printf(&quot;Buffer: &quot;); \t    for(int i=0; i&lt;9; i++)     \t    printf(&quot;%2x &quot;, buf[i]);     \tprintf(&quot;\\npos=%d\\n\\n&quot;, pos);     } }  int main() {     test(&quot;0&quot;, 0., 4);      test(&quot;0.10&quot;, 0.1, 4);     test(&quot;0.23&quot;, 0.23, 4);     test(&quot;4.00&quot;, 4., 4);     test(&quot;5.60&quot;, 5.6, 4);     test(&quot;7.89&quot;, 7.89, 4);     test(&quot;1.23&quot;, 1.234, 4);     test(&quot;56.8&quot;, 56.78, 4);     test(&quot;56.8&quot;, 56.78, 5);     test(&quot;123&quot;, 123.4, 4);     test(&quot;568&quot;, 567.8, 5);     test(&quot;12345&quot;, 12345., 6);      test(&quot;-0.10&quot;, -0.1, 5);     test(&quot;-0.23&quot;, -0.23, 5);     test(&quot;-4.00&quot;, -4., 5);     test(&quot;-5.60&quot;, -5.6, 5);     test(&quot;-7.89&quot;, -7.89, 5);     test(&quot;-1.23&quot;, -1.234, 5);     test(&quot;-56.8&quot;, -56.78, 5);     test(&quot;-56.8&quot;, -56.78, 6);     test(&quot;-123&quot;, -123.4, 5);     test(&quot;-568&quot;, -567.8, 6);     test(&quot;-12345&quot;, -12345., 7); }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Serial.print \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u2014 \u041c\u041a \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0431\u0443\u0442. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e USB Serial \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0436\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434.\n<\/li>\n<li>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0447\u0438\u043a \u041c\u0430\u0439\u0435\u0440\u0441\u0430 \u043f\u0440\u0438\u043d\u0435\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0442\u0430\u043a\u043e\u0435 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u043c\u0430\u043c\u0430 \u043d\u0435 \u0433\u043e\u0440\u044e\u0439. \u0411\u043e\u043b\u0435\u0435 40\u043a! \u0422\u0430\u043c \u0431\u044b\u043b\u0438 \u0438 \u044d\u043a\u0441\u0435\u043f\u0448\u0435\u043d\u044b, \u0438 type info, \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043a\u0443\u0441\u043a\u0438 C++ ABI \u0438 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u044f \u0438 \u0441\u043b\u044b\u0445\u043e\u043c \u043d\u0435 \u0441\u043b\u044b\u0445\u0438\u0432\u0430\u043b \u0437\u0430 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c.\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0430\u0433\u0430, \u0432\u043e\u0442 \u044d\u0442\u0438 \u0440\u0435\u0431\u044f\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">GPSDataModel & GPSDataModel::instance() {    \tstatic GPSDataModel inst;    \treturn inst; }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u043b\u044e\u0441\u044b \u043f\u043b\u044e\u0441\u0430\u043c\u0438, \u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0432 \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0441\u044b\u043b\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 extern. <\/p>\n<\/li>\n<li>\u0428\u0440\u0438\u0444\u0442\u044b. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b, \u0447\u0442\u043e \u0448\u0440\u0438\u0444\u0442\u044b \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u0434. \u041d\u043e \u0432 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u043b\u0438 \u043d\u0435 \u0432 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430 \u0447\u0435\u043c \u043c\u043e\u0433\u043b\u0438 \u0431\u044b. \u042f \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u043a\u0440\u0438\u043f\u0442, \u0438 \u0448\u0440\u0438\u0444\u0442\u044b \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432\u044b\u0438\u0433\u0440\u0430\u0432 \u0447\u0443\u0442\u043e\u043a \u0444\u043b\u0435\u0448\u0430.\n<p>  \u0422\u0430\u043a, \u0448\u0440\u0438\u0444\u0442 8\u044512 \u043f\u043e\u0445\u0443\u0434\u0435\u043b \u0441 850 \u0434\u043e 732 \u0431\u0430\u0439\u0442\u0430, \u0430 \u0448\u0440\u0438\u0444\u0442 16\u044522 (\u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Bodoni MT) \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0441\u044f \u0441 474 \u0434\u043e 408. \u0412 \u044d\u0442\u043e\u043c \u0448\u0440\u0438\u0444\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u043e\u043d \u0442\u0430\u043a \u043c\u0430\u043b\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0448\u0440\u0438\u0444\u0442\u044b \u0443 \u043c\u0435\u043d\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u0432 \u0445\u0435\u0434\u0435\u0440\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u0425\u0435\u0434\u0435\u0440\u044b \u0438\u043d\u043a\u043b\u0443\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 cpp-\u0448\u043d\u0438\u043a\u0438 \u0433\u0434\u0435 \u044f \u0440\u0438\u0441\u0443\u044e \u044d\u0442\u0438\u043c\u0438 \u0448\u0440\u0438\u0444\u0442\u0430\u043c\u0438. \u0422\u0430\u043a \u0432\u043e\u0442, \u0441\u0446\u0443\u043a\u043e, \u043a\u043e\u043c\u043f\u0438\u043b\u0435\u0440 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0446\u043f\u043f\u0448\u043d\u0438\u043a\u0430 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0444\u043e\u043d\u0442\u044b. \u042f \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b \u0444\u043e\u043d\u0442\u044b \u0432 cpp \u0444\u0430\u0439\u043b \u0438 \u043e\u0431\u044a\u0435\u043c \u0444\u043b\u0435\u0448\u0430 \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u043d\u0430 9\u043a. 9 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u0437\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0432 \u0445\u0435\u0434\u0435\u0440\u0435! 9 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442, \u041a\u0430\u0440\u043b! \u0412\u043e\u0442 \u0438 \u0432\u0435\u0440\u044c \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043b\u0430\u0436\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u043c!\n<\/li>\n<li>\u0421 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u0443 HardwareSerial \u043d\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 attachInterrupt. \u0423 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0440\u0434\u0443\u0438\u043d\u043e \u0435\u0433\u043e, \u043a\u0441\u0442\u0430\u0442\u0438, \u0442\u043e\u0436\u0435 \u043d\u0435\u0442. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f NeoSWSerial, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 NeoGPS, \u043d\u043e \u044d\u0442\u043e \u043a\u0430\u043a \u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0444\u0442\u0432\u0430\u0440\u043d\u044b\u0439 UART \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0446\u0435\u043b\u043e\u0439 \u043a\u0443\u0447\u0438 \u0445\u0430\u0440\u0434\u0432\u0430\u0440\u043d\u044b\u0445.\n<p>  \u042f \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0447\u0438\u0442\u0430\u043b\u0441\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e STM32 \u2014 DMA \u0438 \u0432\u0441\u0435 \u0442\u0430\u043a\u043e\u0435. \u041f\u043e\u0434\u0443\u043c\u0430\u043b, \u043c\u043e\u0436\u0435\u0442 \u0438 \u043c\u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0436\u0438\u043c \u0432 \u0446\u0435\u043b\u044f\u0445 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0431\u0430\u0442\u0430\u0440\u0435\u0438. \u0412\u0435\u0434\u044c \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0442\u044c \u0438 \u0441\u043e sleep()\u2019\u0430\u043c\u0438, \u043d\u043e \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 \u0438\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u043e\u043f\u0440\u043e\u0441 \u201c\u0430 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u043b\u0438 \u0447\u0435\u0433\u043e \u0438\u0437 GPS?\u201d<\/p>\n<\/li>\n<li>\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0437\u0430\u0434\u0430\u0447\u0438\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 UX \u0434\u0438\u0437\u0430\u0439\u043d\u0430. \u0425\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043a\u0443\u0447\u0443 \u0440\u0430\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043d\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e. \u0414\u0430\u0436\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u0448\u0440\u0438\u0444\u0442\u0430 \u0432\u043b\u0430\u0437\u0438\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 3 \u0441\u0442\u0440\u043e\u043a \u043f\u043e 21 \u0441\u0438\u043c\u0432\u043e\u043b\u0443.\n<p>  \u0422\u0430\u043a, \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u043e\u0434\u043e\u043c\u0435\u0442\u0440\u0443 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435 \u0432\u043b\u0430\u0437\u0438\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u044d\u043a\u0440\u0430\u043d. \u0418 \u043d\u0430 2 \u0442\u043e\u0436\u0435. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044d\u043a\u0440\u0430\u043d \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c\u0438 \u0431\u0443\u043a\u0432\u0430\u043c\u0438. \u0410 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0442\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u0441\u044f \u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u043a\u0440\u0430\u043d\u0447\u0438\u043a\u0430\u0445.<\/p>\n<\/li>\n<li>GPS. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 NeoGPS \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u043a\u0438\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0412 \u0441\u0442\u0438\u043b\u0435 \u201c\u043d\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u201d -&gt; \u201c\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u044f\u201d -&gt; \u201c\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 2D Fix\u201d -&gt; \u201c\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 3D Fix\u201d. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u0430\u043a\u0438\u043c \u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u0438\u043c GPS \u043c\u043e\u0434\u0443\u043b\u0435\u043c, \u043d\u043e \u043d\u0435 \u0441 \u043c\u043e\u0438\u043c. \u0423 \u043c\u0435\u043d\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442\u044b.\n<\/li>\n<li>GPS. \u0425\u043e\u0442\u0435\u043b \u043f\u043e\u0431\u044b\u0440\u0438\u043a\u0443 \u0440\u0430\u0437\u0434\u043e\u0431\u044b\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0410 \u043d\u0435 \u0442\u0443\u0442-\u0442\u043e \u0431\u044b\u043b\u043e. \u0412 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u0430 HDOP\/VDOP \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0411\u0443\u0434\u0443 \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d \u0437\u0430 \u0442\u043e\u043b\u043a\u043e\u0432\u043e\u0435 \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u044d\u0442\u0438\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c.\n<\/li>\n<li>\u0412\u044b\u0441\u043e\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f. \u041e\u0447\u0435\u043d\u044c \u0443\u0434\u0438\u0432\u0438\u043b\u0441\u044f \u043a\u043e\u0433\u0434\u0430 \u0443\u0432\u0438\u0434\u0435\u043b \u0432\u044b\u0441\u043e\u0442\u0443 65000\u043c, \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0413\u041f\u0421 \u043f\u043e\u0441\u043b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u0432\u0430\u043b \u0432\u044b\u0441\u043e\u0442\u0443 -500\u043c. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 \u0443 \u0441\u0435\u0431\u044f \u0432 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0441\u043e\u0442.\n<\/li>\n<li>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0436\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0433\u043e. \u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u0433\u043b\u0430\u0441\u0438\u0442 Time To First Fix &lt; 30 \u0441\u0435\u043a\u0443\u043d\u0434, \u043d\u043e \u044d\u0442\u043e, \u043f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u043e\u0438\u043c\u043a\u0443 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0435\u0440\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0412\u0440\u0435\u043c\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0410 \u0432\u043e\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0436\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u043c\u0438\u043d\u0443\u0442. \u0414\u0430\u0436\u0435 GPS \u0432\u043a\u043b\u044e\u0447\u0430\u043b\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u043d\u0430\u0437\u0430\u0434.\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u00ab\u0438\u0437 \u0440\u043e\u0437\u0435\u0442\u043a\u0438\u00bb \u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u0430\u043a\u043e\u0439 \u043d\u0438\u0431\u0443\u0434\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0439 \u0441\u043e\u043d. \u0411\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0430 \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0435 \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c. \u0412\u044b\u0441\u043e\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e: +-50\u043c, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0437\u0435\u0442 \u043a\u0443\u0434\u0430 \u043d\u0430\u0434\u043e. \u0414\u0430 \u0438 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043f\u043b\u0430\u0432\u0430\u0435\u0442\n<\/li>\n<li>\u041f\u0440\u0438 \u043f\u043b\u043e\u0445\u043e\u043c \u043f\u0440\u0438\u0435\u043c\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u043a\u0430\u0447\u043a\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u043e 150\u043a\u043c\/\u0447, \u0430 \u0441\u0430\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043d\u0430 \u0434\u043e 7\u043a\u043c \u0437\u0430 \u0447\u0430\u0441. \u041d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0433\u0434\u0435 \u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u043f\u043e\u043b\u0435.\n<\/li>\n<\/ul>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c<\/h2>\n<p>  \u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043f\u0440\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f. \u0414\u0430, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043c\u043e\u0449\u043d\u0435\u0435, \u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435. \u041d\u0443\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0431\u043e \u043e\u0434\u043d\u043e \u043d\u0435\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0435 \u043f\u0430\u0440\u0443 \u043a\u0438\u043b\u043e. <\/p>\n<p>  \u041a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c, \u043d\u0430 STM32 \u0432\u044b\u043b\u0435\u0437\u043b\u0438 \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0447\u0442\u043e \u0438 \u043d\u0430 AVR.   <\/p>\n<ul>\n<li>\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0437\u0430\u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u043e const \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u041e\u0417\u0423 (\u0442\u0430\u043c \u043d\u0430 \u043f\u043e\u043b\u043a\u0438\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c USB \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b)<\/li>\n<li>512 \u0431\u0430\u0439\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 adafruit, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/li>\n<li>\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 SPI, \u0445\u043e\u0442\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e SPI \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u2014 512 \u0431\u0430\u0439\u0442<\/li>\n<li>\u0432\u0441\u044f\u043a\u0430\u044f \u0444\u0438\u0433\u043d\u044f \u0438\u0437 NeoGPS \u2014 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0441\u043e\u043a\u043e\u0441\u043d\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u0438 \u0432\u0441\u0435 \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u043e\u0447\u0435\u0435. \u041a\u0435\u043c-\u0442\u043e \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u044e\u0437\u0430\u0435\u0442\u0441\u044f \u2014 300 \u0431\u0430\u0439\u0442<\/li>\n<li>\u043a\u043b\u0430\u0441\u0441 TwoWire (\u0440\u0443\u0447\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f I2C). \u042d\u0442\u043e \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u043b\u0438\u043d\u043a\u0435\u0440 \u0435\u0435 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432\u0442\u044e\u0445\u0438\u0432\u0430\u0435\u0442 \u2014 650 \u0431\u0430\u0439\u0442<\/li>\n<li>\u043a\u043e\u0434 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0410\u0426\u041f. \u041f\u043e\u043a\u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0431\u0430\u0442\u0430\u0440\u0435\u0438. \u041f\u043e\u043a\u0430 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b.<\/li>\n<\/ul>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u043f\u043e\u043b\u043e\u043d. \u0422\u0430\u043a\u043e\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 (\u0442\u043e\u0442 \u0436\u0435 TwoWire) \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 \u0445\u0435\u0434\u0435\u0440\u0435, \u0442\u043e \u043b\u0438\u043d\u043a\u0435\u0440 \u0435\u0433\u043e \u043f\u0440\u0438\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u043d \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043b\u0438\u043d\u043a\u0435\u0440\u0430, \u043d\u043e \u0431\u0438\u043b\u0434 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u0440\u0434\u0443\u0438\u043d\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u043b\u0430\u0441\u0441 TwoWire \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Wire \u0438 \u0432\u0441\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. <\/p>\n<p>  \u0421 \u043a\u043e\u0434\u043e\u043c SPI \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Adafruit_SSD1306 <s>\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u043f\u0440\u043e \u0421++ \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/s> \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u043e\u0434 \u0438 \u0434\u043b\u044f SPI \u0438 \u0434\u043b\u044f I2C. \u041f\u0440\u0438\u0447\u0435\u043c \u0432\u044b\u0431\u043e\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0432\u043b\u0435\u043f\u0438\u0442\u044c \u043e\u0431\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u0434. \u0420\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435.<\/p>\n<p>  \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e \u043c\u0435\u043b\u043e\u0447\u0438. \u0413\u0434\u0435 \u0441\u043c\u043e\u0433 \u2014 \u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0438\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u043b const \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e. \u041d\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0432\u0441\u0435 \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043d\u044f\u0442\u043e 55\u043a\u0431 \u0444\u043b\u0435\u0448\u0430, \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 7\u043a \u2014 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0412\u043e\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e \u0441\u0435\u043a\u0446\u0438\u044f\u043c<\/b><\/p>\n<div class=\"spoiler_text\">\n<table>\n<tbody>\n<tr>\n<td><b>Name<\/b><\/td>\n<td><b>Size<\/b><\/td>\n<\/tr>\n<tr>\n<td><b>.text section (Code in ROM)<\/b><\/td>\n<td> <\/td>\n<\/tr>\n<tr>\n<td>System stuff<\/td>\n<td>320<\/td>\n<\/tr>\n<tr>\n<td>My code<\/td>\n<td>212<\/td>\n<\/tr>\n<tr>\n<td>NeoGPS<\/td>\n<td>4056<\/td>\n<\/tr>\n<tr>\n<td>Adafruit SSD1306<\/td>\n<td>3108<\/td>\n<\/tr>\n<tr>\n<td>FreeRTOS<\/td>\n<td>3452<\/td>\n<\/tr>\n<tr>\n<td>Arduino: Wire Library (I2C)<\/td>\n<td>296<\/td>\n<\/tr>\n<tr>\n<td>My Code<\/td>\n<td>6744<\/td>\n<\/tr>\n<tr>\n<td>Board init \/ system stuff<\/td>\n<td>788<\/td>\n<\/tr>\n<tr>\n<td>libmaple<\/td>\n<td>3778<\/td>\n<\/tr>\n<tr>\n<td>Arduino (HardwareSerial, Print)<\/td>\n<td>1978<\/td>\n<\/tr>\n<tr>\n<td>libmaple<\/td>\n<td>280<\/td>\n<\/tr>\n<tr>\n<td>libmaple USB CDC<\/td>\n<td>2216<\/td>\n<\/tr>\n<tr>\n<td>libmaple USB CoreLib<\/td>\n<td>2388<\/td>\n<\/tr>\n<tr>\n<td>math<\/td>\n<td>12556<\/td>\n<\/tr>\n<tr>\n<td>libc (malloc\/free, memcpy, strcmp)<\/td>\n<td>3456<\/td>\n<\/tr>\n<tr>\n<td><b>Total:<\/b><\/td>\n<td><b>45628<\/b><\/td>\n<\/tr>\n<tr>\n<td> <\/td>\n<td> <\/td>\n<\/tr>\n<tr>\n<td><b>.data section (RAM)<\/b><\/td>\n<td> <\/td>\n<\/tr>\n<tr>\n<td>libmaple constants &amp; tables<\/td>\n<td>820<\/td>\n<\/tr>\n<tr>\n<td>USB stuff &amp; descriptors (after cleanup)<\/td>\n<td>84<\/td>\n<\/tr>\n<tr>\n<td>Impure data (WTF? Used in FreeRTOS)<\/td>\n<td>1068<\/td>\n<\/tr>\n<tr>\n<td>malloc stuff<\/td>\n<td>1044<\/td>\n<\/tr>\n<tr>\n<td><b>Total:<\/b><\/td>\n<td><b>3016<\/b><\/td>\n<\/tr>\n<tr>\n<td> <\/td>\n<td> <\/td>\n<\/tr>\n<tr>\n<td><b>.rodata section (constants in ROM)<\/b><\/td>\n<td> <\/td>\n<\/tr>\n<tr>\n<td>NeoGPS constants<\/td>\n<td>140<\/td>\n<\/tr>\n<tr>\n<td>Adafruit_SSD1306 constants<\/td>\n<td>76<\/td>\n<\/tr>\n<tr>\n<td>default font<\/td>\n<td>1280<\/td>\n<\/tr>\n<tr>\n<td>vtables<\/td>\n<td>120<\/td>\n<\/tr>\n<tr>\n<td>Monospace8x12 font<\/td>\n<td>1512<\/td>\n<\/tr>\n<tr>\n<td>vtables<\/td>\n<td>42<\/td>\n<\/tr>\n<tr>\n<td>My classes data + vtables<\/td>\n<td>886<\/td>\n<\/tr>\n<tr>\n<td>TimeFont<\/td>\n<td>528<\/td>\n<\/tr>\n<tr>\n<td>My classes data + vtables<\/td>\n<td>168<\/td>\n<\/tr>\n<tr>\n<td>Arduino + libmaple stuff<\/td>\n<td>792<\/td>\n<\/tr>\n<tr>\n<td>USB descriptors<\/td>\n<td>260<\/td>\n<\/tr>\n<tr>\n<td>Math constants<\/td>\n<td>552<\/td>\n<\/tr>\n<tr>\n<td><b>Total:<\/b><\/td>\n<td><b>6356<\/b><\/td>\n<\/tr>\n<tr>\n<td> <\/td>\n<td> <\/td>\n<\/tr>\n<tr>\n<td> <\/td>\n<td> <\/td>\n<\/tr>\n<tr>\n<td><b>.bss section (Zeroed variables in RAM)<\/b><\/td>\n<td> <\/td>\n<\/tr>\n<tr>\n<td>stuff<\/td>\n<td>28<\/td>\n<\/tr>\n<tr>\n<td>display buffer<\/td>\n<td>512<\/td>\n<\/tr>\n<tr>\n<td>Heap<\/td>\n<td>8288<\/td>\n<\/tr>\n<tr>\n<td>FreeRTOS<\/td>\n<td>192<\/td>\n<\/tr>\n<tr>\n<td>My data<\/td>\n<td>868<\/td>\n<\/tr>\n<tr>\n<td>libmaple + arduino<\/td>\n<td>168<\/td>\n<\/tr>\n<tr>\n<td>usb<\/td>\n<td>548<\/td>\n<\/tr>\n<tr>\n<td>malloc stuff<\/td>\n<td>56<\/td>\n<\/tr>\n<tr>\n<td>usb<\/td>\n<td>60<\/td>\n<\/tr>\n<tr>\n<td><b>Total<\/b>:<\/td>\n<td><b>10720<\/b><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>  <\/div>\n<\/div>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u041e\u0417\u0423 \u043c\u043e\u0438\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<table>\n<tbody>\n<tr>\n<td><b>name<\/b><\/td>\n<td><b>Size<\/b><\/td>\n<\/tr>\n<tr>\n<td>CurrentPositionScreen::drawScreen() const::longtitudeString<\/td>\n<td>17<\/td>\n<\/tr>\n<tr>\n<td>CurrentPositionScreen::drawScreen() const::latitudeString<\/td>\n<td>19<\/td>\n<\/tr>\n<tr>\n<td>timeZoneScreen<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>odometer1<\/td>\n<td>52<\/td>\n<\/tr>\n<tr>\n<td>odometer0<\/td>\n<td>52<\/td>\n<\/tr>\n<tr>\n<td>gpsDataModel<\/td>\n<td>192<\/td>\n<\/tr>\n<tr>\n<td>odometer2<\/td>\n<td>52<\/td>\n<\/tr>\n<tr>\n<td>gpsParser<\/td>\n<td>292<\/td>\n<\/tr>\n<tr>\n<td>lastPeriodIdleValue<\/td>\n<td>4<\/td>\n<\/tr>\n<tr>\n<td>curIdleTicks<\/td>\n<td>4<\/td>\n<\/tr>\n<tr>\n<td>lastCountedTick<\/td>\n<td>4<\/td>\n<\/tr>\n<tr>\n<td>lastCountedPeriod<\/td>\n<td>4<\/td>\n<\/tr>\n<tr>\n<td>debugScreen<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>speedScreen<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>positionScreen<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<td>timeScreen<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>screenStack<\/td>\n<td>20<\/td>\n<\/tr>\n<tr>\n<td>rootSettingsScreen<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<td>display<\/td>\n<td>40<\/td>\n<\/tr>\n<tr>\n<td>satellitesScreen<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>screenIdx<\/td>\n<td>4<\/td>\n<\/tr>\n<tr>\n<td>odometerScreen<\/td>\n<td>24<\/td>\n<\/tr>\n<tr>\n<td>altitudeScreen<\/td>\n<td>8<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>  <\/div>\n<\/div>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0430\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c (\u0445\u043e\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u043c\u0430\u0448\u0438\u0441\u0442\u044b\u043c, \u0447\u0435\u043c \u043d\u0430 AVR). \u042f \u043d\u0435 \u0437\u043d\u0430\u044e \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 ARM, \u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d \u0442\u0430\u043a\u0438\u043c. \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440, \u043a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435 \u0442\u0430\u043a \u043b\u0438\u0445\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 AVR. \u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0438\u0445 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043c\u0435\u0441\u0442\u043e\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 libc \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0435\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e. \u042f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e 12\u043a \u043d\u0430 sprintf. \u042d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 strcmp \u0438\u043b\u0438 memset \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0425\u043e\u0442\u0435\u043b \u0431\u044b \u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u043e\u043d\u0438 \u0442\u0430\u043c \u0434\u0435\u043b\u0430\u044e\u0442. \u042f \u0434\u0430\u0436\u0435 \u0441\u043a\u0430\u0447\u0430\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 newlib, \u0433\u0434\u0435 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b. \u041d\u043e \u0442\u0430\u043c \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b. \u0421 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u043e\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b\u043e. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e, \u043f\u043e \u043c\u043e\u0435\u043c\u0443, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0448\u0442\u0443\u043a\u0438 \u044d\u0442\u043e \u043a\u043e\u0449\u0443\u043d\u0441\u0442\u0432\u043e.<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439. \u041d\u043e \u0435\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0441\u0443\u0442\u044c \u043f\u0440\u0438\u0431\u043e\u0440\u0430, \u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0441\u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043a\u0440\u0443\u043f\u043d\u0430\u044f \u0438 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0447\u0430\u0441\u0442\u044c \u2014 malloc\/free. \u0412 \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u0434\u0435 \u044f \u0435\u0435 \u044f\u0432\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e. \u0423 FreeRTOS \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u041e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d\u043e \u043b\u0435\u0437\u0435\u0442 \u043d\u0435\u044f\u0441\u043d\u043e. \u0412\u044b\u0437\u043e\u0432\u043e\u0432 \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b. \u042f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u043a\u043e\u0433\u0434\u0430 \u044f \u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 STM32 \u2014 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0443\u0436\u0435 \u0431\u044b\u043b \u0432 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0435. \u0421\u043a\u0430\u0436\u0443 \u0431\u043e\u043b\u044c\u0448\u0435. \u0415\u0441\u043b\u0438 \u0432 \u043f\u0443\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c Adafruit_GFX \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 malloc. \u0412\u0440\u044f\u0434 \u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0442\u0443\u0442 \u0432\u0438\u043d\u043e\u0432\u0430\u0442\u0430 \u2014 \u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0432\u0438\u043d\u043d\u044b\u0439 \u0445\u0435\u0434\u0435\u0440 \u0441 \u0442\u0430\u0439\u043f\u0434\u0435\u0444\u0430\u043c\u0438. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043a\u043e\u0441\u044f\u043a\u0438 \u0431\u0438\u043b\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>  \u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0441\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e. <\/p>\n<h2>\u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>  <i>\u0421\u0442\u0430\u0432\u043b\u044e \u0431\u0443\u0442\u044b\u043b\u043a\u0443 \u0442\u043e\u043c\u0443, \u043a\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 (\u0421) \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0430\u0439\u043a\u0430<\/i><\/p>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u043d\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043a \u0446\u0435\u043b\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u043b \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 ARM\/STM32 \u0438, \u0435\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u043c\u043d\u0435 \u044d\u0442\u043e \u0447\u0435\u0440\u0442\u043e\u0432\u0441\u043a\u0438 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c. \u041f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u0430\u043a \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0434\u0430\u0442\u0430\u0448\u0438\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 20. \u041d\u043e \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043a\u0440\u0443\u043f\u043d\u044b\u0439 \u0448\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u2014 \u043f\u0435\u0440\u0435\u0435\u0437\u0434 \u043d\u0430 FreeRTOS. \u041a\u043e\u0434 \u0441\u0442\u0430\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c. \u0410 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0435\u0433\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b GPS \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 NeoGPS \u044f \u0441\u043c\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0438\u0445 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u044d\u043a\u0440\u0430\u043d\u0430\u0445. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c, \u043f\u0440\u0430\u0432\u0434\u0430, \u043f\u043e\u0432\u043e\u0437\u0438\u0442\u0441\u044f \u0441 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0443\u043f\u0435\u0440\u0441\u044f \u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0438\u043b\u0434 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0430\u0440\u0434\u0443\u0438\u043d\u043e. \u041e\u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u0430 \u0434\u043b\u044f \u043c\u0435\u043b\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043d\u043e \u043c\u043d\u0435 \u043e\u043d\u0430 \u0436\u043c\u0435\u0442 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0441\u043e \u0432\u0441\u0435\u0445 \u0441\u0442\u043e\u0440\u043e\u043d. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0435\u0449\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0431\u0435\u0437 \u043c\u043e\u0435\u0433\u043e \u0432\u0435\u0434\u043e\u043c\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0443 \u043c\u0435\u043d\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442\u0430: \u043a\u0430\u043a \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445? \u043a\u0430\u043a \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e? \u041a\u0430\u043a \u0437\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0440\u0430\u0442\u043d\u0438\u043a\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441 \u044d\u0442\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c? \u0412 \u043e\u0431\u0449\u0435\u043c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>  \u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0443\u0435\u0442 \u043c\u043e\u044f \u0447\u0443\u0439\u043a\u0430, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u0438\u043b\u0434 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0432\u043b\u0435\u0447\u0435\u0442 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0435\u0449\u0438. \u041f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u0442\u044c \u0441 Atmel Studio \u043d\u0430 CooCox \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0443\u044e IDE. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Arduino. \u041f\u043e\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u043d\u043e \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0442\u044f\u043d\u0435\u0442.<\/p>\n<p>  \u041d\u0443 \u0430 \u043f\u043e\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 SD \u043a\u0430\u0440\u0442\u044b, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u0435\u043c, USB Mass Storage Device \u0438 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u2014 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u044e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443. \u042f \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c \u2014 \u043e\u043d\u0438 \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442. <\/p>\n<p>  \u0421\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u043f\u0440\u043e\u043a\u0442\u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435: <a href=\"https:\/\/github.com\/grafalex82\/GPSLogger\">github.com\/grafalex82\/GPSLogger<\/a><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:\/\/geektimes.ru\/post\/287666\/\"> https:\/\/geektimes.ru\/post\/287666\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/geektimes\/post_images\/23c\/d47\/e0f\/23cd47e0f2c8676913e23a1541d4833e.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>  \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u044f \u0437\u0430\u0433\u043e\u0440\u0435\u043b\u0441\u044f \u0438\u0434\u0435\u0435\u0439 \u043f\u0440\u043e\u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0435\u0440\u043d\u044b\u0439 \u0438 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 GPS \u043b\u043e\u0433\u0433\u0435\u0440 Holux M241. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u0447\u0435\u0433\u043e \u043d\u0438\u0431\u0443\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043d\u0430 \u0440\u044b\u043d\u043a\u0435, \u0447\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u044c \u043c\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u043a\u043e\u043f\u043d\u0443\u0442\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, NMEA GPS \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, USB \u0438 SD Card \u043f\u0440\u0435\u043c\u0443\u0434\u0440\u043e\u0441\u0442\u0435\u0439, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0435\u0439 \u043c\u0435\u0447\u0442\u044b.<\/p>\n<p>  \u0427\u0442\u043e \u0436\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u044f \u0441\u0442\u0440\u043e\u044e <a href=\"https:\/\/geektimes.ru\/post\/286348\/\">\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043b \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a>. \u041d\u0430 \u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044f \u043f\u0440\u0438\u0441\u0442\u0440\u0435\u043b\u0438\u0432\u0430\u043b\u0441\u044f \u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c \u2014 \u0449\u0443\u043f\u0430\u043b Arduino \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0430 \u043d\u044e\u0430\u043d\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430\u0445 \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0442. \u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043c\u0430\u0441\u0441\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0438\u043d\u043f\u0443\u0442\u0430, \u0437\u0430 \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0412\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0447\u0435\u0433\u043e \u043d\u0438\u0431\u0443\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u043d\u044c\u043a\u043e\u0435.<\/p>\n<p>  \u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0438. \u041a\u0430\u043a \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u042f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e \u043f\u043e \u0445\u043e\u0434\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c GPS. \u0410 \u0435\u0449\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u2014 FreeRTOS \u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 STM32. \u041d\u0443 \u0438 \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e.<\/p>\n<p>  \u041f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442<\/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-284501","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284501","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=284501"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/284501\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=284501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=284501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=284501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}