Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Stel DS3231 in via GPS

Componenten en benodigdheden

Arduino Nano R3
× 1
DS3231 klokmodule
× 1
NEO 6M GPS-MODULE
× 1
BI DIRECTIONELE LEVEL SHIFTER
× 1
LCD 16*2 DISPLAY
× 1
I2C LCD-RUGZAK
× 1
15-weg 0,1 inch sockets
× 2
6-weg 0,1 inch sockets
× 2
4-weg 0,1 inch socket
× 1
5-weg 0,1 inch socket
× 1
4-polige 0,1 inch pinstrip
× 1
Stripboard 24 strips * 37 kolommen
× 1
4K7-weerstanden
× 2
Drukknop (enkelpolige kortstondig 6 m vierkant)
× 1

Over dit project

Mijn DS3231 drijft af, ik deed de normale gang van zaken bij het updaten door wat code te compileren met systeemtijd, maar dit bleek een beetje onnauwkeurig omdat het compileren en uploaden steeds werd onderbroken door andere processen die op mijn computer plaatsvonden.

Nadat ik ontdekte dat GPS nauwkeurige tijd (UTC) en datum gaf, besloot ik die te gebruiken om mijn DS3231 in te stellen.

Circuit:

LCD-rugzak naar Arduino:

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

DS3231 klokmodule naar Arduino:

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

LEVEL SHIFTER van Arduino:

5V - 5V

GND - GND

D3 - BUS

D4 - BUS

NEO 6M GPS van level shifter:

3V - VCC

GND - GND

BUS - TXD (eindigt op D3)

BUS - RXD (eindigt op D4)

SCHAKEL CONTACTEN:

SCHAKELAAR - D9

SCHAKELAAR - GND

Vermogen:

Ik lever de stroom aan mijn circuit via de USB-kabel.

Software:

De 99% van de software is het parsing.ino-voorbeeld in de Adafruit GPS-bibliotheek. Ik heb een kleine hoeveelheid code toegevoegd om de geëxtraheerde GPS-datum en -tijd door te geven aan de DS3231 en wat extra code om de tijd van de DS3231 op een LCD-scherm weer te geven.

Gebruikte bibliotheek:

Adafruit GPSLibrary door Adafruit versie 1.0.3

RTCLib door Adafruit versie 1.2.0

NewLiquidCrystalvoor de I2C-displayrugzak.

Bediening:

Zet het apparaat aan.

Op het LCD-scherm worden de datum- en tijdwaarden weergegeven die momenteel in de DS3231-registers staan.

Wacht even totdat de GPS is vergrendeld.

Druk op de knop om de tijd in te stellen via het GPS-signaal.

Op het LCD-scherm wordt de nieuwe tijd weergegeven.

Bedieningsbeperkingen:

De GPS-eenheid heeft tijd nodig om te vergrendelen en er is geen indicatie dat de vergrendeling is bereikt. Door op de instelknop te drukken zonder vergrendeling, werd mijn DS3231-datum ingesteld op 2000:0:0 en de tijd op 0:0:0.

Nadat de rode LED op de GPS-eenheid begint te knipperen, lijkt de beste tijd om op de instelknop te drukken - dit kan tot 10 minuten duren (binnen).

Aanvankelijk had de DS3231-eenheid die ik gebruikte een lege batterij, bij het indrukken van set werd de datum ingesteld op 2000:0:0 en de tijd op 0:164:164. Het duurde een hele tijd voordat de batterij voldoende was opgeladen om de GPS-gegevens te accepteren en zelfstandig verder te tikken.

GPS-eigenaardigheden:

Het bord dat ik kocht, zei simpelweg NEO 6M GPS en heeft de verbindingspinnen gemarkeerd met hun functies. Ik heb de datasheet van het apparaat [1] bekeken en daar stond dat het apparaat op ongeveer 3V werkte, vandaar mijn gebruik van een niveauverschuiver. Bij nadere inspectie vond ik echter een 4A2D-chip die op het bord was gesoldeerd, een zoekopdracht op internet toont aan dat het een spanningsregelaar is, maar dit garandeert niet dat de communicatielijnen van niveau zijn verschoven (mijn apparaat werd geleverd zonder schakelschema).

Ik heb ook online gelezen dat verschillende GPS-modules verschillen in hun vermogen om binnenshuis een goed signaal te ontvangen, vandaar mijn toevoeging van een LCD-scherm zodat ik het mee naar buiten kan nemen.

LCD-gril:

Ik gebruik een van de excentrieke met een I2C-adres van 0x3F, de meeste gebruiken het adres 0x27, dus als je niets ziet, probeer dat dan eerst te veranderen.

Eigenaardigheid van de bibliotheek:

De libraryRTCLib (Adafruit versie 1.2.0) stelt de tijd- en datumregisters in, maar niet het dagregister van de DS3231. De bibliotheek heeft een functie om de dag van de week terug te geven die on-the-fly wordt berekend met behulp van de waarden in het datumregister.

