Relógio GPS Preciso: Exatidão Acessível e Confiável
Componentes e Materiais
| Componente | Qtd | Nota |
|---|---|---|
| Arduino UNO | 1 | |
| Display LCD 16×2 ou 20×4 com adaptador I2C | 1 | Endereço 0x27 ou 0x3F |
| Protoboard | 1 | |
| Jumpers | 1 | |
| Receptor GPS (GY-GPS6MV2 com u-blox NEO-6M) | 1 | 3,3/5V tolerante |
Aplicativos
- Arduino IDE
Sobre o Projeto
Já usei RTCs e NTP para relógios. Aqui apresento fonte alternativa: parsing de strings NMEA de satélites GPS.
Receptores GPS são baratos (ex.: GY-GPS6MV2).
Testes Iniciais
- PC com u-center (u-blox): Use adaptador FTDI → porta COM → fix em ~1 min (LED pisca). F8 → Text Console mostra strings NMEA.
- Decodificador online: rl.se/gprmc
Circuito
- GPS VCC → 5V, GND → GND
- GPS TX → Arduino D8, GPS RX → Arduino D7 (SoftwareSerial)
- LCD I2C: SDA → A4, SCL → A5
Código Principal (baseado em exemplo Adafruit GPS)
Bibliotecas: Wire.h, LiquidCrystal_I2C.h, Adafruit_GPS.h, SoftwareSerial.h.
Configuração GPS: saída RMC+GGA (altitude), taxa 1 Hz.
Fuso Horário
int timezone = +1; // Europa/Berlim (UTC+1)
Ajuste para seu fuso. Hora local = GPS.hour + timezone.
Velocidade do Vento (nós → km/h + escala Beaufort)
float speed = GPS.speed * 1.852; // 1 nó = 1,852 km/h
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");
Saída no LCD (20×4)
- Linha 1: Hora local (HH:MM:SS)
- Linha 2: Data (DD.MM.YY)
- Linha 3: Velocidade + descrição Beaufort
- Linha 4: Altitude
Atualização a cada 2 s. Funciona bem até em display 16×2 (omitir segundos/altitude).
Observações
Na Europa também existe sinal DCF77 (rádio), mas é mais caro e sensível.
Divirta-se explorando opções GPS!
Código Completo
// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver
// Parsing via interrupção para liberdade no loop principal
// Modificado 01.02.2020 - Ingo Lohs
// GPRMC & GPGGA decoder: https://rl.se/gprmc
#include
#include
LiquidCrystal_I2C lcd(0x3F, 20, 4); // 0x27 ou 0x3F
#include
#include
SoftwareSerial mySerial(8, 7); // RX, TX
Adafruit_GPS GPS(&mySerial);
#define GPSECHO true
int timezone = +1; // UTC+1
void setup() {
lcd.init(); lcd.backlight();
Serial.begin(115200); delay(5000);
Serial.println("Adafruit GPS library basic test!");
GPS.begin(9600); // UBLOX 6M usa 9600
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // RMC + GGA
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 debug
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
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);
// Beaufort (mesmo if-else acima)
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);
}
}
}
Processo de manufatura
- Controlador de Luva DIY de Baixo Custo e Carro a Hélice – Construa Seu Próprio Controlador de Mão Arduino
- Projeto DHT11: Sensor Temperatura/Umidade com LEDs Indicadores e Buzzer
- Construa um Datalogger GPS com Análise Espacial no Azure IoT Hub
- Registrador de Temperatura e Umidade com Arduino, DHT11 e Ethernet Shield
- Monitor de Temperatura e Relógio Tempo Real com Arduino Due e Display TFT 3.2"
- Relógio Analógico Estilo POV com LEDs – Projeto DIY Arduino Nano
- Celebre com Luz e Som: Projeto Arduino DIY de Aniversário
- Módulo GPS u-blox LEA‑6H 02: Guia de Integração com Arduino e Python
- Autômatos Celulares em Tempo Real no Arduino com Display OLED 128x64
- Palheta Motorizada e Pedal Stomp para Guitarra – DIY com Impressão 3D e Arduino