{"id":1509,"date":"2022-12-14T23:02:24","date_gmt":"2022-12-14T22:02:24","guid":{"rendered":"https:\/\/theroamingworkshop.cloud\/b\/?p=1509"},"modified":"2023-04-14T23:14:53","modified_gmt":"2023-04-14T22:14:53","slug":"temps-i-7-reloj-de-sobremesa-casero-con-wifi-sensor-de-temperatura-presion-y-autonomia-48h","status":"publish","type":"post","link":"https:\/\/theroamingworkshop.cloud\/b\/1509\/temps-i-7-reloj-de-sobremesa-casero-con-wifi-sensor-de-temperatura-presion-y-autonomia-48h\/","title":{"rendered":"Temps-i 7: reloj de sobremesa casero con WIFI, sensor de temperatura-presi\u00f3n y autonom\u00eda +48h."},"content":{"rendered":"\n<p>Despu\u00e9s de muchas idas y venidas, pruebas, redise\u00f1os, quemaduras, cortes y alguna que otra peque\u00f1a explosi\u00f3n, por fin traigo un del reloj de mesa inteligente en el que llevo dos a\u00f1os trabajando. Hacer un tutorial completo y detallado ser\u00eda todav\u00eda m\u00e1s largo y tedioso, pero espero que estas pinceladas sean de ayuda para hacer el tuyo propio. Aviso de que se requiere mucho tiempo y pr\u00e1ctica y no se puede hacer a la ligera&#8230;<\/p>\n\n\n\n<div id=\"menu\" style=\"padding:20px 20px 20px 20px; border-left:2px solid darkgrey;\">\n<p style=\"font-weight:bold;\">Contenido<\/p>\n<\/div>\n<script>\nvar text;\nvar element;\n\nfunction fillmenu(){\n\nfor (let i=0; i<window.document.getElementsByTagName(\"h2\").length; i++){\nelement = window.document.getElementsByTagName(\"h2\")[i];\ntext = \"\u25b9 \"+element.innerHTML;\nvar newelement = document.createElement(\"a\");\nnewelement.innerHTML=text;\nvar postid=window.document.getElementsByTagName(\"article\")[0].id;\nvar url = \"https:\/\/theroamingworkshop.cloud\/b\/?p=\"+postid.substr(5,postid.length)+\"#\"+element.id;\nnewelement.setAttribute(\"href\", url);\nnewelement.appendChild(document.createElement(\"br\"));\nwindow.document.getElementById(\"menu\").appendChild(newelement);\n}\n}\n\nif(window.location.href.includes(\"tag\")){\n\n}else{\nwindow.setTimeout(fillmenu,2000);\n}\n\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"que-es-tempsi-7\">Qu\u00e9 es Temps-i 7?<\/h2>\n\n\n\n<p>Desgranemos su nombre:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Temps<\/strong> es tiempo en valenciano,<\/li>\n\n\n\n<li><strong>i<\/strong> de internet, que es de donde obtiene la hora,<\/li>\n\n\n\n<li><strong>7<\/strong> de la pantalla que utiliza, de 7 segmentos para cada d\u00edgito.<\/li>\n<\/ul>\n\n\n\n<p>Estos tres conceptos definen a este compacto reloj de sobremesa, con conectividad WIFI, sensor de temperatura y buena autonom\u00eda.<\/p>\n\n\n\n<p>Vamos a ver c\u00f3mo se hace!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"componentes\">Componentes<\/h2>\n\n\n\n<p>Primero, veamos los ingredientes de la receta y qu\u00e9 hace cada uno:<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps1.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" data-id=\"1649\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps1.jpg\" alt=\"\" class=\"wp-image-1649\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps1.jpg 500w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps1-300x300.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps1-150x150.jpg 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><figcaption class=\"wp-element-caption\">Sparkfun Esp32 Thing<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps2-edited.jpeg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"497\" height=\"497\" data-id=\"1651\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps2-edited.jpeg\" alt=\"\" class=\"wp-image-1651\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps2-edited.jpeg 497w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps2-edited-300x300.jpeg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps2-edited-150x150.jpeg 150w\" sizes=\"auto, (max-width: 497px) 100vw, 497px\" \/><\/a><figcaption class=\"wp-element-caption\">Pantalla de segmentos<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps3.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1100\" height=\"1422\" data-id=\"1652\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps3.jpg\" alt=\"\" class=\"wp-image-1652\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps3.jpg 1100w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps3-232x300.jpg 232w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps3-792x1024.jpg 792w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps3-768x993.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps3-676x874.jpg 676w\" sizes=\"auto, (max-width: 1100px) 100vw, 1100px\" \/><\/a><figcaption class=\"wp-element-caption\">BMP-280<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps4.jpeg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"225\" height=\"225\" data-id=\"1653\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps4.jpeg\" alt=\"\" class=\"wp-image-1653\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps4.jpeg 225w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps4-150x150.jpeg 150w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/a><figcaption class=\"wp-element-caption\">Resistencias<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps5.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"961\" data-id=\"1654\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps5.jpg\" alt=\"\" class=\"wp-image-1654\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps5.jpg 1280w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps5-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps5-1024x769.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps5-768x577.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps5-676x508.jpg 676w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><figcaption class=\"wp-element-caption\">PCB personalizada<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps6.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"960\" data-id=\"1655\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps6.jpg\" alt=\"\" class=\"wp-image-1655\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps6.jpg 1280w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps6-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps6-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps6-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps6-676x507.jpg 676w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><figcaption class=\"wp-element-caption\">LiPo 3.7v 1000mAh<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Placa <strong><a rel=\"noreferrer noopener\" href=\"https:\/\/learn.sparkfun.com\/tutorials\/esp32-thing-hookup-guide\" target=\"_blank\">ESP32-Thing de SparkFun<\/a><\/strong><br>&gt;&gt;Microcontrolador de altas prestaciones con conectividad WIFI y Bluetooth gracias al chip ESP32 integrado, ideal para proyectos de IoT.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pantalla de <strong>4 d\u00edgitos de 7 segmentos<\/strong> de color rojo.<br>&gt;&gt;Mostrar\u00e1 la hora y la temperatura.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M\u00f3dulo <a href=\"https:\/\/learn.adafruit.com\/adafruit-bmp280-barometric-pressure-plus-temperature-sensor-breakout\/overview\"><strong>BMP-280<\/strong><\/a><br>&gt;&gt;Sensor digital de temperatura y presi\u00f3n barom\u00e9trica muy compacto.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Resistencias<\/strong> de 100 Ohm.<br>&gt;&gt;Necesarias para reducir la corriente en la pantalla, sin disminuir excesivamente su brillo (admite hasta 1k Ohm, pero as\u00ed ser\u00eda dif\u00edcilmente visible con la luz del d\u00eda).<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Placa <strong>PCB<\/strong> con circuito impreso personalizado.<br>&gt;&gt;Simplifica la conexi\u00f3n de la pantalla y las resistencias al microcontrolador.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bater\u00eda<\/strong> LiPo 3.7v <strong>1000mAh<\/strong><br>&gt;&gt;Asegura una autonom\u00eda de m\u00e1s de 48 horas sin alimentaci\u00f3n externa.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cables puente<\/strong>.<br>&gt;&gt;Para realizar conexiones adicionales con los m\u00f3dulos externos.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pulsador<\/strong><br>&gt;&gt;Usado para alternar el programa mostrado en pantalla.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dise\u00f1o-electronico\">Dise\u00f1o electr\u00f3nico<\/h2>\n\n\n\n<p>Es muy importante <strong>estudiar los componentes<\/strong> electr\u00f3nicos que vamos a utilizar, leer todas las <strong>especificaciones<\/strong> y <strong>prototipar<\/strong> con todas las precauciones antes de ponernos a soldar como locos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"eleccion-de-componentes\">Elecci\u00f3n de los componentes<\/h3>\n\n\n\n<p>Los componentes arriba listados no son mera casualidad ni copia de ninguna otra parte. Simplemente son la prueba m\u00e1s exitosa de muchas otras y que cumplen todas las necesidades del proyecto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La pantalla de 4 d\u00edgitos <strong>muestra exclusivamente lo que busco<\/strong> ver: la hora. Si adem\u00e1s puedo aprovechar para mostrar la temperatura, pues mejor. Pero una pantalla de m\u00e1s calidad, de tipo LCD, generar\u00eda un mayor <strong>consumo<\/strong> realmente innecesario ya que otra de las caracter\u00edsticas fundamentales es la <strong>autonom\u00eda<\/strong>.<\/li>\n\n\n\n<li>El microcontrolador cuenta con <strong>conexi\u00f3n a internet<\/strong>, as\u00ed como suficiente <strong>capacidad de c\u00f3mputo<\/strong>. Adem\u00e1s, tiene <strong>suficientes pines entrada\/salida<\/strong> para manejar la pantalla sin necesidad de un expansor de pines. Otras opciones que he probado:\n<ul class=\"wp-block-list\">\n<li>Microcontroladores <strong>m\u00e1s compactos<\/strong>: Teensy 4, Digispark, SparkFun Pro Micro. <strong>Necesitan expansor de entrada\/salida<\/strong> (PCF8574) <strong>y\/o m\u00f3dulo WIFI<\/strong> (ESP-01). Adem\u00e1s, requiere demasiadas conexiones.<\/li>\n\n\n\n<li>Microcontralor <strong>con conexi\u00f3n WIFI integrada<\/strong> <strong>y suficientes E\/S<\/strong>, como la NodeMCU con Esp8266. <strong>Faltaba potencia<\/strong> en el procesador y se retrasaba casi 4 segundos en cada minuto.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"prototipado-de-circuito-electrico\">Prototipado del circuito el\u00e9ctrico<\/h3>\n\n\n\n<p>Una vez estudiados y obtenidos los componentes, los conectamos en una <strong>placa de prototipos<\/strong> (o protoboard) para probar su funcionamiento.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps11.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps11-1024x768.jpg\" alt=\"\" class=\"wp-image-1656\" width=\"512\" height=\"384\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps11-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps11-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps11-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps11-676x507.jpg 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps11.jpg 1280w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>En mi caso, tras varias combinaciones de pines, la forma m\u00e1s organizada me ha resultado ser la siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">ESP32-Thing<\/th><th class=\"has-text-align-center\" data-align=\"center\">Componente<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">VBAT<\/td><td class=\"has-text-align-center\" data-align=\"center\">LiPo +<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3V3<\/td><td class=\"has-text-align-center\" data-align=\"center\">BMP-280 3V3<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GND<\/td><td class=\"has-text-align-center\" data-align=\"center\">LiPo -<br>BMP GND<br>BMP SD0<br>Pulsador -<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO21<\/td><td class=\"has-text-align-center\" data-align=\"center\">BMP SDA<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO04<\/td><td class=\"has-text-align-center\" data-align=\"center\">BMP SCL<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO32<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pulsador +<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO17<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla D\u00edgito 1<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO23<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla D\u00edgito 2<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO19<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla D\u00edgito 3<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO25<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla D\u00edgito 4<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO15<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla Segmento A<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO22<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla Segmento B<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO27<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla Segmento C<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO12<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla Segmento D<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO13<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla Segmento E<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO18<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla Segmento F<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO26<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla Segmento G<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">GPIO14<\/td><td class=\"has-text-align-center\" data-align=\"center\">Pantalla Segmento P (punto)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"esquema-de-patillaje\">Esquema de patillaje<\/h3>\n\n\n\n<p>Una vez tengamos el prototipo montado, es bueno pasarlo a un esquema con un programa de <strong>EDA<\/strong> (<strong>a<\/strong>utomatizaci\u00f3n de <strong>d<\/strong>ise\u00f1o <strong>e<\/strong>lectr\u00f3nico) como <strong><a rel=\"noreferrer noopener\" href=\"https:\/\/www.kicad.org\/\" target=\"_blank\">Kicad<\/a><\/strong>, donde tambi\u00e9n podremos generar un dise\u00f1o de PCB para mandar a fabricar. Si no, siempre puedes hacer el esquema en papel, ya que dentro de dos meses no vas a recordar d\u00f3nde iba cada cable...<\/p>\n\n\n\n<p><strong>Kicad<\/strong> tiene su truquillo y es bueno practicar antes con proyectos m\u00e1s sencillos. Aun as\u00ed, es asequible para usuarios medios, ya que b\u00e1sicamente consiste en <strong>buscar y elegir s\u00edmbolos de nuestros componentes<\/strong> y <strong>conectar sus pines correctamente seg\u00fan sus especificaciones<\/strong>.<\/p>\n\n\n\n<p>Yo, para no liar la cosa de cables en el papel, he usado nombres en cada conexi\u00f3n, que tambi\u00e9n es v\u00e1lido en <strong>Kicad<\/strong>. Adem\u00e1s, ver\u00e1s que <strong>la ESP32-Thing est\u00e1 compuesta por dos tiras de 20x pines<\/strong>, ya que no encontr\u00e9 ning\u00fan s\u00edmbolo que me funcionara y no ten\u00eda tiempo de dise\u00f1arlo como toca. Lo importante es que nuestro dise\u00f1o <strong>funcione y sea coherente<\/strong> con la realidad.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps17.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"385\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps17-1024x385.png\" alt=\"\" class=\"wp-image-1924\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps17-1024x385.png 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps17-300x113.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps17-768x289.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps17-1536x578.png 1536w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps17-676x254.png 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps17.png 1767w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Esquema de Kicad<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Lo siguiente es <strong>asignar huellas<\/strong> realistas (o <strong>footprints<\/strong>) a cada s\u00edmbolo de componente, y entonces podremos dise\u00f1ar una placa de circuito impreso (o PCB) que podemos enviar a fabricar (normalmente a China) por unos 15\u20ac \/ 5 placas.<\/p>\n\n\n\n<p>No hay que volverse muy locos con esto, especialmente si no somos expertos. Yo solo lo uso para facilitar las soldaduras cuando hay muchas conexiones, como es este caso donde <strong>se realizan unas 90 soldaduras<\/strong> pero se mantiene un formato bastante compacto.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps18.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"616\" data-id=\"1925\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps18-1024x616.png\" alt=\"\" class=\"wp-image-1925\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps18-1024x616.png 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps18-300x180.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps18-768x462.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps18-676x407.png 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps18.png 1297w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Dise\u00f1o de PCB en Kicad<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps19.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"558\" data-id=\"1926\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps19-1024x558.png\" alt=\"\" class=\"wp-image-1926\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps19-1024x558.png 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps19-300x163.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps19-768x418.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps19-1536x836.png 1536w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps19-676x368.png 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps19.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Visor PCB en 3D<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps20-edited.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"960\" data-id=\"1928\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps20-edited.jpg\" alt=\"\" class=\"wp-image-1928\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps20-edited.jpg 960w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps20-edited-300x300.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps20-edited-150x150.jpg 150w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps20-edited-768x768.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps20-edited-676x676.jpg 676w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/a><figcaption class=\"wp-element-caption\">PCBs encargadas<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"programacion-del-reloj\">Programaci\u00f3n del reloj<\/h2>\n\n\n\n<p>La mayor\u00eda de microcontroladores, como el ESP32-Thing, son <strong>compatibles con el <a href=\"https:\/\/www.arduino.cc\/en\/software\" target=\"_blank\" rel=\"noreferrer noopener\">IDE de Arduino<\/a><\/strong>, lo cual facilitar\u00e1 la conexi\u00f3n con la placa para enviarle un programa de reloj.<\/p>\n\n\n\n<p>Antes de empezar, es importante hacer un peque\u00f1o <strong>listado de las tareas y funciones<\/strong> que queremos incluir en el programa e irlo modificando mientras las programamos. De esta forma podremos probar las distintas funciones por separado, y debuguear los distintos pasos para corregir errores m\u00e1s r\u00e1pidamente. En mi caso, de nuevo tras muchas pruebas, quiero que el programa conste de lo siguiente:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Definici\u00f3n de librer\u00edas y variables.<\/li>\n\n\n\n<li>Configuraci\u00f3n de pines.<\/li>\n\n\n\n<li>Conexi\u00f3n WiFi.<\/li>\n\n\n\n<li>Obtener fecha por SNTP.<\/li>\n\n\n\n<li>Desconexi\u00f3n y apagado de WiFi (ahorra bater\u00eda).<\/li>\n\n\n\n<li>Conversi\u00f3n de fecha a d\u00edgitos.<\/li>\n\n\n\n<li>Muestra de d\u00edgitos en pantalla.<\/li>\n\n\n\n<li>Iniciar temporizador.<\/li>\n\n\n\n<li>Iniciar lectura de pin de cambio de programa.<\/li>\n\n\n\n<li>Cambio de programa al activar el pulsador.\n<ol class=\"wp-block-list\">\n<li>Lectura de sensores.<\/li>\n\n\n\n<li>Muestra de temperatura en pantalla.<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li>Actualizar hora al finalizar el temporizador (cada minuto).<\/li>\n\n\n\n<li>Reiniciar temporizador.<\/li>\n<\/ol>\n\n\n\n<p>No me quiero entretener mucho con el c\u00f3digo, y encima no es el m\u00e1s ordenado que tengo, pero lo dejo aqu\u00ed incrustado para quien lo quiera copiar, o tambi\u00e9n en github:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/TheRoam\/Tempsi-7\">https:\/\/github.com\/TheRoam\/Tempsi-7<\/a><\/p>\n\n\n\n<div style=\"height:350px;overflow-x:hidden;padding:2px 2px 2px 2px;\"><pre class=\"wp-block-code\"><code style=\"display:block;width:100%;\">\/\/----------------------------------------------------------------\/\/\n\/\/    Temps-i 7 WiFi clock and temperature in 4 digit display     \/\/\n\/\/  v 1.0.1                                                       \/\/\n\/\/                                                                \/\/\n\/\/  Interfaces:                                                   \/\/\n\/\/  - Sparkfun ESP32-Thing micocontroller                         \/\/\n\/\/  - BMP-280 temperature and pressure digital sensor             \/\/\n\/\/  - 4 digit 7 segment display                                   \/\/\n\/\/  - Programm push button                                        \/\/\n\/\/  - LiPo Battery                                                \/\/\n\/\/                                                                \/\/\n\/\/  Detailed documentation:                                       \/\/\n\/\/  https:\/\/theroamingworkshop.cloud                              \/\/\n\/\/                                                                \/\/\n\/\/                \u00a9 THE ROAMING WORKSHOP 2022                     \/\/\n\/\/----------------------------------------------------------------\/\/\n#include < esp_wifi.h >\n#include < WiFi.h >\n#include < WiFiMulti.h >\n#include \"time.h\"\n#include \"sntp.h\"\n#include < Wire.h >\n#include < Adafruit_BMP280.h >\n\/\/ Spaces inside <> only shown for correct html display. Remove them in Arduino IDE\n\/\/BMP280 sensor using I2C interface\nAdafruit_BMP280 bmp;\n#define BMP_SCK  (4)\n#define BMP_MISO (21)\n#define BMP_MOSI (4)\n#define BMP_CS   (21)\n\/\/Sensor variables\nfloat TEMP=0;     \/\/temperature variable\nfloat ALT=0;      \/\/altitude variable\nfloat PRES=0;     \/\/pressure variable\nfloat hREF=1020.0;\/\/sea level reference pressure in hPa\n\/\/define time variables\nRTC_DATA_ATTR long long TIME=0; \/\/concatenated time\nRTC_DATA_ATTR long long d=0;  \/\/day\nRTC_DATA_ATTR long long m=0;  \/\/month\nRTC_DATA_ATTR long long Y=0;  \/\/year\nRTC_DATA_ATTR long long H=0;  \/\/hour\nRTC_DATA_ATTR long long M=0;  \/\/minute\nRTC_DATA_ATTR long long S=0;  \/\/second\nRTC_DATA_ATTR uint32_t dS=0;  \/\/seconds counter for dot\nRTC_DATA_ATTR struct tm timeinfo; \/\/saves full date variable\nlong long inicio=0; \/\/saves start time\nlong long ahora=0;  \/\/saves current time\n\/\/Define digit pins in an array, in display order, for looping\n\/\/Numbers match ESP32-Thing GPIO number\nint DigPins[4]{\n  17,\/\/ first digit (GPIO 17)\n  23,\/\/second digit (GPIO 23)\n  19,\/\/third digit  (GPIO 19)\n  25\/\/fourth digit  (GPIO  25)\n};\n\/\/Define segment pins\n\/\/Numbers match ESP32-Thing GPIO number\nint SegPins[8]{\n  14,   \/\/P\n  26,   \/\/g\n  18,   \/\/f\n  13,   \/\/e\n  12,   \/\/d\n  27,   \/\/c\n  22,   \/\/b\n  15    \/\/a\n};\n\/\/Auxiliary variables\n\/\/Numbers match ESP32-Thing GPIO number\nint ProgPin=32;   \/\/Pin no used for program\nint ButtonStatus=1;\nint ledPin=5;     \/\/Used to blink the ESP32-Thing blue led\nint ProgNum=-1;   \/\/Define a variable to keep track of current program number\n\/\/ WIFI\n\/\/ Define your wifi network and credentials\nchar ssid1[] = \"YOUR_WIFI_SSID1\";\nchar pass1[] = \"YOUR_WIFI_PASS1\";\nchar ssid1[] = \"YOUR_WIFI_SSID2\";\nchar pass1[] = \"YOUR_WIFI_PASS2\";\nWiFiMulti wifiMulti;\n\/\/ NTP variables\n\/\/ Update time zone if needed\nconst char* ntpServer1 = \"pool.ntp.org\";\nconst char* ntpServer2 = \"time.nist.gov\";\nconst long  gmtOffset_sec = 3600;\nconst int   daylightOffset_sec = 0; \/\/this will be corrected later with software\nconst char* time_zone = \"CET-1CEST,M3.5.0,M10.5.0\/3\";  \/\/ TimeZone rule for Europe\/Rome including daylight adjustment rules (optional)\n\/\/ Displayed characters in every digit are a byte array indicating ON (1) and OFF (0) segments\n\/\/ Use a wiring pattern that matches an understandable byte chain so you can make them up easily\n\/\/ Segment\/byte pattern: Babcdefgp --> where 1 is HIGH (ON) and 0 is LOW (OFF)\n\/\/ Refer to a character by calling this array, i.e.:\n\/\/  - call number 3 by calling ns[3]\n\/\/  - call letter A by calling ns[20]\n\/\/  - call underscore symbol (_) by calling ns[49]\nbyte ns[50]{ \/\/ Array Position - Byte character\n  B11111100,\/\/ 0-0\n  B01100000,\/\/ 1-1\n  B11011010,\/\/ 2-2\n  B11110010,\/\/ 3-3\n  B01100110,\/\/ 4-4\n  B10110110,\/\/ 5-5\n  B10111110,\/\/ 6-6\n  B11100000,\/\/ 7-7\n  B11111110,\/\/ 8-8\n  B11110110,\/\/ 9-9\n  B11111101,\/\/ 10-0.\n  B01100001,\/\/ 11-1.\n  B11011011,\/\/ 12-2.\n  B11110011,\/\/ 13-3.\n  B01100111,\/\/ 14-4.\n  B10110111,\/\/ 15-5.\n  B10111111,\/\/ 16-6.\n  B11100001,\/\/ 17-7.\n  B11111111,\/\/ 18-8.\n  B11110111,\/\/ 19-9.\n  B11101110,\/\/ 20-A\n  B00111110,\/\/ 21-b\n  B10011100,\/\/ 22-C\n  B01111010,\/\/ 23-d\n  B10011110,\/\/ 24-e\n  B10001110,\/\/ 25-f\n  B10111100,\/\/ 26-G\n  B00101110,\/\/ 27-h\n  B00001100,\/\/ 28-I\n  B11111000,\/\/ 29-J\n  B01101110,\/\/ 30-K(H)\n  B00011100,\/\/ 31-L\n  B00101010,\/\/ 32-m(n)\n  B00101010,\/\/ 33-n\n  B00111010,\/\/ 34-o\n  B11001110,\/\/ 35-P\n  B11100110,\/\/ 36-q\n  B00001010,\/\/ 37-r\n  B10110110,\/\/ 38-S\n  B00011110,\/\/ 39-t\n  B01111100,\/\/ 40-U\n  B00111000,\/\/ 41-v\n  B00111000,\/\/ 42-w(v)\n  B01101110,\/\/ 43-X(H)\n  B01110110,\/\/ 44-y\n  B11011010,\/\/ 45-Z\n  B00000001,\/\/ 46-. (dot)\n  B11000110,\/\/ 47-* (astherisc)\n  B00000010,\/\/ 48-- (hyphon)\n  B00010000,\/\/ 49-_ (underscore)\n};\n\/\/array to store displayed digits\nint digits[4];\n\/\/digit calculation variables\nint first_digit = 0;\nint second_digit = 0;\nint third_digit = 0;\nint fourth_digit = 0;\n\/\/counters for looping digits and current number\nint dig=0;\nint n=0;\nint dot=1;\nvoid setup()\n{\n  \/\/ Start disabling bluetooth and WIFI to save energy\n  \/\/ Just power WIFI later, when needed.\n  esp_err_t esp_bluedroid_disable(void);\n  esp_err_t esp_bt_controller_disable(void);\n  WiFi.disconnect(true);\n  WiFi.mode(WIFI_OFF);\n  \n  \/\/ Start serial communication for any debug messages\n  \/\/ Commented for production; uncomment for debugging\n  \/\/Serial.begin(115200);\n  \/\/Define I2C pins, as we are not using standard ones\n  Wire.begin(21,4);\n  \/\/ Activate digit pins looping the pin array.\n  for (dig=0; dig<4; dig++){\n    pinMode(DigPins[dig], OUTPUT);\n  }\n  for (dig=0; dig<4; dig++){  \/\/set them LOW (turn them OFF)\n    digitalWrite(DigPins[dig], LOW);\n  }\n  \/\/ Activate segment pins\n  for (int i=0; i<8; i++){\n    pinMode(SegPins[i],OUTPUT);\n  }\n  \/\/ Activate LED pin\n  pinMode(ledPin, OUTPUT);\n  \/\/ Activate PROG pin\n  pinMode(ProgPin, INPUT_PULLUP);\n  \/\/ Turn ON Wifi\n  wifiON();\n  \n  \/\/ Setup NTP parameters\n  sntp_set_time_sync_notification_cb( timeavailable );\n  sntp_servermode_dhcp(1);\n  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);\n  \/\/wait for date\n  do{\n    delay(100);\n  }while(TIME==0);\n  delay(500);\n  \/\/WIFI can be turned off now\n  wifiOFF();  \n  \/\/ Setup BMP280\n  unsigned status;\n  \/\/BMP-280 I2C Address:\n  \/\/ 0x76 if SD0 is grounded\n  \/\/ 0x77 if SD0 is high\n  status = bmp.begin(0x76);\n  if (!status) {\n    Serial.println(F(\"Could not find a valid BMP280 sensor, check wiring or \"\n                      \"try a different address!\"));\n    Serial.print(\"SensorID was: 0x\"); Serial.println(bmp.sensorID(),16);\n    Serial.print(\"        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\\n\");\n    Serial.print(\"   ID of 0x56-0x58 represents a BMP 280,\\n\");\n    Serial.print(\"        ID of 0x60 represents a BME 280.\\n\");\n    Serial.print(\"        ID of 0x61 represents a BME 680.\\n\");\n    ESP.restart();\n    while (1) delay(10);\n  }\n  \/\/Default settings from datasheet.\n  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     \/\/ Operating Mode.\n                  Adafruit_BMP280::SAMPLING_X2,     \/\/ Temp. oversampling\n                  Adafruit_BMP280::SAMPLING_X16,    \/\/ Pressure oversampling\n                  Adafruit_BMP280::FILTER_X16,      \/\/ Filtering.\n                  Adafruit_BMP280::STANDBY_MS_500); \/\/ Standby time.\n  \/\/get initial readings\n  readSensors();\n  \n  \/\/ Get correct time\n  sync_clock();\n  num_shift();\n  \/\/ Set start time\n  inicio = millis();\n  \/\/ Set dot time\n  dS=millis();\n}\nvoid loop(){\n  \/\/ After setup, this function will loop until shutdown.\n  \n  \/\/ Start time counter using chip's milisecond counter\n  uint32_t ahora=millis();\n  \n  \/\/ Check if the counter has reached 60000 miliseconds.\n  \/\/ Calibrate if you realize that time desyncs\n  \/\/ This depends on processor calculation, which can vary with input voltage (if on batteries) and temperature.\n  while ( (ahora-inicio+(S*1000)) < 59500){\n    \/\/ Run dot blinker when not showing temperature\n    \/\/commented as it sometimes desyncs the hour digit (needs fixing)\n    \/*if(ProgNum==-1){\n      dot_blinker();\n    }*\/\n    \n    \/\/ Reading push button:\n    \/\/ when pressed change status\n    if(digitalRead(ProgPin)==1){\n      ButtonStatus=1;\n    }\n    \/\/ when released after press, set \"program change\" status\n    \/\/ this avoids constant change when holding\n    if(digitalRead(ProgPin)==0 &#038;&#038; ButtonStatus==1){\n      ButtonStatus=2;\n    }\n    \/\/ Status 2 -> Programm change\n    if(ButtonStatus==2){\n      \/\/reset status\n      ButtonStatus=0;\n      \/\/update programm number\n      ProgNum=-ProgNum;\n      Serial.println(ProgNum);\n      \/\/change to temp\n      if(ProgNum==1){\n       \/\/light LED\n       digitalWrite(ledPin, HIGH); \n       \/\/save TIME\n       TIME=digits[0]*1000+(digits[1]-10)*100+digits[2]*10+digits[3];\n       \/\/show temp\n       room_temp();\n      }else if(ProgNum==-1){  \/\/change to time\n        \/\/turn off LED\n        digitalWrite(ledPin, LOW);\n        \/\/restore time\n        split_time(TIME);\n      }\n    }\n    \n    \/\/update time counter\n    ahora=millis();\n    num_shift();\n    delay(6);\n  }\n  \/\/ End of while() after 60 seconds\n  \/\/ Reset initial time\n  S=0;\n  inicio=millis();\n  \/\/make sure there's dot at the end\n  if(digits[1]<=10){\n    digits[1]+10;\n    dot=0;\n  }\n  \/\/update time\n  \/\/if program is in temperature, change to time\n  if(ProgNum==1){\n    split_time(TIME);\n    ProgNum=-1;\n  }\n  updateMinutes();\n}\n\/\/-WIFI function\n\/\/--Setup and turn Wifi ON\nvoid wifiON(){\n  \/\/ Set up WIFI (ESP32 Thing only working with wifiMulti library)\n  Serial.println(\"Conectando\");\n  wifiMulti.addAP(ssid1,pass1);\n  \/\/wifiMulti.addAP(ssid2,pass2);\n  int led=1;\n  int boot=1;\n  wifiMulti.run();\n  \/\/WiFi.disconnect(true);\n  \n  while((WiFi.status() != WL_CONNECTED)){\n    digitalWrite(ledPin, HIGH);\n    delay(500);\n    digitalWrite(ledPin,LOW);\n    delay(500);\n    wifiMulti.run();\n  }\n  \/\/ Make sure LED is off when finished\n  digitalWrite(ledPin,LOW);\n  \/\/ When CONNECTED, while loop ends.\n  Serial.print(\"Conectado a \");\n  Serial.println(WiFi.SSID());\n  Serial.println(WiFi.localIP());\n}\n\/\/-Disable WIFI\nvoid wifiOFF(){\n  \/\/turn WIFI off as it's not needed any more\n  WiFi.disconnect(true);\n  WiFi.mode(WIFI_OFF);\n  \/\/disable wifi (deinit clears all flash data)\n  esp_wifi_deinit();\n}\n\/\/----BMP280 functions\n\/\/-Read sensor data\nvoid readSensors(){\n  TEMP=bmp.readTemperature();\n  Serial.println(\"T: \"+(String)TEMP+\"\u00baC\");\n  PRES=bmp.readPressure();\n  Serial.println(\"P: \"+(String)PRES+\"hPa\");\n  ALT=bmp.readAltitude(hREF);\n  Serial.println(\"h: \"+(String)ALT+\"msnm\");\n}\n\/\/----NTP functions\n\/\/-Callback function (get's called when time adjusts via NTP)\nvoid timeavailable(struct timeval *t)\n{\n  Serial.println(\"Got time adjustment from NTP!\");\n  simpleTime();\n}\nvoid simpleTime()\n{ \n  if(!getLocalTime(&#038;timeinfo)){\n    Serial.println(\"No time available (yet)\");\n    return;\n  }\n  Serial.print(\"Synced time: \");\n  Serial.println(&#038;timeinfo, \"%A, %B %d %Y %H:%M:%S\");\n  \/\/save time\n  sync_clock();\n}\n\/\/-\n\/\/PROGRAM #0: HELLO at startup\n\/\/function to say \"HOLA\" at start up while connecting to WiFi\nvoid ini_HOLA(){\n  int h=30;\n  int o=34;\n  int l=31;\n  int a=20;\n  digits[0]=46;\n  digits[1]=46;\n  digits[2]=46;\n  digits[3]=46;\n}\n\/\/PROGRAM #1: WiFi synced time\n\/\/function that gets current time via WiFi\nvoid sync_clock(){\n  Y=timeinfo.tm_year;\n    TIME=TIME+Y*10000000000;\n  m=timeinfo.tm_mon;\n  m=m+1;\n    TIME=TIME+m*100000000;\n  d=timeinfo.tm_mday;\n    TIME=d*1000000;\n  H=timeinfo.tm_hour;\n  \/\/check daylight saving time and correct hour\n  \/\/\"27 Mar (03 27) +1 hour; 30 Oct (10 30) back -1 hour\"\n  if( ( m*100+d >= 327 ) && ( m*100+d < 1030 ) ){\n    H=H+1;\n  }else{\n    H=H;\n  }\n  TIME=TIME+H*10000;\n  M=timeinfo.tm_min;\n    TIME=TIME+M*100;\n  S=timeinfo.tm_sec;\n    TIME=TIME+S;\n    \n  \/\/split current 4 digit time into sigle digits\n  split_time((TIME\/100)-((TIME\/100)\/10000)*10000);\n}\n\/\/number splitting function to separate time string into digits\nvoid split_time(long long num) {\n  first_digit = num \/ 1000;\n  digits[0] = first_digit;\n  int first_left = num - (first_digit * 1000);\n  second_digit = first_left \/ 100;\n  digits[1] = second_digit;\n  \/\/a\u00f1adimos el segundero fijo (sumamos 10)\n  digits[1] = digits[1]+10;\n  int second_left = first_left - (second_digit * 100);\n  third_digit = second_left \/ 10;\n  digits[2] = third_digit;\n  fourth_digit = second_left - (third_digit * 10);\n  digits[3] = fourth_digit;\n}\n\/\/ number shifting function\nvoid num_shift(){\n  for (dig=0; dig<4; dig++){\/\/ turn digits off\n    digitalWrite(DigPins[dig], HIGH);\n  }\n  \n  \/\/turn them ON (LOW) one by one\n    digitalWrite(DigPins[n], LOW);\n    for(int seg=7; seg>=0; seg--){\n      \/\/read byte array for digit\n      int x = bitRead(ns[digits[n]],seg);\n      \/\/turn the segments ON or OFF\n      digitalWrite(SegPins[seg],x);\n    }\n    n++;\/\/ move to next no.\n    if (n==4){\/\/ if no. is 4, restart\n      n=0;\n    }\n}\n\/\/Getting room temperature from LM35 sensor via NodeMCU analog input pin (ADC)\nvoid room_temp(){\n  readSensors();\n  \/\/This will return temperature in XY.Z format\n  \/\/We don't want the integer value, so we can use the four digits to display temperature units as well \"XY\u00baC\"\n  \/\/Getting first digit in byte format ns[X] where X=int(XY.Z\/10)=int(X.YZ)=X\n  digits[0]=int(TEMP\/10)-int(TEMP\/100)*10;\n  \/\/Getting second digit in byte format ns[Y] where Y=int(XY.Z)-X*10=int(XY.Z)-int(XY.Z\/10)*10\n  digits[1]=int(TEMP\/1)-int(TEMP\/10)*10;\n  \/\/Setting temperature units as degree celsius (\u00baC) in byte format\n  digits[2]=47; \/\/astherisc *\n  digits[3]=22; \/\/character C\n}\nvoid updateMinutes(){\n  \/\/add 1 to the last digit\n  digits[3]=digits[3]+1;\n  \/\/if greater than 9, reset to 0\n  if (digits[3]>9){\n    digits[3]=0;\n    \/\/then add 1 to the third digit\n    updateM0();\n  }\n  \/\/send last digit to display\n  digitalWrite(DigPins[3], LOW);\n}\nvoid updateM0(){\n  \/\/add 1 to third digit\n  digits[2]=digits[2]+1;\n  \/\/if greater than 5, reset to 0\n  if (digits[2]>5){\n    digits[2]=0;\n    \/\/then add 1 to current hours\n    updateH1();\n  }\n  \/\/send digit to display\n  digitalWrite(DigPins[2], LOW);\n}\nvoid updateH1(){\n  \/\/add 1 hour\n  digits[1]=digits[1]+1;\n  \/\/ if greater than 19, reset to 10\n  \/\/ (instead of number 0-9, we use numbers 10-19 in order to add the \"dot\" to the display)\n  if (digits[1]>19){\n    digits[1]=10;\n    \/\/then add 1 to the first digit\n    updateH0();\n  }\/\/ reset when it's 24h (go back to 00)\n  if(digits[1]>13 && digits[0]==2){\n    digits[0]=0;\n    digits[1]=10;\n  }\n  \/\/display digits\n  digitalWrite(DigPins[1], LOW);\n  digitalWrite(DigPins[0], LOW);\n}\nvoid updateH0(){\n  \/\/add 1 to first digit\n  digits[0]=digits[0]+1;\n  \/\/if greater than 2, reset to 0 (it shouldn't happen as we reset earlier, but just in case..)\n  if (digits[0]>2){\n    digits[0]=0;\n  }\n  \/\/display digit\n  digitalWrite(DigPins[0], LOW);\n}\nvoid dot_blinker(){\n  \/\/every second, blink the dot\n    if( millis()-dS > 1000 && dot == 1){\n      digits[1]=digits[1]-10;\n      dS=millis();\n      dot=0;\n    }\n    if( millis()-dS > 250 && dot == 0){\n      digits[1]=digits[1]+10;\n      dot=1;\n    }\n}\n<\/code><\/pre><\/div>\n\n\n\n<p>Ten en cuenta que se hace uso de las siguientes <strong>librer\u00edas adicionales<\/strong> que deber\u00e1s instalar usando el IDE de Arduino:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gestor de placas <strong>esp32<\/strong> de <strong>Espressif<\/strong><\/li>\n\n\n\n<li>Librer\u00eda <strong>WiFiMulti<\/strong><\/li>\n\n\n\n<li>Librer\u00eda <strong>Adafruit_BMP280<\/strong>\n<ul class=\"wp-block-list\">\n<li>(el resto de librer\u00edas se derivan de las anteriores)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Deberemos <strong>probar constantemente el funcionamiento del c\u00f3digo durante la fase de prototipado<\/strong> para poder cambiar la asignaci\u00f3n de pines en caso de alg\u00fan mal funcionamiento. Si ya est\u00e1 todo soldado y nos falla algo, ser\u00e1 bastante m\u00e1s complicado encontrar y resolver el error, de ser en alguna conexi\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ensamblaje\">Ensamblaje<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"soldaduras\">Soldaduras<\/h3>\n\n\n\n<p>Una vez comprobado el c\u00f3digo y dise\u00f1ada la PCB, ya podemos empezar a soldar, teniendo claro donde va cada cosa y tomando mucha precauci\u00f3n, porque una mala soldadura puede arruinarte cualquier m\u00f3dulo o generar errores en el programa.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps7.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"1280\" data-id=\"1658\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps7.jpg\" alt=\"\" class=\"wp-image-1658\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps7.jpg 960w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps7-225x300.jpg 225w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps7-768x1024.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps7-676x901.jpg 676w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/a><figcaption class=\"wp-element-caption\">BMP-280 soldada a la placa<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps8.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"960\" data-id=\"1659\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps8.jpg\" alt=\"\" class=\"wp-image-1659\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps8.jpg 1280w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps8-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps8-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps8-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps8-676x507.jpg 676w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><figcaption class=\"wp-element-caption\">Esp32-Thing soldada a la palca<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps9.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"960\" data-id=\"1660\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps9.jpg\" alt=\"\" class=\"wp-image-1660\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps9.jpg 1280w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps9-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps9-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps9-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps9-676x507.jpg 676w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><figcaption class=\"wp-element-caption\">Pantalla soldada a la placa<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps10.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"960\" data-id=\"1661\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps10.jpg\" alt=\"\" class=\"wp-image-1661\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps10.jpg 1280w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps10-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps10-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps10-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps10-676x507.jpg 676w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><figcaption class=\"wp-element-caption\">Resistencias soldadas a la placa<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dise\u00f1o-de-carcasa\">Dise\u00f1o de carcasa<\/h3>\n\n\n\n<p>Con todo soldado y montado ya tenemos una mejor idea del volumen real del dispositivo. Yo lo voy a medir todo milim\u00e9tricamente con un pie de rey para hacer un modelo 3D de la placa ya montada.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps16.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps16.png\" alt=\"\" class=\"wp-image-1665\" width=\"416\" height=\"279\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps16.png 832w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps16-300x201.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps16-768x514.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/temps16-676x453.png 676w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/a><figcaption class=\"wp-element-caption\">Modelo 3D en Blender de los componentes conectados en su posici\u00f3n final<\/figcaption><\/figure>\n<\/div>\n\n\n<p>As\u00ed puedes <strong>dise\u00f1ar una carcasa<\/strong> alrededor del modelo y fabricarla con una impresora 3D, pero puedes buscar otros tipos de ensamblajes con madera o metal laminados.<\/p>\n\n\n\n<p>Yo suelo usar <strong>dos piezas<\/strong> (una de <strong>base<\/strong> y otra de <strong>tapa<\/strong>) para poder atornillar la una a la otra. Tambi\u00e9n voy a <strong>incluir distintos huecos<\/strong> para permitir la conexi\u00f3n del cable USB, para a\u00f1adir el pulsador de cambio de programa y para a\u00f1adir un soporte rotatorio que encajar\u00e1 el reloj en una ranura del televisor.<\/p>\n\n\n\n<p>Adem\u00e1s usar\u00e9 PLA blanco en una pieza y gris en otra para darle algo m\u00e1s de vida al dise\u00f1o, quedando todo as\u00ed:<\/p>\n\n\n\n<iframe style=\"width:100%;height:350px;border:none\" src=\"https:\/\/theroamingworkshop.cloud\/threeJS\/models\/Tempsi7\/\"><\/iframe>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps22.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-id=\"1934\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps22-1024x768.jpg\" alt=\"\" class=\"wp-image-1934\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps22-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps22-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps22-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps22-676x507.jpg 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps22.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps25.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-id=\"1930\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps25-1024x768.jpg\" alt=\"\" class=\"wp-image-1930\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps25-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps25-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps25-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps25-676x507.jpg 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps25.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps24.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-id=\"1931\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps24-1024x768.jpg\" alt=\"\" class=\"wp-image-1931\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps24-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps24-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps24-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps24-676x507.jpg 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps24.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps23.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-id=\"1932\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps23-1024x768.jpg\" alt=\"\" class=\"wp-image-1932\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps23-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps23-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps23-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps23-676x507.jpg 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps23.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps21.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-id=\"1933\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps21-1024x768.jpg\" alt=\"\" class=\"wp-image-1933\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps21-1024x768.jpg 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps21-300x225.jpg 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps21-768x576.jpg 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps21-676x507.jpg 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/12\/temps21.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p>Y eso es todo. Espero que te haya gustado y te sea \u00fatil. \u00a1L\u00e1nzate a montar tu propio reloj WIFI! Cualquier duda sobre este reloj, al Twitter! \ud83d\udc26<\/p>\n\n\n\n<p>\ud83d\udc26 <code><a rel=\"noreferrer noopener\" href=\"https:\/\/twitter.com\/roamingworkshop\" target=\"_blank\">@RoamingWorkshop<\/a><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Despu\u00e9s de muchas idas y venidas, pruebas, redise\u00f1os, quemaduras, cortes y alguna que otra peque\u00f1a explosi\u00f3n, por fin traigo un del reloj de mesa inteligente en el que llevo dos a\u00f1os trabajando. Hacer un tutorial completo y detallado ser\u00eda todav\u00eda m\u00e1s largo y tedioso, pero espero que estas pinceladas sean de ayuda para hacer el [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1933,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66],"tags":[445,417,419,447,421,449,451,453,433],"class_list":["post-1509","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-electronica","tag-diy-es","tag-electronica-es","tag-electronics-es","tag-esp32-es","tag-internet-es","tag-reloj-es","tag-reloj-inteligente-es","tag-smartwatch-es","tag-wifi-es","post-preview"],"_links":{"self":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/1509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/comments?post=1509"}],"version-history":[{"count":18,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/1509\/revisions"}],"predecessor-version":[{"id":1945,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/1509\/revisions\/1945"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media\/1933"}],"wp:attachment":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media?parent=1509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/categories?post=1509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/tags?post=1509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}