{"id":15,"date":"2014-10-30T13:13:00","date_gmt":"2014-10-30T13:13:00","guid":{"rendered":""},"modified":"2021-05-23T16:47:13","modified_gmt":"2021-05-23T15:47:13","slug":"binary-clock-4","status":"publish","type":"post","link":"https:\/\/blog.hslracing.com\/electronics\/2014\/10\/binary-clock-4.html","title":{"rendered":"Binary Clock 4"},"content":{"rendered":"<p>I recently re-read an article, I had originally read some time ago, about an arduino clock source using a single wire, on <a href=\"http:\/\/www.instructables.com\/id\/Make-an-accurate-Arduino-clock-using-only-one-wire\/\">Instructables<\/a>&nbsp;by relic1974, and thought that this might possibly be a more accurate clock signal than the tone value I am currently using.<\/p>\n<p>The internal timer is not overly accurate and there seems to be enough fluctuation in the tone output to cause my clock to gain or lose seconds over a relatively short period of time.<\/p>\n<p>There are no required changes to my board layout as since as with most of the pins on an&nbsp;<a href=\"http:\/\/www.atmel.com\/devices\/attiny44.aspx\">ATtiny44<\/a>,&nbsp;D3 is also an analog pin (A7), in addition to which it is also one of 4 PWM capable pins.<\/p>\n<p>Using a PWM signal makes for slightly smaller hex code as I would no longer require the <a href=\"http:\/\/arduino.cc\/en\/reference\/tone\">tone()<\/a> function, as it would be replaced with an <a href=\"http:\/\/arduino.cc\/en\/Reference\/AnalogWrite\">analogWrite()<\/a> function instead.<\/p>\n<p>The binary sketch size is 3072 bytes for &nbsp;the&nbsp;<a href=\"http:\/\/arduino.cc\/en\/reference\/tone\">tone()<\/a>&nbsp;version and 2264 bytes for the PWM version,<\/p>\n<p>I was not exactly strapped for space&nbsp;on my <a href=\"http:\/\/www.atmel.com\/devices\/attiny44.aspx\">ATtiny44<\/a>&nbsp;chip, but now it will even fit on an&nbsp;<a href=\"http:\/\/www.atmel.com\/devices\/attiny24.aspx\">ATtiny24<\/a>&nbsp;chip.<\/p>\n<div>I have also decided to make use of&nbsp;<a href=\"http:\/\/playground.arduino.cc\/Code\/Bounce\">bounce2<\/a>, newer more enhanced debounce code,&nbsp;which requires a couple more changes.<\/p>\n<p>The full version of the new code is posted below:<br \/><span style=\"font-family: 'Courier New', Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">#include &lt;Bounce2.h&gt;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">#define TONEPIN 7 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Analog pin 7 (pa7) used as PWM output<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">#define BUTTON1 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ digital pin 0 (pb1) used to set clock<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">#define BUTTON2 4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ digital pin 6 (pa6) used to set clock<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">int masterClock = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">int lastsec = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">int seconds = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">int minutes = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">int hours = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">int hms = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">int sw1 = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">int sw2 = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">int both = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">boolean sw1on = false;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">boolean sw2on = false;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">boolean bothon = false;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">const int nPins = 5;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">const int pins[] = {6, 7, 8, 9, 10};<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">const int clock[17][2] = { {6, 7}, {6, 8}, {7, 8}, {8, 9}, {8, 10}, {9, 10}, &nbsp; &nbsp;\/\/ Seconds LEDs<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{7, 6}, {8, 6}, {8, 7}, {9, 8}, {10, 8}, {10, 9}, &nbsp; &nbsp;\/\/ Minutes LEDs<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{9, 6}, {6, 9}, {6, 10}, {10, 7}, {7, 10} }; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ Hours LEDs<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">Bounce button1 = Bounce();<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">Bounce button2 = Bounce();<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">void setup() {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; attachInterrupt(0, tick, CHANGE); \/\/ call ISR on change to INT0 (digital pin 2)<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; analogReference(DEFAULT); &nbsp;\/\/ default 5V reference<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; analogWrite(TONEPIN, 127); \/\/ start PWM with 50% duty cycle as clock input for ISR<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; pinMode(BUTTON1, INPUT); &nbsp; \/\/ setup button1 for input<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; pinMode(BUTTON2, INPUT); &nbsp; \/\/ setup button2 for input<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; button1.attach(BUTTON1);<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; button1.interval(5); &nbsp; &nbsp; &nbsp; \/\/ set 5ms debounce interval for BUTTON1<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; button2.attach(BUTTON2);<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; button2.interval(5); &nbsp; &nbsp; &nbsp; \/\/ set 5ms debounce interval for BUTTON2<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">}<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">void tick() { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ Interrupt Service Routine to generate 1 second &#8220;tick&#8221;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; masterClock++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ increment clock counter<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; if (masterClock &gt;= 979) { &nbsp;\/\/ 980 ticks reached (490Hz * 2)<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; seconds++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ increment seconds<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; masterClock = 0; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ reset masterClock<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">}<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">void turnon(int led) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; int Vcc = clock[led][0];<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; int Gnd = clock[led][1];<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; pinMode(Vcc, OUTPUT);<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; pinMode(Gnd, OUTPUT);<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; digitalWrite(Vcc, HIGH);<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; digitalWrite(Gnd, LOW);<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">}<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">void alloff() {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; for (int i = 0; i &lt; nPins; i++) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; digitalWrite(pins[i], LOW);<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; pinMode(pins[i], INPUT);<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">}<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">void showtime(int Value, int Width, int Offset) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; int mask;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; for (int i = 0; i &lt; Width; i++) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; mask = 1 &lt;&lt; i; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ shift bit mask by current position<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; if (HIGH &amp;&amp; (Value &amp; mask)) { &nbsp; &nbsp; &nbsp;\/\/ check if LED should be lit<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; &nbsp; turnon(Offset + i); &nbsp; \/\/ turn on the LED<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; &nbsp; alloff();<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">}<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">void loop() {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; \/\/ Check if buttons have been pressed &nbsp;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; button1.update(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ update button1<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; button2.update(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ update button2<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; sw1 = button1.read(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ button 1 state<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; sw2 = button2.read(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ button 2 state<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; both = sw1 &amp;&amp; sw2; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ both state<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; if (sw1 == 0) sw1on = false;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; if (sw2 == 0) sw2on = false;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; if (both == 0) bothon = false;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; \/\/ toggle setup states if both buttons are pressed and then released together<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; if (both &amp;&amp; !bothon) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; if (hms == 0) hms=1; &nbsp; &nbsp; &nbsp; \/\/ toggle hours\/minutes\/seconds to hours if entering setup mode<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; else hms = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ toggle hours\/minutes\/seconds to off if leaving setup mode<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; bothon = true; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ set flag for both buttons on<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\"><br \/><\/span><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; \/\/ set hours(1), minutes(2), or seconds(3)<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; if ((hms != 0) &amp;&amp; sw1 &amp;&amp; !sw1on &amp;&amp; !bothon) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; hms++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ toggle hours\/minutes\/seconds<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; if (hms == 4) hms = 1; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ reset back to hours if hms goes beyond seconds<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; sw1on = true;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp;&nbsp;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; if ((hms != 0) &amp;&amp; sw2 &amp;&amp; !sw2on &amp;&amp; !bothon) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; if (hms == 1) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; hours++;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; if (hours == 24) hours = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; if (hms == 2) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; minutes++;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; if (minutes == 60) minutes = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; if (hms == 3) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; seconds = 0;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; sw2on = true;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp;&nbsp;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; \/\/ Adjust the time based on seconds passed<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; if (seconds == 60) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; minutes++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ increment minutes when seconds reach 60<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; if (minutes == 60) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; hours++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ increment hours when minutes reach 60<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; if (hours == 24) {<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; &nbsp; hours = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ reset hours when hours reaches 24<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; &nbsp; minutes = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ reset minutes when minutes reaches 60<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; &nbsp; seconds = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ reset seconds when seconds reaches 60<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; }<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp;&nbsp;<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; showtime(seconds, 6, 0); &nbsp; \/\/ Display seconds (LEDs 0-5)<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; showtime(minutes, 6, 6); &nbsp; \/\/ Display minutes (LEDs 6-11)<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">&nbsp; showtime(hours, 5, 12); &nbsp; &nbsp;\/\/ Display hours (LEDs 12-16)<\/span><br \/><span style=\"font-family: Courier New, Courier, monospace\">}<\/span><\/div>\n","protected":false},"excerpt":{"rendered":"<p>I recently re-read an article, I had originally read some time ago, about an arduino clock source using a single wire, on Instructables&nbsp;by relic1974, and thought that this might possibly be a more accurate clock signal than the tone value I am currently using. The internal timer is not overly accurate and there seems to&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-15","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts\/15","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/comments?post=15"}],"version-history":[{"count":1,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts\/15\/revisions"}],"predecessor-version":[{"id":83,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/posts\/15\/revisions\/83"}],"wp:attachment":[{"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/media?parent=15"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/categories?post=15"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.hslracing.com\/electronics\/wp-json\/wp\/v2\/tags?post=15"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}