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

Een goedkope en nauwkeurige klok op basis van GPS

Componenten en benodigdheden

Arduino UNO
× 1
Adafruit RGB-achtergrondverlichting LCD - 16x2
in mijn geval een nobrand LCD 20x4 Display met I2C-adapter voor gemakkelijke connectiviteit
× 1
Broodplank (algemeen)
× 1
Jumperdraden (algemeen)
× 1
GPS-ontvanger (algemeen)
GY-GPS6Mv2 met ublox NEO-6M
× 1

Apps en online services

Arduino IDE

Over dit project


Tot nu toe heb ik verschillende RTC-klokken gebruikt voor klokprojecten of de tijd van NTP-servers gekregen. In dit project presenteer ik u een andere bron:het ontleden van de NMEA-reeks van GPS-satellieten over de hele wereld.

Ik was verrast hoe goedkoop een GPS-ontvanger tegenwoordig is:koop er een (in mijn geval wordt de GY-GPS6Mv2 gebruikt).

a.) een eerste - optionele - test op een Windows-pc:installeer "u-center" als download van U-Blox.

Met behulp van een FTDI-adapter vindt de GPS-breakout zijn weg naar de COM-poort van uw pc en toont na ongeveer 1 minuut de bevestiging (de verbinding) aan de baan. Hiervoor knippert een rood controlelampje op de breakout.

De automatisch gegenereerde graphics zorgen ervoor dat je meer wilt experimenteren met GPS. Met F8 - Text Console in het View menu krijg je de verschillende NMEA strings geleverd.

b.) U kunt een decoderingstest uitvoeren op gratis online services:https://rl.se/gprmc

Nu zeker is dat je een werkende GPS-ontvanger hebt - zorg dat er zicht is op de lucht - kunnen we voor je eigen wensen de gewenste informatie uit de string halen.

We gebruiken een Adafruit-bibliotheek "Adafruit GPS-bibliotheek" - als je deze in de Arduino IDE hebt geïnstalleerd, kun je een beetje uitproberen met de voorbeelden.

c.) Circuit

Arduino A4> SDA weergeven Arduino A5> SCL weergeven

#include #include LiquidCrystal_I2C lcd(0x3F, 20, 4); // stel het LCD-adres in> vaak 0x27 of 0x3F

> gebruik een beeldscherm dat rondslingert, misschien een 16x2?

#include #include

Sluit de GPS-voedingspin aan op 5V Sluit de GPS-aardingspin aan op aarde Sluit de GPS TX-pin (zenden) aan op Digital 8 Sluit de GPS RX-pin (ontvangen) aan op Digital 7// u kunt de pinnummers aanpassen aan uw bedrading:SoftwareSerial mySerial(8 , 7);Adafruit_GPS GPS(&mySerial);

> de GPS-ontvanger is 3.3 / 5V tolerant.

d.) Ons horloge moet de tijd, de datum, een indicatie van de windsnelheid en laten we zeggen de hoogte geven. We hebben geen locatie nodig omdat mijn horloge bij het raam stopt.

Een NMEA string levert de tijd in de UTC standaard. Een conversie naar de lokale tijdzone is aan ons. Zolang niemand een beter voorstel doet, voeg ik +1 toe voor mijn tijdzone (Europa Berlijn).

int tijdzone =+1; // Europa/Berlijn (UTC +0100)> NMEA is UTC-georiënteerd 

Pas de tijdzone naar wens aan. Het variabele uur wordt dan gebruikt in de code voor de uitvoer op het LCD-scherm in plaats van GPS.hour - de UTC-waarde.

// output naar LCD-scherm
lcd.setCursor(5,0); // ,0 =eerste regel
int uur =(GPS.uur) + tijdzone; // formatteer GPS.hour UTC naar uw individuele tijdzone
if (uur <10) { lcd.print('0'); }
lcd.print(uur, DEC); lcd.print(':');

In Europa gebruiken we "km/h" in plaats van knopen voor windsnelheid. Dus ik heb de waarde eerst omgezet van knopen naar km/u met behulp van een constante en deze vervolgens gegroepeerd.> 1 knopen =1,852 kilometer per uur

vlottersnelheid =(GPS.snelheid) * 1.852; // Overschakelen van Snelheid/Knoten> Snelheid/km/h 

Evaluatie volgens Wikipedia:

if (snelheid <=1) {lcd.print(" Windstille");}
else if ((snelheid> 1) &&(snelheid <=9)) {lcd.print(" leiser Zug");}
else if ((snelheid> 9) &&(snelheid <=46)) {lcd.print(" Brise");}
else if ((snelheid> 46) &&(snelheid <=56)) {lcd.print(" sterkere wind");}
else if ((snelheid> 56) &&(snelheid <=74)) {lcd.print(" stuerm. Wind");}
else if ((snelheid> 74) &&(snelheid <=83)) {lcd.print(" Sturm");}
else if ((snelheid> 83) &&(snelheid <=102)) {lcd.print(" schwerer Sturm");}
else if (snelheid> 102) {lcd.print(" Orkan");}
else {lcd.print(" ohne Bewertung ");}

Het resultaat wordt als volgt op het display weergegeven en kan uiteraard naar eigen wens worden aangepast:

Ik heb de update-frequentie op 2 seconden gelaten binnen de lus. Ik heb zelfs de neiging om de seconden en de hoogten te laten varen ten gunste van een 16x2 display.

Veel plezier met het verkennen van de diverse GPS-opties!

In Europa hebben we ook de evaluatie van een DCF77-radiosignaal beschikbaar. Dit is echter aanzienlijk duurder en het gebruik ervan zou erg gevoelig zijn.

Code

  • GPS_SoftwareSerial_Parsing_ilo
