Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad
Componentes y suministros
| Arduino UNO | 1 |
| Pantalla LCD RGB 16x2 (en mi caso LCD 20x4 I2C genérico) | 1 |
| Protoboard (genérica) | 1 |
| Cables jumper (genéricos) | 1 |
| Receptor GPS (genérico) – GY-GPS6Mv2 con u-blox NEO-6M | 1 |
Aplicaciones y servicios online
- Arduino IDE
Acerca del proyecto
Hasta ahora he usado varios RTC para proyectos de reloj u obtenía la hora de servidores NTP. En este proyecto presento otra fuente: parsear la cadena NMEA de satélites GPS.
Me sorprendió lo barato que es un receptor GPS hoy: consigue uno (uso GY-GPS6Mv2).

a) Prueba opcional en Windows: Instala "u-center" de U-Blox. Con adaptador FTDI, el GPS llega al puerto COM y muestra la fijación (fix) a los satélites en ~1 min (LED rojo parpadea). Con F8 → Text Console ves las cadenas NMEA.
b) Test de decodificación online: rl.se/gprmc
Una vez verificado que el GPS funciona (necesita vista al cielo), extraemos la info deseada.

Usamos la librería Adafruit "Adafruit GPS Library" (instalar desde IDE).
c) Circuito



Conexiones I2C LCD: Arduino A4 → SDA, A5 → SCL.
#include
#include
LiquidCrystal_I2C lcd(0x3F, 20, 4); // dirección LCD, suele ser 0x27 o 0x3F
Conexiones GPS (tolerante 3.3/5V):
- VCC → 5V
- GND → GND
- TX (GPS) → Digital 8
- RX (GPS) → Digital 7
#include
#include
SoftwareSerial mySerial(8, 7);
Adafruit_GPS GPS(&mySerial);
d) Nuestro reloj mostrará: hora, fecha, indicación de velocidad del viento y altitud. No necesitamos ubicación porque el reloj estará en la ventana.
La cadena NMEA da la hora en UTC. La conversión a hora local es nuestra. Añado +1 para zona Europa/Berlín (UTC+0100).
int timezone = +1; // Europa/Berlín (UTC+0100)
La variable hour se usa para mostrar en LCD en lugar de GPS.hour (UTC).
// Salida a LCD
lcd.setCursor(5,0); // línea 1
int hour = (GPS.hour) + timezone;
if (hour < 10) lcd.print('0');
lcd.print(hour, DEC); lcd.print(':');
// ... minutos y segundos similar
En Europa usamos km/h en lugar de nudos para velocidad viento. Convierto: 1 nudo = 1.852 km/h.
float speed = (GPS.speed) * 1.852; // nudos a km/h
Evaluación según Wikipedia (escala Beaufort simplificada):
if (speed <= 1) lcd.print(" Windstille");
else if (speed <= 9) lcd.print(" leiser Zug");
else if (speed <= 46) lcd.print(" Brise");
else if (speed <= 56) lcd.print(" starker Wind");
else if (speed <= 74) lcd.print(" stuerm. Wind");
else if (speed <= 83) lcd.print(" Sturm");
else if (speed <= 102) lcd.print(" schwerer Sturm");
else if (speed > 102) lcd.print(" Orkan");
else lcd.print(" ohne Bewertung");
Resultado en pantalla (adaptable a gusto):

Dejé frecuencia de actualización a 2 segundos en el loop. Incluso prescindo de segundos y altitud para usar un display 16x2.


