{"id":793,"date":"2022-12-19T16:47:51","date_gmt":"2022-12-19T08:47:51","guid":{"rendered":"http:\/\/wordpress.loc\/?p=793"},"modified":"2022-12-19T16:48:10","modified_gmt":"2022-12-19T08:48:10","slug":"esp32_ch1-40","status":"publish","type":"post","link":"https:\/\/www.nmking.io\/index.php\/2022\/12\/19\/793\/","title":{"rendered":"ESP32 Lolin32 Lite I2C OLED\u53ca\u96fb\u6c60\u7ba1\u7406"},"content":{"rendered":"\n<figure class=\"wp-block-pullquote\"><blockquote><p>\u5728ESP32\u7684\u5bb6\u65cf\u88e1\uff0c\u6700\u4fbf\u5b9c\u7684\u61c9\u8a72\u820a\u5c6c\u9019\u6b3eLolin 32 Lite\uff0c\u4e0d\u904e\u4fbf\u5b9c\u96d6\u4fbf\u5b9c\uff0c\u4e0d\u50c5\u8a72\u6709\u7684\u90fd\u6709\uff0c\u9084\u5916\u52a0\u4e86\u96fb\u6e90\u7ba1\u7406\uff0c\u53ef\u4ee5\u8b93\u4f60\u7121\u75db\u76f4\u63a5\u4f7f\u7528\u96fb\u6c60\uff0c\u7576USB\u4f9b\u96fb\u6642\u53ef\u4ee5\u63d0\u4f9b\u96fb\u529b\u4e4b\u5916\uff0c\u9084\u53ef\u4ee5\u5e6b\u5fd9\u96fb\u6c60\u5145\u96fb\uff0c\u7576USB\u79fb\u9664\u6642\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u96fb\u6c60\u4f9b\u96fb\u3002<\/p><\/blockquote><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.mischianti.org\/wp-content\/uploads\/2021\/07\/ESP32-WeMos-LOLIN32-Lite-pinout-mischianti-low.jpg?resize=838%2C445&#038;ssl=1\" alt=\"\" width=\"838\" height=\"445\"\/><\/figure>\n\n\n\n<p>\u9019\u627932Lite\u54c1\u8cea\u6bd4\u4ee5\u5f80\u66f4\u512a\u826f\uff0c\u7576\u96fb\u6c60\u5b8c\u6210\u5145\u96fb\u5f8c\uff0c\u96fb\u6c60\u5145\u96fb\u71c8\u6703\u7184\u6ec5\uff0c\u4ee5\u5f80\u7684\u6279\u865f\u5c31\u7b97\u5145\u98fd\u96fb\uff0c\u71c8\u4e00\u6a23\u6703\u4e00\u76f4\u4eae\u8457\uff0c\u5c0e\u81f4\u6211\u5011\u5206\u4e0d\u6e05\u695a\u96fb\u6c60\u96fb\u91cf\u72c0\u6cc1\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/pic.pimg.tw\/youyouyou\/1654196279-1597454059-g_n.png?resize=838%2C914&#038;ssl=1\" alt=\"\" width=\"838\" height=\"914\"\/><figcaption class=\"wp-element-caption\">Lolin 32 Lite\u5145\u96fb\u72c0\u614b<\/figcaption><\/figure>\n\n\n\n<p>\u95dc\u65bc\u9019\u98461200mAh\u7684\u92f0\u805a\u96fb\u6c60\u7684\u96fb\u91cf\u5982\u4f55\uff1f\u76ee\u524d\u6211\u7528OLED\u9032\u884c\u6e2c\u8a66\uff0c\u5145\u98fd\u96fb\u5f8c\u8b93OLED\u9577\u6642\u9593\u958b\u8457\uff0c\u7d50\u679c\u4f7f\u7528\u6642\u9593\u4ecb\u65bc36hr~48hr\u4e4b\u9593\u3002<\/p>\n\n\n\n<p>\u9019\u88e1\u7522\u751f\u4e00\u500b\u554f\u984c\uff0c\u4ed4\u7d30\u770bLolin32Lite\u6c92\u6709\u50b3\u7d71\u7684I2C\u8173\u4f4d21\u53ca22\uff0c\u6240\u4ee5\u5982\u679c\u4f7f\u7528I2C\u5c31\u5fc5\u9808\u81ea\u5b9a\u7fa9\uff0c\u6211\u5011\u4f7f\u7528SDA=19,SCL=23\u8173\u4f4d\u4f86\u555f\u52d5I2C OLED\u87a2\u5e55<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u7a0b\u5f0f\u9808\u5b89\u88ddAdafruit_GFX\u53caAdafruit SSD1306\u5169\u500b\u7a0b\u5f0f\u5eab\uff0c\u4e26\u76f4\u63a5\u958b\u555f\u7bc4\u4f8b\u7a0b\u5f0f<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/pic.pimg.tw\/youyouyou\/1654196713-4086044252-g_n.png?resize=842%2C310&#038;ssl=1\" alt=\"\" width=\"842\" height=\"310\"\/><\/figure>\n\n\n\n<p>\u7b2c\u4e00\u500b\u8981\u4fee\u6539\u7684\u662f\u7b2c35\u884c\u7684\u4f4d\u5740\uff0c\u7531\u539f\u4f86\u7684<mark style=\"background-color:#fcb900\" class=\"has-inline-color\">0x3D<\/mark>\u6539\u6210<mark style=\"background-color:#fcb900\" class=\"has-inline-color\">0x3C<\/mark><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/pic.pimg.tw\/youyouyou\/1654197145-3613179922-g_n.png?resize=840%2C426&#038;ssl=1\" alt=\"\" width=\"840\" height=\"426\"\/><\/figure>\n\n\n\n<p>\u7b2c\u4e8c\u500b\u5247\u662f\u5728setup\u5167\uff0c\u8a2d\u5b9aI2C\u7684\uff0c\u4f7f\u7528wire(SDA,SCL)\uff0c\u6211\u5011\u4f7f\u752819\u53ca23\u8173<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/pic.pimg.tw\/youyouyou\/1654197446-2629783416-g_n.png?resize=843%2C340&#038;ssl=1\" alt=\"\" width=\"843\" height=\"340\"\/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;SPI.h>\n#include &lt;Wire.h>\n#include &lt;Adafruit_GFX.h>\/\/\u8acb\u5b89\u88ddAdafruit_GFX\n#include &lt;Adafruit_SSD1306.h>\/\/\u8acb\u5b89\u88ddAdafruit SSD1306\n\n#define SCREEN_WIDTH 128 \/\/ OLED display width, in pixels\n#define SCREEN_HEIGHT 64 \/\/ OLED display height, in pixels\n\n\/\/ Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)\n\/\/ The pins for I2C are defined by the Wire-library. \n\/\/ On an arduino UNO:       A4(SDA), A5(SCL)\n\/\/ On an arduino MEGA 2560: 20(SDA), 21(SCL)\n\/\/ On an arduino LEONARDO:   2(SDA),  3(SCL), ...\n#define OLED_RESET     4 \/\/ Reset pin # (or -1 if sharing Arduino reset pin)\n#define SCREEN_ADDRESS 0x3C \/\/\/&lt; See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32\nAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, OLED_RESET);\n\n#define NUMFLAKES     10 \/\/ Number of snowflakes in the animation example\n\n#define LOGO_HEIGHT   16\n#define LOGO_WIDTH    16\nstatic const unsigned char PROGMEM logo_bmp&#91;] =\n{ 0b00000000, 0b11000000,\n  0b00000001, 0b11000000,\n  0b00000001, 0b11000000,\n  0b00000011, 0b11100000,\n  0b11110011, 0b11100000,\n  0b11111110, 0b11111000,\n  0b01111110, 0b11111111,\n  0b00110011, 0b10011111,\n  0b00011111, 0b11111100,\n  0b00001101, 0b01110000,\n  0b00011011, 0b10100000,\n  0b00111111, 0b11100000,\n  0b00111111, 0b11110000,\n  0b01111100, 0b11110000,\n  0b01110000, 0b01110000,\n  0b00000000, 0b00110000 };\n\nvoid setup() {\n  Wire.begin(19,23);\n  Serial.begin(115200);\n\n  \/\/ SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally\n  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {\n    Serial.println(\"SSD1306 allocation failed\");\n    for(;;); \/\/ Don't proceed, loop forever\n  }else{Serial.println(\"SSD1306 test OK\");}\n\n  \/\/ Show initial display buffer contents on the screen --\n  \/\/ the library initializes this with an Adafruit splash screen.\n  display.display();\n  delay(2000); \/\/ Pause for 2 seconds\n\n  \/\/ Clear the buffer\n  display.clearDisplay();\n\n  \/\/ Draw a single pixel in white\n  display.drawPixel(10, 10, SSD1306_WHITE);\n\n  \/\/ Show the display buffer on the screen. You MUST call display() after\n  \/\/ drawing commands to make them visible on screen!\n  display.display();\n  delay(2000);\n  \/\/ display.display() is NOT necessary after every single drawing command,\n  \/\/ unless that's what you want...rather, you can batch up a bunch of\n  \/\/ drawing operations and then update the screen all at once by calling\n  \/\/ display.display(). These examples demonstrate both approaches...\n\n  testdrawline();      \/\/ Draw many lines\n\n  testdrawrect();      \/\/ Draw rectangles (outlines)\n\n  testfillrect();      \/\/ Draw rectangles (filled)\n\n  testdrawcircle();    \/\/ Draw circles (outlines)\n\n  testfillcircle();    \/\/ Draw circles (filled)\n\n  testdrawroundrect(); \/\/ Draw rounded rectangles (outlines)\n\n  testfillroundrect(); \/\/ Draw rounded rectangles (filled)\n\n  testdrawtriangle();  \/\/ Draw triangles (outlines)\n\n  testfilltriangle();  \/\/ Draw triangles (filled)\n\n  testdrawchar();      \/\/ Draw characters of the default font\n\n  testdrawstyles();    \/\/ Draw 'stylized' characters\n\n  testscrolltext();    \/\/ Draw scrolling text\n\n  testdrawbitmap();    \/\/ Draw a small bitmap image\n\n  \/\/ Invert and restore display, pausing in-between\n  display.invertDisplay(true);\n  delay(1000);\n  display.invertDisplay(false);\n  delay(1000);\n\n  testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); \/\/ Animate bitmaps\n}\n\nvoid loop() {\n}\n\nvoid testdrawline() {\n  int16_t i;\n\n  display.clearDisplay(); \/\/ Clear display buffer\n\n  for(i=0; i&lt;display.width(); i+=4) {\n    display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);\n    display.display(); \/\/ Update screen with each newly-drawn line\n    delay(1);\n  }\n  for(i=0; i&lt;display.height(); i+=4) {\n    display.drawLine(0, 0, display.width()-1, i, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n  delay(250);\n\n  display.clearDisplay();\n\n  for(i=0; i&lt;display.width(); i+=4) {\n    display.drawLine(0, display.height()-1, i, 0, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n  for(i=display.height()-1; i>=0; i-=4) {\n    display.drawLine(0, display.height()-1, display.width()-1, i, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n  delay(250);\n\n  display.clearDisplay();\n\n  for(i=display.width()-1; i>=0; i-=4) {\n    display.drawLine(display.width()-1, display.height()-1, i, 0, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n  for(i=display.height()-1; i>=0; i-=4) {\n    display.drawLine(display.width()-1, display.height()-1, 0, i, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n  delay(250);\n\n  display.clearDisplay();\n\n  for(i=0; i&lt;display.height(); i+=4) {\n    display.drawLine(display.width()-1, 0, 0, i, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n  for(i=0; i&lt;display.width(); i+=4) {\n    display.drawLine(display.width()-1, 0, i, display.height()-1, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n\n  delay(2000); \/\/ Pause for 2 seconds\n}\n\nvoid testdrawrect(void) {\n  display.clearDisplay();\n\n  for(int16_t i=0; i&lt;display.height()\/2; i+=2) {\n    display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);\n    display.display(); \/\/ Update screen with each newly-drawn rectangle\n    delay(1);\n  }\n\n  delay(2000);\n}\n\nvoid testfillrect(void) {\n  display.clearDisplay();\n\n  for(int16_t i=0; i&lt;display.height()\/2; i+=3) {\n    \/\/ The INVERSE color is used so rectangles alternate white\/black\n    display.fillRect(i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);\n    display.display(); \/\/ Update screen with each newly-drawn rectangle\n    delay(1);\n  }\n\n  delay(2000);\n}\n\nvoid testdrawcircle(void) {\n  display.clearDisplay();\n\n  for(int16_t i=0; i&lt;max(display.width(),display.height())\/2; i+=2) {\n    display.drawCircle(display.width()\/2, display.height()\/2, i, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n\n  delay(2000);\n}\n\nvoid testfillcircle(void) {\n  display.clearDisplay();\n\n  for(int16_t i=max(display.width(),display.height())\/2; i>0; i-=3) {\n    \/\/ The INVERSE color is used so circles alternate white\/black\n    display.fillCircle(display.width() \/ 2, display.height() \/ 2, i, SSD1306_INVERSE);\n    display.display(); \/\/ Update screen with each newly-drawn circle\n    delay(1);\n  }\n\n  delay(2000);\n}\n\nvoid testdrawroundrect(void) {\n  display.clearDisplay();\n\n  for(int16_t i=0; i&lt;display.height()\/2-2; i+=2) {\n    display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,\n      display.height()\/4, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n\n  delay(2000);\n}\n\nvoid testfillroundrect(void) {\n  display.clearDisplay();\n\n  for(int16_t i=0; i&lt;display.height()\/2-2; i+=2) {\n    \/\/ The INVERSE color is used so round-rects alternate white\/black\n    display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,\n      display.height()\/4, SSD1306_INVERSE);\n    display.display();\n    delay(1);\n  }\n\n  delay(2000);\n}\n\nvoid testdrawtriangle(void) {\n  display.clearDisplay();\n\n  for(int16_t i=0; i&lt;max(display.width(),display.height())\/2; i+=5) {\n    display.drawTriangle(\n      display.width()\/2  , display.height()\/2-i,\n      display.width()\/2-i, display.height()\/2+i,\n      display.width()\/2+i, display.height()\/2+i, SSD1306_WHITE);\n    display.display();\n    delay(1);\n  }\n\n  delay(2000);\n}\n\nvoid testfilltriangle(void) {\n  display.clearDisplay();\n\n  for(int16_t i=max(display.width(),display.height())\/2; i>0; i-=5) {\n    \/\/ The INVERSE color is used so triangles alternate white\/black\n    display.fillTriangle(\n      display.width()\/2  , display.height()\/2-i,\n      display.width()\/2-i, display.height()\/2+i,\n      display.width()\/2+i, display.height()\/2+i, SSD1306_INVERSE);\n    display.display();\n    delay(1);\n  }\n\n  delay(2000);\n}\n\nvoid testdrawchar(void) {\n  display.clearDisplay();\n\n  display.setTextSize(1);      \/\/ Normal 1:1 pixel scale\n  display.setTextColor(SSD1306_WHITE); \/\/ Draw white text\n  display.setCursor(0, 0);     \/\/ Start at top-left corner\n  display.cp437(true);         \/\/ Use full 256 char 'Code Page 437' font\n\n  \/\/ Not all the characters will fit on the display. This is normal.\n  \/\/ Library will draw what it can and the rest will be clipped.\n  for(int16_t i=0; i&lt;256; i++) {\n    if(i == '\\n') display.write(' ');\n    else          display.write(i);\n  }\n\n  display.display();\n  delay(2000);\n}\n\nvoid testdrawstyles(void) {\n  display.clearDisplay();\n\n  display.setTextSize(1);             \/\/ Normal 1:1 pixel scale\n  display.setTextColor(SSD1306_WHITE);        \/\/ Draw white text\n  display.setCursor(0,0);             \/\/ Start at top-left corner\n  display.println(F(\"Hello, world!\"));\n\n  display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); \/\/ Draw 'inverse' text\n  display.println(3.141592);\n\n  display.setTextSize(2);             \/\/ Draw 2X-scale text\n  display.setTextColor(SSD1306_WHITE);\n  display.print(F(\"0x\")); display.println(0xDEADBEEF, HEX);\n\n  display.display();\n  delay(2000);\n}\n\nvoid testscrolltext(void) {\n  display.clearDisplay();\n\n  display.setTextSize(2); \/\/ Draw 2X-scale text\n  display.setTextColor(SSD1306_WHITE);\n  display.setCursor(10, 0);\n  display.println(F(\"scroll\"));\n  display.display();      \/\/ Show initial text\n  delay(100);\n\n  \/\/ Scroll in various directions, pausing in-between:\n  display.startscrollright(0x00, 0x0F);\n  delay(2000);\n  display.stopscroll();\n  delay(1000);\n  display.startscrollleft(0x00, 0x0F);\n  delay(2000);\n  display.stopscroll();\n  delay(1000);\n  display.startscrolldiagright(0x00, 0x07);\n  delay(2000);\n  display.startscrolldiagleft(0x00, 0x07);\n  delay(2000);\n  display.stopscroll();\n  delay(1000);\n}\n\nvoid testdrawbitmap(void) {\n  display.clearDisplay();\n\n  display.drawBitmap(\n    (display.width()  - LOGO_WIDTH ) \/ 2,\n    (display.height() - LOGO_HEIGHT) \/ 2,\n    logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);\n  display.display();\n  delay(1000);\n}\n\n#define XPOS   0 \/\/ Indexes into the 'icons' array in function below\n#define YPOS   1\n#define DELTAY 2\n\nvoid testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {\n  int8_t f, icons&#91;NUMFLAKES]&#91;3];\n\n  \/\/ Initialize 'snowflake' positions\n  for(f=0; f&lt; NUMFLAKES; f++) {\n    icons&#91;f]&#91;XPOS]   = random(1 - LOGO_WIDTH, display.width());\n    icons&#91;f]&#91;YPOS]   = -LOGO_HEIGHT;\n    icons&#91;f]&#91;DELTAY] = random(1, 6);\n    Serial.print(F(\"x: \"));\n    Serial.print(icons&#91;f]&#91;XPOS], DEC);\n    Serial.print(F(\" y: \"));\n    Serial.print(icons&#91;f]&#91;YPOS], DEC);\n    Serial.print(F(\" dy: \"));\n    Serial.println(icons&#91;f]&#91;DELTAY], DEC);\n  }\n\n  for(;;) { \/\/ Loop forever...\n    display.clearDisplay(); \/\/ Clear the display buffer\n\n    \/\/ Draw each snowflake:\n    for(f=0; f&lt; NUMFLAKES; f++) {\n      display.drawBitmap(icons&#91;f]&#91;XPOS], icons&#91;f]&#91;YPOS], bitmap, w, h, SSD1306_WHITE);\n    }\n\n    display.display(); \/\/ Show the display buffer on the screen\n    delay(200);        \/\/ Pause for 1\/10 second\n\n    \/\/ Then update coordinates of each flake...\n    for(f=0; f&lt; NUMFLAKES; f++) {\n      icons&#91;f]&#91;YPOS] += icons&#91;f]&#91;DELTAY];\n      \/\/ If snowflake is off the bottom of the screen...\n      if (icons&#91;f]&#91;YPOS] >= display.height()) {\n        \/\/ Reinitialize to a random position, just off the top\n        icons&#91;f]&#91;XPOS]   = random(1 - LOGO_WIDTH, display.width());\n        icons&#91;f]&#91;YPOS]   = -LOGO_HEIGHT;\n        icons&#91;f]&#91;DELTAY] = random(1, 6);\n      }\n    }\n  }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5728ESP32\u7684\u5bb6\u65cf\u88e1\uff0c\u6700\u4fbf\u5b9c\u7684\u61c9\u8a72\u820a\u5c6c\u9019\u6b3eLolin 32 Lite\uff0c\u4e0d\u904e\u4fbf\u5b9c\u96d6\u4fbf\u5b9c\uff0c\u4e0d\u50c5\u8a72\u6709\u7684\u90fd\u6709\uff0c\u9084\u5916\u52a0\u4e86 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":["post-793","post","type-post","status-publish","format-standard","hentry","category-esp32"],"blocksy_meta":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/posts\/793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/comments?post=793"}],"version-history":[{"count":1,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/posts\/793\/revisions"}],"predecessor-version":[{"id":794,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/posts\/793\/revisions\/794"}],"wp:attachment":[{"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/media?parent=793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/categories?post=793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nmking.io\/index.php\/wp-json\/wp\/v2\/tags?post=793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}