{"id":364566,"date":"2024-05-21T02:19:28","date_gmt":"2024-05-21T02:19:28","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=364566"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T02:19:28","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=364566","title":{"rendered":"<span>ESPspectrum \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0432\u043e\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0440\u043e\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c ESPspectrum <a href=\"https:\/\/habr.com\/ru\/articles\/783778\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/articles\/783778\/<\/a>. \u0412 \u044d\u0442\u043e\u0439 \u043a\u0430\u043a \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b ( \u0442.\u0435. \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 ESPspectrum ).<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e SPIFFS. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 SD \u043a\u0430\u0440\u0442\u044b( \u0443\u0436\u0435 \u0437\u0430\u043a\u0430\u0437\u0430\u043b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 ) .<\/p>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0445\u043e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u0435\u0439, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438 \u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0439.<\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0441\u043a\u0435\u0442\u0447\u0430<\/h2>\n<p>\u0412 \u043d\u0435\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.  <\/p>\n<pre><code class=\"cpp\">void menuOC(); void freereadKeyboard(); void kalculator(); \/\/files void file_mode(); void file_read(); String filename(); String write_data(); void file_del(); void file_create(); \/\/games void snake_game(); \/\/\u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 void game_menu(); \/*==============================================*\/ #define CLOCK 16 \/\/D- #define DATA 17  \/\/D+  const char keymap[] = {   0, 0,  0,  0,  0,  0,  0,  0,   0, 0,  0,  0,  0,  0, '`', 0,   0, 0 , 0 , 0,  0, 'q', '1', 0,   0, 0, 'z', 's', 'a', 'w', '2', 0,   0, 'c', 'x', 'd', 'e', '4', '3', 0,   0, ' ', 'v', 'f', 't', 'r', '5', 0,   0, 'n', 'b', 'h', 'g', 'y', '6', 0,   0, 0, 'm', 'j', 'u', '7', '8', 0,   0, ',', 'k', 'i', 'o', '0', '9', 0,   0, '.', '\/', 'l', ';', 'p', '-', 0,   0, 0, '\\'', 0, '[', '=', 0, 0,   0, 0, 13, ']', 0, '\\\\', 0, 0,   0, 0, 0, 0, 0, 0, 127, 0,   0, '1', 0, '4', '7', 0, 0, 0,   '0', '.', '2', '5', '6', '8', 0, 0,   0, '+', '3', '-', '*', '9', 0, 0,   0, 0, 0, 0 };  int  lastscan; String txt_keys;  \/*==============================================*\/ #include &lt;ESP32Lib.h> #include &lt;Ressources\/Font6x8.h> #include &lt;Ressources\/CodePage437_8x8.h> #include &lt;Ressources\/CodePage437_8x14.h> #include &lt;Ressources\/CodePage437_8x16.h>  \/\/ \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440\u044b \u043d\u0430 R G B!!!!!!  \/\/pin configuration const int redPin = 33; const int greenPin = 14; const int bluePin = 12; const int hsyncPin = 2; const int vsyncPin = 4;  \/\/VGA Device VGA3Bit vga;  \/*==============================================*\/ #include \"FS.h\" #include \"SPIFFS.h\"  \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u00abFile\u00bb \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c: File myFile; \/*==============================================*\/ void setup() {   Serial.begin(115200);   \/\/initializing vga at the specified pins   pinMode(CLOCK, INPUT_PULLUP); \/\/\u043f\u0438\u043d\u044b \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b   pinMode(DATA, INPUT_PULLUP);    vga.init(vga.MODE320x240, redPin, greenPin, bluePin, hsyncPin, vsyncPin);    vga.setFont(CodePage437_8x16);   vga.setCursor(2, 5);   vga.println(\"Starting...\");   vga.setCursor(2, 25);   vga.println(\"ESPspectrum V1\");   vga.setFont(CodePage437_8x14);   vga.setCursor(2, 100);   vga.println(\"created on 2023\");   delay(5000);   vga.clear(vga.RGB(0, 0, 0));   delay(1000);   vga.setCursor(0, 0);        if(!SPIFFS.begin(true)){  \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \/ \"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 SPIFFS\"     Serial.println(\"Error while mounting SPIFFS\"); vga.println(\"Error while mounting SPIFFS\");      delay(2000); vga.clear(vga.RGB(0, 0, 0)); vga.setCursor(0, 0); return; }      }  int menu = 0; void loop() {   menuOC(); Serial.println(txt_keys); }<\/code><\/pre>\n<h2>\u041c\u0435\u043d\u044e OC<\/h2>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043c\u0435\u043d\u044e: \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440, \u0438\u0433\u0440\u043e\u0432\u043e\u0435 \u043c\u0435\u043d\u044e, \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u043c\u0435\u043d\u044e \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0447\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448 1 &#8212; 5.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438. <\/p>\n<pre><code class=\"cpp\"> void menuOC(){    vga.setCursor(2, 2);    vga.println(\"1 - Work with files\");       vga.println(\"2 - Calculator\");      vga.println(\"3 - Free printing\");    vga.println(\"4 - View the commands\");    vga.println(\"5 - Games\"); \/*==================================================*\/   int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0x5A and scanval != 0xE0)     {    txt_keys = txt_keys + keymap[scanval];       Serial.println(keymap[scanval]);      }        \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432              if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}                     if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); menu = 0;}           if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0;}           if(scanval == 0x16){menu = 1;}           if(scanval == 0x1E){menu = 2;}           if(scanval == 0x26){menu = 3;}           if(scanval == 0x25){menu = 4;}           if(scanval == 0x2E){menu = 5;}          \/\/\u0435\u0441\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 == \"\" \u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u043d\u044e \u0440\u0430\u0432\u043d\u0430 \"\"   }   lastscan = scanval; \/*========================================================*\/         if(menu == 0){ txt_keys = \"\"; }    \/\/\u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u043d\u044e \u0440\u0430\u0432\u043d\u0430 \"\" \u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \"\"    if(menu == 1){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_mode();}    if(menu == 2){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); kalculator();}    if(menu == 3){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); freereadKeyboard(); }    if(menu == 4)    {     txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);      vga.print(\"instructions for use can be found in the README file\");  \/\/\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 README     delay(5000); vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);     }                                                                                                                                                                                                                                                                                                                                                                                                                             if(menu == 5){ txt_keys = \"\";vga.clear(vga.RGB(0,0,0));  game_menu();}        Serial.print(\"menu = \");Serial.println(menu);    }      <\/code><\/pre>\n<h2>\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0447\u0430\u0442\u044c<\/h2>\n<p>\u0420\u0435\u0436\u0438\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0437\u043d\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443<\/p>\n<pre><code class=\"cpp\">\/*==================================*\/ void freereadKeyboard(){    while(true){      int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0x5A and scanval != 0xE0)     {    txt_keys = txt_keys + keymap[scanval];       Serial.println(keymap[scanval]);    vga.print(keymap[scanval]);      }        \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432              if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}                     if(scanval == 0x5A){vga.println(\"\"); }           if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}          }   lastscan = scanval;  }  }<\/code><\/pre>\n<h2>\u041a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440<\/h2>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f, \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f(123,22225 = 123,22 ?)<\/p>\n<pre><code class=\"cpp\">void kalculator() {   String sing = \"=\"; String s1 = \"\"; String s2 = \"\";    int s12 = 1;  vga.println(\"Calculator\");    \/*==================================================*\/  while(true){       int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0xE0){      if( keymap[scanval] == '='){sing = \"=\";}   if( keymap[scanval] == '+'){sing = \"+\";}   if( keymap[scanval] == '-'){sing = \"-\";}   if( keymap[scanval] == '*'){sing = \"*\";}    if( keymap[scanval] == '\/'){sing = \"\/\";}      if( keymap[scanval] == '=' or keymap[scanval] == '+' or keymap[scanval] == '-' or keymap[scanval] == '*' or keymap[scanval] == '\/' or scanval == 0x5A ){     if(s12 == 1){ s1 = txt_keys; txt_keys = \"\"; s12 = 2;}     else{s2 = txt_keys; txt_keys = \"\"; s12 = 1;}      }   else{txt_keys = txt_keys + keymap[scanval];}    if(scanval != 0xE0 and scanval != 0x5A){ Serial.println(keymap[scanval]); vga.print(keymap[scanval]); }      }             \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432              if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); vga.println(\"Kalculator\"); s1 = \"\"; s2 = \"\"; txt_keys = \"\";}             \/\/\u043e\u0442\u0432\u0435\u0442                   if(scanval == 0x5A){vga.println(\"\");             if(sing == \"=\"){vga.println(s1.toFloat()  == s2.toFloat());}             if(sing == \"+\"){vga.println(s1.toFloat() + s2.toFloat() );}             if(sing == \"-\"){vga.println(s1.toFloat() - s2.toFloat() );}             if(sing == \"*\"){vga.println(s1.toFloat() * s2.toFloat() );}             if(sing == \"\/\"){vga.println(s1.toFloat() \/ s2.toFloat() );}               s1 = \"\"; s2 = \"\"; txt_keys = \"\";                              }           if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}   }   lastscan = scanval; \/*========================================================*\/     Serial.print(\"s1 = \");Serial.println(s1);  Serial.print(\"s2 = \");Serial.println(s2);  }  }<\/code><\/pre>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0435 \u043c\u0435\u043d\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438: \u0447\u0442\u0435\u043d\u0438\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\/\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u043d\u0430\u0434\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f( \u043f\u0440\u0438\u043c\u0435\u0440 test1). \u0414\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u0436\u0435 \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e \u043c\u0438\u043c\u043e \u0432\u0432\u043e\u0434\u0430 \u0438\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b\u0430  \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. <\/p>\n<pre><code class=\"cpp\">String write_data(){   String str = \" &lt;no data> \";    while(true){     int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0x5A and scanval != 0xE0)     {    txt_keys = txt_keys + keymap[scanval];       Serial.println(keymap[scanval]);    vga.print(keymap[scanval]);      }        \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432              if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);  txt_keys = \"\"; }                                if(scanval == 0x5A){             str = txt_keys;              vga.setCursor(0, 0);              vga.clear(vga.RGB(0,0,0));              txt_keys = \"\";              return(str);             }                      if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);  txt_keys = \"\"; }          }   lastscan = scanval;  } }   String filename(){   String str; while(true){     int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0x5A and scanval != 0xE0)     {    txt_keys = txt_keys + keymap[scanval];       Serial.println(keymap[scanval]);    vga.print(keymap[scanval]);      }        \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432              if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);  txt_keys = \"\"; str = \"\";}                                if(scanval == 0x5A){             str = \"\/\" + txt_keys + \".txt\";              vga.setCursor(0, 0);              vga.clear(vga.RGB(0,0,0));              txt_keys = \"\";               return(str);             }                      if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);  txt_keys = \"\"; str = \"\";}          }   lastscan = scanval;  }    } \/*==================== mode =========================*\/ void file_mode(){   int filemode = 0;    while(true){        vga.setCursor(2, 2);    vga.println(\"1 - Read\");         vga.println(\"2 - Create new \/ owerwrite\");    vga.println(\"3 - Delete\");     int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0x5A and scanval != 0xE0){ txt_keys = txt_keys + keymap[scanval]; Serial.println(keymap[scanval]);}             \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438                   if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}                     if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); filemode = 0;}           if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}           if(scanval == 0x16){filemode = 1;}           if(scanval == 0x1E){filemode = 2;}           if(scanval == 0x26){filemode = 3;}           if(scanval == 0x25){filemode = 4;}           if(scanval == 0x2E){filemode = 5;}   }   lastscan = scanval;         if(filemode == 1){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_read(); }    if(filemode == 2){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_create();}    if(filemode == 3){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_del(); }            Serial.print(\"filemode = \");Serial.println(filemode); }    }    \/*===================== read files ==========================*\/  void file_read() \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430: { int del = 20;   char inByte  = 0; String n = filename();     myFile = SPIFFS.open(n, FILE_READ);        vga.print(\"File size:\");     vga.println(myFile.size()); delay(1000); vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); \/\/size    if(myFile.size() == 0){vga.print(\"an error is likely, press end\"); }           while(myFile.available()) {       inByte = (char)myFile.read();      vga.print((char)inByte); \/\/ ascii converter    delay(del);   }     delay(500);  while(true){    int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)   {           if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}   }   lastscan = scanval;   delay(100);  }    myFile.close();   vga.clear(vga.RGB(0,0,0));   vga.setCursor(0, 0); } \/*================= delete =====================================*\/ void file_del() {   String n = filename();        if(SPIFFS.remove(n)){     Serial.println(\"File successfully deleted\");     vga.println(\"File successfully deleted\");             }   else{     Serial.print(\"Deleting file failed!\");     vga.print(\"Deleting file failed!\");              \/\/  \"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u0430\u0439\u043b!\"   }   delay(2000);       vga.clear(vga.RGB(0,0,0));   vga.setCursor(0, 0); }  \/*================= create =====================================*\/ void file_create() {   String n = filename();       String dataf = write_data();      myFile = SPIFFS.open(n, FILE_WRITE);      if (myFile.print(dataf))   {                    Serial.println(\"Message successfully written\");       vga.print(\"Message successfully written\");              }   else{Serial.print(\"Writing message failed!!\"); vga.print(\"Writing message failed!!\");}   delay(2500);   myFile.close();      vga.clear(vga.RGB(0,0,0));   vga.setCursor(0, 0); }  <\/code><\/pre>\n<h2>\u0418\u0433\u0440\u044b<\/h2>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435, \u043d\u043e \u043e\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442 \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u043e. \u041a\u0430\u043a \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0438\u0433\u0440\u0443 \u043d\u0430 \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u044f \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u043b \u0437\u043c\u0435\u0439\u043a\u0443.<\/p>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u0430  &#8212; #include &#171;games\/SnakeGame.h&#187;<\/p>\n<p>\u0412 \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0438\u0433\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 Documents\\Arduino\\ESPspectrum\\ESPspectrum_V1\\games. \u0422\u0443\u0434\u0430 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0433\u0440\u0430.<\/p>\n<pre><code class=\"cpp\">#include \"games\/SnakeGame.h\" \/\/#include \"games\/'\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u044b'.h\" void game_menu() {   int gamemode = 0;    while(true){        vga.setCursor(2, 2);    vga.println(\"1 - Snake\");         vga.println(\"2 - Add\");    \/\/\u043f\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u0438\u0433\u0440     int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0x5A and scanval != 0xE0){ txt_keys = txt_keys + keymap[scanval]; Serial.println(keymap[scanval]);}             \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438                   if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}                     if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); gamemode = 0;}           if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}           if(scanval == 0x16){gamemode = 1;}           if(scanval == 0x1E){gamemode = 2;}           if(scanval == 0x26){gamemode = 3;}           if(scanval == 0x25){gamemode = 4;}           if(scanval == 0x2E){gamemode = 5;}   }   lastscan = scanval;     \/\/\u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f = \"\" \u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0438\u0433\u0440\u0443 \"\"    if(gamemode == 1){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); snake_game(); }             Serial.print(\"gamemode = \");Serial.println(gamemode); }    }<\/code><\/pre>\n<h2>USB <\/h2>\n<p>\u042f \u043d\u0430\u0448\u0435\u043b \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c USB \u0430 \u043d\u0435 PC\/2 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b. \u041a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a<\/p>\n<pre><code class=\"cpp\">#define CLOCK 16 \/\/D- #define DATA 17  \/\/D+   const char keymap[] = {   0, 0,  0,  0,  0,  0,  0,  0,   0, 0,  0,  0,  0,  0, '`', 0,   0, 0 , 0 , 0,  0, 'q','1', 0,   0, 0, 'z','s','a','w','2', 0,   0,'c','x','d','e','4','3', 0,   0,' ','v','f','t','r','5', 0,   0,'n','b','h','g','y','6', 0,   0, 0, 'm','j','u','7','8', 0,   0,',','k','i','o','0','9', 0,   0,'.','\/','l',';','p','-', 0,   0, 0,'\\'', 0,'[', '=', 0, 0,   0, 0,13, ']', 0, '\\\\', 0, 0,   0, 0, 0, 0, 0, 0, 127, 0,   0,'1', 0,'4','7', 0, 0, 0,   '0','.','2','5','6','8', 0, 0,   0,'+','3','-','*','9', 0, 0,   0, 0, 0, 0 };    void setup() {   Serial.begin(115200);   pinMode(CLOCK, INPUT_PULLUP); \/\/\u043f\u0438\u043d\u044b \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b   pinMode(DATA, INPUT_PULLUP);  }  uint8_t lastscan; uint8_t line = 0, col = 0;   void loop() {    uint16_t scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {    Serial.println(keymap[scanval]);          }   lastscan = scanval;    }<\/code><\/pre>\n<p>\u0421\u0430\u043c\u044b\u043c \u043b\u0443\u0447\u0448\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 &#8212;  \u044d\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043b\u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u043c\u043d\u043e\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0434\u0438\u0441\u043a\u043e\u0440\u0434. \u0410 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. <\/p>\n<p>\u0410\u0440\u0445\u0438\u0432 \u0441 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439 \u0438 \u0441\u0445\u0435\u043c\u043e\u0439:\u00a0<a href=\"https:\/\/disk.yandex.ru\/d\/22eXr-gerhFaXA\" rel=\"noopener noreferrer nofollow\">https:\/\/disk.yandex.ru\/d\/22eXr-gerhFaXA<\/a><\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 esp32\u00a0<a href=\"https:\/\/www.alexcube.ru\/blog\/2021\/11\/53-dnya-do-2022-goda-zx-spectrum-iz-arduino\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.alexcube.ru\/blog\/2021\/11\/53-dnya-do-2022-goda-zx-spectrum-iz-arduino\/<\/a><\/p>\n<hr\/>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441\u044b, \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0443:\u00a0<a href=\"https:\/\/discord.gg\/nd6K7sbR\" rel=\"noopener noreferrer nofollow\">https:\/\/discord.gg\/nd6K7sbR<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/784538\/\"> https:\/\/habr.com\/ru\/articles\/784538\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0432\u043e\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0440\u043e\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c ESPspectrum <a href=\"https:\/\/habr.com\/ru\/articles\/783778\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/articles\/783778\/<\/a>. \u0412 \u044d\u0442\u043e\u0439 \u043a\u0430\u043a \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b ( \u0442.\u0435. \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 ESPspectrum ).<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e SPIFFS. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 SD \u043a\u0430\u0440\u0442\u044b( \u0443\u0436\u0435 \u0437\u0430\u043a\u0430\u0437\u0430\u043b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 ) .<\/p>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0445\u043e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u0435\u0439, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438 \u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0439.<\/p>\n<h2>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0441\u043a\u0435\u0442\u0447\u0430<\/h2>\n<p>\u0412 \u043d\u0435\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.  <\/p>\n<pre><code class=\"cpp\">void menuOC(); void freereadKeyboard(); void kalculator(); \/\/files void file_mode(); void file_read(); String filename(); String write_data(); void file_del(); void file_create(); \/\/games void snake_game(); \/\/\u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 void game_menu(); \/*==============================================*\/ #define CLOCK 16 \/\/D- #define DATA 17  \/\/D+  const char keymap[] = {   0, 0,  0,  0,  0,  0,  0,  0,   0, 0,  0,  0,  0,  0, '`', 0,   0, 0 , 0 , 0,  0, 'q', '1', 0,   0, 0, 'z', 's', 'a', 'w', '2', 0,   0, 'c', 'x', 'd', 'e', '4', '3', 0,   0, ' ', 'v', 'f', 't', 'r', '5', 0,   0, 'n', 'b', 'h', 'g', 'y', '6', 0,   0, 0, 'm', 'j', 'u', '7', '8', 0,   0, ',', 'k', 'i', 'o', '0', '9', 0,   0, '.', '\/', 'l', ';', 'p', '-', 0,   0, 0, '\\'', 0, '[', '=', 0, 0,   0, 0, 13, ']', 0, '\\\\', 0, 0,   0, 0, 0, 0, 0, 0, 127, 0,   0, '1', 0, '4', '7', 0, 0, 0,   '0', '.', '2', '5', '6', '8', 0, 0,   0, '+', '3', '-', '*', '9', 0, 0,   0, 0, 0, 0 };  int  lastscan; String txt_keys;  \/*==============================================*\/ #include &lt;ESP32Lib.h> #include &lt;Ressources\/Font6x8.h> #include &lt;Ressources\/CodePage437_8x8.h> #include &lt;Ressources\/CodePage437_8x14.h> #include &lt;Ressources\/CodePage437_8x16.h>  \/\/ \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440\u044b \u043d\u0430 R G B!!!!!!  \/\/pin configuration const int redPin = 33; const int greenPin = 14; const int bluePin = 12; const int hsyncPin = 2; const int vsyncPin = 4;  \/\/VGA Device VGA3Bit vga;  \/*==============================================*\/ #include \"FS.h\" #include \"SPIFFS.h\"  \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u00abFile\u00bb \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c: File myFile; \/*==============================================*\/ void setup() {   Serial.begin(115200);   \/\/initializing vga at the specified pins   pinMode(CLOCK, INPUT_PULLUP); \/\/\u043f\u0438\u043d\u044b \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b   pinMode(DATA, INPUT_PULLUP);    vga.init(vga.MODE320x240, redPin, greenPin, bluePin, hsyncPin, vsyncPin);    vga.setFont(CodePage437_8x16);   vga.setCursor(2, 5);   vga.println(\"Starting...\");   vga.setCursor(2, 25);   vga.println(\"ESPspectrum V1\");   vga.setFont(CodePage437_8x14);   vga.setCursor(2, 100);   vga.println(\"created on 2023\");   delay(5000);   vga.clear(vga.RGB(0, 0, 0));   delay(1000);   vga.setCursor(0, 0);        if(!SPIFFS.begin(true)){  \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \/ \"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 SPIFFS\"     Serial.println(\"Error while mounting SPIFFS\"); vga.println(\"Error while mounting SPIFFS\");      delay(2000); vga.clear(vga.RGB(0, 0, 0)); vga.setCursor(0, 0); return; }      }  int menu = 0; void loop() {   menuOC(); Serial.println(txt_keys); }<\/code><\/pre>\n<h2>\u041c\u0435\u043d\u044e OC<\/h2>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043c\u0435\u043d\u044e: \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440, \u0438\u0433\u0440\u043e\u0432\u043e\u0435 \u043c\u0435\u043d\u044e, \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u043c\u0435\u043d\u044e \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0447\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448 1 &#8212; 5.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438. <\/p>\n<pre><code class=\"cpp\"> void menuOC(){    vga.setCursor(2, 2);    vga.println(\"1 - Work with files\");       vga.println(\"2 - Calculator\");      vga.println(\"3 - Free printing\");    vga.println(\"4 - View the commands\");    vga.println(\"5 - Games\"); \/*==================================================*\/   int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0x5A and scanval != 0xE0)     {    txt_keys = txt_keys + keymap[scanval];       Serial.println(keymap[scanval]);      }        \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432              if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}                     if(scanval == 0x5A){vga.clear(vga.RGB(0,0,0)); menu = 0;}           if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0;}           if(scanval == 0x16){menu = 1;}           if(scanval == 0x1E){menu = 2;}           if(scanval == 0x26){menu = 3;}           if(scanval == 0x25){menu = 4;}           if(scanval == 0x2E){menu = 5;}          \/\/\u0435\u0441\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 == \"\" \u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u043d\u044e \u0440\u0430\u0432\u043d\u0430 \"\"   }   lastscan = scanval; \/*========================================================*\/         if(menu == 0){ txt_keys = \"\"; }    \/\/\u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u043d\u044e \u0440\u0430\u0432\u043d\u0430 \"\" \u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \"\"    if(menu == 1){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); file_mode();}    if(menu == 2){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); kalculator();}    if(menu == 3){ txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); freereadKeyboard(); }    if(menu == 4)    {     txt_keys = \"\"; vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);      vga.print(\"instructions for use can be found in the README file\");  \/\/\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 README     delay(5000); vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);     }                                                                                                                                                                                                                                                                                                                                                                                                                             if(menu == 5){ txt_keys = \"\";vga.clear(vga.RGB(0,0,0));  game_menu();}        Serial.print(\"menu = \");Serial.println(menu);    }      <\/code><\/pre>\n<h2>\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0447\u0430\u0442\u044c<\/h2>\n<p>\u0420\u0435\u0436\u0438\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0437\u043d\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443<\/p>\n<pre><code class=\"cpp\">\/*==================================*\/ void freereadKeyboard(){    while(true){      int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0x5A and scanval != 0xE0)     {    txt_keys = txt_keys + keymap[scanval];       Serial.println(keymap[scanval]);    vga.print(keymap[scanval]);      }        \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432              if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0);}                     if(scanval == 0x5A){vga.println(\"\"); }           if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}          }   lastscan = scanval;  }  }<\/code><\/pre>\n<h2>\u041a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440<\/h2>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f, \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f(123,22225 = 123,22 ?)<\/p>\n<pre><code class=\"cpp\">void kalculator() {   String sing = \"=\"; String s1 = \"\"; String s2 = \"\";    int s12 = 1;  vga.println(\"Calculator\");    \/*==================================================*\/  while(true){       int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval != 0xE0){      if( keymap[scanval] == '='){sing = \"=\";}   if( keymap[scanval] == '+'){sing = \"+\";}   if( keymap[scanval] == '-'){sing = \"-\";}   if( keymap[scanval] == '*'){sing = \"*\";}    if( keymap[scanval] == '\/'){sing = \"\/\";}      if( keymap[scanval] == '=' or keymap[scanval] == '+' or keymap[scanval] == '-' or keymap[scanval] == '*' or keymap[scanval] == '\/' or scanval == 0x5A ){     if(s12 == 1){ s1 = txt_keys; txt_keys = \"\"; s12 = 2;}     else{s2 = txt_keys; txt_keys = \"\"; s12 = 1;}      }   else{txt_keys = txt_keys + keymap[scanval];}    if(scanval != 0xE0 and scanval != 0x5A){ Serial.println(keymap[scanval]); vga.print(keymap[scanval]); }      }             \/\/\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432              if(scanval == 0x76){vga.clear(vga.RGB(0,0,0)); vga.setCursor(0, 0); vga.println(\"Kalculator\"); s1 = \"\"; s2 = \"\"; txt_keys = \"\";}             \/\/\u043e\u0442\u0432\u0435\u0442                   if(scanval == 0x5A){vga.println(\"\");             if(sing == \"=\"){vga.println(s1.toFloat()  == s2.toFloat());}             if(sing == \"+\"){vga.println(s1.toFloat() + s2.toFloat() );}             if(sing == \"-\"){vga.println(s1.toFloat() - s2.toFloat() );}             if(sing == \"*\"){vga.println(s1.toFloat() * s2.toFloat() );}             if(sing == \"\/\"){vga.println(s1.toFloat() \/ s2.toFloat() );}               s1 = \"\"; s2 = \"\"; txt_keys = \"\";                              }           if(scanval == 0xE0){vga.clear(vga.RGB(0,0,0)); menu = 0; return;}   }   lastscan = scanval; \/*========================================================*\/     Serial.print(\"s1 = \");Serial.println(s1);  Serial.print(\"s2 = \");Serial.println(s2);  }  }<\/code><\/pre>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0435 \u043c\u0435\u043d\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438: \u0447\u0442\u0435\u043d\u0438\u0435, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\/\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u043d\u0430\u0434\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f( \u043f\u0440\u0438\u043c\u0435\u0440 test1). \u0414\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u0436\u0435 \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e \u043c\u0438\u043c\u043e \u0432\u0432\u043e\u0434\u0430 \u0438\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b\u0430  \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. <\/p>\n<pre><code class=\"cpp\">String write_data(){   String str = \" &lt;no data> \";    while(true){     int scanval = 0;   for(int i = 0; i&lt;11; i++)   {     while(digitalRead(CLOCK));     scanval |= digitalRead(DATA) &lt;&lt; i;     while(!digitalRead(CLOCK));   }   scanval >>= 1;   scanval &amp;= 0xFF;   Serial.println(scanval, HEX);   if(lastscan != 0xF0 &amp;&amp; scanval != 0xF0)  {   if(scanval <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-364566","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/364566","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=364566"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/364566\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=364566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=364566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=364566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}