Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

DS3231 per GPS einstellen

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
DS3231-Uhrenmodul
× 1
NEO 6M GPS-MODUL
× 1
BI DIRECTIONAL LEVEL SHIFTER
× 1
LCD 16*2 DISPLAY
× 1
I2C LCD RUCKSACK
× 1
15-polige 0,1-Zoll-Buchsen
× 2
6-polige 0,1-Zoll-Buchsen
× 2
4-polige 0,1-Zoll-Buchse
× 1
5-poliger 0,1-Zoll-Sockel
× 1
4-Wege 0,1-Zoll-Stiftleiste
× 1
Stripboard 24 Streifen * 37 Spalten
× 1
4K7-Widerstände
× 2
Drucktaste (einpoliger kurzzeitiger 6m-Quadrat)
× 1

Über dieses Projekt

Mein DS3231 driftet ab, ich habe es normal gemacht, es zu aktualisieren, indem ich etwas Code unter Verwendung der Systemzeit kompilierte, aber dies erwies sich als etwas ungenau, da das Kompilieren und Hochladen immer wieder durch andere Prozesse auf meinem Computer unterbrochen wurde.

Nachdem ich festgestellt hatte, dass GPS eine genaue Uhrzeit (UTC) und ein genaues Datum anzeigte, entschied ich mich, dies zu verwenden, um meine DS3231 einzustellen.

Schaltung:

LCD-Rucksack zu Arduino:

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

DS3231-Taktmodul für Arduino:

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

LEVEL SHIFTER von Arduino:

5V - 5V

GND - GND

D3 - BUS

D4 - BUS

NEO 6M GPS vom Level Shifter:

3V - VCC

GND - GND

BUS - TXD (endet bei D3)

BUS - RXD (endet bei D4)

KONTAKTE SCHALTEN:

SCHALTER - D9

SCHALTER - GND

Leistung:

Ich versorge meinen Stromkreis über das USB-Kabel mit Strom.

Software:

Die 99% der Software sind das parsing.ino-Beispiel in der Adafruit GPS-Bibliothek. Ich habe eine kleine Codemenge hinzugefügt, um das extrahierte GPS-Datum und die GPS-Uhrzeit an den DS3231 zu übergeben, und einen zusätzlichen Code, um die Uhrzeit vom DS3231 auf einem LCD-Display anzuzeigen.

Verwendete Bibliothek:

Adafruit GPSLibrary von Adafruit Version 1.0.3

RTCLib von Adafruit Version 1.2.0

NewLiquidCrystalfür den I2C Display Rucksack.

Bedienung:

Schalten Sie das Gerät ein.

Das LCD zeigt die aktuellen Datums- und Zeitwerte in den DS3231-Registern an.

Warten Sie eine Weile, bis das GPS gesperrt ist.

Drücken Sie die Taste, um die Uhrzeit über das GPS-Signal einzustellen.

Das LCD zeigt die neue Zeit an.

Betriebseinschränkungen:

Das GPS-Gerät braucht Zeit zum Sperren und es gibt keine Anzeige, dass die Sperre erreicht wurde. Das Drücken der Set-Taste ohne Sperre führte dazu, dass mein DS3231-Datum auf 2000:0:0 und die Zeit auf 0:0:0 eingestellt wurde.

Nachdem die rote LED am GPS-Gerät zu blinken beginnt, scheint die beste Zeit zum Drücken der Set-Taste zu sein – dies kann bis zu 10 Minuten dauern (in Innenräumen).

Anfangs hatte das von mir verwendete DS3231-Gerät eine leere Batterie, beim Drücken von Set wurde das Datum auf 2000:0:0 und die Uhrzeit auf 0:164:164 gestellt. Es hat eine ganze Weile gedauert, bis der Akku genug Ladung hatte, um die GPS-Daten zu akzeptieren und von selbst weiter korrekt zu ticken.

GPS-Macken:

