{"id":2000,"date":"2022-04-04T12:31:35","date_gmt":"2022-04-04T10:31:35","guid":{"rendered":"https:\/\/www.sabulo.com\/sb\/?p=2000"},"modified":"2022-04-04T12:44:52","modified_gmt":"2022-04-04T10:44:52","slug":"time-management-cube","status":"publish","type":"post","link":"https:\/\/www.sabulo.com\/sb\/accelerometer\/time-management-cube\/","title":{"rendered":"Time Management Cube"},"content":{"rendered":"\n<p>So, this academic year is already well down the road, and I haven&#8217;t blogged in a while. To make up for this, I thought I&#8217;d show you a time management cube, which notes which side is up, and changes the text accordingly. The device also writes the update into the Web, making this yet another inane IoT device.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/www.sabulo.com\/sb\/wp-content\/uploads\/2021\/06\/VID_20210510_115639.mp4\"><\/video><\/figure>\n\n\n\n<p>As you can see, it has an accelerometer in the center of the cube, and when it is rotated, the side that is up is taken to be whatever you are currently doing. When you have finished doing that, simply rotate the cube to start another activity. Let&#8217;s have a look at how this is done.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Parts list<\/h2>\n\n\n\n<p>ESP32 is a widely available system-on-a-chip device, which you can find anywhere. I usually buy mine off eBay where they seem to cost around 6,50 euros apiece.<\/p>\n\n\n\n<p>The accelerometer is a GY-521, which I got from my Freenove Arduino Starter kits. It&#8217;s also very generic and can be bought on a variety of suppliers. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The ESP32<\/h2>\n\n\n\n<p>I&#8217;ll highlight some parts in the code. It has the usual definitions at the top, then the setup, where the display is started and the device connects to the Web. During this it will write the word &#8220;Booted&#8221; into the Web, which assumes you start the device when you come into the office in the morning. The definitions and setup are largely from the sample files used in this mashup project.<\/p>\n\n\n\n<p>Perhaps the interesting bit is the accelerometer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/gyroscope settings\ndouble x;\ndouble y;\ndouble z;\nconst int MPU_addr = 0x68;\nint16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;\nint minVal = 265;\nint maxVal = 402;\nint shortx, shorty, shortz, anglesum;\nString strShortX, strShortY, strShortZ, strActivity;\n<\/code><\/pre>\n\n\n\n<p id=\"block-00f8081a-5ec7-460f-8bb9-46e22ba124d3\">The shortx, y, and z are my variables used in the calculation of the position of the cube, and the corresponding strShortX etc. are used for display and Web update purposes.<\/p>\n\n\n\n<p>The next part shows you what happens in the loop, when the accelerometer stance is read. <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Wire.beginTransmission(MPU_addr);<br>Wire.write(0x3B);<br>Wire.endTransmission(false);<br>Wire.requestFrom(MPU_addr, 14, true);<br>AcX = Wire.read() &lt;&lt; 8 | Wire.read();<br>AcY = Wire.read() &lt;&lt; 8 | Wire.read();<br>AcZ = Wire.read() &lt;&lt; 8 | Wire.read();<br>int xAng = map(AcX, minVal, maxVal, -90, 90);<br>int yAng = map(AcY, minVal, maxVal, -90, 90);<br>int zAng = map(AcZ, minVal, maxVal, -90, 90);<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">x = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);<br>y = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);<br>z = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">Serial.print(\"AngleX= \");<br>Serial.println(x);<br>shortx = int(x \/ 60) + 1;<br>String xangle;<br>xangle = int(x);<br>Serial.print(\"AngleY= \");<br>Serial.println(y);<br>shorty = int(y \/ 60) + 1;<br>String yangle;<br>yangle = int(y);<br>Serial.print(\"AngleZ= \");<br>Serial.println(z);<br>shortz = int(z \/ 60) + 1;<br>String zangle;<br>zangle = int(z);<br>Serial.println(\"-----------------------------------------\");<br>anglesum = shortx + shorty + shortz;<\/pre>\n\n\n\n<p>The first block finds out the angles in radians, then they are simplified into x, y, and z degrees. The third block then converts the angle that can be between 0 to 360 into 0 to 6. The anglesum variable then contains the sum of the simplified angles. The Serial.println statements are used to show you values in the Serial Mointor, which is useful for debugging purposes. <\/p>\n\n\n\n<p>Then there is a case structure, which uses the sum to define which side of the cube is up. When I had the system installed, I rotated the cube and noted down the sums, and then used them as the trigger here.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">switch (anglesum) {<br>case 5:<br>strActivity = \"Email\";<br>break;<br>case 10:<br>strActivity = \"Coffee\";<br>break;<br>case 12:<br>strActivity = \"Documents\";<br>break;<br>case 13:<br>strActivity = \"Meeting\";<br>break;<br>case 14:<br>strActivity = \"Teaching\";<br>break;<br>case 16:<br>strActivity = \"3D Work\";<br>break;<\/pre>\n\n\n\n<p>The loop then continues to check whether the activity is the same as a second before, or whether there was a change:<\/p>\n\n\n\n<p>So, if strActivityOld is &#8220;Booting&#8230;&#8221; which happens in the setup, it will display that. When it comes to the main loop, the cube stance is read, and the strActivity is updated. If the activity is different from strActivityOld, it will display &#8220;Change!&#8221; and then go into the UpdateActivity function to write the new activity into the Web:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">display.clearDisplay();\ndisplay.setTextSize(2); \/\/ Normal 1:1 pixel scale\ndisplay.setTextColor(SSD1306_WHITE); \/\/ Draw white text\ndisplay.setCursor(0, 0); \/\/ Start at top-left corner\ndisplay.print(\"Activity:\");\ndisplay.setCursor(0, 16); \/\/ Start at top-left corner\ndisplay.print(strActivity);\ndisplay.display();\nif (strActivity != strActivityOld) { \/\/THIS IS where the activity is checked.\ndisplay.clearDisplay();\ndisplay.setCursor(0, 0); \/\/ Start at top-left corner\nif (strActivityOld == \"Booting\u2026\") {\ndisplay.print(\"Booting\u2026\");\n}\nelse {\ndisplay.print(\"Change!\");\nUpdateActivity(strActivity); \/\/This is the update function for the Web.\n}\ndisplay.display();\ndelay(200);\n}\nSerial.println(strActivity);\nSerial.println(strActivityOld);\nstrActivityOld = strActivity;\ndelay(1000);<\/pre>\n\n\n\n<p>The UpdateActivity function is invoked whenever there is a change in the stance of the cube, with the strActivity passed as a parameter to it.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void UpdateActivity(String myActivity) {\n  \/\/sending data to the server:\n\n  Serial.println(\"add data to web\");\n  Serial.printf(\"Connecting to %s \", ssid);\n  if (WiFi.status() == WL_CONNECTED) {\n    WiFiClient client;\n    HTTPClient http;\n\n    \/\/ Your Domain name with URL path or IP address with path\n    http.begin(serverName);\n\n    \/\/ If you need an HTTP request with a content type: text\/plain\n    http.addHeader(\"Content-Type\", \"text\/plain\");\n    String httpRequestData = \"Activity: \" + myActivity;\n    \/\/ Send HTTP POST request\n    int httpResponseCode = http.POST(httpRequestData);\n\n    Serial.println(\"HTTP Response code: \");\n    Serial.println(httpRequestData);\n\n    \/\/ Free resources\n    http.end();\n  }\n  else {\n    Serial.println(\"WiFi Disconnected\");\n  }\n}<\/code><\/pre>\n\n\n\n<p>That explains the various interesting bits in the code, the rest is merely definitions and run-of-the-mill code. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wiring scheme<\/h2>\n\n\n\n<p>Both the accelerometer and the display are I2C devices. Therefore they both have just four wires, VCC for voltage, GND for ground, SDA for data, and SCL for clock. You need to share the pins 21 and 22, since they are in the same bus, and separated by their device IDs. It is likely you don&#8217;t have to change the IDs, they should work out of the box. The easiest way is to make a jumper cable with one female connector at one end and two females at the other<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758-scaled.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"825\" height=\"825\" src=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758.jpg?resize=825%2C825&#038;ssl=1\" alt=\"\" class=\"wp-image-2066\" srcset=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758-scaled.jpg?resize=1024%2C1024&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758-scaled.jpg?resize=300%2C300&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758-scaled.jpg?resize=150%2C150&amp;ssl=1 150w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758-scaled.jpg?resize=768%2C768&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758-scaled.jpg?resize=1536%2C1536&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758-scaled.jpg?resize=2048%2C2048&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758-scaled.jpg?w=1650&amp;ssl=1 1650w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125758-scaled.jpg?w=2475&amp;ssl=1 2475w\" sizes=\"auto, (max-width: 825px) 100vw, 825px\" \/><\/a><\/figure>\n\n\n\n<p>Connect the display as follows:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>VCC to ESP32 5V<\/li><li>GND to ESP32 ground<\/li><li>SDA to pin 21<\/li><li>SCL to pin 22<\/li><\/ul>\n\n\n\n<p>Connect the accelerometer as follows:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>VCC to ESP32 3.3V<\/li><li>GND to ESP32 ground<\/li><li>SDA to pin 21<\/li><li>SCL to pin 22<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735-scaled.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"825\" height=\"825\" src=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735.jpg?resize=825%2C825&#038;ssl=1\" alt=\"\" class=\"wp-image-2067\" srcset=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735-scaled.jpg?resize=1024%2C1024&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735-scaled.jpg?resize=300%2C300&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735-scaled.jpg?resize=150%2C150&amp;ssl=1 150w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735-scaled.jpg?resize=768%2C768&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735-scaled.jpg?resize=1536%2C1536&amp;ssl=1 1536w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735-scaled.jpg?resize=2048%2C2048&amp;ssl=1 2048w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735-scaled.jpg?w=1650&amp;ssl=1 1650w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/20220404_125735-scaled.jpg?w=2475&amp;ssl=1 2475w\" sizes=\"auto, (max-width: 825px) 100vw, 825px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">3D Printed cube<\/h2>\n\n\n\n<p>The 3D printable STL file is also on GitHub. My cube is 8 x 8 cm, and I printed with with the Formlabs Form 3 resin printer. It comes out rather light, and even if I used the most flexible wires I could find in the lab, it was slightly tilted when the wires coming out of one of the cube&#8217;s corners were bent. Therefore I added a bolt with a bunch of nuts to the center bar of the cube, and now the cube sits flat regardless of the side facing down. <\/p>\n\n\n\n<p>You can print it with a filament printer as well, but you will need to use supports, and you will spend some time ripping them off (the resin printer also used supports but they are easy to remove.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Web end of it<\/h2>\n\n\n\n<p>Every time the cube is turned, it sends the new position to a file on the Web:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/image.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"444\" height=\"553\" src=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/image.png?resize=444%2C553&#038;ssl=1\" alt=\"\" class=\"wp-image-2070\" srcset=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/image.png?w=444&amp;ssl=1 444w, https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/uploads\/2022\/04\/image.png?resize=241%2C300&amp;ssl=1 241w\" sizes=\"auto, (max-width: 444px) 100vw, 444px\" \/><\/a><figcaption>Time list<\/figcaption><\/figure>\n\n\n\n<p>The PHP that manages it is very simple. One file receives the input:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\r\n    $_POST = file_get_contents('php:\/\/input');\r\n    $myYear = date(\"d.m.Y\");\r\n    $myHour = date(\"H:i\");\r\n    $myFile = \"gravicube.txt\";\r\n    $fh = fopen($myFile, 'a') or die(\"can't open file\");\r\n    fwrite($fh, $myYear . \" \" .  $myHour);\r\n    fwrite($fh, \"\\t\");\r\n    fwrite($fh, $_POST);\r\n    fwrite($fh, \"\\n\");    \r\n    fclose($fh);\r\n?><\/code><\/pre>\n\n\n\n<p>This is called gravicube.php and it records the data in a file. There is also a file in the same folder called index.php:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!doctype html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;meta charset=\"utf-8\"&gt;\n&lt;title&gt;3D Lab Activity Monitor&lt;\/title&gt;\n&lt;link rel=\"stylesheet\" type=\"text\/css\" href=\"gravicube.css\"&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\n&lt;?php\n\n\n\n$myRealTime = date(\"H:i\");\necho (\"&lt;p&gt;Current time is \"), $myRealTime;\necho \"\";\n\n\n    $file=\"humitime.txt\";\n    $linecount = 0;\n    $handle = fopen($file, \"r\");\n    echo (\"&lt;p&gt;The latest reported activity:&lt;p&gt;\");\n    $data = array_slice(file('gravicube.txt'), -10);\n    $mylinecount=0;\n        foreach ($data as $line) {\n            $pos = strpos($line, \"A:\");\n            $showLine = substr($line, 0, $pos-1);  \n            $mylinecount++;\n            if ($mylinecount == 10) {\n                echo(\"&lt;p class='mybold'&gt;\");\n                echo $showLine;\n                echo(\"&lt;\/p&gt;\");\n            } \n            else {\n                echo(\"&lt;p&gt;\"), $showLine, (\"&lt;\/p&gt;\");\n            }\n} \n ?&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p>This way you don&#8217;t need to type anything behind the folder name.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Final demo video<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Gravicube\" width=\"825\" height=\"619\" src=\"https:\/\/www.youtube.com\/embed\/zcebIertkik?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption>Gravicube in action<\/figcaption><\/figure>\n<div class=\"pvc_clear\"><\/div><p id=\"pvc_stats_2000\" class=\"pvc_stats all  \" data-element-id=\"2000\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/i0.wp.com\/www.sabulo.com\/sb\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif?resize=16%2C16&#038;ssl=1\" border=0 \/><\/p><div class=\"pvc_clear\"><\/div>","protected":false},"excerpt":{"rendered":"<p>So, this academic year is already well down the road, and I haven&#8217;t blogged in a while. To make up &hellip; <a href=\"https:\/\/www.sabulo.com\/sb\/accelerometer\/time-management-cube\/\" class=\"more-link\">More <span class=\"screen-reader-text\">Time Management Cube<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_2000\" class=\"pvc_stats all  \" data-element-id=\"2000\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.sabulo.com\/sb\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\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":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[63,98,64],"tags":[],"class_list":["post-2000","post","type-post","status-publish","format-standard","hentry","category-accelerometer","category-adafruit-oled","category-esp32-development-board"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6vhqE-wg","_links":{"self":[{"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/posts\/2000","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/comments?post=2000"}],"version-history":[{"count":7,"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/posts\/2000\/revisions"}],"predecessor-version":[{"id":2079,"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/posts\/2000\/revisions\/2079"}],"wp:attachment":[{"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/media?parent=2000"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/categories?post=2000"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sabulo.com\/sb\/wp-json\/wp\/v2\/tags?post=2000"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}