¡Diviértete explorando las opciones del GPS!
En Europa también existe señal horaria DCF77, pero es más cara y su manejo es muy sensible.
Código
GPS_SoftwareSerial_Parsing_ilo (C/C++)
// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver
// Modified 01.02.2020 - Ingo Lohs
// GPRMC & GPGGA decoder: https://rl.se/gprmc
#include
#include
LiquidCrystal_I2C lcd(0x3F,20,4);
#include
#include
SoftwareSerial mySerial(8, 7);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO true
int timezone = +1; // Europe/Berlin (UTC +0100)
void setup() {
lcd.init(); lcd.backlight();
Serial.begin(115200);
delay(5000);
Serial.println("Adafruit GPS library basic test!");
GPS.begin(9600); // UBLOX 6M: GY-GPS6Mv2
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // RMC + GGA (incluye altitud)
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz
GPS.sendCommand(PGCMD_ANTENNA);
delay(1000);
mySerial.println(PMTK_Q_RELEASE);
}
uint32_t timer = millis();
void loop() {
char c = GPS.read();
if (c && GPSECHO) Serial.write(c);
if (GPS.newNMEAreceived()) {
if (!GPS.parse(GPS.lastNMEA())) return;
}
if (timer > millis()) timer = millis();
if (millis() - timer > 2000) {
timer = millis();
// Serial output
Serial.print("\nTime: ");
if (GPS.hour < 10) Serial.print('0');
Serial.print(GPS.hour, DEC); Serial.print(':');
if (GPS.minute < 10) Serial.print('0');
Serial.print(GPS.minute, DEC); Serial.print(':');
if (GPS.seconds < 10) Serial.print('0');
Serial.print(GPS.seconds, DEC); Serial.print('.');
if (GPS.milliseconds < 10) Serial.print("00");
else if (GPS.milliseconds < 100) Serial.print("0");
Serial.println(GPS.milliseconds);
Serial.print("Date: ");
Serial.print(GPS.day, DEC); Serial.print('/');
Serial.print(GPS.month, DEC); Serial.print("/20");
Serial.println(GPS.year, DEC);
Serial.print("Fix: "); Serial.print((int)GPS.fix);
Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
// LCD output
lcd.setCursor(5,0);
int hour = (GPS.hour) + timezone;
if (hour < 10) lcd.print('0');
lcd.print(hour, DEC); lcd.print(':');
if (GPS.minute < 10) lcd.print('0');
lcd.print(GPS.minute, DEC); lcd.print(':');
if (GPS.seconds < 10) lcd.print('0');
lcd.print(GPS.seconds, DEC);
lcd.setCursor(5,1);
if (GPS.day < 10) lcd.print('0');
lcd.print(GPS.day, DEC); lcd.print('.');
if (GPS.month < 10) lcd.print('0');
lcd.print(GPS.month, DEC); lcd.print('.');
lcd.print(GPS.year, DEC);
if (GPS.fix) {
Serial.print("Location: ");
Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
Serial.print(", "); Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
Serial.print("Speed (knots): "); Serial.println(GPS.speed);
Serial.print("Angle: "); Serial.println(GPS.angle);
Serial.print("Altitude: "); Serial.println(GPS.altitude);
Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
lcd.setCursor(0,2);
float speed = (GPS.speed) * 1.852;
lcd.print(speed);
if (speed <= 1) lcd.print(" Windstille");
else if (speed <= 9) lcd.print(" leiser Zug");
else if (speed <= 46) lcd.print(" Brise");
else if (speed <= 56) lcd.print(" starker Wind");
else if (speed <= 74) lcd.print(" stuerm. Wind");
else if (speed <= 83) lcd.print(" Sturm");
else if (speed <= 102) lcd.print(" schwerer Sturm");
else if (speed > 102) lcd.print(" Orkan");
else lcd.print(" ohne Bewertung");
lcd.setCursor(0,3);
lcd.print("Hoehe: "); lcd.print(GPS.altitude);
}
}
}
Proceso de manufactura
- Controlador de guante DIY de bajo coste y coche de hélice – Construya su propio controlador manual Arduino
- Proyecto Sensor DHT11 Temperatura y Humedad con Indicadores LED y Altavoz Piezo
- Registrador GPS con Análisis Espacial en Azure IoT Hub
- Registrador de Temperatura y Humedad con Arduino, DHT11 y Ethernet Shield
- Monitor de Temperatura y Reloj en Tiempo Real con Arduino Due y Pantalla TFT 3.2"
- Reloj analógico por persistencia de visión (POV) con Arduino Nano – Proyecto DIY
- Celebra con Luz y Sonido: Proyecto Arduino de Cumpleaños DIY
- Módulo GPS u-blox LEA‑6H 02: Guía de integración con Arduino y Python
- Autómatas Celulares en Tiempo Real con Arduino y Pantalla OLED 128x64
- Tacómetro Arduino de Alta Velocidad – Algoritmo "Single-Shot" para RPM Preciso
- Púa de Velocidad y Pedal Stomp para Guitarra DIY – Construye tu Propia Púa Motorizada Impresa en 3D