GPS_SoftwareSerial_Parsing_iloC/C++
Adafruits Voorbeeld iets aangepast
// Testcode voor Adafruit GPS-modules met MTK3329/MTK3339 driver//// Deze code laat zien hoe je in een interrupt naar de GPS-module kunt luisteren// waardoor het programma meer 'vrijheid' heeft - ontleden// wanneer er 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// gewijzigd 01.02.2020 - Ingo Lohs// GPRMC &GPGGA-decoder:https://rl.se/gprmc#include  #include LiquidCrystal_I2C lcd(0x3F,20,4); // stel het LCD-adres in op 0x27 voor een display met 16 tekens en 2 regels> 0x3F in mijn geval voor een lcd-display uit 2004 #include #include // Sluit de GPS-voedingspin aan op 5V/ / Sluit de GPS-aardingspin aan op aarde// Sluit de GPS TX (zenden)-pin aan op Digital 8// Sluit de GPS RX (ontvangen)-pin aan op Digital 7// u kunt de pinnummers aanpassen aan uw bedrading:SoftwareSerial mySerial( 8, 7);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# definieer GPSECHO trueint tijdzone =+1; // Europa/Berlijn (UTC +0100)> NMEA is UTC-georiënteerdvoid setup(){ lcd.init(); lcd.achtergrondverlichting(); // maak verbinding met 115200 zodat we de GPS snel genoeg kunnen lezen en echo zonder tekens te laten vallen // ook uitspugen Serial.begin (115200); vertraging (5000); Serial.println ("Adafruit GPS-bibliotheek basistest!"); // 9600 NMEA is de standaard baudrate voor Adafruit MTK GPS's - sommigen gebruiken 4800 GPS.begin (9600); //> in mijn geval gebruik ik UBLOX 6M:GY-GPS6Mv2 // 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); vertraging (1000); // Vraag naar de firmwareversie mySerial.println(PMTK_Q_RELEASE);}uint32_t timer =millis();void loop() // herhaal keer op keer {char c =GPS.read(); // als je fouten wilt opsporen, is dit een goed moment om het te doen! if ((c) &&(GPSECHO)) Serial.write(c); // als een zin is ontvangen, kunnen we de controlesom controleren, deze ontleden... if (GPS.newNMEAreceived()) { // een lastig iets hier is als we de NMEA-zin of gegevens afdrukken // we uiteindelijk niet luisteren en andere zinnen opvangen! // dus wees erg op uw hoede als u OUTPUT_ALLDATA gebruikt en probeert om gegevens af te drukken //Serial.println(GPS.lastNMEA()); // dit stelt ook de vlag newNMEAreceived() in op false if (!GPS.parse(GPS.lastNMEA())) // dit stelt ook de vlag newNMEAreceived() in op false return; // we kunnen een zin niet ontleden. In dat geval moeten we wachten op een andere } // als millis() of timer rond is, stellen we hem gewoon opnieuw in als (timer> millis()) timer =millis(); // print ongeveer elke 2 seconden de huidige statistieken uit if (millis() - timer> 2000) { timer =millis(); // reset de timer Serial.print("\nTime:"); if (GPS.uur <10) { Serial.print('0'); } Serial.print (GPS.uur, DEC); Serieel.print(':'); if (GPS.minuut <10) { Serial.print('0'); } Serial.print (GPS.minuten, DEC); Serieel.print(':'); if (GPS.seconden <10) { Serial.print('0'); } Serial.print (GPS.seconden, DEC); Serieel.print('.'); if (GPS.milliseconden <10) { Serial.print("00"); } else if (GPS.milliseconden> 9 &&GPS.milliseconden <100) { Serial.print("0"); } Serial.println (GPS.milliseconden); Serial.print("Datum:"); Serial.print (GPS.dag, DEC); Serieel.print('/'); Serieafdruk (GPS.maand, DEC); Serial.print("/20"); Serial.println (GPS.jaar, DEC); Serial.print("Fix:"); Serial.print((int)GPS.fix); Serial.print(" kwaliteit:"); Serial.println((int)GPS.fixkwaliteit); // output naar LCD-scherm lcd.setCursor (5,0); // ,0 =eerste regel in uur =(GPS.uur) + tijdzone; // formatteer GPS.hour UTC naar uw individuele tijdzone als (uur <10) { lcd.print('0'); } lcd.print (uur, DEC); lcd.print(':'); if (GPS.minuut <10) { lcd.print('0'); } lcd.print(GPS.minuut, DEC); lcd.print(':'); if (GPS.seconden <10) { lcd.print('0'); } lcd.print (GPS.seconden, DEC); // output naar LCD-scherm lcd.setCursor (5,1); // ,0 =tweede regel if (GPS.day <10) { lcd.print('0'); } lcd.print(GPS.dag, DEC); lcd.print('.'); if (GPS.maand <10) { lcd.print('0'); } lcd.print (GPS.maand, DEC); lcd.print('.'); lcd.print (GPS.jaar, DEC); if (GPS.fix) { // hebben we een satellietverbinding? zo ja, dan hebben we meer waarden:Serial.print("Locatie:"); Serial.print (GPS.latitude, 4); Seriële.afdruk (GPS.lat); Serieel.print(", "); Seriële.afdruk (GPS.lengtegraad, 4); Serial.println(GPS.lon); Serial.print("Snelheid (knopen):"); Seriële.println(GPS.snelheid); Serial.print("Hoek:"); Seriële.println (GPS.hoek); Serial.print("Hoogte:"); Serial.println(GPS.hoogte); Serial.print("Satellieten:"); Serial.println((int)GPS.satellieten); lcd.setCursor(0,2); // ,2 =derde regel // 1 Knoten =1.852 Kilometer per uur vlottersnelheid =(GPS.snelheid) * 1.852; // Overschakelen van Snelheid/Knoten> Snelheid/km/h //lcd.print("Snelheid km/h:"); lcd.print(snelheid); // Bewertung der Windstärke nach https://de.wikipedia.org/wiki/Windgeschwindigkeit /* Beschreibung - Geschwindigkeit in km/h * Windstille - 0-1 * leiser Zug - 2-9 * leichte Brise - 10-19 * schwache Brise - 20-28 * mäßige Brise - 29-37 * frische Brise - 38-46 * sterkere Wind - 47-56 * Stürmischer Wind - 57-74 * Sturm - 75-83 * schwerer Sturm - 84-102 * Orkan -> 103 */ if (snelheid <=1) {lcd.print(" Windstille");} else if ((snelheid> 1) &&(snelheid <=9)) {lcd.print("leiser Zug");} else if ((snelheid> 9) &&(snelheid <=46)) {lcd.print(" Brise");} else if ((snelheid> 46) &&(snelheid <=56)) {lcd.print(" sterkere Wind ");} else if ((snelheid> 56) &&(snelheid <=74)) {lcd.print(" stuerm. Wind");} else if ((snelheid> 74) &&(snelheid <=83)) { lcd.print(" Sturm");} else if ((snelheid> 83) &&(snelheid <=102)) {lcd.print(" schwerer Sturm");} else if (snelheid> 102) {lcd.print( " Orkan");} else {lcd.print("ohne Bewertung");} lcd.setCursor(0,3); // ,3 =vierde regel lcd.print("Hoehe:"); lcd.print(GPS.hoogte); } }}

Productieproces

  1. Zelfgemaakte goedkope handschoencontroller en propellerauto
  2. DHT11-sensor met LED's en een piëzo-luidspreker
  3. GPS-datalogger, ruimtelijke analyse en Azure IoT Hub.
  4. Temperatuur- en vochtigheidsdatalogger
  5. Arduino Temp. Monitor en realtimeklok met 3.2-weergave
  6. Analoge stijl LED POV-klok
  7. Gefeliciteerd met je verjaardag:licht en geluid
  8. u-blox LEA-6H 02 GPS-module met Arduino en Python
  9. Arduino en OLED-gebaseerde mobiele automaten
  10. Op Arduino gebaseerde RPM-teller met een nieuw en sneller algoritme
  11. Gitaar Speed ​​Pick en Stomp Pedaal!