Ik vond dit vreemd, maar realiseerde me uiteindelijk dat het logisch was, om het dagregister in te stellen zou je code moeten worden ingesteld om het op schrikkeljaren te wijzigen, terwijl het genereren van de dag door een formule dit voorkomt.

UTC en lokale tijd:

Ik heb gezocht op UTC en ontdekte dat er geen verandering nodig was voor mijn lokale tijd, dus als je het nodig hebt, moet je dat stukje code zelf toevoegen.

Referenties:

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

Code

  • Stel DS3231-codebestand in
Stel DS3231-codebestand inArduino
// Datum- en tijdfuncties met behulp van een DS3231 RTC aangesloten via I2C en Wire lib#include #include "RTClib.h"//Aadafruit versie 1.2.0 op mijn machineRTC_DS3231 RTC;char daysOfTheWeek[7] [12] ={"zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"};const int days_string_length =12;//einde klok stuff//for lcd display//#include //is al opgenomen (hierboven) // Download de LCD I2C-bibliotheek hier:// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include //Let op het ongebruikelijke adres van 0x3F. De meeste lcd's gebruiken het adres van 0x27, dus als u niets ziet, probeer dat eerst te veranderen LiquidCrystal_I2C lcd (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIEF); // Stel het LCD I2C-adres in//end of for lcd-display//for button#define button 9// Testcode voor Adafruit GPS-modules met MTK3329/MTK3339-stuurprogramma//// Deze code laat zien hoe u naar de GPS-module kunt luisteren in een interrupt// waardoor het programma meer 'vrijheid' heeft - ontleden gewoon// wanneer een nieuwe NMEA-zin beschikbaar is! Krijg vervolgens toegang tot gegevens wanneer// gewenst.//// Getest en werkt uitstekend met de Adafruit Ultimate GPS-module// met MTK33x9-chipset// ------> http://www.adafruit.com/products/746/ / Haal er vandaag nog een bij de Adafruit elektronicawinkel // en help open source hardware &software te ondersteunen! -ada#include #include // Als u een GPS-module gebruikt:// Verbind de GPS-voedingspin met 5V// Verbind de GPS-aardingspin met aarde// Als u software gebruikt serieel (standaard schetsvoorbeeld):// Verbind de GPS TX (zenden) pin met Digital 3// Verbind de GPS RX (ontvangen) pin met Digital 2// Bij gebruik van hardware serieel (bijv. Arduino Mega):// Verbind de GPS TX (zenden) pin naar Arduino RX1, RX2 of RX3// Verbind de GPS RX (ontvangen) pin met overeenkomende TX1, TX2 of TX3// Als je het Adafruit GPS-schild gebruikt, verander // SoftwareSerial mySerial(3, 2 ); -> SoftwareSerial mySerial(8, 7);// en zorg ervoor dat de schakelaar is ingesteld op SoftSerial// Als u softwareserieel gebruikt, houd deze regel dan ingeschakeld// (u kunt de pincodes aanpassen aan uw bedrading):SoftwareSerial mySerial( 3, 2);// Als u hardware-serieel gebruikt (bijv. Arduino Mega), maak dan commentaar op de // bovenstaande SoftwareSerial-regel en schakel deze regel in plaats daarvan in// (u kunt het serienummer wijzigen zodat het overeenkomt met uw bedrading)://HardwareSerial mySerial =Serial1;Adafruit_GPS GPS(&mySerial);// Stel GPSECHO in op 'false' om de echo van de GPS-gegevens naar de seriële console uit te schakelen// Stel in op 'true' als u fouten wilt opsporen en naar de onbewerkte GPS-zinnen wilt luisteren. #define GPSECHO false //---------> uitgeschakeld// dit houdt bij of we de interrupt// standaard uitzetten!boolean usingInterrupt =false;void useInterrupt(boolean); // Func-prototype houdt Arduino 0023 happyvoid setup () {// verbind op 115200 zodat we de GPS snel genoeg kunnen lezen en echo zonder tekens te laten vallen // spugen het ook uit Serial.begin (115200); Serial.println ("Adafruit GPS-bibliotheek basistest!"); // 9600 NMEA is de standaard baudrate voor Adafruit MTK GPS's - sommigen gebruiken 4800 GPS.begin (9600); // verwijder commentaar op deze regel om RMC (aanbevolen minimum) en GGA (fix-gegevens) in te schakelen, inclusief hoogte GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // verwijder commentaar op deze regel om alleen de "minimaal aanbevolen" gegevens in te schakelen //GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCONLY); // Voor het ontleden van gegevens raden we aan niets anders te gebruiken dan alleen RMC of RMC+GGA aangezien // de parser zich op dit moment niet druk maakt over andere zinnen // Stel de updatesnelheid in GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // Updatesnelheid van 1 Hz // Om ervoor te zorgen dat de parseercode goed werkt en tijd heeft om de gegevens te sorteren, en // deze uit te printen, raden we aan om niets hoger dan 1 Hz te gebruiken // Vraag updates over de antennestatus aan, commentaar uit om stil te houden GPS.sendCommand (PGCMD_ANTENNA); // het leuke van deze code is dat je elke milliseconde een timer0-interrupt kunt laten afgaan // en gegevens van de GPS voor je kunt lezen. dat maakt de // loop-code een stuk eenvoudiger! gebruikInterrupt(true); vertraging (1000); // Vraag om firmwareversie mySerial.println (PMTK_Q_RELEASE); // start lcd lcd.begin (16,2); lcd.achtergrondverlichting(); lcd.wissen(); //setup-knop pinMode (knop, INPUT_PULLUP); }// Interrupt wordt eenmaal per milliseconde aangeroepen, zoekt naar nieuwe GPS-gegevens en slaat itSIGNAL(TIMER0_COMPA_vect) op { char c =GPS.read(); // als je fouten wilt opsporen, is dit een goed moment om het te doen! #ifdef UDR0 if (GPSECHO) if (c) UDR0 =c; // rechtstreeks schrijven naar UDR0 is veel sneller dan Serial.print // maar er kan slechts één teken tegelijk worden geschreven. #endif}void useInterrupt(boolean v) { if (v) { // Timer0 wordt al gebruikt voor millis() - we onderbreken gewoon ergens // in het midden en roepen de "Compare A" -functie boven OCR0A =0xAF; TIMSK0 |=_BV(OCIE0A); gebruikmakend vanInterrupt =waar; } else { // roep de interrupt-functie COMPA niet meer aan TIMSK0 &=~_BV(OCIE0A); gebruikmakend vanInterrupt =false; }}uint32_t timer =millis();void loop() // keer op keer herhalen{ // als je de bovenstaande interrupt niet gebruikt, moet je // de GPS 'handmatig opvragen', niet aanbevolen:(if (! usingInterrupt) { // lees gegevens van de GPS in de 'hoofdlus' char c =GPS.read(); // als je fouten wilt opsporen, is dit een goed moment om het te doen! if (GPSECHO) if (c) Serial.print(c);} // als een zin wordt ontvangen, kunnen we de checksum controleren, ontleden... if (GPS.newNMEAreceived()) { // een lastige zaak hier is als we printen de NMEA-zin, of gegevens // we luisteren uiteindelijk niet en vangen andere zinnen! // dus wees erg op uw hoede als u OUTPUT_ALLDATA gebruikt en probeert gegevens af te drukken //Serial.println(GPS.lastNMEA()); // dit ook zet de vlag newNMEAreceived() op false if (!GPS.parse(GPS.lastNMEA())) // dit stelt ook de vlag newNMEAreceived() in op false return; // we kunnen een zin niet ontleden, in welk geval we dat zouden moeten doen wacht gewoon op een andere } // als millis() of timer rond is, zullen we het gewoon resetten als (timer> millis()) timer =millis();static bool second_time_round=false; // druk ongeveer elke 2 seconden de huidige statistieken af ​​//if (millis() - timer> 2000) { // timer =millis(); // reset de timer //Schrijf gegevens naar de klok als de knop wordt ingedrukt - knop wordt normaal hoog gehouden door interne pullup if(!digitalRead(button)){//Opmerking:RTClib stelt niet expliciet het dag van de weekregister in op DS3231.// In plaats daarvan, wanneer u dayOfTheWeek() gebruikt, wordt de dag berekend met een formule op basis van de datum. //Zondag wordt als nul beschouwd.//(gebaseerd op mijn lezing van de bibliotheekkoptekst en ccp-bestanden) //set rtc RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minuten, GPS.seconden)); //lcd lcd.clear(); lcd.setCursor(2,0); lcd.print("Ingedrukte set"); vertraging (5000); lcd.wissen(); } DateTime nu =RTC.now(); lcd.setCursor(4,0); lcd.print(nu.jaar(), DEC); lcd.print('/'); lcd.print(nu.maand(), DEC); lcd.print('/'); lcd.print(nu.day(), DEC); lcd.print(' '); lcd.setCursor(4,1); lcd.print(nu.uur(), DEC); lcd.print(':'); lcd.print(now.minute(), DEC); lcd.print(':'); lcd.print(now.second(), DEC); lcd.print(" ");}

Schema's


Productieproces

  1. Wat zijn stelschroeven?
  2. Venn-diagrammen en sets
  3. Een blijvende erfenis achterlaten
  4. SMRP publiceert set definities van M&R-statistieken
  5. Java 10 - Omgeving instellen
  6. Wat is een setvierkant?
  7. Oppervlakteslijpen op de ouderwetse manier
  8. De beste keuze:een Box Way CNC-draaibank
  9. Wat is een punchset?
  10. Wat is een lineaire manier CNC-draaibank?
  11. Mechanische toolset begrijpen