{"id":8558,"date":"2019-09-04T00:26:45","date_gmt":"2019-09-04T00:26:45","guid":{"rendered":"https:\/\/stevepedwards.today\/stevepedwards.com\/ElectronicsStuff\/?p=8558"},"modified":"2019-09-04T00:26:45","modified_gmt":"2019-09-04T00:26:45","slug":"showing-gps-data-in-128x32-oled","status":"publish","type":"post","link":"https:\/\/stevepedwards.today\/ElectronicsStuff\/showing-gps-data-in-128x32-oled\/","title":{"rendered":"Showing GPS  data in 128&#215;32 OLED"},"content":{"rendered":"<p>Finally answered some programming fundamentals for myself! The detailed declarations outside of void setup(){} and loop(){} are effectively code modules that can then called as condensed functions later e.g in the main loop (if you want)..duh.<br \/>\n<iframe loading=\"lazy\" title=\"GPS and OLED data\" width=\"1778\" height=\"1000\" src=\"https:\/\/www.youtube.com\/embed\/vTrTk4-fpOY?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><br \/>\nI got the oled char code to get going from the Adafruit GFX example.<br \/>\nThe most important thing I've learned now is code structure from top down as read during compile time - so why it fails when code is not called in order of dependency! (yep! I'm not a programmer!)<br \/>\nI've tidied this to a format that works for me to keep track of steps (especially visually useful is a section \"}-\u00a0 \/\/ end xxx\" ) in the clear, logical order that the program loads and runs by with comments on terms and their-\u00a0 function to aid learning - dunno if I'm using the right terminology here, but the order is:<br \/>\ntitle\/usage comments; <a href=\"https:\/\/www.arduino.cc\/reference\/en\/language\/structure\/further-syntax\/include\/\">#includes<\/a>; <a href=\"https:\/\/www.arduino.cc\/reference\/en\/language\/structure\/further-syntax\/define\/\">defines<\/a>; global <a href=\"https:\/\/www.arduino.cc\/reference\/en\/\">constants\/variables<\/a>; setup body; <a href=\"https:\/\/www.arduino.cc\/reference\/en\/\">Control Structures{}<\/a>; loop body containing desired <a href=\"https:\/\/www.arduino.cc\/reference\/en\/\">functions<\/a>()\/code modules<\/p>\n<pre class=\"lang:default decode:true\">\/******************************************************************************\n  Steve_GPS_OLED.ino to display data in serialmon and OLED, adapted from:\n  TinyGPSPlus_GPS_Shield.ino\n  TinyGPS++ Library Example for the SparkFun GPS Logger Shield\n  By Jim Lindblom @ SparkFun Electronics\n  February 9, 2016\n  https:\/\/stevepedwards.today\/github.com\/sparkfun\/GPS_Shield\n  This example uses SoftwareSerial to communicate with the GPS module on\n  pins 8 and 9. It uses the TinyGPS++ library to parse the NMEA strings sent\n  by the GPS module, and prints interesting GPS information to the serial\n  monitor.\n  After uploading the code, open your serial monitor, set it to 9600 baud, and\n  watch for latitude, longitude, altitude, course, speed, date, time, and the\n  number of visible satellites.\n  Resources:\n  TinyGPS++ Library  - https:\/\/stevepedwards.today\/github.com\/mikalhart\/TinyGPSPlus\/releases\n  SoftwareSerial Library\n  Development\/hardware environment specifics:\n  Arduino IDE 1.6.7\n  GPS Logger Shield v2.0 - Make sure the UART switch is set to SW-UART\n  Arduino Uno, RedBoard, Pro, etc.\n  OLED pins from front are 1 to Nano 5v, 2 to Nano pin GND, 3 to Nano pin A4, 4 to Nano pin A5;\n  Neo7 GPS pins from front are pin 1 to Nano D9, pin2 to D8, pin 3 to GND, pin 4 to Nano 5V;\n******************************************************************************\/\n\/\/#include is used to include outside libraries in your sketch.\n\/\/ 0\/1 UART for programming\/Serial monitor-ing, use SoftwareSerial:\n#include &lt;SoftwareSerial.h&gt;\n#include &lt;Adafruit_GFX.h&gt;\n#include &lt;Adafruit_SSD1306.h&gt;\n#include &lt;TinyGPS++.h&gt; \/\/ Include the TinyGPS++ library\n\/\/ #define is a useful C component that allows the programmer to give a name to a\n\/\/constant value before the program is compiled.\n#define ARDUINO_GPS_RX 9 \/\/ GPS TX, Arduino RX pin\n#define ARDUINO_GPS_TX 8 \/\/ GPS RX, Arduino TX pin\n#define gpsPort ssGPS  \/\/ Alternatively, use Serial1 on the Leonardo\n\/\/ Define the serial monitor port. On the Uno, and Leonardo this is 'Serial'\n\/\/  on other boards this may be 'SerialUSB'\n#define SerialMonitor Serial\n#define GPS_BAUD 9600 \/\/ GPS module baud rate. GP3906 defaults to 9600.\n\/\/ If you're using an Arduino Uno, RedBoard, or any board that uses the\n\/\/ 0\/1 UART for programming\/Serial monitor-ing, use SoftwareSerial:\n\/\/ OLED screen type parameters\n#define SCREEN_WIDTH 128 \/\/ OLED display width, in pixels\n#define SCREEN_HEIGHT 32 \/\/ OLED display height, in pixels\n\/\/ Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)\n#define OLED_RESET     4 \/\/ Reset pin # (or -1 if sharing Arduino reset pin)\nTinyGPSPlus tinyGPS; \/\/ Create a TinyGPSPlus object\n\/\/ NOTE: This define has to be placed below the Adafruit library it comes from as page is read top down!\nAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, OLED_RESET);\nSoftwareSerial ssGPS(ARDUINO_GPS_TX, ARDUINO_GPS_RX); \/\/ Create a SoftwareSerial\n\/\/ Set gpsPort to either ssGPS if using SoftwareSerial or Serial1 if using an\n\/\/ Arduino with a dedicated hardware serial port\n\/\/ Integers are your primary data-type for number storage.\n\/\/ (minimum value of -2^15 and a maximum value of (2^15) - 1)\n\/\/ Arduino takes care of dealing with negative numbers for you\nint m = 0; \/\/ global constant to reserve mem for this data, feet to meters later\n\/\/ The void keyword is used only in function declarations.\n\/\/ It indicates that the function is expected\n\/\/ to return no information to the function from which it was called.\n\/\/ The setup() function is called when a sketch starts. Use it to initialize\n\/\/variables, pin modes, start using libraries, etc. The setup function will only\n\/\/run once,after each powerup or reset of the Arduino board.\nvoid setup()  {\n  SerialMonitor.begin(9600);\n  gpsPort.begin(GPS_BAUD);\n  \/\/ SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally\n  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { \/\/ Address 0x3C for 128x32\n    Serial.println(F(\"SSD1306 allocation failed\"));\n    \/\/ Address 0x3C for 128x32\n    for(;;); \/\/ Don't proceed, loop forever\n  }\n} \/\/ end setup\n\/\/ formats the raw GPS data to readable form using TinyGPS++ Lib\nvoid printGPSInfo() {\n  \/\/ Print latitude, longitude, altitude in feet, course, speed, date, time,\n  \/\/ and the number of visible satellites.\n  SerialMonitor.print(\"Lat: \"); SerialMonitor.println(tinyGPS.location.lat(), 6);\n  SerialMonitor.print(\"Long: \"); SerialMonitor.println(tinyGPS.location.lng(), 6);\n  SerialMonitor.print(\"Alt: \"); SerialMonitor.print(tinyGPS.altitude.feet()); SerialMonitor.println(\" feet\");\n  int m = (tinyGPS.altitude.feet()) \/ 3.28084;\n  SerialMonitor.print(\"Alt: \"); SerialMonitor.print(m); SerialMonitor.println(\" meters\");\n  SerialMonitor.print(\"Date: \"); printDate();\n  SerialMonitor.print(\"Time: \"); printTime();\n  SerialMonitor.print(\"Sats: \"); SerialMonitor.println(tinyGPS.satellites.value());\n  SerialMonitor.println();\n} \/\/end printGPSInfo()\nvoid printGPS_OLED()  {\n  \/\/ OLED screen page 1\n  \/\/ Print latitude, longitude, altitude in feet, course, speed, date, time,\n  \/\/ and the number of visible satellites.\n  display.clearDisplay();\n  display.setTextSize(1);      \/\/ Normal 1:1 pixel scale\n  display.setTextColor(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  display.print(\"Lat: \"); display.println(tinyGPS.location.lat(), 6);\n  display.print(\"Long: \"); display.println(tinyGPS.location.lng(), 6);\n  display.print(\"Alt: \"); display.print(tinyGPS.altitude.feet()); display.println(\" feet\");\n  int m = (tinyGPS.altitude.feet()) \/ 3.28084;\n  display.print(\"Alt: \"); display.print(m); display.print(\" meters\");\n  display.display();\n  delay(3000);\n  \/\/ OLED screen page 2\n  display.clearDisplay();\n  display.setTextSize(1);      \/\/ Normal 1:1 pixel scale\n  display.setTextColor(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  display.print(\"Date: \"); display.println(); \/\/display.printDate();\n  display.print(\"Time: \"); display.println(); \/\/display.printTime();\n  display.print(\"Sats: \"); display.println(tinyGPS.satellites.value());\n  display.println();\n  display.display();\n  delay(3000);\n} \/\/ end printGPS_OLED()\n\/\/ This custom version of delay() ensures that the tinyGPS object\n\/\/ is being \"fed\". From the TinyGPS++ examples.\nstatic void smartDelay(unsigned long ms)  {\n  unsigned long start = millis();\n  do\n  {\n    \/\/ If data has come in from the GPS module\n    while (gpsPort.available())\n      tinyGPS.encode(gpsPort.read()); \/\/ Send it to the encode function\n    \/\/ tinyGPS.encode(char) continues to \"load\" the tinGPS object with new\n    \/\/ data coming in from the GPS module. As full NMEA strings begin to come in\n    \/\/ the tinyGPS library will be able to start parsing them for pertinent info\n  } while (millis() - start &lt; ms);\n} \/\/ end smartDelay()\n\/\/ printDate() formats the GPS date into dd\/mm\/yy.\nvoid printDate()  {\n  SerialMonitor.print(tinyGPS.date.day());\n  SerialMonitor.print(\"\/\");\n  SerialMonitor.print(tinyGPS.date.month());\n  SerialMonitor.print(\"\/\");\n  SerialMonitor.println(tinyGPS.date.year());\n} \/\/ end printDate()\n\/\/ printTime() formats the GPS time into \"hh:mm:ss\", and prints leading 0's\n\/\/ where they're called for.\nvoid printTime()  {\n  SerialMonitor.print(tinyGPS.time.hour());\n  SerialMonitor.print(\":\");\n  if (tinyGPS.time.minute() &lt; 10) SerialMonitor.print('0');\n  SerialMonitor.print(tinyGPS.time.minute());\n  SerialMonitor.print(\":\");\n  if (tinyGPS.time.second() &lt; 10) SerialMonitor.print('0');\n  SerialMonitor.println(tinyGPS.time.second());\n} \/\/ end printTime()\n\/\/ After creating a setup() function, which initializes and sets the initial values,\n\/\/ loop section loops forever so contained functions from above update new data values from GPS\n\/\/ and print to serialmon and OLED\nvoid loop() {\n  printGPS_OLED();\n  printGPSInfo();\n  \/\/ \"Smart delay\" looks for GPS data while the Arduino's not doing anything else\n  smartDelay(1000);\n} \/\/end loop\n<\/pre>\n<p>The SerialMonitor.printDate(); \/ SerialMonitor.printTime(); cannot be called as display.printDate() or display.printTime(); for the OLED, as it is not in the Adafruit library, so I'm stuck there for a bit to know combining library functions...?<br \/>\nhmm.. think I have to write my own library addition for that?<br \/>\n<a href=\"https:\/\/www.arduino.cc\/en\/Hacking\/LibraryTutorial\">https:\/\/www.arduino.cc\/en\/Hacking\/LibraryTutorial<\/a><br \/>\nNo, I just had to repeat the long format of date and time in the printGPS_OLED() function:<\/p>\n<pre class=\"lang:default decode:true \">\/******************************************************************************\n  Steve_GPS_OLED.ino to display data in serialmon and OLED, adapted from:\n  TinyGPSPlus_GPS_Shield.ino\n  TinyGPS++ Library Example for the SparkFun GPS Logger Shield\n  By Jim Lindblom @ SparkFun Electronics\n  February 9, 2016\n  https:\/\/stevepedwards.today\/github.com\/sparkfun\/GPS_Shield\n  This example uses SoftwareSerial to communicate with the GPS module on\n  pins 8 and 9. It uses the TinyGPS++ library to parse the NMEA strings sent\n  by the GPS module, and prints interesting GPS information to the serial\n  monitor.\n  After uploading the code, open your serial monitor, set it to 9600 baud, and\n  watch for latitude, longitude, altitude, course, speed, date, time, and the\n  number of visible satellites.\n  Resources:\n  TinyGPS++ Library  - https:\/\/stevepedwards.today\/github.com\/mikalhart\/TinyGPSPlus\/releases\n  SoftwareSerial Library\n  Development\/hardware environment specifics:\n  Arduino IDE 1.6.7\n  GPS Logger Shield v2.0 - Make sure the UART switch is set to SW-UART\n  Arduino Uno, RedBoard, Pro, etc.\n  OLED pins from front are 1 to Nano 5v, 2 to Nano pin GND, 3 to Nano pin A4, 4 to Nano pin A5;\n  Neo7 GPS pins from front are pin 1 to Nano D9, pin2 to D8, pin 3 to GND, pin 4 to Nano 5V;\n******************************************************************************\/\n\/\/#include is used to include outside libraries in your sketch.\n\/\/ 0\/1 UART for programming\/Serial monitor-ing, use SoftwareSerial:\n#include &lt;SoftwareSerial.h&gt;\n#include &lt;Adafruit_GFX.h&gt;\n#include &lt;Adafruit_SSD1306.h&gt;\n#include &lt;TinyGPS++.h&gt; \/\/ Include the TinyGPS++ library\n\/\/ #define is a useful C component that allows the programmer to give a name to a\n\/\/constant value before the program is compiled.\n#define ARDUINO_GPS_RX 9 \/\/ GPS TX, Arduino RX pin\n#define ARDUINO_GPS_TX 8 \/\/ GPS RX, Arduino TX pin\n#define gpsPort ssGPS  \/\/ Alternatively, use Serial1 on the Leonardo\n\/\/ Define the serial monitor port. On the Uno, and Leonardo this is 'Serial'\n\/\/  on other boards this may be 'SerialUSB'\n#define SerialMonitor Serial\n#define GPS_BAUD 9600 \/\/ GPS module baud rate. GP3906 defaults to 9600.\n\/\/ If you're using an Arduino Uno, RedBoard, or any board that uses the\n\/\/ 0\/1 UART for programming\/Serial monitor-ing, use SoftwareSerial:\n\/\/ OLED screen type parameters\n#define SCREEN_WIDTH 128 \/\/ OLED display width, in pixels\n#define SCREEN_HEIGHT 32 \/\/ OLED display height, in pixels\n\/\/ Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)\n#define OLED_RESET     4 \/\/ Reset pin # (or -1 if sharing Arduino reset pin)\nTinyGPSPlus tinyGPS; \/\/ Create a TinyGPSPlus object\n\/\/ NOTE: This define has to be placed below the Adafruit library it comes from as page is read top down!\nAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, OLED_RESET);\nSoftwareSerial ssGPS(ARDUINO_GPS_TX, ARDUINO_GPS_RX); \/\/ Create a SoftwareSerial\n\/\/ Set gpsPort to either ssGPS if using SoftwareSerial or Serial1 if using an\n\/\/ Arduino with a dedicated hardware serial port\n\/\/ Integers are your primary data-type for number storage.\n\/\/ (minimum value of -2^15 and a maximum value of (2^15) - 1)\n\/\/ Arduino takes care of dealing with negative numbers for you\nint m = 0; \/\/ global constant to reserve mem for this data, feet to meters later\n\/\/ The void keyword is used only in function declarations.\n\/\/ It indicates that the function is expected\n\/\/ to return no information to the function from which it was called.\n\/\/ The setup() function is called when a sketch starts. Use it to initialize\n\/\/variables, pin modes, start using libraries, etc. The setup function will only\n\/\/run once,after each powerup or reset of the Arduino board.\nvoid setup()  {\n  SerialMonitor.begin(9600);\n  gpsPort.begin(GPS_BAUD);\n  \/\/ SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally\n  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { \/\/ Address 0x3C for 128x32\n    Serial.println(F(\"SSD1306 allocation failed\"));\n    \/\/ Address 0x3C for 128x32\n    for(;;); \/\/ Don't proceed, loop forever\n  }\n} \/\/ end setup\n\/\/ formats the raw GPS data to readable form using TinyGPS++ Lib\nvoid printGPSInfo() {\n  \/\/ Print latitude, longitude, altitude in feet, course, speed, date, time,\n  \/\/ and the number of visible satellites.\n  SerialMonitor.print(\"Lat: \"); SerialMonitor.println(tinyGPS.location.lat(), 6);\n  SerialMonitor.print(\"Long: \"); SerialMonitor.println(tinyGPS.location.lng(), 6);\n  SerialMonitor.print(\"Alt: \"); SerialMonitor.print(tinyGPS.altitude.feet()); SerialMonitor.println(\" feet\");\n  int m = (tinyGPS.altitude.feet()) \/ 3.28084;\n  SerialMonitor.print(\"Alt: \"); SerialMonitor.print(m); SerialMonitor.println(\" meters\");\n  SerialMonitor.print(\"Date: \"); printDate();\n  SerialMonitor.print(\"Time: \"); printTime();\n  SerialMonitor.print(\"Sats: \"); SerialMonitor.println(tinyGPS.satellites.value());\n  SerialMonitor.println();\n} \/\/end printGPSInfo()\nvoid printGPS_OLED()  {\n  \/\/ OLED screen page 1\n  \/\/ Print latitude, longitude, altitude in feet, course, speed, date, time,\n  \/\/ and the number of visible satellites.\n  display.clearDisplay();\n  display.setTextSize(1);      \/\/ Normal 1:1 pixel scale\n  display.setTextColor(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  display.print(\"Lat: \"); display.println(tinyGPS.location.lat(), 6);\n  display.print(\"Long: \"); display.println(tinyGPS.location.lng(), 6);\n  display.print(\"Alt: \"); display.print(tinyGPS.altitude.feet()); display.println(\" feet\");\n  int m = (tinyGPS.altitude.feet()) \/ 3.28084;\n  display.print(\"Alt: \"); display.print(m); display.print(\" meters\");\n  display.display();\n  delay(3000);\n  \/\/ OLED screen page 2\n  display.clearDisplay();\n  display.setTextSize(1);      \/\/ Normal 1:1 pixel scale\n  display.setTextColor(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  display.print(\"Date: \"); display.print(tinyGPS.date.day());\n  display.print(\"\/\");\n  display.print(tinyGPS.date.month());\n  display.print(\"\/\");\n  display.println(tinyGPS.date.year());\n  display.print(\"Time: \"); display.print(tinyGPS.time.hour());\n  display.print(\":\");\n  if (tinyGPS.time.minute() &lt; 10) display.print('0');\n  display.print(tinyGPS.time.minute());\n  display.print(\":\");\n  if (tinyGPS.time.second() &lt; 10) display.print('0');\n  display.println(tinyGPS.time.second());\n  display.print(\"Sats: \"); display.println(tinyGPS.satellites.value());\n  display.println();\n  display.display();\n  delay(3000);\n} \/\/ end printGPS_OLED()\n\/\/ This custom version of delay() ensures that the tinyGPS object\n\/\/ is being \"fed\". From the TinyGPS++ examples.\nstatic void smartDelay(unsigned long ms)  {\n  unsigned long start = millis();\n  do\n  {\n    \/\/ If data has come in from the GPS module\n    while (gpsPort.available())\n      tinyGPS.encode(gpsPort.read()); \/\/ Send it to the encode function\n    \/\/ tinyGPS.encode(char) continues to \"load\" the tinGPS object with new\n    \/\/ data coming in from the GPS module. As full NMEA strings begin to come in\n    \/\/ the tinyGPS library will be able to start parsing them for pertinent info\n  } while (millis() - start &lt; ms);\n} \/\/ end smartDelay()\n\/\/ printDate() formats the GPS date into dd\/mm\/yy.\nvoid printDate()  {\n  SerialMonitor.print(tinyGPS.date.day());\n  SerialMonitor.print(\"\/\");\n  SerialMonitor.print(tinyGPS.date.month());\n  SerialMonitor.print(\"\/\");\n  SerialMonitor.println(tinyGPS.date.year());\n} \/\/ end printDate()\n\/\/ printTime() formats the GPS time into \"hh:mm:ss\", and prints leading 0's\n\/\/ where they're called for.\nvoid printTime()  {\n  SerialMonitor.print(tinyGPS.time.hour());\n  SerialMonitor.print(\":\");\n  if (tinyGPS.time.minute() &lt; 10) SerialMonitor.print('0');\n  SerialMonitor.print(tinyGPS.time.minute());\n  SerialMonitor.print(\":\");\n  if (tinyGPS.time.second() &lt; 10) SerialMonitor.print('0');\n  SerialMonitor.println(tinyGPS.time.second());\n} \/\/ end printTime()\n\/\/ After creating a setup() function, which initializes and sets the initial values,\n\/\/ loop section loops forever so contained functions from above update new data values from GPS\n\/\/ and print to serialmon and OLED\nvoid loop() {\n  printGPS_OLED();\n  printGPSInfo();\n  \/\/ \"Smart delay\" looks for GPS data while the Arduino's not doing anything else\n  smartDelay(1000);\n} \/\/end loop<\/pre>\n<p><iframe loading=\"lazy\" title=\"OLED GPS date time showing\" width=\"1778\" height=\"1000\" src=\"https:\/\/www.youtube.com\/embed\/TvIdnCdTCyg?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><br \/>\n&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Finally answered some programming fundamentals for myself! The detailed declarations outside of void setup(){} and loop(){} are effectively code modules that can then called as condensed functions later e.g in the main loop (if you want)..duh. I got the oled char code to get going from the Adafruit GFX example. The most important thing I've <a href=\"https:\/\/stevepedwards.today\/ElectronicsStuff\/showing-gps-data-in-128x32-oled\/\" class=\"more-link\">...<span class=\"screen-reader-text\">  Showing GPS  data in 128&#215;32 OLED<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-8558","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/posts\/8558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/comments?post=8558"}],"version-history":[{"count":0,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/posts\/8558\/revisions"}],"wp:attachment":[{"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/media?parent=8558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/categories?post=8558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/stevepedwards.today\/ElectronicsStuff\/wp-json\/wp\/v2\/tags?post=8558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}