Die Platine, die ich gekauft habe, sagte einfach NEO 6M GPS und hat die Anschlussstifte mit ihren Funktionen gekennzeichnet. Ich habe mir das Datenblatt für das Gerät [1] angesehen und darin stand, dass das Gerät mit etwa 3 V funktioniert, daher meine Verwendung eines Pegelumsetzers. Bei näherer Betrachtung fand ich jedoch einen 4A2D-Chip, der auf die Platine gelötet war, eine Internetsuche zeigt, dass es sich um einen Spannungsregler handelt, dies garantiert jedoch nicht, dass die Kommunikationsleitungen pegelverschoben sind (mein Gerät wurde ohne Schaltplan geliefert).

Ich habe auch online gelesen, dass verschiedene GPS-Module sich in ihrer Fähigkeit unterscheiden, ein gutes Signal in Innenräumen zu empfangen, daher habe ich ein LCD-Display hinzugefügt, damit ich es draußen mitnehmen kann.

LCD-Eigenart:

Ich verwende einen der Sonderlinge mit einer I2C-Adresse von 0x3F, die meisten verwenden die Adresse 0x27. Wenn Sie also nichts sehen, versuchen Sie es zuerst zu ändern.

Bibliotheks-Eigenart:

Die BibliothekRTCLib (Adafruit Version 1.2.0) setzt die Zeit- und Datumsregister, aber nicht das Tagesregister des DS3231. Die Bibliothek verfügt über eine Funktion zur Rückgabe des Wochentags, der anhand der Werte im Datumsregister im laufenden Betrieb berechnet wird.

Ich fand das seltsam, erkannte aber schließlich, dass es sinnvoll ist, das Tagesregister einzustellen, wenn Ihr Code so eingerichtet werden muss, dass er in Schaltjahren geändert wird, während der Tag durch eine Formel generiert wird, vermeidet dies.

UTC &Ortszeit:

Ich habe nach UTC gesucht und festgestellt, dass für meine Ortszeit keine Änderung erforderlich war. Wenn Sie sie also benötigen, müssen Sie diesen Code selbst hinzufügen.

Referenzen:

[1] https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf(abgerufen /Dec/2018)

Code

  • DS3231-Codedatei festlegen
