¿Cuántos somos los fans de Harry Potter que hemos soñado con tener este reloj en casa? Hemos surcado las redes en busca de poder comprarlo y ni en amazon estaba. Pues cansado de la búsqueda para comprarlo, empecé la de crearlo, y así fue como llegué a varios enlaces en distintos idiomas. De todos ellos cogí lo «mejor» para mi y lo más económico, así que os traigo el Reloj de los Weasley con Arduino y servicios gratuitos.

Preparativos para empezar con el reloj Weasley
Os voy a enumerar las cosas que vamos a emplear, para que veais el coste en cuanto a servicios y/o requerimientos, así como el coste económico. Ya os adelanto que me he gastado 30 euros en hardware. (Aquí no incluyo mi tiempo, que ha sido bastante xD)
- Cuenta de Gmail para:
- Google Script: aquí pondremos nuestro código que le dirá a nuestro reloj que hacer.
- Excel en Google Drive: para almacenar la información a modo «base de datos».
- Cuenta en IFTT, para obtener y mandar la ubicación del usuario. (solo 5 ubicaciones por usuario en el plan free).
- Placa Wifi Arduino, aquí yo he ido a lo básico, como solo necesitaba una conexión Wifi, me he comprado solo el módulo Wifi de Arduino en Amazon (11€) el ESP32.
- Servos, dos motores para poder mover las manecillas del reloj, en mi caso voy a poner solo uno, pero ya tengo previsto como poner 2. También de Amazon (12€) los ES08MA II.
Explicación del «sistema»
Pues os explico brevemente como vamos a utilizar estos servicios. Dado que el primer problema que me encontré fueron los servicios, estuve indagando una forma económica de hacerlo.
Muchos tutoriales utilizaban Particle que vale para alojar código en la nube y conectarlo a su dispositivo «Arduino» ya que solo funciona, para dispositivos Particle (20$ + 25$ de envio y 3 semanas de espera…)

Así que obté por una placa Wifi que soportara arduino, la mencionada arriba. Con esto necesitaba un «servidor» para alojar mi código, ya que Particle no me valía. Utilicé Arduino Cloud, pero no pude acabar de sincronizarlo por version de la placa Wifi que vino y lo dejé también.
Mi idea aquí fue la siguiente, vamos a crear un ecosistema que no dependa de marcas ni versiones, así que indagué sobre como conectar arduino, de manera genérica a cualquier servicio. Aquí me encontré con que podía hacer un Get o Post hacia Google Script y decidí almacenar ahí el código. Y ya, puesto que estabamos en la suit de Google, porque no usar un excel a modo «base de datos»; lo pongo entre comillas porque valdría un .txt para esto, pero almacenar información no deja de ser una base de datos.
Llegados a este punto solo me faltaba poder mandar la ubicación real del usuario al código (google Script), que lo almacene en la BD (excel) y lo lea nuestro arduino (Placa Wifi ESP32). Esto lo logré con IFTT, al saber que puedo emitir un webhook con parámetros. Le puedo mandar a nuestro servidor, al fichero del código, un parámetro en función de la ubicación.
Con el circulo ya cerrado, queda en el código indicarle que hacer con ese valor, almacenarlo, leerlo e interpretarlo.
Empezamos con la programación
Con lo anteriormente mencionado, vamos a empezar con el nucleo de nuestro reloj, nuestro código base, que irá almacenado en Google Script.
Nos creamos un nuevo proyecto, le asignamos un nombre y un nombre al archivo también. En mi caso de nombre de proyecto he puesto WeasleyClock y como lo que haré le fichero será hacer un POST (para introducir el dato de la localización en el Excel) lo llamé así.


Ahora, os adjunto explicado el código del ficheor POST.gs:
function doGet (e) {
//creamos la variable con la url de nuestro excel --> en el siguiente paso
var ss = SpreadsheetApp.openByUrl("url del excel")
// vamos a usar la celda 1 para almacenar el valor
var range = ss.getRange("A1");
//mostramos el valor para el log
Logger.log(e.parameter.theArg);
//almacenamos en la celda A1 de nuestro excel el valor pasado por parametro
range.setValue(e.parameter.position);
//la variable que yo pasare se llama position tu puedes cambiarlo por otra
};
Y ahora para completar el código, vamos a crear un excel en la misma cuenta de google drive. Una vez creado, le asignamos un nombre para no borrarlo por error y con el excel abierto, copiamos toda la url, hasta el /edit, el resto no que es «#gid=0». Esta url copiada la pegamos en el código dónde indico.
Y hasta aquí ya tenemos configurado nuestro «servidor» y «base de datos» con su fichero de ejecución.
Antes de nada, y porque a mi me ha pasado, Google Script requiere permisos, pero no te los pide hasta que no lo ejecutas la primera vez. Para esto vamos a modificar el código y ejecutarlo una primera vez desde el navegador.
Comentamos la linea 8 y 10 y agregamos justo después de la linea 10 y antes del cierre de llave un range.setValue(30); con esto le vamos a mandar un 30 a nuestra celda. El código quedaría así:
function doGet (e) {
//creamos la variable con la url de nuestro excel --> en el siguiente paso
var ss = SpreadsheetApp.openByUrl("url del excel")
// vamos a usar la celda 1 para almacenar el valor
var range = ss.getRange("A1");
//mostramos el valor para el log
//Logger.log(e.parameter.theArg);
//almacenamos en la celda A1 de nuestro excel el valor pasado por parametro
//range.setValue(e.parameter.position);
range.setValue(30);
};
Guardamos, ejecutamos, y le damos los permisos.



