{"id":343781,"date":"2023-01-11T09:01:49","date_gmt":"2023-01-11T09:01:49","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=343781"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=343781","title":{"rendered":"<span>OLIMEX ESP32-EVB: \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u043e\u0435<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/post\/709238\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/wg\/mz\/js\/wgmzjsm7-bkbboskzqfgysc3m08.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/wg\/mz\/js\/wgmzjsm7-bkbboskzqfgysc3m08.jpeg\" data-blurred=\"true\"\/><\/a><\/p>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u044b OLIMEX <a href=\"https:\/\/habr.com\/ru\/post\/708578\/\">ESP32-EVB<\/a> \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0435\u0451 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u043b\u0438\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 75\u044575 \u043c\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f OLIMEX \u0443\u043c\u0443\u0434\u0440\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 ESP32, Ethernet \u0444\u0438\u0437\u0438\u043a\u0443 LAN8710A, microSD \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0435\u0440, IR \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a, CAN \u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440, 2 \u0440\u0435\u043b\u0435, \u0440\u0430\u0437\u044a\u0451\u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0437\u0430\u0440\u044f\u0434\u043a\u0438 \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u2014 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043f\u043b\u043e\u0442\u043d\u043e \u00ab\u043f\u043e\u0441\u0430\u0436\u0435\u043d\u044b\u00bb \u043d\u0430 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 GPIO \u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u2014 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0435\u0433\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ESP32-EVB \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u043d\u0430 ESP32.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\"> \u0420\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0430<\/font><\/h2>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0443 \u043f\u043b\u0430\u0442\u044b ESP32-EVB. \u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043d\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e GPIO, \u043d\u0435\u0437\u0430\u043d\u044f\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a \u043a\u0430\u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 GPIO \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c ESP32-EVB.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/as\/vg\/ui\/asvguiegyq-olbug9z7asewmu6o.png\" data-src=\"https:\/\/habrastorage.org\/webt\/as\/vg\/ui\/asvguiegyq-olbug9z7asewmu6o.png\"\/><\/div>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\"> \u041f\u043b\u0430\u043d \u043f\u043e \u043a\u043e\u0434\u0443<\/font><\/h2>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 ESP32-EVB. \u0412\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u043b\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044f \u0435\u0433\u043e \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>  \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c ESP32-EVB:<\/p>\n<ol>\n<li>\u041a\u043d\u043e\u043f\u043a\u0430 User (BUT1)<\/li>\n<li>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0435<\/li>\n<li>Ethernet LAN8710A<\/li>\n<li>microSD \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0435\u0440<\/li>\n<li>IR \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a<\/li>\n<li>CAN \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/li>\n<\/ol>\n<p>  \u042f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043a\u0435\u0442\u0447\u0435\u0439 Arduino, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 ESP32-EVB \u0432\u0430\u0448\u0443 \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\"> \u041a\u043d\u043e\u043f\u043a\u0430 User (BUT1)<\/font><\/h2>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 BUT1, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 \u043a GPIO34. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0438\u0437 \u0441\u043a\u0435\u0442\u0447\u0430 Arduino \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0443 \u0432\u0430\u0441 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ue\/xu\/ib\/uexuibv-ifxt4krfc_spqej6jm8.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/ue\/xu\/ib\/uexuibv-ifxt4krfc_spqej6jm8.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041a\u043e\u0434 \u0441\u043a\u0435\u0442\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438:<\/p>\n<pre><code class=\"java\">\/*   OLIMEX ESP32-EVB Button example *\/  #define BUTTON_PIN 34  void setup() {   Serial.begin(115200);   Serial.println();   Serial.println(F(\"Start OLIMEX ESP32-EVB Button example...\"));      pinMode(BUTTON_PIN, INPUT); }  void loop() {   Serial.println(digitalRead(BUTTON_PIN));   delay(100); } <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0435\u0442\u0447, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0432\u0438\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u0448\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 Serial \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0435: \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0436\u0430\u0442\u0430 \u2014 \u0432\u044b\u0432\u043e\u0434 \u00ab1\u00bb, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u00ab0\u00bb.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/rv\/or\/ih\/rvorihido0biipbrp4cjqsh8amw.png\" data-src=\"https:\/\/habrastorage.org\/webt\/rv\/or\/ih\/rvorihido0biipbrp4cjqsh8amw.png\"\/><\/div>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\"> \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0435<\/font><\/h2>\n<p>  \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0435 \u043d\u0435\u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439. \u041f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0432 \u0441\u043a\u0435\u0442\u0447\u0435 GPIO, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0440\u0435\u043b\u0435 (32 \u0438 33) \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043e\u0447\u0435\u0440\u0451\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438\u0445. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0435\u0442\u0447\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043e\u0447\u0435\u0440\u0451\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u0432\u0430 \u0440\u0435\u043b\u0435, \u0430 \u043f\u0440\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u00ab\u0431\u0435\u0433\u0443\u0449\u0435\u0433\u043e \u043e\u0433\u043d\u044f\u00bb \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u044e\u0431\u044b\u043c (\u0432 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445, \u043a\u043e\u043d\u0435\u0447\u043d\u043e) \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043b\u0435 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ys\/_c\/ms\/ys_cmseq-enkhbnfuc0geu77qxw.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/ys\/_c\/ms\/ys_cmseq-enkhbnfuc0geu77qxw.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041a\u043e\u0434 \u0441\u043a\u0435\u0442\u0447\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0435:<\/p>\n<pre><code class=\"java\">\/*   OLIMEX ESP32-EVB Relays example *\/  byte pins[] = {32, 33}; byte pos = 0;  void setup() {   Serial.begin(115200);   Serial.println();   Serial.println(F(\"Start OLIMEX ESP32-EVB Relays example...\"));    pinMode(pins[0], OUTPUT);   pinMode(pins[1], OUTPUT); }  void clear() {   digitalWrite(pins[0], LOW);   digitalWrite(pins[1], LOW); }  void change(byte n) {   clear();   digitalWrite(pins[n], HIGH); }  void loop() {   change(pos);   Serial.print(F(\"ON Relay #\")); Serial.println(pos);   delay(10000);   pos++;   if (pos > 1) {pos = 0;} } <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043b\u0435 \u043d\u0430 \u0431\u043e\u0440\u0442\u0443, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0432 \u044d\u0442\u043e\u0442 \u0441\u043a\u0435\u0442\u0447 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430.<\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043a\u0435\u0442\u0447\u0430 (\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0432 Serial \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0441\u0430\u043c\u0438\u0445 \u0440\u0435\u043b\u0435).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/c_\/7m\/dx\/c_7mdxfd7s8f71pozrt5gjdd6xu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/c_\/7m\/dx\/c_7mdxfd7s8f71pozrt5gjdd6xu.png\"\/><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u043e\u0433\u0440\u0435\u0432\u0430 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0437\u0430\u0434\u0430\u0447\u0430\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 ESP32-EVB.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\"> Ethernet LAN8710A<\/font><\/h2>\n<p>  \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 ESP32-EVB \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0447\u0438\u043f Ethernet \u0444\u0438\u0437\u0438\u043a\u0438 LAN8710A \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e LAN8720A. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u043e\u0431\u0430 \u0447\u0438\u043f\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u043a\u0435\u0442\u0447 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u0432\u0438\u0434.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u0432\u0430\u0440\u0446, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 ESP32-EVB.<\/p>\n<pre><code class=\"java\">#define ETH_CLK_MODE    ETH_CLOCK_GPIO0_IN <\/code><\/pre>\n<p>  \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440\u0430 GPIO \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043f\u0438\u043d\u043e\u0432 ADDR, MDC \u0438 MDIO.<\/p>\n<pre><code class=\"java\">#define ETH_ADDR        0 #define ETH_MDC_PIN     23 #define ETH_MDIO_PIN    18 <\/code><\/pre>\n<p>  \u041d\u0430 \u043f\u043b\u0430\u0442\u0435 ESP32-EVB \u0432\u044b\u0432\u043e\u0434 NRST \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c\u044b LAN8710A \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u043a \u043f\u043b\u044e\u0441\u0443 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u044b\u0447\u043a\u0430 \u0434\u043b\u044f \u0435\u0433\u043e \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u043d\u0430 \u0437\u0435\u043c\u043b\u044e, \u043d\u043e \u043e\u043d \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u043a \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 ESP32, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u00ab\u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c\u00bb \u0432 \u0441\u043a\u0435\u0442\u0447\u0435 \u043f\u0438\u043d NRST \u043d\u0430 \u00ab\u043f\u0443\u0441\u0442\u043e\u0439\u00bb GPIO5 (\u0435\u0441\u043b\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CAN \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e GPIO5 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u00ab\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439\u00bb).<\/p>\n<pre><code class=\"java\">#define NRST            5 <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/tc\/5o\/g8\/tc5og8xkvchckk2ujdexveyuajq.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/tc\/5o\/g8\/tc5og8xkvchckk2ujdexveyuajq.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041a\u043e\u0434 \u0441\u043a\u0435\u0442\u0447\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Ethernet:<\/p>\n<pre><code class=\"java\">\/*   OLIMEX ESP32-EVB Ethernet example *\/  #include &lt;ETH.h> #include &lt;SPI.h>  #define ETH_CLK_MODE    ETH_CLOCK_GPIO0_IN #define ETH_POWER_PIN   -1 #define ETH_TYPE        ETH_PHY_LAN8720 #define ETH_ADDR        0 #define ETH_MDC_PIN     23 #define ETH_MDIO_PIN    18 #define NRST            5  static bool eth_connected = false;  void setup() {   Serial.begin(115200);   Serial.println();   Serial.println(F(\"Start OLIMEX ESP32-EVB Ethernet example...\"));    WiFi.onEvent(WiFiEvent);    ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK_MODE); }  void WiFiEvent(WiFiEvent_t event) {   switch (event) {     case SYSTEM_EVENT_ETH_START:       Serial.println(\"ETH Started\");       ETH.setHostname(\"esp32-ethernet\");       break;     case SYSTEM_EVENT_ETH_CONNECTED:       Serial.println(\"ETH Connected\");       break;     case SYSTEM_EVENT_ETH_GOT_IP:       Serial.print(\"ETH MAC: \"); Serial.print(ETH.macAddress());       Serial.print(\", IPv4: \");  Serial.print(ETH.localIP());       if (ETH.fullDuplex()) {Serial.print(\", FULL_DUPLEX\");}       Serial.print(\", \"); Serial.print(ETH.linkSpeed()); Serial.println(\"Mbps\");       eth_connected = true;       break;     case SYSTEM_EVENT_ETH_DISCONNECTED:       Serial.println(\"ETH Disconnected\");       eth_connected = false;       break;     case SYSTEM_EVENT_ETH_STOP:       Serial.println(\"ETH Stopped\");       eth_connected = false;       break;     default:       break;   } } \/\/ WiFiEvent( )  void testClient(const char *host, uint16_t port) {   Serial.print(\"\\nconnecting to \"); Serial.println(host);    WiFiClient client;   if (!client.connect(host, port)) {     Serial.println(\"connection failed\");     return;   }      client.printf(\"GET \/ HTTP\/1.1\\r\\nHost: %s\\r\\n\\r\\n\", host);   while (client.connected() &amp;&amp; !client.available());   while (client.available()) {     Serial.write(client.read());   }    Serial.println(\"closing connection\\n\");   client.stop(); }  void loop() {   if (eth_connected) {     testClient(\"baidu.com\", 80);   }   delay(10000); } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 (www.baidu.com) \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442 \u043d\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442. \u041d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e LAN8710A \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 ESP32-EVB. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 Wi-Fi \u0438\/\u0438\u043b\u0438 Ethernet \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/6n\/uj\/pi\/6nujpi-nm_r7bgs1f27ezjr_uu4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/6n\/uj\/pi\/6nujpi-nm_r7bgs1f27ezjr_uu4.png\"\/><\/div>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\"> microSD \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0435\u0440<\/font><\/h2>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0435 \u00ab\u0437\u0430\u0432\u0435\u0441\u0442\u0438\u00bb microSD \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0435\u0440 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 OLIMEX ESP32-EVB \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0435\u0451 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0442\u043e \u0443 \u0432\u0430\u0441 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2014 \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u043b\u043e \u0432 \u00ab\u043c\u0443\u0434\u0440\u0451\u043d\u043e\u043c\u00bb \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 GPIO \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 ESP32 \u0438, \u043f\u043b\u044e\u0441 \u043a \u0442\u043e\u043c\u0443 (\u0432\u0438\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0441 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0435\u0439 \u043d\u0438\u043a\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043c\u043e\u0433 \u0437\u0430\u0432\u0435\u0441\u0442\u0438), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u0436\u0438\u043c\u0430 \u00abSDMMC_HOST_FLAG_1BIT\u00bb.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/uj\/sr\/jm\/ujsrjmuu1zj2l4kdir_bokyyki0.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/uj\/sr\/jm\/ujsrjmuu1zj2l4kdir_bokyyki0.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0435\u0431\u0443\u0441 (\u0437\u0430\u0442\u043e \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u0438 \u043d\u0430\u0432\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f), \u0434\u0430\u043b\u0435\u0435 \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u0433\u043e\u0442\u043e\u0432\u043e\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0435 \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u00abmicroSD \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0435\u0440 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 OLIMEX ESP32-EVB\u00bb.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"java\">MISO: GPIO15 MOSI: GPIO2 SCK: GPIO14 CS: GPIO17 <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u0447\u0451\u043c \u043d\u0430 \u0440\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u0435 GPIO17 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d \u043a\u0430\u043a SPI_CS, \u0430 \u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043f\u0438\u043d CS \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0435\u0440\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u043a \u043f\u043b\u044e\u0441\u0443 \u043f\u0438\u0442\u0430\u043d\u0438\u044f. \u041a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0435\u0440\u043e\u043c:<\/p>\n<pre><code class=\"java\">\/*   OLIMEX ESP32-EVB SD example *\/  #include \"FS.h\" #include \"SD_MMC.h\" #include \"SPI.h\"  void setup() {   Serial.begin(115200);   Serial.println();   Serial.println(F(\"Start OLIMEX ESP32-EVB SD example...\"));    SPI.begin(14, 15, 2, 17);   if (!SD_MMC.begin(\"\/sdcard\", true)) {     Serial.println(\"Card mount failed\");     return;   }      uint8_t cardType = SD_MMC.cardType();   if (cardType == CARD_NONE){     Serial.println(\"No card attached\");     return;   }    Serial.print(\"Card Type: \");   if      (cardType == CARD_MMC) {Serial.println(\"MMC\");}   else if (cardType == CARD_SD)  {Serial.println(\"SDSC\");}   else if (cardType == CARD_SDHC){Serial.println(\"SDHC\");}   else {Serial.println(\"UNKNOWN\");}    uint64_t cardSize = SD_MMC.cardSize() \/ (1024*1024);   Serial.printf(\"Card Size: %llu MB\\n\", cardSize);       listDir(SD_MMC, \"\/\", 0);      Serial.printf(\"Total: %llu MB\\n\", SD_MMC.totalBytes() \/ (1024*1024));   Serial.printf( \"Used: %llu MB\\n\", SD_MMC.usedBytes()  \/ (1024*1024)); } \/\/ setup  void listDir(fs::FS &amp;fs, const char * dirname, uint8_t levels) {   Serial.printf(\"Listing directory: %s\\n\", dirname);    File root = fs.open(dirname);   if (!root)               {Serial.println(\"Failed open directory\"); return;}   if (!root.isDirectory()) {Serial.println(\"Not a directory\"); return;}    File file = root.openNextFile();      while (file){     if (file.isDirectory()) {       Serial.print(\"  DIR : \"); Serial.println(file.name());       if (levels){         listDir(fs, file.name(), levels -1);       }     } else {       Serial.print(\"  FILE: \"); Serial.print(file.name());       Serial.print(\"  SIZE: \"); Serial.println(file.size());     }     file = root.openNextFile();   } } \/\/ listDir( )  void loop(){  } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u044f \u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443<\/p>\n<pre><code class=\"java\">if (!SD_MMC.begin(\"\/sdcard\", true)) { <\/code><\/pre>\n<p>  \u0433\u0434\u0435 \u00abtrue\u00bb \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u00abSDMMC_HOST_FLAG_1BIT\u00bb. \u041d\u0438\u0436\u0435 \u044f \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 SD_MMC \u0434\u043b\u044f \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437\u043d\u0443\u0442\u0440\u0438:<\/p>\n<pre><code class=\"java\">bool begin(const char * mountpoint=\"\/sdcard\", bool mode1bit=false, bool format_if_mount_failed=false); host.flags = SDMMC_HOST_FLAG_1BIT; \/\/use 1-line SD mode <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0438\u0446\u0435\u0437\u0440\u0435\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u0447\u0443\u0434\u043e \u2014 \u0440\u0430\u0431\u043e\u0442\u0443 microSD \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0435\u0440\u0430 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 OLIMEX ESP32-EVB. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u0446\u0435\u043d\u0438\u0442\u044c \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c microSD \u043a\u0430\u0440\u0442 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ESP32-EVB.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/uv\/nr\/sb\/uvnrsbvwr7_yul7voyaf_piilik.png\" data-src=\"https:\/\/habrastorage.org\/webt\/uv\/nr\/sb\/uvnrsbvwr7_yul7voyaf_piilik.png\"\/><\/div>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\"> IR \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a<\/font><\/h2>\n<p>  \u041f\u043b\u044e\u0441 \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u044f\u043c, ESP32-EVB \u0438\u043c\u0435\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0444\u0440\u0430\u043a\u0440\u0430\u0441\u043d\u044b\u0435 (IR) \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430 GPIO39 \u0438 GPIO12. \u042d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043f\u043b\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b, \u044f \u043d\u0435 \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u044e\u0441\u044c, \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/kh\/wb\/pu\/khwbpudmkv9bopo2lhdejfi_sti.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/kh\/wb\/pu\/khwbpudmkv9bopo2lhdejfi_sti.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u043d\u0444\u0440\u0430\u043a\u0440\u0430\u0441\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u043e\u043c \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/Arduino-IRremote\/Arduino-IRremote\">Arduino-IRremote<\/a>. \u0412 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0441\u043a\u0435\u0442\u0447\u0435 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043c \u0438\u043d\u0444\u0440\u0430\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u043f\u0443\u043b\u044c\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e (\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u0434 \u043d\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0448\u043b\u0451\u043c \u0432 \u044d\u0444\u0438\u0440 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0441\u0438\u0433\u043d\u0430\u043b, \u043d\u0430\u0436\u0438\u043c\u0430\u044f \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 ESP32-EVB.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<ul>\n<li>IR \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a: GPIO39<\/li>\n<li>IR \u0438\u0437\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c: GPIO12<\/li>\n<li>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430: GPIO34<\/li>\n<li>STATUS_PIN: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043a\u0435\u0442\u0447\u0435 \u0434\u043b\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 ESP32-EVB \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 GPIO ESP32 (\u0438 \u043d\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430), \u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u0438\u043d \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u043d\u0430 \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043a\u0435\u0442\u0447\u0435 \u043f\u0438\u043d D4 (U1TXD). \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0438\u0431\u043e \u043d\u0430\u0439\u0442\u0438 \u00ab\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439\u00bb \u043f\u0438\u043d \u0434\u043b\u044f STATUS_PIN, \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043a\u0435\u0442\u0447 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043e\u0434, \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043a\u0435\u0442\u0447\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 2 \u0444\u0430\u0439\u043b\u0430: \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 (ir_example.ino) \u0438 \u0444\u0430\u0439\u043b \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 (PinDefinitionsAndMore.h). \u0412 \u0444\u0430\u0439\u043b\u0435 PinDefinitionsAndMore.h \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u043e\u043c\u0435\u0440\u0430 GPIO \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0440\u0430\u0441\u043f\u0438\u043d\u043e\u0432\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 ESP32-EVB (\u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u0442\u0440\u0435\u043c\u044f \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u043a\u0430\u043c\u0438).<\/p>\n<pre><code class=\"java\">#define LED_BUILTIN 4 \/\/ !!! #define IR_RECEIVE_PIN       39  \/\/ !!! #define IR_SEND_PIN          12  \/\/ !!! #define APPLICATION_PIN      34   \/\/ !!! <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 PinDefinitionsAndMore.h<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\/*  *  PinDefinitionsAndMore.h  *  *  Contains pin definitions for IRremote examples for various platforms  *  as well as definitions for feedback LED and tone() and includes  *  *  Copyright (C) 2021  Armin Joachimsmeyer  *  armin.joachimsmeyer@gmail.com  *  *  This file is part of IRremote https:\/\/github.com\/Arduino-IRremote\/Arduino-IRremote.  *  *  Arduino-IRremote is free software: you can redistribute it and\/or modify  *  it under the terms of the GNU General Public License as published by  *  the Free Software Foundation, either version 3 of the License, or  *  (at your option) any later version.  *  *  This program is distributed in the hope that it will be useful,  *  but WITHOUT ANY WARRANTY; without even the implied warranty of  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  *  GNU General Public License for more details.  *  *  You should have received a copy of the GNU General Public License  *  along with this program.  If not, see &lt;http:\/\/www.gnu.org\/licenses\/gpl.html>.  *  *\/  \/*  * Pin mapping table for different platforms  *  * Platform     IR input    IR output   Tone  * -----------------------------------------  * DEFAULT\/AVR  2           3           4  * ATtinyX5     0           4           3  * ATtiny167    9           8           5 \/\/ Digispark pro number schema  * ATtiny167    3           2           7  * ATtiny3217   10          11          3 \/\/ TinyCore schema  * ATtiny1604   2           PA5\/3       %  * SAMD21       3           4           5  * ESP8266      14 \/\/ D5    12 \/\/ D6    %  * ESP32        15          4           27  * BluePill     PA6         PA7         PA3  * APOLLO3      11          12          5  *\/  #define LED_BUILTIN 4 \/\/ !!!   \/\/#define _IR_MEASURE_TIMING \/\/ For debugging purposes.  #if defined(ESP8266) #define FEEDBACK_LED_IS_ACTIVE_LOW \/\/ The LED on my board (D4) is active LOW #define IR_RECEIVE_PIN          14 \/\/ D5 #define IR_RECEIVE_PIN_STRING   \"D5\" #define IR_SEND_PIN             12 \/\/ D6 - D4\/pin 2 is internal LED #define IR_SEND_PIN_STRING      \"D6\" #define _IR_TIMING_TEST_PIN     13 \/\/ D7 #define APPLICATION_PIN          0 \/\/ D3  #define tone(...) void()      \/\/ tone() inhibits receive timer #define noTone(a) void() #define TONE_PIN                42 \/\/ Dummy for examples using it   #elif defined(ESP32) #include &lt;Arduino.h> #define TONE_LEDC_CHANNEL        1  \/\/ Using channel 1 makes tone() independent of receiving timer -> No need to stop receiving timer.  void tone(uint8_t _pin, unsigned int frequency){   ledcAttachPin(_pin, TONE_LEDC_CHANNEL);   ledcWriteTone(TONE_LEDC_CHANNEL, frequency); }  void tone(uint8_t _pin, unsigned int frequency, unsigned long duration){   ledcAttachPin(_pin, TONE_LEDC_CHANNEL);   ledcWriteTone(TONE_LEDC_CHANNEL, frequency);   delay(duration);   ledcWriteTone(TONE_LEDC_CHANNEL, 0); }  void noTone(uint8_t _pin){   ledcWriteTone(TONE_LEDC_CHANNEL, 0); }  #define IR_RECEIVE_PIN       39  \/\/ !!! #define IR_SEND_PIN          12  \/\/ !!! #define TONE_PIN             27  \/\/ D27 25 &amp; 26 are DAC0 and 1 #define APPLICATION_PIN      34  \/\/ !!!   #elif defined(ARDUINO_ARCH_STM32) || defined(ARDUINO_ARCH_STM32F1) \/\/ BluePill in 2 flavors \/\/ Timer 3 blocks PA6, PA7, PB0, PB1 for use by Servo or tone() #define IR_RECEIVE_PIN          PA6 #define IR_RECEIVE_PIN_STRING   \"PA6\" #define IR_SEND_PIN             PA7 #define IR_SEND_PIN_STRING      \"PA7\" #define TONE_PIN                PA3 #define _IR_TIMING_TEST_PIN      PA5 #define APPLICATION_PIN         PA2  #elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) #include \"ATtinySerialOut.hpp\" \/\/ Available as Arduino library \"ATtinySerialOut\". saves 370 bytes program space and 38 bytes RAM for digistump core #define IR_RECEIVE_PIN  0 #define IR_SEND_PIN     4 \/\/ Pin 2 is serial output with ATtinySerialOut. Pin 1 is internal LED and Pin3 is USB+ with pullup on Digispark board. #define TONE_PIN        3 #define _IR_TIMING_TEST_PIN 3  #elif defined(__AVR_ATtiny87__) || defined(__AVR_ATtiny167__) #include \"ATtinySerialOut.hpp\" \/\/ Available as Arduino library \"ATtinySerialOut\" \/\/ For ATtiny167 Pins PB6 and PA3 are usable as interrupt source. #  if defined(ARDUINO_AVR_DIGISPARKPRO) #define IR_RECEIVE_PIN   9 \/\/ PA3 - on Digispark board labeled as pin 9 \/\/#define IR_RECEIVE_PIN  14 \/\/ PB6 \/ INT0 is connected to USB+ on DigisparkPro boards #define IR_SEND_PIN      8 \/\/ PA2 - on Digispark board labeled as pin 8 #define TONE_PIN         5 \/\/ PA7 #define _IR_TIMING_TEST_PIN 10 \/\/ PA4 #  else #define IR_RECEIVE_PIN  3 #define IR_SEND_PIN     2 #define TONE_PIN        7 #  endif  #elif defined(__AVR_ATtiny88__) \/\/ MH-ET Tiny88 board #include \"ATtinySerialOut.hpp\" \/\/ Available as Arduino library \"ATtinySerialOut\". Saves 128 bytes program space \/\/ Pin 6 is TX pin 7 is RX #define IR_RECEIVE_PIN   3 \/\/ INT1 #define IR_SEND_PIN      4 #define TONE_PIN         9 #define _IR_TIMING_TEST_PIN 8  #elif defined(__AVR_ATtiny3217__) #define IR_RECEIVE_PIN  10 #define IR_SEND_PIN     11 #define TONE_PIN         3 #define APPLICATION_PIN  5  #elif defined(__AVR_ATtiny1604__) #define IR_RECEIVE_PIN   2 \/\/ To be compatible with interrupt example, pin 2 is chosen here. #define IR_SEND_PIN      3 #define APPLICATION_PIN  5  #define tone(...) void()      \/\/ Define as void, since TCB0_INT_vect is also used by tone() #define noTone(a) void() #define TONE_PIN        42 \/\/ Dummy for examples using it  #  elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \\ || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \\ || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \\ || defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \\ || defined(__AVR_ATmega164P__) || defined(__AVR_ATmega32__) \\ || defined(__AVR_ATmega16__) || defined(__AVR_ATmega8535__) \\ || defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) \\ || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) \\ || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega162__) #define IR_RECEIVE_PIN      2 #define IR_SEND_PIN        13 #define TONE_PIN            4 #define APPLICATION_PIN     5 #define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 \/\/ E.g. used for examples which use LED_BUILDIN for example output. #define _IR_TIMING_TEST_PIN  7  #elif defined(ARDUINO_ARCH_APOLLO3) #define IR_RECEIVE_PIN  11 #define IR_SEND_PIN     12 #define TONE_PIN         5  #elif defined(ARDUINO_ARCH_MBED) \/\/ Arduino Nano 33 BLE #define IR_RECEIVE_PIN      2 #define IR_SEND_PIN         3 #define TONE_PIN            4 #define APPLICATION_PIN     5 #define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 \/\/ E.g. used for examples which use LED_BUILDIN for example output. #define _IR_TIMING_TEST_PIN  7  #elif defined(TEENSYDUINO) #define IR_RECEIVE_PIN      2 #define IR_SEND_PIN         3 #define TONE_PIN            4 #define APPLICATION_PIN     5 #define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 \/\/ E.g. used for examples which use LED_BUILDIN for example output. #define _IR_TIMING_TEST_PIN  7  #elif defined(__AVR__) \/\/ Default as for ATmega328 like on Uno, Nano etc. #define IR_RECEIVE_PIN      2 \/\/ To be compatible with interrupt example, pin 2 is chosen here. #define IR_SEND_PIN         3 #define TONE_PIN            4 #define APPLICATION_PIN     5 #define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 \/\/ E.g. used for examples which use LED_BUILDIN for example output. #define _IR_TIMING_TEST_PIN  7  #elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_SAM) #define IR_RECEIVE_PIN      2 #define IR_SEND_PIN         3 #define TONE_PIN            4 #define APPLICATION_PIN     5 #define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 \/\/ E.g. used for examples which use LED_BUILDIN for example output. #define _IR_TIMING_TEST_PIN  7  \/\/ On the Zero and others we switch explicitly to SerialUSB #define Serial SerialUSB  \/\/ Definitions for the Chinese SAMD21 M0-Mini clone, which has no led connected to D13\/PA17. \/\/ Attention!!! D2 and D4 are switched on these boards!!! \/\/ If you connect the LED, it is on pin 24\/PB11. In this case activate the next two lines. \/\/#undef LED_BUILTIN \/\/#define LED_BUILTIN 24 \/\/ PB11 \/\/ As an alternative you can choose pin 25, it is the RX-LED pin (PB03), but active low.In this case activate the next 3 lines. \/\/#undef LED_BUILTIN \/\/#define LED_BUILTIN 25 \/\/ PB03 \/\/#define FEEDBACK_LED_IS_ACTIVE_LOW \/\/ The RX LED on the M0-Mini is active LOW  #elif defined (NRF51) \/\/ BBC micro:bit #define IR_RECEIVE_PIN      2 #define IR_SEND_PIN         3 #define APPLICATION_PIN     1 #define _IR_TIMING_TEST_PIN  4  #define tone(...) void()    \/\/ no tone() available #define noTone(a) void() #define TONE_PIN           42 \/\/ Dummy for examples using it  #else #warning Board \/ CPU is not detected using pre-processor symbols -> using default values, which may not fit. Please extend PinDefinitionsAndMore.h. \/\/ Default valued for unidentified boards #define IR_RECEIVE_PIN      2 #define IR_SEND_PIN         3 #define TONE_PIN            4 #define APPLICATION_PIN     5 #define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 \/\/ E.g. used for examples which use LED_BUILDIN for example output. #define _IR_TIMING_TEST_PIN  7 #endif \/\/ defined(ESP8266)  #if !defined (FLASHEND) #define FLASHEND 0xFFFF \/\/ Dummy value for platforms where FLASHEND is not defined #endif \/*  * Helper macro for getting a macro definition as string  *\/ #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 ir.ino<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\/*   OLIMEX ESP32-EVB IR example   * ReceiveAndSend.cpp  *   *  * Record and play back last received IR signal at button press.  * The logic is:  * If the button is pressed, send the IR code.  * If an IR code is received, record it.  *  * An example for simultaneous receiving and sending is in the UnitTest example.  *  * An IR detector\/demodulator must be connected to the input IR_RECEIVE_PIN.  *  * A button must be connected between the input SEND_BUTTON_PIN and ground.  * A visible LED can be connected to STATUS_PIN to provide status.  *  * Initially coded 2009 Ken Shirriff http:\/\/www.righto.com  *  *  This file is part of Arduino-IRremote https:\/\/github.com\/Arduino-IRremote\/Arduino-IRremote.  *  *\/  #include &lt;Arduino.h> #include \"PinDefinitionsAndMore.h\"  \/\/#define EXCLUDE_EXOTIC_PROTOCOLS \/\/ saves around 900 bytes program space  #include &lt;IRremote.hpp>  int SEND_BUTTON_PIN = APPLICATION_PIN; int STATUS_PIN = LED_BUILTIN;  int DELAY_BETWEEN_REPEAT = 50;  \/\/ On the Zero and others we switch explicitly to SerialUSB #if defined(ARDUINO_ARCH_SAMD) #define Serial SerialUSB #endif  struct storedIRDataStruct { \/\/ Storage for the recorded code   IRData receivedIRData;   \/\/ extensions for sendRaw   uint8_t rawCode[RAW_BUFFER_LENGTH]; \/\/ durations if raw   uint8_t rawCodeLength;              \/\/ length of code } sStoredIRData;  int lastButtonState;  void storeCode(IRData *aIRReceivedData); void sendCode(storedIRDataStruct *aIRDataToSend);  void setup() {   Serial.begin(115200);   Serial.println();   Serial.println(F(\"Start OLIMEX ESP32-EVB IR example...\"));      \/\/ Just to know which program is running on my Arduino   \/\/Serial.println(F(\"START \" __FILE__ \" from \" __DATE__ \"\\r\\nUsing library version \" VERSION_IRREMOTE));    IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); \/\/ Start the receiver, enable feedback LED, take LED feedback pin from the internal boards definition   IrSender.begin(IR_SEND_PIN, ENABLE_LED_FEEDBACK); \/\/ Specify send pin and enable feedback LED at default feedback LED pin    pinMode(STATUS_PIN, OUTPUT);   pinMode(SEND_BUTTON_PIN, INPUT); \/\/ !!!  } \/\/ setup  \/\/ Stores the code for later playback in sStoredIRData  void storeCode(IRData *aIRReceivedData) {   if (aIRReceivedData->flags &amp; IRDATA_FLAGS_IS_REPEAT)      {Serial.println(F(\"Ignore repeat\")); return;}   if (aIRReceivedData->flags &amp; IRDATA_FLAGS_IS_AUTO_REPEAT) {Serial.println(F(\"Ignore autorepeat\")); return;}   if (aIRReceivedData->flags &amp; IRDATA_FLAGS_PARITY_FAILED)  {Serial.println(F(\"Ignore parity error\")); return;}    sStoredIRData.receivedIRData = *aIRReceivedData; \/\/ Copy decoded data    if (sStoredIRData.receivedIRData.protocol == UNKNOWN) {     Serial.print(F(\"Received unknown code and store \"));     Serial.print(IrReceiver.decodedIRData.rawDataPtr->rawlen - 1);     Serial.println(F(\" timing entries as raw \"));          IrReceiver.printIRResultRawFormatted(&amp;Serial, true); \/\/ output the results in RAW format          sStoredIRData.rawCodeLength = IrReceiver.decodedIRData.rawDataPtr->rawlen - 1;     IrReceiver.compensateAndStoreIRResultInArray(sStoredIRData.rawCode); \/\/ store current raw data in dedicated array for later usage   } else {     IrReceiver.printIRResultShort(&amp;Serial);     sStoredIRData.receivedIRData.flags = 0; \/\/ clear flags -esp. repeat- for later sending     Serial.println();   } } \/\/ storeCode( )  void sendCode(storedIRDataStruct *aIRDataToSend) {   if (aIRDataToSend->receivedIRData.protocol == UNKNOWN) { \/\/ raw     IrSender.sendRaw(aIRDataToSend->rawCode, aIRDataToSend->rawCodeLength, 38); \/\/ 38 KHz     Serial.print(F(\"Sent raw \"));     Serial.print(aIRDataToSend->rawCodeLength);     Serial.println(F(\" marks or spaces\"));   } else {     IrSender.write(&amp;aIRDataToSend->receivedIRData, NO_REPEATS); \/\/ write func switch for different protocols     Serial.print(F(\"Sent: \"));     printIRResultShort(&amp;Serial, &amp;aIRDataToSend->receivedIRData);   } }  void loop() {   int buttonState = digitalRead(SEND_BUTTON_PIN); \/\/ active LOW   \/\/ Serial.print(F(\"=>\")); Serial.println(buttonState); !!!   if (lastButtonState == LOW &amp;&amp; buttonState == HIGH) {     Serial.println(F(\"Button released\"));     IrReceiver.start(); \/\/ re-enable receiver   }    \/\/ Check for static button state    if (buttonState == LOW) {     IrReceiver.stop();          \/\/ Button pressed send stored data or repeat     Serial.println(F(\"Button pressed, now sending\"));     digitalWrite(STATUS_PIN, HIGH);     if (lastButtonState == buttonState) {       sStoredIRData.receivedIRData.flags = IRDATA_FLAGS_IS_REPEAT;     }     sendCode(&amp;sStoredIRData);     digitalWrite(STATUS_PIN, LOW);     delay(DELAY_BETWEEN_REPEAT); \/\/ Wait a bit between retransmissions   } else if (IrReceiver.available()) { \/\/ Button is not pressed, check for incoming data     storeCode(IrReceiver.read());     IrReceiver.resume();   }    lastButtonState = buttonState; } \/\/ loop <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043a\u0435\u0442\u0447\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c IR \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u043f\u0443\u043b\u044c\u0442\u0430 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c \u0432 \u044d\u0444\u0438\u0440 (\u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u043c), \u043d\u0430\u0436\u0438\u043c\u0430\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u00abUser\u00bb \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 ESP32-EVB.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/tz\/n7\/6w\/tzn76w98d9umvdnvmmn5a7orwac.png\" data-src=\"https:\/\/habrastorage.org\/webt\/tz\/n7\/6w\/tzn76w98d9umvdnvmmn5a7orwac.png\"\/><\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\"> CAN \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/font><\/h2>\n<p>  \u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 ESP32-EVB, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u2014 \u044d\u0442\u043e CAN \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/nhatuan84\/esp32-can-protocol-demo\">arduino-esp32-can-demo<\/a>. \u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u043a\u0435\u0442\u0447 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e CAN \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0438 \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442 \u043f\u043e \u043d\u0435\u043c\u0443 \u0441\u0432\u043e\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/-j\/h6\/l_\/-jh6l__enqmxtlehhayxmsky4yu.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/-j\/h6\/l_\/-jh6l__enqmxtlehhayxmsky4yu.jpeg\" data-blurred=\"true\"\/><\/div>\n<p>  \u041a\u043e\u0434 \u0441\u043a\u0435\u0442\u0447\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 CAN \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c:<\/p>\n<pre><code class=\"java\">\/*   OLIMEX ESP32-EVB CAN example *\/  #include &lt;ESP32CAN.h> #include &lt;CAN_config.h>  CAN_device_t CAN_cfg;  void setup() {   Serial.begin(115200);   Serial.println();   Serial.println(F(\"Start OLIMEX ESP32-EVB CAN example...\"));      CAN_cfg.speed     = CAN_SPEED_1000KBPS;   CAN_cfg.tx_pin_id = GPIO_NUM_5;   CAN_cfg.rx_pin_id = GPIO_NUM_35;   CAN_cfg.rx_queue  = xQueueCreate(10, sizeof(CAN_frame_t));   ESP32Can.CANInit(); } \/\/ setup  void loop() {   CAN_frame_t rx_frame;      \/\/receive next CAN frame from queue   if (xQueueReceive(CAN_cfg.rx_queue,&amp;rx_frame, 3*portTICK_PERIOD_MS) == pdTRUE) {     if (rx_frame.FIR.B.FF == CAN_frame_std)       printf(\"New standard frame\");     else       printf(\"New extended frame\");      if (rx_frame.FIR.B.RTR == CAN_RTR)       printf(\" RTR from 0x%08x, DLC %d\\r\\n\",rx_frame.MsgID, rx_frame.FIR.B.DLC);     else {       printf(\" from 0x%08x, DLC %d\\n\",rx_frame.MsgID, rx_frame.FIR.B.DLC);       for (int i = 0; i &lt; 8; i++) {         printf(\"%c\\t\", (char)rx_frame.data.u8[i]);       }       printf(\"\\n\");     }   } else {     rx_frame.FIR.B.FF = CAN_frame_std;     rx_frame.MsgID = 1;     rx_frame.FIR.B.DLC = 8;          rx_frame.data.u8[0] = 'h';     rx_frame.data.u8[1] = 'e';     rx_frame.data.u8[2] = 'l';     rx_frame.data.u8[3] = 'l';     rx_frame.data.u8[4] = 'o';     rx_frame.data.u8[5] = 'c';     rx_frame.data.u8[6] = 'a';     rx_frame.data.u8[7] = 'n';      ESP32Can.CANWriteFrame(&amp;rx_frame);   } } \/\/ loop <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u043c \u0441\u043a\u0435\u0442\u0447\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f CAN \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043f\u043b\u0430\u0442\u044b ESP32-EVB, \u0433\u0434\u0435, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f TX (5) \u0438 RX (35) \u043f\u0438\u043d\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<pre><code class=\"java\">  CAN_cfg.speed     = CAN_SPEED_1000KBPS;   CAN_cfg.tx_pin_id = GPIO_NUM_5;   CAN_cfg.rx_pin_id = GPIO_NUM_35;   CAN_cfg.rx_queue  = xQueueCreate(10, sizeof(CAN_frame_t));   ESP32Can.CANInit(); <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043a\u0435\u0442\u0447 \u043f\u043e\u0434 \u0432\u0430\u0448\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u043b\u0438 \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 CAN \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c.<\/p>\n<h2><font color=\"#1c22be\">\u276f<\/font> <font color=\"#454cee\"> \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/font><\/h2>\n<p>  \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0441\u0442\u0430\u0442\u0435\u0439, \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e \u0432\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 OLIMEX ESP32-EVB \u0438 \u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u0442\u0435\u043f\u0435\u0440\u044c, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u0435\u0439, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c OLIMEX ESP32-EVB \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0438\u0445 IoT \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>  \u0421 \u0447\u0435\u043c \u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0441 (\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e OLIMEX, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 ESP32-EVB, \u0447\u0435\u0440\u0435\u0437 6 \u043b\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430) \u0438 \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e.<\/p>\n<p>  <a href=\"https:\/\/timeweb.cloud\/\/vds-vps?utm_source=habr&amp;utm_medium=banner&amp;utm_campaign=vds-promo-6-rub\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/p-\/u9\/l2\/p-u9l27ynelxi92bcmdxhu76ma8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/p-\/u9\/l2\/p-u9l27ynelxi92bcmdxhu76ma8.png\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/709238\/\"> https:\/\/habr.com\/ru\/company\/timeweb\/blog\/709238\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/post\/709238\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/wg\/mz\/js\/wgmzjsm7-bkbboskzqfgysc3m08.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/wg\/mz\/js\/wgmzjsm7-bkbboskzqfgysc3m08.jpeg\" data-blurred=\"true\"\/><\/a><\/p>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u044b OLIMEX <a href=\"https:\/\/habr.com\/ru\/post\/708578\/\">ESP32-EVB<\/a> \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0435\u0451 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u043b\u0438\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 75\u044575 \u043c\u043c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f OLIMEX \u0443\u043c\u0443\u0434\u0440\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 ESP32, Ethernet \u0444\u0438\u0437\u0438\u043a\u0443 LAN8710A, microSD \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0435\u0440, IR \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a, CAN \u0442\u0440\u0430\u043d\u0441\u0438\u0432\u0435\u0440, 2 \u0440\u0435\u043b\u0435, \u0440\u0430\u0437\u044a\u0451\u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0437\u0430\u0440\u044f\u0434\u043a\u0438 \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u2014 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043f\u043b\u043e\u0442\u043d\u043e \u00ab\u043f\u043e\u0441\u0430\u0436\u0435\u043d\u044b\u00bb \u043d\u0430 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 GPIO \u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u2014 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0435\u0433\u043a\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ESP32-EVB \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u043d\u0430 ESP32.  <\/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-343781","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/343781","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=343781"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/343781\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=343781"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=343781"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=343781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}