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

Eine günstige und genaue Uhr auf GPS-Basis

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
Adafruit RGB-Hintergrundbeleuchtung LCD - 16x2
in meinem Fall ein Nobrand LCD 20x4 Display mit I2C Adapter für einfache Konnektivität
× 1
Breadboard (generisch)
× 1
Jumper (generisch)
× 1
GPS-Empfänger (generisch)
GY-GPS6Mv2 mit ublox NEO-6M
× 1

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt


Bisher habe ich verschiedene RTC-Uhren für Uhrenprojekte verwendet oder die Uhrzeit von NTP-Servern bezogen. In diesem Projekt präsentiere ich Ihnen eine weitere Quelle:das Parsen des NMEA-Strings von GPS-Satelliten auf der ganzen Welt.

Ich war überrascht, wie günstig ein GPS-Empfänger heute ist:Holen Sie sich einen (in meinem Fall wird der GY-GPS6Mv2 verwendet).

a.) ein erster - optionaler - Test auf einem Windows-PC:Installieren Sie "u-center" als Download von U-Blox.

Mit Hilfe eines FTDI-Adapters findet der GPS-Breakout den Weg zum COM-Port Ihres PCs und zeigt nach ca. 1 Minute die Befestigung (die Verbindung) zum Orbit an. Dazu blinkt eine rote Kontrolllampe am Breakout.

Die automatisch generierten Grafiken machen Lust auf mehr mit GPS experimentieren. Mit F8 - Text Console im View-Menü bekommt man die verschiedenen NMEA-Strings geliefert.

b.) Sie können einen Decodierungstest auf kostenlosen Online-Diensten durchführen:https://rl.se/gprmc

Da nun sichergestellt ist, dass Sie über einen funktionierenden GPS-Empfänger verfügen - achten Sie auf Sicht zum Himmel - können wir die gewünschten Informationen aus dem String für Ihre eigenen Wünsche extrahieren.

Wir verwenden eine Adafruit-Bibliothek "Adafruit GPS Library" - wenn Sie diese in der Arduino IDE installiert haben, können Sie mit den Beispielen ein wenig ausprobieren.

c.) Schaltung

Arduino A4> SDA anzeigen Arduino A5> SCL anzeigen

#include #include LiquidCrystal_I2C lcd(0x3F, 20, 4); // setze die LCD-Adresse> oft 0x27 oder 0x3F

> ein herumliegendes Display verwenden, vielleicht ein 16x2?

#include #include

Verbinden Sie den GPS-Power-Pin mit 5VVerbinden Sie den GPS-Masse-Pin mit MasseVerbinden Sie den GPS-TX-Pin (Senden) mit Digital 8Verbinden Sie den GPS-RX-Pin (Empfang) mit Digital 7// Sie können die Pin-Nummern an Ihre Verkabelung anpassen:SoftwareSerial mySerial(8 , 7);Adafruit_GPS GPS(&mySerial);

> der GPS-Empfänger ist 3,3 / 5V tolerant.

d.) Unsere Uhr soll die Uhrzeit, das Datum, die Windgeschwindigkeit und sagen wir die Höhe anzeigen. Wir brauchen keinen Standort, weil meine Uhr am Fenster stehen bleibt.

Ein NMEA-String liefert die Uhrzeit im UTC-Standard. Eine Umrechnung in die lokale Zeitzone obliegt uns. Solange niemand einen besseren Vorschlag macht, füge ich +1 für meine Zeitzone (Europa Berlin) hinzu.

int Zeitzone =+1; // Europa/Berlin (UTC +0100)> NMEA ist UTC-orientiert 

Passen Sie die Zeitzone nach Ihren Wünschen an. Die variable Stunde wird dann im Code für die Ausgabe auf dem LCD-Display anstelle von GPS.hour verwendet - dem UTC-Wert.

// Ausgabe auf LCD-Display
lcd.setCursor(5,0); // ,0 =erste Zeile
int Stunde =(GPS.hour) + Zeitzone; // GPS.hour UTC auf Ihre individuelle Zeitzone formatieren
if (Stunde <10) { lcd.print('0'); }
lcd.print (Stunde, DEZ); lcd.print(':');

In Europa verwenden wir "km/h" anstelle von Knoten für die Windgeschwindigkeit. Also habe ich den Wert zuerst mit einer Konstanten von Knoten in km/h umgerechnet und dann gruppiert.> 1 Knoten =1,852 Kilometer pro Stunde

float speed =(GPS.speed) * 1,852; // Wechseln von Geschwindigkeit/Knoten> Geschwindigkeit/km/h 

