{"id":293395,"date":"2019-08-14T21:00:23","date_gmt":"2019-08-14T21:00:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=293395"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=293395","title":{"rendered":"ESP32-CAM Video Streaming Server \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 I2C \u0438 SPI \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u0432"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">ESP-32 CAM \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u043e\u0442 <a href=\"https:\/\/www.diymore.cc\/products\/esp32-cam-wifi-wireless-module-esp32-serial-to-wifi-esp32-cam-spi-flash-bluetooth-development-board-with-ov2640-camera-module\">Diymore<\/a>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fe\/it\/oc\/feitoc3nxkss7zc6ocsw7cmuyho.jpeg\" width=\"500\"><\/div>\n<p>  <\/p>\n<h3>ESP32-CAM Video Streaming Server<\/h3>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/randomnerdtutorials.com\/esp32-cam-video-streaming-face-recognition-arduino-ide\/\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>  \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: <a href=\"https:\/\/randomnerdtutorials.com\/installing-the-esp32-board-in-arduino-ide-windows-instructions\/\">Esp32 board in Arduino Ide Windows<\/a> \/ <a href=\"https:\/\/randomnerdtutorials.com\/installing-the-esp32-board-in-arduino-ide-mac-and-linux-instructions\/\">Esp32 board in Arduino Ide Linux and Mac<\/a> <\/p>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0435\u0441\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043c\u043e\u0434\u0443\u043b\u044c AI-THINKER \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b <br \/>  #define CAMERA_MODEL_AI_THINKER<\/p>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446. \u041a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u044b\u043b \u043f\u043e\u043b\u0435\u0437\u0435\u043d.<br \/>  <a name=\"habracut\"><\/a><br \/>  It seems that face recognition is no longer working (at least with the example program) when using the 1.02 ESP core. Rolling back to the 1.01 core and using the example program belonging to that core, will \u2018fix\u2019 it<\/p>\n<p>  \u041e\u0442\u043a\u0430\u0442\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 1.01 \u0432\u0441\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_2\/tg\/47\/_2tg47ntvkqznzh-nr_jhqzitz8.png\"><\/div>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0443 \u0434\u0438\u0441\u043f\u043b\u043b\u0435\u0432 I2C 128&#215;64 \u0438 TFT SPI 128&#215;128 <\/p>\n<p>  C\u0442\u0430\u0442\u044c\u044f <a href=\"https:\/\/bitluni.net\/ov7670-with-fifo\">OV7670 with FIFO<\/a> \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u043a \u0434\u0438\u0441\u043f\u043b\u0435\u044e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435 CAM \u043c\u043e\u0434\u0443\u043b\u044c. Support OV2640 and OV7670 cameras<\/p>\n<p>  \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0443 \u043c\u0435\u043d\u044f \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435<\/p>\n<p>  ESP32 camera + Wifi Server + I2C Display (AdaFruit)<br \/>  ESP32 camera + SPI Display 1.44&#8243; TFT 128&#215;128 v1.1 (AdaFruit)<br \/>  ESP32 camera + SPI Display 1.8&#8243; TFT 128*160 (Espressif \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430)<\/p>\n<p>  WiFi Server \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u0435\u0442 \u0441 ISP. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0430 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 WiFi \u043c\u043e\u0434\u0443\u043b\u044f.<\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c ESP32-CAM \u0438\u043c\u0435\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u043d\u043e\u0433. \u0427\u0430\u0441\u0442\u044c \u043f\u043e\u0440\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u043c\u0435\u0440\u044b, \u0447\u0430\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 sd-card. sd-card \u0440\u0430\u0437\u044c\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435. \u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u0432\u044b\u0432\u043e\u0434 (IO4) \u044d\u0442\u043e \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043d\u044b\u0439 \u0444\u043e\u043d\u0430\u0440\u044c.<\/p>\n<p>  I2C Display B\/W \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u0441 \u043a\u0430\u043c\u0435\u0440\u044b. TFT \u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. \u041d\u0430 \u043d\u0435\u043c \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u0438\u0446\u043e. \u041d\u0430 \u0442\u0430\u043a\u043e\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u0435 \u0438\u043b\u0438 \u0447\u0443\u0442\u044c \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0414\u0432\u0435\u0440\u043d\u043e\u0439 \u0413\u043b\u0430\u0437\u043e\u043a<\/p>\n<p>  \u0421\u043a\u0430\u0436\u0443 \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043e\u0442 AdaFruit \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0431\u044b\u0441\u0442\u0430\u0440\u0430\u044f. \u041c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043f\u0430\u0440\u0443 \u043a\u0430\u0434\u0440\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u043d\u0438\u0437\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u041d\u043e \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0441\u0442\u0438 ESP32_TFT_library \u0441 \u043c\u043e\u0438\u043c \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c 1.44&#8243; 128&#215;128 SPI V1.1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f ILI9163. \u042f \u0432\u0437\u044f\u043b 1.8&#8243; 128*160 SPI TFT \u0438 \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0436\u0430\u0442\u044c \u043e\u043a\u043e\u043b\u043e 12 FPS! <a href=\"https:\/\/github.com\/loboris\/ESP32_TFT_library\">\u0421\u0441\u044b\u043b\u043a\u0430<\/a>.<\/p>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f esp-32 (<a href=\"https:\/\/forum.arduino.cc\/index.php?topic=397439.0\">\u0441\u0441\u044b\u043b\u043a\u0430<\/a>):<\/p>\n<p>  4.98 sec Adafruit_ST7735<br \/>  1.71 sec ST7735X_kbv<br \/>  1.30 sec PDQ_ST7735<\/p>\n<p>  \u0412\u0438\u0434\u0435\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0435:<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/HnhsxP0W0m4?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0432\u0443\u0445 \u043f\u043e\u0440\u0442\u043e\u0432 SPI \u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u044f c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c ILI9341 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 30 \u043a\u0430\u0434\u0440\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 (<a href=\"https:\/\/blog.littlevgl.com\/2019-01-31\/esp32\">\u0441\u0441\u044b\u043b\u043a\u0430<\/a>).<\/p>\n<p>  \u041d\u043e \u043a\u0430\u043a \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 ESP32-CAM \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d SPI. \u041e\u043d \u0432\u044b\u0432\u0435\u0434\u0435\u043d \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 PINS:<\/p>\n<p>  IO2 \u2014 DC(A0)<br \/>  IO14 \u2014 CLK<br \/>  IO15 \u2014 CS<br \/>  IO13 \u2014 MOSI (SDA)<br \/>  IO12 \u2014 MISO (\u0412\u0445\u043e\u0434. \u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f)<\/p>\n<p>  IO0 \u2014 BCKL (\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430. \u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f)<br \/>  IO16 \u2014 RST<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ob\/wr\/wy\/obwrwyztxqm6ct4dtlxe_fggdim.png\"><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nr\/7e\/dg\/nr7edg2broaykspjtyxncso2zxy.png\"><\/p>\n<p>  \u041f\u0435\u0440\u0432\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u0442\u043e\u0442\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u044d\u0442\u043e AdaFruit SSD1306<\/p>\n<h3>I2C 128&#215;64 Blue OLED Display<\/h3>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ec\/xl\/ji\/ecxljimycqq42q16yxswiehsv98.png\"><\/div>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include &lt;Wire.h&gt; #include &lt;Adafruit_GFX.h&gt; #include &lt;Adafruit_SSD1306.h&gt;  #define SCREEN_WIDTH 128 \/\/ OLED display width, in pixels #define SCREEN_HEIGHT 64 \/\/ OLED display height, in pixels  \/\/ Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET     -1 \/\/ Reset pin # (or -1 if sharing Arduino reset pin)  Adafruit_SSD1306 display;  void init_display(){     pinMode(14,INPUT_PULLUP);     pinMode(15,INPUT_PULLUP);     Wire.begin(14,15);     display = Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, OLED_RESET);   if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { \/\/ Address 0x3D for 128x64     Serial.println(F(\"SSD1306 allocation failed\"));     for(;;); \/\/ Don't proceed, loop forever   }      ....  <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">camera_capture()<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#define BACKCOLOR 0x0000 \/\/ Black #define PIXELCOLOR 0xFFFF  \/\/ White  #define FRAME_WIDTH 320 #define FRAME_HEIGHT 240  uint16_t pixel_color = 0;  esp_err_t camera_capture(){     \/\/acquire a frame     camera_fb_t * fb = esp_camera_fb_get();     if (!fb) {         ESP_LOGE(TAG, \"Camera Capture Failed\");         return ESP_FAIL;     }   int i = 0;      for(int y = 0; y &lt; SCREEN_HEIGHT; y++){     for(int x = 0; x &lt; SCREEN_WIDTH; x++){       i = y * FRAME_WIDTH + x; \/\/ FRAMESIZE_QVGA \/\/ 320x240       char ch = (char)fb-&gt;buf[i];        if (ch &gt; 128)          pixel_color = WHITE;       else           pixel_color = BLACK;        \/\/ Draw a single pixel in white        display.drawPixel(x, y, pixel_color);      }   }     display.display();      \/\/return the frame buffer back to the driver for reuse     esp_camera_fb_return(fb);     Serial.println(\"Capture frame ok.\");     return ESP_OK; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 esp32 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Software I2C \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f. \u0417\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b IO14 \u0438 IO15. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u044b\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u043f\u043e\u0440\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 H\/W \u0448\u0438\u043d\u0430.<\/p>\n<p>  \u041a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c <a href=\"https:\/\/www.instructables.com\/id\/Monochrome-096-i2c-OLED-display-with-arduino-SSD13\/\">Monochrome 0.96&#8243; i2c OLED display<\/a>. \u041d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u043d\u0430 \u0448\u0438\u043d\u0435 I2\u0421. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 0x3\u0421<\/p>\n<h3>SPI Display 1.8&#8243; TFT 128*160 Espressif \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/h3>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/e9\/ym\/zg\/e9ymzg6iukpuzpowfbgvlln89dg.jpeg\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/eo\/jv\/j0\/eojvj0nkmzg1dqiubx3jcaoepou.jpeg\"><\/div>\n<p>  \u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:<\/p>\n<p>  IO2 \u2014 A0<br \/>  IO14 \u2014 SCK<br \/>  IO15 \u2014 CS<br \/>  IO13 \u2014 SDA<br \/>  IO16 \u2014 RESET<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fp\/v8\/iv\/fpv8iv79hdpoefoxwnzsc64ychm.png\"><br \/>  \u041d\u0430 \u043f\u043b\u0430\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d SD-card reader<\/p>\n<p>  \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f IO:<\/p>\n<pre><code class=\"cpp\">\/\/ Configuration for other boards, set the correct values for the display used \/\/---------------------------------------------------------------------------- #define DISP_COLOR_BITS_24\t0x66 \/\/#define DISP_COLOR_BITS_16\t0x55  \/\/ Do not use!  \/\/ ############################################# \/\/ ### Set to 1 for some displays,           ### \/\/     for example the one on ESP-WROWER-KIT ### \/\/ ############################################# #define TFT_INVERT_ROTATION 0 #define TFT_INVERT_ROTATION1 0  \/\/ ################################################ \/\/ ### SET TO 0X00 FOR DISPLAYS WITH RGB MATRIX ### \/\/ ### SET TO 0X08 FOR DISPLAYS WITH BGR MATRIX ### \/\/ ### For ESP-WROWER-KIT set to 0x00           ### \/\/ ################################################ #define TFT_RGB_BGR 0x08  \/\/ ############################################################## \/\/ ### Define ESP32 SPI pins to which the display is attached ### \/\/ ##############################################################  \/\/ The pins configured here are the native spi pins for HSPI interface \/\/ Any other valid pin combination can be used #define PIN_NUM_MISO 12\t\t\/\/ SPI MISO #define PIN_NUM_MOSI 13\t\t\/\/ SPI MOSI #define PIN_NUM_CLK  14\t\t\/\/ SPI CLOCK pin #define PIN_NUM_CS   15\t\t\/\/ Display CS pin #define PIN_NUM_DC   2\t\t\/\/ Display command\/data pin #define PIN_NUM_TCS  0\t\t\/\/ Touch screen CS pin (NOT used if USE_TOUCH=0)  \/\/ -------------------------------------------------------------- \/\/ ** Set Reset and Backlight pins to 0 if not used ! \/\/ ** If you want to use them, set them to some valid GPIO number #define PIN_NUM_RST  0  \t\/\/ GPIO used for RESET control  #define PIN_NUM_BCKL 0  \t\/\/ GPIO used for backlight control #define PIN_BCKL_ON  0  \t\/\/ GPIO value for backlight ON #define PIN_BCKL_OFF 1  \t\/\/ GPIO value for backlight OFF \/\/ --------------------------------------------------------------  \/\/ ####################################################### \/\/ Set this to 1 if you want to use touch screen functions \/\/ ####################################################### #define USE_TOUCH\tTOUCH_TYPE_NONE \/\/ #######################################################  \/\/ ####################################################################### \/\/ Default display width (smaller dimension) and height (larger dimension) \/\/ ####################################################################### #define DEFAULT_TFT_DISPLAY_WIDTH  128 #define DEFAULT_TFT_DISPLAY_HEIGHT 160 \/\/ #######################################################################  #define DEFAULT_GAMMA_CURVE 0 #define DEFAULT_SPI_CLOCK   32000000 #define DEFAULT_DISP_TYPE   DISP_TYPE_ST7735B \/\/----------------------------------------------------------------------------  #define TFT_INVERT_ROTATION         0 #define TFT_INVERT_ROTATION1        1 #define TFT_INVERT_ROTATION2        0  <\/code><\/pre>\n<p>  \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442 <a href=\"https:\/\/github.com\/espressif\/esp-idf\">Espressif<\/a>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <a href=\"https:\/\/docs.espressif.com\/projects\/esp-idf\/en\/latest\/get-started\/index.html#get-started-get-esp-idf\">\u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c<\/a>.<\/p>\n<p>  \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/github.com\/loboris\/ESP32_TFT_library\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443<\/a>. \u041d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u0434\u0432\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<p>  Makefile:<\/p>\n<pre><code class=\"bash\">+ CFLAGS += -Wno-error=tautological-compare \\ +         -Wno-implicit-fallthrough \\ +\t\t  -Wno-implicit-function-declaration <\/code><\/pre>\n<p>  components\/tft\/tftspi.c:<\/p>\n<pre><code class=\"cpp\">+ #include \"driver\/gpio.h <\/code><\/pre>\n<p>  \u2192\u00a0<a href=\"https:\/\/github.com\/zoon81\/ESP32_TFT_library\/commit\/0ee6fd16d20f2a52e6ae2fa769485205a4afd69f\">\u041f\u0430\u0442\u0447<\/a><\/p>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/github.com\/espressif\/esp32-camera\">ESP32 Camera Driver<\/a>.<\/p>\n<p>  \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c:<\/p>\n<p>  #. $HOME\/esp\/esp-idf\/export.sh<br \/>  #idf.py menuconfig<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yc\/yl\/ml\/ycylmlzznbfewlweiaris71dbzo.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_3\/gn\/5s\/_3gn5s4bmrqunmhwjeabdtxe9yu.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/x8\/jc\/g6\/x8jcg6ia43npfcol7rebn1taz7e.png\"><\/div>\n<p>  \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043b\u044f USB \u043f\u043e\u0440\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430:<\/p>\n<p>  #sudo chmod 777 \/dev\/ttyUSB0<\/p>\n<p>  \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438 \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c:<\/p>\n<p>  #make -j4 &amp;&amp; make flash<\/p>\n<p>  12FPS \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0447\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 send_data. \u0417\u0430\u043f\u0438\u0441\u044c \u0438\u0434\u0435\u0442 \u043d\u0435 \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e, \u0430 \u0446\u0435\u043b\u043e\u0439 \u043b\u0438\u043d\u0438\u0435\u0439 \u0440\u0430\u0432\u043d\u043e\u0439 \u0448\u0438\u0440\u0438\u043d\u0435 \u044d\u043a\u0440\u0430\u043d\u0430:<\/p>\n<pre><code class=\"cpp\">esp_err_t camera_capture(){     uint32_t tstart, t1, t2; \ttstart = clock();     \/\/acquire a frame     camera_fb_t * fb = esp_camera_fb_get();     if (!fb) {         printf(\"Camera Capture Failed\\n\");         return ESP_FAIL;     }     t1 = clock() - tstart;     printf(\"Capture camera time: %u ms\\r\\n\", t1);      int i = 0, bufPos = 0;      uint8_t hb, lb;     color_t color;     color_t *color_line = heap_caps_malloc(_width*3, MALLOC_CAP_DMA);      tstart = clock();      for(int y = 0; y &lt; _height; y++)     {   \t bufPos = 0;         for(int x = 0; x &lt; _width; x++)         {             i = (y * FRAME_WIDTH + x) &lt;&lt; 1;              hb = fb-&gt;buf[i] ;             lb = fb-&gt;buf[i + 1];                    color.r = (lb &amp; 0x1F) &lt;&lt; 3;             color.g = (hb &amp; 0x07) &lt;&lt; 5 | (lb &amp; 0xE0) &gt;&gt; 3;             color.b =  hb &amp; 0xF8;              color_line[bufPos] = color;             bufPos++; \/\/         TFT_drawPixel(0, 0, color, 1);        }        disp_select();        send_data(0, y, _width-1, y, _width, color_line);        wait_trans_finish(1);        disp_deselect();     }      free(color_line);      t1 = clock() - tstart;     printf(\"Send buffer time: %u ms\\r\\n\", t1);     esp_camera_fb_return(fb);     printf(\"Capture frame ok.\\n\");     return ESP_OK; } <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">\/\/ #if defined(CAMERA_MODEL_AI_THINKER) #define PWDN_GPIO_NUM     32 #define RESET_GPIO_NUM    -1 #define XCLK_GPIO_NUM      0 #define SIOD_GPIO_NUM     26 #define SIOC_GPIO_NUM     27  #define Y9_GPIO_NUM       35 #define Y8_GPIO_NUM       34 #define Y7_GPIO_NUM       39 #define Y6_GPIO_NUM       36 #define Y5_GPIO_NUM       21 #define Y4_GPIO_NUM       19 #define Y3_GPIO_NUM       18 #define Y2_GPIO_NUM        5 #define VSYNC_GPIO_NUM    25 #define HREF_GPIO_NUM     23 #define PCLK_GPIO_NUM     22  void camera_init_(){   camera_config_t config;   config.ledc_channel = LEDC_CHANNEL_0;   config.ledc_timer = LEDC_TIMER_0;   config.pin_d0 = Y2_GPIO_NUM;   config.pin_d1 = Y3_GPIO_NUM;   config.pin_d2 = Y4_GPIO_NUM;   config.pin_d3 = Y5_GPIO_NUM;   config.pin_d4 = Y6_GPIO_NUM;   config.pin_d5 = Y7_GPIO_NUM;   config.pin_d6 = Y8_GPIO_NUM;   config.pin_d7 = Y9_GPIO_NUM;   config.pin_xclk = XCLK_GPIO_NUM;   config.pin_pclk = PCLK_GPIO_NUM;   config.pin_vsync = VSYNC_GPIO_NUM;   config.pin_href = HREF_GPIO_NUM;   config.pin_sscb_sda = SIOD_GPIO_NUM;   config.pin_sscb_scl = SIOC_GPIO_NUM;   config.pin_pwdn = PWDN_GPIO_NUM;   config.pin_reset = RESET_GPIO_NUM;   config.xclk_freq_hz = 20000000;   config.fb_count = 2;  \/\/ for display   config.frame_size = FRAMESIZE_QVGA;   config.pixel_format = PIXFORMAT_RGB565;   \/\/ camera init   esp_err_t err = esp_camera_init(&amp;config);   if (err != ESP_OK) {     printf(\"Camera init failed with error 0x%x\", err);     return;   }    printf(\"Camera init OK\\n\"); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u2192 <a href=\"https:\/\/gist.github.com\/app-z\/f5f8ddd9939adfd51912277db5251714\">Gist<\/a><\/p>\n<p>  <u>FRAME_WIDTH \u2014 \u044d\u0442\u043e \u0448\u0438\u0440\u0438\u043d\u0430 \u043a\u0430\u0434\u0440\u0430 320 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0434\u043b\u044f QVGA<\/u><\/p>\n<pre><code class=\"cpp\">config.frame_size = FRAMESIZE_QVGA; \/\/ 320x240 <\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0435 \u043e\u043a\u043d\u043e 128*160 \u043e\u0442 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430<\/p>\n<p>  <i>Log \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441 \u043e\u0434\u043d\u0438\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u043c\u0435\u0440\u044b (config.fb_count=1)<br \/>  Capture camera time: 32 ms<br \/>  Send buffer time: 47 ms<br \/>  Capture frame ok.<\/i><\/p>\n<p>  <b>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<br \/>  1000 \/ (32 + 47) = 12.65 FPS<\/b><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Log \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441 \u0434\u0432\u0443\u043c\u044f \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u043c\u0435\u0440\u044b (config.fb_count=2)<\/b><\/p>\n<div class=\"spoiler_text\">Capture camera time: 39 ms<\/p>\n<p>  Send buffer time: 63 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 59 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 34 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 40 ms<\/p>\n<p>  Send buffer time: 64 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 59 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 34 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 40 ms<\/p>\n<p>  Send buffer time: 63 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 60 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 34 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 39 ms<\/p>\n<p>  Send buffer time: 63 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 60 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 1 ms<\/p>\n<p>  Send buffer time: 34 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 40 ms<\/p>\n<p>  Send buffer time: 63 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 60 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 34 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 40 ms<\/p>\n<p>  Send buffer time: 63 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 59 ms<\/p>\n<p>  Capture frame ok.<br \/>  Capture camera time: 0 ms<\/p>\n<p>  Send buffer time: 35 ms<\/p>\n<p>  Capture frame ok.<\/p><\/div>\n<\/div>\n<p>  \u0417\u0430 \u0441\u0447\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u043c\u0435\u0440\u044b, \u0431\u0443\u0444\u0435\u0440 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e. \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u043d\u043e \u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u00ab\u043d\u0430\u0431\u0435\u0433\u0430\u0435\u0442\u00bb. \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u0435\u0436\u0434\u0443 \u0446\u0438\u043a\u043b\u0430\u043c\u0438 \u043f\u043b\u0430\u0432\u0430\u0435\u0442.<\/p>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u044f \u043f\u043e\u0439\u043c\u0430\u043b \u0432 \u043b\u043e\u0433\u0430\u0445 \u00abBrownout detector was triggered\u00bb \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b detector. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u0438\u0442\u0430\u043b \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u043e\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 3.3V ESP32-CAM<\/p>\n<pre><code class=\"cpp\">#include \"soc\/rtc_cntl_reg.h\" ... WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); \/\/disable brownout detector <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  ESP32 \u043d\u0435\u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c. \u041a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u043e\u0432 \u0432 CAM \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u043b\u0430\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044e CAM \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u0430 \u043a\u0430\u043c\u0435\u0440\u0430.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\"><a href=\"https:\/\/randomnerdtutorials.com\/esp32-troubleshooting-guide\/\">randomnerdtutorials.com\/esp32-troubleshooting-guide<\/a><br \/>  <a href=\"https:\/\/www.instructables.com\/id\/Select-Color-Display-for-ESP32\">www.instructables.com\/id\/Select-Color-Display-for-ESP32<\/a><br \/>  <a href=\"https:\/\/github.com\/gnulabis\/UTFT-ESP\">github.com\/gnulabis\/UTFT-ESP<\/a><br \/>  <a href=\"https:\/\/github.com\/Bodmer\/TFT_eSPI\">github.com\/Bodmer\/TFT_eSPI<\/a><\/div>\n<\/div>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <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\/post\/463157\/\"> https:\/\/habr.com\/ru\/post\/463157\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">ESP-32 CAM \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u043e\u0442 <a href=\"https:\/\/www.diymore.cc\/products\/esp32-cam-wifi-wireless-module-esp32-serial-to-wifi-esp32-cam-spi-flash-bluetooth-development-board-with-ov2640-camera-module\">Diymore<\/a>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fe\/it\/oc\/feitoc3nxkss7zc6ocsw7cmuyho.jpeg\" width=\"500\"><\/div>\n<p>  <\/p>\n<h3>ESP32-CAM Video Streaming Server<\/h3>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/randomnerdtutorials.com\/esp32-cam-video-streaming-face-recognition-arduino-ide\/\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>  \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0434\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438: <a href=\"https:\/\/randomnerdtutorials.com\/installing-the-esp32-board-in-arduino-ide-windows-instructions\/\">Esp32 board in Arduino Ide Windows<\/a> \/ <a href=\"https:\/\/randomnerdtutorials.com\/installing-the-esp32-board-in-arduino-ide-mac-and-linux-instructions\/\">Esp32 board in Arduino Ide Linux and Mac<\/a> <\/p>\n<p>  \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0435\u0441\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043c\u043e\u0434\u0443\u043b\u044c AI-THINKER \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b <br \/>  #define CAMERA_MODEL_AI_THINKER<\/p>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446. \u041a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u044b\u043b \u043f\u043e\u043b\u0435\u0437\u0435\u043d.  <\/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-293395","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/293395","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=293395"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/293395\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=293395"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=293395"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=293395"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}