Horloge GPS précise : Précision et fiabilité abordables
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Écran LCD RGB 16×2 (ou LCD 20×4 avec adaptateur I2C) | 1 |
| Breadboard | 1 |
| Fils de connexion | 1 |
| Récepteur GPS (GY-GPS6MV2 avec u-blox NEO-6M) | 1 |
Applications et services en ligne
- Arduino IDE
À propos du projet
J'ai utilisé jusqu'ici des modules RTC ou l'heure NTP pour mes projets d'horloge. Ici, une nouvelle source : l'analyse des trames NMEA des satellites GPS.
Surprise : les récepteurs GPS sont très bon marché aujourd'hui (ex: GY-GPS6MV2).
Tests préliminaires
- Test PC (optionnel) : Installez « u-center » (u-blox). Avec un adaptateur FTDI, le GPS se connecte au port COM. Fix (connexion satellites) en ~1 minute (LED rouge clignote). Menu View → F8 Text Console pour voir les trames NMEA.
- Test décodage en ligne : rl.se/gprmc – collez une trame NMEA pour la décoder.
Une fois le GPS fonctionnel (vue du ciel nécessaire), extrayons les infos souhaitées.
Câblage
- Arduino A4 (SDA) → LCD SDA
- Arduino A5 (SCL) → LCD SCL
- GPS VCC → 5V
- GPS GND → GND
- GPS TX → Arduino D8
- GPS RX → Arduino D7
Le récepteur GPS tolère 3,3V/5V.
#include
#include
LiquidCrystal_I2C lcd(0x3F, 20, 4); // adresse souvent 0x27 ou 0x3F
#include
#include
SoftwareSerial mySerial(8, 7); // RX, TX
Adafruit_GPS GPS(&mySerial);
Fonctionnalités de l'horloge
Affichage : Heure, Date, Indication vitesse du vent (convertie depuis nœuds), Altitude. Pas de position (montre fixe à la fenêtre).
Fuseau horaire
Les trames NMEA donnent l'heure UTC. Conversion locale :
int timezone = +1; // Europe/Berlin (UTC+0100)
int hour = GPS.hour + timezone;
Adaptez timezone à votre localisation.
Vitesse du vent (conversion nœuds → km/h + échelle Beaufort simplifiée)
float speed = GPS.speed * 1.852; // 1 nœud = 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 lcd.print(" Orkan");
Résultat sur l'écran
Ligne 1 : Heure (HH:MM:SS)
Ligne 2 : Date (JJ.MM.AA)
Ligne 3 : Vitesse + qualification vent
Ligne 4 : Altitude
Fréquence de mise à jour : 2 secondes (réglable). On peut supprimer secondes et altitude pour un écran 16×2.
Alternative européenne : signal radio DCF77, mais plus cher et sensible.
Amusez-vous à explorer les possibilités du GPS !
Code complet
// 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);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // RMC + GGA (altitude)
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update
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();
// Série
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);
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 lcd.print(" Orkan");
lcd.setCursor(0,3);
lcd.print("Hoehe: "); lcd.print(GPS.altitude);
}
}
}
Processus de fabrication
- Contrôleur gant DIY low‑cost & voiture à hélice – Construisez votre propre contrôleur main Arduino
- Projet capteur DHT11 température/humidité avec indicateurs LED et buzzer piézo
- Enregistreur GPS avec Analyse Spatiale sur Azure IoT Hub
- Enregistreur de Température et Humidité Arduino avec DHT11 et Shield Ethernet
- Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
- Horloge à persistance rétinienne (POV) style analogique — Arduino Nano 17 LEDs
- Célébrez avec Lumière et Son : Projet Arduino Anniversaire DIY
- Automates Cellulaires Temps Réel sur Arduino avec Écran OLED 128x64
- Médiator Motorisé et Pédale d'Effet DIY – Impression 3D et Arduino