Auswertung nach Wikipedia:

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

Das Ergebnis wird auf dem Display wie folgt angezeigt und kann natürlich an die eigenen Wünsche angepasst werden:

Ich habe die Aktualisierungsfrequenz innerhalb der Schleife bei 2 Sekunden belassen. Ich tendiere sogar dazu, auf die Sekunden und die Höhen zugunsten einer 16x2-Anzeige zu verzichten.

Viel Spaß beim Erkunden der vielfältigen GPS-Optionen!

In Europa steht uns auch die Auswertung eines DCF77-Funksignals zur Verfügung. Dieser ist jedoch deutlich teurer und seine Handhabung gilt als sehr sensibel.

Code

  • GPS_SoftwareSerial_Parsing_ilo
GPS_SoftwareSerial_Parsing_iloC/C++
Adafruits-Beispiel etwas angepasst
// Testcode für Adafruit GPS-Module mit MTK3329/MTK3339-Treiber//// Dieser Code zeigt, wie man das GPS-Modul in einem Interrupt abhört// was dem Programm mehr 'Freiheit' ermöglicht - 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// geändert 01.02.2020 - Ingo Lohs// GPRMC &GPGGA Decoder:https://rl.se/gprmc#include  #include LiquidCrystal_I2C lcd(0x3F,20,4); // setze die LCD-Adresse auf 0x27 für eine 16-stellige und 2-zeilige Anzeige> 0x3F in meinem Fall für eine LCD-Anzeige von 2004 / Verbinden Sie den GPS-Masse-Pin mit Masse // Verbinden Sie den GPS-TX-Pin (Senden) mit Digital 8// Verbinden Sie den GPS-RX-Pin (Empfangen) mit Digital 7// Sie können die Pin-Nummern an Ihre Verkabelung anpassen:SoftwareSerial mySerial( 8, 7);Adafruit_GPS GPS(&mySerial);// Setzen Sie GPSECHO auf 'false', um das Echo der GPS-Daten an die serielle Konsole auszuschalten // Setzen Sie auf 'true', wenn Sie die rohen GPS-Sätze debuggen und anhören möchten# Definiere GPSECHO trueint timezone =+1; // Europa/Berlin (UTC +0100)> NMEA ist UTC-orientiertvoid setup () { lcd.init (); LCD-Rücklicht(); // Verbindung mit 115200 herstellen, damit wir das GPS schnell genug lesen und echoen können, ohne Zeichen zu verlieren // auch ausspucken Serial.begin(115200); Verzögerung (5000); Serial.println ( "Grundlegender Test der Adafruit GPS-Bibliothek!"); // 9600 NMEA ist die Standardbaudrate für Adafruit MTK GPSs - einige verwenden 4800 GPS.begin (9600); //> in meinem Fall verwende ich UBLOX 6M:GY-GPS6Mv2 // Entkommentieren Sie diese Zeile, um RMC (empfohlenes Minimum) und GGA (fixe Daten) einschließlich 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); Verzögerung (1000); // Nach Firmware-Version fragen mySerial.println(PMTK_Q_RELEASE);}uint32_t timer =millis();void loop() // immer wieder ausführen{char c =GPS.read(); // Wenn Sie debuggen möchten, ist dies ein guter Zeitpunkt! if ((c) &&(GPSECHO)) Serial.write(c); // wenn ein Satz empfangen wird, können wir die Prüfsumme überprüfen, sie parsen ... if (GPS.newNMEAreceived()) { // eine knifflige Sache hier ist, wenn wir den NMEA-Satz oder die Daten drucken // am Ende nicht zuhören und andere Sätze fangen! // Seien Sie also sehr vorsichtig, wenn Sie OUTPUT_ALLDATA verwenden und versuchen, Daten auszudrucken //Serial.println(GPS.lastNMEA()); // dies setzt auch das newNMEAreceived() Flag auf false if (!GPS.parse(GPS.lastNMEA())) // dies setzt auch das newNMEAreceived() Flag auf false return; // wir können einen Satz nicht parsen, in diesem Fall sollten wir einfach auf einen anderen warten } // Wenn millis() oder der Timer umläuft, werden wir ihn einfach zurücksetzen if (timer> millis()) timer =millis(); // ungefähr alle 2 Sekunden die aktuellen Statistiken ausdrucken if (millis () - timer> 2000) { timer =millis (); // den Timer zurücksetzen Serial.print("\nTime:"); Wenn (GPS.Stunde <10) {Serial.print('0'); } Serial.print (GPS.hour, DEC); Serial.print (':'); Wenn (GPS.Minute <10) {Serial.print('0'); } Serial.print (GPS.Minute, DEZ); Serial.print (':'); Wenn (GPS.seconds <10) {Serial.print ('0'); } Serial.print (GPS.seconds, DEC); Serial.print ('.'); wenn (GPS.millisekunden <10) {Serial.print ("00"); aufrechtzuerhalten. Sonst wenn (GPS.millisekunden> 9 &&GPS.millisekunden <100) {Serial.print ("0"); } Serial.println (GPS.millisekunden); Serial.print("Datum:"); Serial.print (GPS.Tag, DEZ); Serial.print ('/'); Serial.print (GPS.Monat, DEZ); Serial.print ("/20"); Serial.println (GPS.Jahr, DEZ); Serial.print("Fix:"); Serial.print ((int)GPS.fix); Serial.print ( "Qualität:"); Serial.println ((int)GPS.fixquality); // Ausgabe auf LCD-Display lcd.setCursor(5,0); // ,0 =erste Zeile int Stunde =(GPS.hour) + Zeitzone; // GPS.hour UTC auf Ihre individuelle Zeitzone formatieren if (hour <10) {lcd.print('0'); } lcd.print (Stunde, DEZ); lcd.print(':'); wenn (GPS.Minute <10) {lcd.print('0'); } lcd.print (GPS.Minute, DEZ); lcd.print(':'); wenn (GPS.seconds <10) {lcd.print('0'); } lcd.print (GPS.seconds, DEC); // Ausgabe auf LCD-Display lcd.setCursor (5,1); // ,0 =zweite Zeile if (GPS.day <10) {lcd.print('0'); } lcd.print (GPS.Tag, DEZ); lcd.print('.'); wenn (GPS.Monat <10) {lcd.print('0'); } lcd.print (GPS.Monat, DEZ); lcd.print('.'); lcd.print (GPS.Jahr, DEZ); if (GPS.fix) { // Haben wir eine Satellitenverbindung? wenn ja, haben wir mehr Werte: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 ("Geschwindigkeit (Knoten):"); Serial.println (GPS.speed); Serial.print("Winkel:"); Serial.println (GPS.angle); Serial.print ("Höhe:"); Serial.println (GPS.altitude); Serial.print("Satelliten:"); Serial.println ((int)GPS.satellites); lcd.setCursor(0,2); // ,2 =dritte Zeile // 1 Knoten =1,852 Kilometer pro Stunde float speed =(GPS.speed) * 1,852; // Wechseln von Geschwindigkeit/Knoten> Geschwindigkeit/km/h //lcd.print("Geschwindigkeit km/h:"); lcd.print (Geschwindigkeit); // 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 * starker Wind - 47-56 * stürmischer Wind - 57-74 * Sturm - 75-83 * schwerer Sturm - 84-102 * Orkan -> 103 */ if (speed <=1) {lcd.print(" Windstille");} else if ((speed> 1) &&(speed <=9)) {lcd.print("leiser Zug");} else if ((Geschwindigkeit> 9) &&(Geschwindigkeit <=46)) {lcd.print(" Brise");} else if ((Geschwindigkeit> 46) &&(Geschwindigkeit <=56)) {lcd.print(" starker Wind ");} else if ((Geschwindigkeit> 56) &&(Geschwindigkeit <=74)) {lcd.print(" stuerm. Wind");} else if ((Geschwindigkeit> 74) &&(Geschwindigkeit <=83)) { lcd.print(" Sturm");} else if ((Geschwindigkeit> 83) &&(Geschwindigkeit <=102)) {lcd.print(" schwerer Sturm");} else if (Geschwindigkeit> 102) {lcd.print( " Orkan");} else {lcd.print(" ohne Bewertung");} lcd.setCursor(0,3); // ,3 =vierte Zeile lcd.print("Höhe:"); lcd.print (GPS.höhe); } }}

Herstellungsprozess

  1. Günstige DIY-Handschuhsteuerung und Propellerauto
  2. DHT11-Sensor mit LEDs und einem Piezo-Lautsprecher
  3. GPS-Datenlogger, räumliche Analyse und Azure IoT Hub.
  4. Temperatur- und Feuchtigkeitsdatenlogger
  5. Arduino-Temp. Monitor und Echtzeituhr mit 3.2 Display
  6. Analoge LED-POV-Uhr
  7. Alles Gute zum Geburtstag:Lichter und Klänge
  8. u-blox LEA-6H 02 GPS-Modul mit Arduino und Python
  9. Arduino- und OLED-basierte zelluläre Automaten
  10. Guitar Speed ​​Pick and Stomp Pedal!