Programando en Arduino
Ahora viene la parte de programar, ya que tenemos que indicarle a nuestra placa Wifi lo que tiene que hacer para que «se haga la magia» en nuestro reloj.
Antes de programar nada, recomendaré instalar las librearias y demás apropiadas que EN MI CASO por mi placa y mis servos, me han funcionado las siguientes:
- Gestor de Tarjetas: ESP32 by Expressif Systems versión 1.0.6
- Os dejo el link al video más explicativo que he encontrado AQUÍ
- Libreria: Servo by Arduino versión 1.1.8
Ahora con esto, debería de estar todo listo para empezar sin errores, pero dependiendo de las versiones puede haber algún tipo de conflicto. No obstante, en internet hay respuestas para todos los errores, si no, podéis contactarme y os intentaré ayudar. Yo mismo me he topado con mil errores en el proceso, pero es la mágia de la creación.
Para empezar creamos una carpeta para almacenar los DOS archivos que tendrá el proyecto arduino. Y en esa carpeta creamos un fichero secrets.h; podéis crear un archivo de texto, borrarle la extensión y ponerle esa. Ahora abrimos arduino y creamos uno nuevo, vacío con el nombre que queramos para guardarlo en esa carpeta.
Coge el fichero secrets.h y arrástralo a la ventan de arduino. Ahora tendremos en el cliente de Arduino, los pestañas, la del proyecto y la de secrets. El fichero secrets es muy sencillo, aquí van las claves:
const char * ssid = "MiWifi";
const char * password = "ClaveWifi";
String GOOGLE_SCRIPT_ID = "IDdelFicheroExcel";
Estos datos habrá que cambiarlos por tu clave de Wifi y contraseña, y el Id del fichero excel de Drive, te muestro en negrita lo que sería el ID:
https://docs.google.com/spreadsheets/d/1F93OXfOY7ci2MCpsAqQr_4BtLGOFDHNtuInqY3E/edit
Ahora vamos con el archivo main, el que pilota, el que controla, el que crea, el que realmente trabaja. Es más largo, pero es muy simple y está todo comentado:
#include "WiFiClientSecure.h"
#include "HTTPClient.h"
#include "Servo_ESP32.h"
#include "secrets.h"; //Acceso a las variables secretas
/********************************************************************************/
//Things to change in secrets.h
//const char * ssid;
//const char * password;
//String GOOGLE_SCRIPT_ID;
const int sendInterval = 5000; //intervalo de refresco
Servo_ESP32 servo1; //Definimos el servo
static const int servoPin = 14; //Pin de alimentacion del servo
int angle = 0; //angulo inicial
int angleStep = 5; //salto de angulo
int angleMin = 0; //angulo minimo
int angleMax = 360; // angulo maximo
int pos = 0; //inicial
/********************************************************************************/
WiFiClientSecure client; //creamos conexion wifi
void setup() {
Serial.begin(115200); //por defecto para visualizar la consola ESP32
delay(10); // cada 10 segundos
servo1.attach(servoPin); //enlazamos el servo con el pin
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); //nos conectamos al wifi
Serial.println("Started");
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Ready to go");
servo1.write(0); //mover servo a posicion 0
}
void loop() { //en bucle hacemos...
spreadsheet_comm(); //llamar a la funcion que se conecta al Excel
delay(sendInterval); //esperamos
}
void moveClock(String payload){//funcion que mueve el motor
Serial.println("moving clock to" + payload);
//yo he definido estas posiciones, que en el reloj sera:
//estoy en casa, en el trabajo... etc podeis definiar tantas como querais
//van en funcion del numero que se le pasa, que lo elegimos nosotros
if(payload == "1"){//home
servo1.write(45); //cuantos grados me muevo
Serial.println(45);
}else if(payload == "2"){//work
servo1.write(60);
Serial.println(60);
}else if(payload == "3"){//mom's house
servo1.write(90);
Serial.println(90);
}else{//lost, si no le mandno nada, estoy "perdido"o "en peligro de muerte"
servo1.write(180);
Serial.println(180);
}
}
void spreadsheet_comm(void) { //conexion con el excel
HTTPClient http;
String url="https://script.google.com/macros/s/"+GOOGLE_SCRIPT_ID+"/exec?read";
// Serial.print(url);
Serial.print("Making a request");
http.begin(url.c_str()); //especificamos la url y certificado
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
int httpCode = http.GET();
String payload;
if (httpCode > 0) { //si el codigo devuelvo que la conexion es correcta
String payload = http.getString(); //guardamos el valor del excel
Serial.println(httpCode);//mostramos el codigo
Serial.println(payload);//mostramos lo que guardamos
moveClock(payload);//mandamos el valor guardado a la funcion del rejo para que sepa a donde moverse
}
else {
Serial.println("Error on HTTP request");
}
http.end();//cerramos la conexion
}
Bueno, revisado el código, no es tan complejo; aunque no voy a negar que costó de hacer porque no había programado tanto con arduino y menos enlazarlo con Google Drive… esto fue lo peor. Pero ya estamos acabando, queda conectar la placa Wifi al PC desde el cliente Arduino, Programa > Subir. Aquí puede que tengáis algún error, pero leyendo la consola, se detecta rápidamente el error; Google es nuestro amigo.
Vamos vamos, que con IFTT acabamos
Y ahora que tenemos una placa Arduino, leyendo un excel, al que se le va a insertar un dato… nos falta un detonante, que inicie todo el proceso; aquí entra IFTT.
Desde la web de IFTT, nos creamos una cuenta y nos vamos a crear un Applet.