DS3231-Codedatei festlegenArduino
// Datums- und Uhrzeitfunktionen mit einer DS3231 RTC verbunden über I2C und Wire lib#include #include "RTClib.h"//Aadafruit Version 1.2.0 auf meiner MaschineRTC_DS3231 RTC;char daysOfTheWeek[7] [12] ={"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};const int days_string_length =12;//Ende des Uhrzeugs//für lcd display//#include //war bereits enthalten (oben) // Holen Sie sich die LCD I2C Library hier:// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include  // Beachten Sie die ungewöhnliche Adresse von 0x3F. Die meisten LCDs verwenden die Adresse 0x27. Wenn Sie also nichts sehen, versuchen Sie, diese zu ändern firstLiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Setze die LCD-I2C-Adresse // Ende von für LCD-Display // für Taste #define Taste 9 // Testcode für Adafruit GPS-Module mit MTK3329/MTK3339-Treiber //// Dieser Code zeigt, wie man das GPS-Modul in . hört ein Interrupt// der dem Programm mehr 'Freiheit' gibt - einfach analysieren// wenn ein neuer NMEA-Satz verfügbar ist! Greifen Sie dann auf Daten zu, wenn// gewünscht.//// Getestet und funktioniert hervorragend mit dem Adafruit Ultimate GPS-Modul// mit MTK33x9-Chipsatz// ------> http://www.adafruit.com/products/746/ / Holen Sie sich noch heute einen im Elektronikladen von Adafruit // und helfen Sie mit, Open-Source-Hardware und -Software zu unterstützen! -ada#include #include // Wenn Sie ein GPS-Modul verwenden:// Verbinden Sie den GPS-Stromanschluss mit 5 V// Verbinden Sie den GPS-Erdungsstift mit Masse// Wenn Sie Software verwenden seriell (Skizzenbeispiel Standard):// Verbinden Sie den GPS TX (Senden) Pin mit Digital 3// Verbinden Sie den GPS RX (Empfangen) Pin mit Digital 2// Bei Verwendung von Hardware seriell (zB Arduino Mega):// Verbinden Sie das GPS TX-(Sende-)Pin an Arduino RX1, RX2 oder RX3// Verbinden Sie den GPS-RX-(Empfangs-)Pin mit dem passenden TX1, TX2 oder TX3// Wenn Sie das Adafruit-GPS-Schild verwenden, ändern Sie // SoftwareSerial mySerial (3, 2 .) ); -> SoftwareSerial mySerial (8, 7); // und stellen Sie sicher, dass der Schalter auf SoftSerial eingestellt ist // Wenn Sie Software Serial verwenden, lassen Sie diese Leitung aktiviert // (Sie können die Pin-Nummern an Ihre Verkabelung anpassen):SoftwareSerial mySerial( 3, 2); // Wenn Sie eine serielle Hardware (z. B. Arduino Mega) verwenden, kommentieren Sie die // obige SoftwareSerial-Zeile aus und aktivieren Sie stattdessen diese Zeile // (Sie können die Seriennummer entsprechend Ihrer Verkabelung ändern)://HardwareSerial mySerial =Serial1;Adafruit_GPS GPS(&mySerial); // Setze GPSECHO auf 'false', um das Echo der GPS-Daten an die serielle Konsole auszuschalten // Setze auf 'true', wenn du die rohen GPS-Sätze debuggen und anhören möchtest. #define GPSECHO false //--------->deaktiviert// dies verfolgt, ob wir den Interrupt verwenden// standardmäßig off!boolean usingInterrupt =false;void useInterrupt(boolean); // Func-Prototyp hält Arduino 0023 happyvoid setup () { // Verbindung mit 115200 herstellen, damit wir das GPS schnell genug lesen und echoen können, ohne Zeichen zu verlieren // auch ausspucken Serial.begin (115200); Serial.println ( "Grundlegender Test der Adafruit GPS-Bibliothek!"); // 9600 NMEA ist die Standardbaudrate für Adafruit MTK GPSs - einige verwenden 4800 GPS.begin (9600); // Entkommentieren Sie diese Zeile, um RMC (empfohlenes Minimum) und GGA (feste Daten) einschließlich der Höhe GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA) einzuschalten; // Entkommentieren Sie diese Zeile, um nur die "minimal empfohlenen" Daten einzuschalten //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); // Für das Parsing von Daten empfehlen wir nur RMC oder RMC+GGA zu verwenden, da // der Parser sich derzeit nicht um andere Sätze kümmert // Setze die Aktualisierungsrate GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz Aktualisierungsrate // Damit der Parsing-Code gut funktioniert und Zeit hat, die Daten zu sortieren und // auszudrucken, empfehlen wir nicht, etwas höher als 1 Hz zu verwenden // Aktualisierungen des Antennenstatus anfordern, Kommentar aus, um ruhig zu bleiben GPS.sendCommand(PGCMD_ANTENNA); // Das Schöne an diesem Code ist, dass Sie alle 1 Millisekunde einen Timer0-Interrupt auslösen lassen können, // und Daten vom GPS für Sie lesen können. das macht den // Schleifencode viel einfacher! useInterrupt(true); Verzögerung (1000); // Nach Firmware-Version fragen mySerial.println(PMTK_Q_RELEASE); // lcd starten lcd.begin (16,2); LCD-Rücklicht(); lcd.clear(); // Einrichtungsschaltfläche PinMode (Schaltfläche, INPUT_PULLUP); } // Interrupt wird einmal pro Millisekunde aufgerufen, sucht nach neuen GPS-Daten und speichert itSIGNAL(TIMER0_COMPA_vect) { char c =GPS.read(); // Wenn Sie debuggen möchten, ist dies ein guter Zeitpunkt!#ifdef UDR0 if (GPSECHO) if (c) UDR0 =c; // Direktes Schreiben in UDR0 ist viel schneller als Serial.print // aber es kann immer nur ein Zeichen gleichzeitig geschrieben werden. #endif}void useInterrupt(boolean v) { if (v) { // Timer0 wird bereits für millis() verwendet - wir unterbrechen einfach irgendwo // in der Mitte und rufen die Funktion "Compare A" über OCR0A =0xAF auf; TIMSK0 |=_BV(OCIE0A); usingInterrupt =true; } else { // Interrupt-Funktion COMPA nicht mehr aufrufen TIMSK0 &=~_BV(OCIE0A); usingInterrupt =false; }}uint32_t timer =millis();void loop() // immer wieder ausführen{ // Falls Sie den obigen Interrupt nicht verwenden, müssen Sie // das GPS "von Hand abfragen", nicht empfohlen:( if (! usingInterrupt) { // Daten vom GPS in der 'main loop' lesen char c =GPS.read(); // Wenn Sie debuggen möchten, ist dies ein guter Zeitpunkt! if (GPSECHO) if (c) Serial.print (c); } // Wenn ein Satz empfangen wird, können wir die Prüfsumme überprüfen, sie analysieren ... if (GPS.newNMEAreceived ()) { // eine knifflige Sache hier ist, wenn wir drucken der NMEA-Satz oder die Daten // am Ende hören wir nicht zu und fangen andere Sätze ab! // Seien Sie also sehr vorsichtig, wenn Sie OUTPUT_ALLDATA verwenden und versuchen, Daten auszudrucken //Serial.println(GPS.lastNMEA()); // dies auch setzt das Flag newNMEAreceived() auf false if (!GPS.parse(GPS.lastNMEA())) // dies setzt auch das Flag newNMEAreceived() auf false return; // wir können einen Satz nicht parsen, in diesem Fall sollten wir warte einfach auf einen anderen} // Wenn millis () oder der Timer umläuft, werden wir ihn einfach zurücksetzen if (timer> millis ()) Timer =millis();static bool second_time_round=false; // ungefähr alle 2 Sekunden die aktuellen Statistiken ausdrucken //if (millis() - timer> 2000) { // timer =millis(); // den Timer zurücksetzen // Daten in die Uhr schreiben, wenn die Taste gedrückt wird - die Taste wird normalerweise durch den internen Pullup hoch gehalten if (! digitalRead (button)) {//Hinweis:RTClib setzt das Wochentagsregister auf DS3231 nicht explizit. // Wenn Sie dayOfTheWeek() verwenden, wird der Tag stattdessen anhand einer Formel basierend auf dem Datum berechnet. // Sonntag wird als Null angenommen. // (basierend auf meinem Lesen des Bibliotheksheaders und der ccp-Dateien) // setze rtc RTC.adjust (DateTime (GPS.year, GPS.month, GPS.day, GPS.hour, GPS.Minute, GPS.Sekunden)); // lcd lcd.clear (); lcd.setCursor(2,0); lcd.print("Gedrückter Satz"); Verzögerung (5000); lcd.clear(); } DateTime now =RTC.now(); lcd.setCursor(4,0); lcd.print (jetzt.Jahr(), DEZ); lcd.print('/'); lcd.print (jetzt.Monat(), DEZ); lcd.print('/'); lcd.print (jetzt.tag(), DEZ); lcd.print(' '); lcd.setCursor(4,1); lcd.print (jetzt.hour(), DEZ); lcd.print(':'); lcd.print (jetzt.minute(), DEZ); lcd.print(':'); lcd.print (jetzt.second(), DEZ); lcd.print(" ");}

Schaltpläne


Herstellungsprozess

  1. Was sind Stellschrauben?
  2. Ein bleibendes Erbe hinterlassen
  3. SMRP veröffentlicht eine Reihe von M&R-Metrikendefinitionen
  4. Java 10 – Umgebungseinrichtung
  5. Was ist ein Geodreieck?
  6. Flachschleifen auf die altmodische Art
  7. Die beste Wahl:Eine Box Way CNC-Drehmaschine
  8. Was ist ein Stanzset?
  9. Was ist eine Linearweg-CNC-Drehmaschine?
  10. Mechanisches Werkzeugset verstehen