Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Horloge précise : Synchroniser DS3231 RTC avec GPS sur Arduino Nano

Composants et fournitures

À propos du projet

Mon module DS3231 dérivait. Je le mettais à jour normalement en compilant du code avec l'heure système, mais cela s'avérait imprécis car la compilation et le téléversement étaient constamment interrompus par d'autres processus sur mon ordinateur.

Après avoir découvert que le GPS fournissait une heure (UTC) et une date précises, j'ai décidé de l'utiliser pour régler mon DS3231.

Circuit

Backpack LCD vers Arduino :

Module horloge DS3231 vers Arduino :

LEVEL SHIFTER depuis Arduino :

NEO 6M GPS depuis le level shifter :

CONTACTS INTERRUPTEUR :

Alimentation

J'alimente mon circuit via le câble USB.

Logiciel

99 % du logiciel est l'exemple parsing.ino de la bibliothèque Adafruit GPS. J'ai ajouté un peu de code pour transmettre la date et l'heure GPS extraites au DS3231 et un code additionnel pour afficher l'heure du DS3231 sur un écran LCD.

Bibliothèques utilisées

Fonctionnement

  1. Mettez l'appareil sous tension.
  2. L'écran LCD affiche la date et l'heure actuellement dans les registres du DS3231.
  3. Attendez que le GPS verrouille (acquière les satellites).
  4. Appuyez sur le bouton pour régler l'heure via le signal GPS.
  5. L'écran LCD affiche la nouvelle heure.

Limitations de fonctionnement

Le module GPS prend du temps pour verrouiller et il n'y a pas d'indicateur de verrouillage. Appuyer sur le bouton de réglage sans verrouillage a entraîné la mise à jour de mon DS3231 à la date 2000:0:0 et l'heure 0:0:0.

Après que la LED rouge du module GPS commence à clignoter semble être le meilleur moment pour appuyer sur le bouton de réglage – cela peut prendre 10 à plusieurs minutes (en intérieur).

Initialement, le module DS3231 que j'utilisais avait une pile à plat ; en appuyant sur set, la date était réglée sur 2000:0:0 et l'heure sur 0:164:164. Il a fallu un certain temps pour que la pile se charge suffisamment pour accepter les données GPS et continuer à fonctionner correctement seule.

Particularités du GPS

La carte achetée indiquait simplement « NEO 6M GPS » avec les broches de connexion marquées selon leurs fonctions. J'ai consulté la fiche technique [1] qui indiquait que le dispositif fonctionne autour de 3 V, d'où mon utilisation d'un level shifter. Cependant, à l'inspection, j'ai trouvé une puce 4A2D soudée sur la carte ; une recherche internet montre qu'il s'agit d'un régulateur de tension, mais cela ne garantit pas que les lignes de communication soient décalées en niveau (mon unité n'avait pas de schéma).

J'ai aussi lu en ligne que différents modules GPS varient dans leur capacité à recevoir un bon signal en intérieur, d'où mon ajout d'un écran LCD pour pouvoir l'emmener dehors.

Particularité du LCD

J'utilise l'un de ces modèles atypiques avec une adresse I2C de 0x3F ; la plupart utilisent 0x27. Si vous ne voyez rien, essayez de modifier cette adresse en premier.

Particularité de la bibliothèque

La bibliothèque RTCLib (version Adafruit 1.2.0) règle les registres d'heure et de date mais pas le registre de jour de la semaine du DS3231. La bibliothèque a une fonction pour retourner le jour de la semaine qui est calculé à la volée en utilisant les valeurs du registre de date.

J'ai trouvé cela étrange mais j'ai fini par réaliser que cela a du sens : régler le registre de jour nécessiterait que votre code soit configuré pour le modifier lors des années bissextiles, alors que générer le jour par une formule évite cela.

UTC et heure locale

J'ai recherché l'UTC et constaté qu'aucun changement n'était nécessaire pour mon heure locale ; si vous en avez besoin, vous devrez ajouter ce bout de code vous-même.

Références

[1] Fiche technique NEO-6 (consulté le 12/2018)

Code

Fichier code « Set DS3231 »

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include 
#include "RTClib.h" // Adafruit version 1.2.0
RTC_DS3231 RTC;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const int days_string_length = 12;

// For LCD display
#include 
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Adresse inhabituelle 0x3F

// For button
#define button 9

// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver
#include 
#include 

SoftwareSerial mySerial(3, 2);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO false
boolean usingInterrupt = false;
void useInterrupt(boolean);

void setup() {
  Serial.begin(115200);
  Serial.println("Adafruit GPS library basic test!");
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
  GPS.sendCommand(PGCMD_ANTENNA);
  useInterrupt(true);
  delay(1000);
  mySerial.println(PMTK_Q_RELEASE);

  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();
  pinMode(button, INPUT_PULLUP);
}

SIGNAL(TIMER0_COMPA_vect) {
  char c = GPS.read();
  #ifdef UDR0
  if (GPSECHO) if (c) UDR0 = c;
  #endif
}

void useInterrupt(boolean v) {
  if (v) {
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
    usingInterrupt = true;
  } else {
    TIMSK0 &= ~_BV(OCIE0A);
    usingInterrupt = false;
  }
}

uint32_t timer = millis();

void loop() {
  if (!usingInterrupt) {
    char c = GPS.read();
    if (GPSECHO) if (c) Serial.print(c);
  }
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) return;
  }
  if (timer > millis()) timer = millis();
  static bool second_time_round = false;

  // Write data to clock if button pressed
  if (!digitalRead(button)) {
    RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minute, GPS.seconds));
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("Pressed set");
    delay(5000);
    lcd.clear();
  }

  DateTime now = RTC.now();
  lcd.setCursor(4, 0);
  lcd.print(now.year(), DEC);
  lcd.print('/');
  lcd.print(now.month(), DEC);
  lcd.print('/');
  lcd.print(now.day(), DEC);
  lcd.print(' ');
  lcd.setCursor(4, 1);
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  lcd.print(now.second(), DEC);
  lcd.print(" ");
}

Schémas

Horloge précise : Synchroniser DS3231 RTC avec GPS sur Arduino Nano
Horloge précise : Synchroniser DS3231 RTC avec GPS sur Arduino Nano

Processus de fabrication

  1. Laisser un héritage durable : leadership authentique pour un meilleur futur
  2. SMRP publie un ensemble standardisé de KPI pour professionnels maintenance et fiabilité
  3. Configuration de l'environnement de développement Java 10 : Compiler et exécuter
  4. Équerres (Set Squares) : Usage, Types et Applications en Dessin Technique
  5. Rectifiage de surface : techniques traditionnelles pour la précision
  6. Pourquoi un tour CNC à glissières prismatiques (box-way) est le choix optimal pour précision et performance
  7. Les jeux de poinçons expliqués : guide complet
  8. Tours CNC à guidage linéaire : précision, vitesse et production légère
  9. Guide essentiel pour choisir la boîte à outils idéale du mécanicien