El flujo es el siguiente, cuando entremos o salgamos de una ubicación, IFTT le mandará el código que indiquemos a nuestro Google Script; que se encargará de almacenarlo en el excel y posteriormente, será leído y ejecutado por nuestra Placa Wifi.
La configuración es la que sigue:
- En «If This…» vamos a seleccionar el trigger location y le indicamos por ejemplo la de «Entrar a un Area» y la ubicacion de casa, esté será el applet de «Home». Le damos a «Create Trigger».
- Ahora en «Then that» vamos a elegir WebHooks, aquí en url vamos a pegar la url de nuestro Google Script que se hace así:
- Vamos a nuestro Script y arriba a la derecha le damos a implementar>Nueva implementación y dejarlo tal que así. Ees muy importante que el acceso se a cualquier usuario. Una vez hecho, copias la url de abajo, la de la aplicación web y es la que hay que pegar en el campo url del webhook.


- Importante que ahora, justo detrás de tu url pones lo siguiente:
- ?position = 1
Le pongo «position» porque es la variable que he definido tanto en el código de Google Script que le iba a pasar, y le mando 1, porque yo quiero. El numero 1, tiene que tener relación con que en Arduino, la instrucción 1 indique que estoy en casa, y mueva el servo a la posición que corresponda.
El resto de campos los dejamos por defecto y Guardamos. Importante, que os descargueis la app de IFTT en el móvil e inicieis sesión con la cuenta con la que habéis creado los Applets, si no, difícil está que pueda leer la ubicación 😉
Conexión del Servo
La verdad que aquí hay que seguir literalmente las instrucciones del fabricante de cada modelo. Lo que si que he visto es que se repite mucho el esquema electrónico de todos los motores. Suelen tener 3 cables, uno para corriente, otro a tierra y otro a nuestro pin 14, que es el que le envia la información. Mirando la placa que tengáis y el motor, es bastante sencillo de conectar. Este paso fue el más rápido.
Como extra, a mi con los servos me vinieron unas pestañas de plastico para conectar al giro del servo y aquí es donde yo he acoplado la «manecilla» que me representa en el reloj.
Conclusión
Para finalizar quiero dejar claro que ha sido un proyecto totalmente por gusto y curiosidad. Me gusta investigar y crear cosas, y aquí, dejo una muestra de ello.
Si que es cierto que me queda pendiente subir un par de fotos de mi reloj, que está por terminar, y tal vez acople un servo más al reloj; pero aún tengo que estudiarlo.
Si has leído hasta aquí y te ha gustado, pues me alegro mucho. Casi más logro por tu parte haberte leído esto que por mi parte hacerlo XD.
Prometo actualizar con mi Reloj Weasley terminado, lo que no puedo decir es cuando, porque ni yo mismo lo se.
Deja una respuesta