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

Une horloge bon marché et précise basée sur le GPS

Composants et fournitures

Arduino UNO
× 1
Adafruit RGB rétro-éclairé LCD - 16x2
dans mon cas, un écran LCD 20x4 sans marque avec adaptateur I2C pour une connectivité facile
× 1
Planche à pain (générique)
× 1
Câbles de raccordement (générique)
× 1
Récepteur GPS (générique)
GY-GPS6Mv2 avec ublox NEO-6M
× 1

Applications et services en ligne

Arduino IDE

À propos de ce projet


Jusqu'à présent, j'ai utilisé diverses horloges RTC pour des projets d'horloge ou obtenu l'heure des serveurs NTP. Dans ce projet, je vous présente une autre source :l'analyse à partir de la chaîne NMEA des satellites GPS du monde entier.

J'ai été surpris de voir à quel point un récepteur GPS est bon marché aujourd'hui :obtenez-en un (dans mon cas, le GY-GPS6Mv2 est utilisé).

a.) un premier test - facultatif - sur un PC Windows :installez « u-center » en téléchargement depuis U-Blox.

À l'aide d'un adaptateur FTDI, le breakout GPS trouve son chemin vers le port COM de votre PC et montre la fixation (la connexion) à l'orbite après environ 1 minute. A cet effet, un voyant de contrôle rouge sur le breakout clignote.

Les graphiques générés automatiquement vous donnent envie d'expérimenter davantage avec le GPS. Avec F8 - Text Console dans le menu Affichage, vous obtenez les différentes chaînes NMEA livrées.

b.) Vous pouvez effectuer un test de décodage sur les services en ligne gratuits :https://rl.se/gprmc

Maintenant qu'il est assuré que vous disposez d'un récepteur GPS fonctionnel - assurez-vous qu'il y a une vue du ciel - nous pouvons extraire les informations souhaitées de la chaîne selon vos propres souhaits.

Nous utilisons une bibliothèque Adafruit "Adafruit GPS Library" - si vous l'avez installée dans l'IDE Arduino, vous pouvez essayer un peu avec les exemples.

c.) Circuit

Arduino A4> Affichage SDA Arduino A5> Affichage SCL

#include #include LiquidCrystal_I2C lcd(0x3F, 20, 4); // définir l'adresse LCD> souvent 0x27 ou 0x3F

> utiliser un écran qui traîne, peut-être un 16x2 ?

#include #include

Connectez la broche d'alimentation GPS à 5VConnectez la broche GPS Ground à la terreConnectez la broche GPS TX (transmission) à Digital 8Connectez la broche GPS RX (réception) à Digital 7 // vous pouvez modifier les numéros de broche pour qu'ils correspondent à votre câblage :SoftwareSerial mySerial (8 , 7);Adafruit_GPS GPS(&mySerial);

> le récepteur GPS est tolérant à 3,3 / 5V.

d.) Notre montre doit donner l'heure, la date, une indication de la vitesse du vent et disons l'altitude. Nous n'avons pas besoin de localisation car ma montre s'arrêtera à la fenêtre.

Une chaîne NMEA fournit l'heure au standard UTC. Une conversion dans le fuseau horaire local est à nous. Tant que personne ne fait une meilleure proposition, j'ajoute +1 pour mon fuseau horaire (Europe Berlin).

int timezone =+1 ; // Europe/Berlin (UTC +0100)> NMEA est orienté UTC 

Ajustez le fuseau horaire à votre convenance. L'heure variable est ensuite utilisée dans le code pour la sortie sur l'écran LCD au lieu de GPS.hour - la valeur UTC.

// sortie sur écran LCD
lcd.setCursor(5,0); // ,0 =première ligne
int heure =(GPS.heure) + fuseau horaire ; // formater GPS.hour UTC à votre fuseau horaire individuel
if (heure <10) { lcd.print('0'); }
lcd.print(heure, DEC); lcd.print(':');

En Europe, nous utilisons "km/h" au lieu de nœuds pour la vitesse du vent. J'ai donc d'abord converti la valeur de nœuds en km/h à l'aide d'une constante, puis je l'ai regroupée.> 1 nœud =1,852 kilomètre par heure

vitesse flottante =(GPS.speed) * 1,852 ; // Passer de Vitesse/Knoten> Vitesse/km/h 

Évaluation selon Wikipédia :

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

Le résultat est affiché à l'écran comme suit et peut bien sûr être adapté à vos propres souhaits :

J'ai laissé la fréquence de mise à jour à 2 secondes dans la boucle. J'ai même tendance à renoncer aux secondes et aux hauteurs au profit d'un affichage 16x2.

Amusez-vous à explorer les diverses options GPS !

En Europe, nous avons également l'évaluation d'un signal radio DCF77 disponible. Cependant, celui-ci est nettement plus cher et sa prise en main serait très sensible.

Code

  • GPS_SoftwareSerial_Parsing_ilo
GPS_SoftwareSerial_Parsing_iloC/C++
Exemple Adafruits ajusté un peu// Code de test pour les modules GPS Adafruit utilisant le pilote MTK3329/MTK3339//// Ce code montre comment écouter le module GPS dans une interruption// ce qui permet au programme d'avoir plus de 'liberté' - il suffit d'analyser // lorsqu'une nouvelle phrase NMEA est disponible ! Accédez ensuite aux données quand// vous le souhaitez.//// Testé et fonctionne très bien avec le module GPS Adafruit Ultimate// en utilisant le chipset MTK33x9// ------> http://www.adafruit.com/products/746/ / Achetez-en un aujourd'hui dans la boutique d'électronique Adafruit // et aidez à prendre en charge le matériel et les logiciels open source ! -ada// modifié 01.02.2020 - Ingo Lohs// Décodeur GPRMC &GPGGA :https://rl.se/gprmc#include #include LiquidCrystal_I2C lcd(0x3F,20,4); // définissez l'adresse LCD sur 0x27 pour un affichage de 16 caractères et 2 lignes> 0x3F dans mon cas pour un affichage LCD 2004#include #include // Connectez la broche d'alimentation GPS à 5V/ / Connectez la broche GPS Ground à la terre // Connectez la broche GPS TX (transmission) à Digital 8// Connectez la broche GPS RX (receive) à Digital 7 // vous pouvez modifier les numéros de broche pour qu'ils correspondent à votre câblage :SoftwareSerial mySerial ( 8, 7);Adafruit_GPS GPS(&mySerial);// Réglez GPSECHO sur 'false' pour désactiver l'écho des données GPS vers la console série// Réglez sur 'true' si vous voulez déboguer et écouter les phrases GPS brutes# définir GPSECHO trueint timezone =+1 ; // Europe/Berlin (UTC +0100)> NMEA est une configuration void orientée UTC(){ lcd.init(); LCD rétro-éclairage(); // se connecte à 115200 afin que nous puissions lire le GPS assez rapidement et faire écho sans laisser de caractères // le cracher également Serial.begin(115200); retard (5000); Serial.println("Test de base de la bibliothèque GPS Adafruit !"); // 9600 NMEA est le débit en bauds par défaut pour les GPS Adafruit MTK - certains utilisent 4800 GPS.begin (9600); //> dans mon cas, j'utilise UBLOX 6M:GY-GPS6Mv2 // décommentez cette ligne pour activer RMC (minimum recommandé) et GGA (données fixes) y compris l'altitude GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // Décommentez cette ligne pour activer uniquement les données "minimum recommandées" //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); // Pour l'analyse des données, nous ne suggérons d'utiliser autre chose que RMC uniquement ou RMC+GGA car // l'analyseur ne se soucie pas des autres phrases pour le moment // Définir le taux de mise à jour GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // Taux de mise à jour de 1 Hz // Pour que le code d'analyse fonctionne correctement et ait le temps de trier les données, et // l'imprime, nous ne suggérons pas d'utiliser quoi que ce soit de plus de 1 Hz // Demander des mises à jour sur l'état de l'antenne, commenter pour garder le silence GPS.sendCommand(PGCMD_ANTENNA); retard(1000); // Demander la version du firmware mySerial.println(PMTK_Q_RELEASE);}uint32_t timer =millis();void loop() // exécuter encore et encore{ char c =GPS.read(); // si vous voulez déboguer, c'est le bon moment pour le faire ! if ((c) &&(GPSECHO)) Serial.write(c); // si une phrase est reçue, nous pouvons vérifier la somme de contrôle, l'analyser... if (GPS.newNMEAreceived()) { // une chose délicate ici est si nous imprimons la phrase NMEA, ou les données // nous finissons pas écouter et attraper d'autres phrases! // soyez donc très prudent si vous utilisez OUTPUT_ALLDATA et essayez d'imprimer des données //Serial.println(GPS.lastNMEA()); // cela définit également l'indicateur newNMEAreceived() sur false if (!GPS.parse(GPS.lastNMEA())) // cela définit également l'indicateur newNMEAreceived() sur false return ; // nous pouvons échouer dans l'analyse d'une phrase auquel cas nous devons simplement attendre un autre } // si millis() ou timer se termine, nous le réinitialiserons simplement if (timer> millis()) timer =millis(); // environ toutes les 2 secondes environ, affiche les statistiques actuelles if (millis() - timer> 2000) { timer =millis(); // réinitialiser la minuterie Serial.print("\nTime:"); if (GPS.heure <10) { Serial.print('0'); } Serial.print(GPS.hour, DEC); Serial.print(':'); if (GPS.minute <10) { Serial.print('0'); } Serial.print(GPS.minute, DEC); Serial.print(':'); if (GPS.secondes <10) { Serial.print('0'); } Serial.print(GPS.seconds, DEC); Serial.print('.'); if (GPS.milliseconds <10) { Serial.print("00"); } else if (GPS.milliseconds> 9 &&GPS.milliseconds <100) { Serial.print("0"); } Serial.println(GPS.milliseconds); Serial.print("Date :"); Serial.print(GPS.day, DEC); Serial.print('/'); Serial.print(GPS.month, DEC); Serial.print("/20"); Serial.println(GPS.year, DEC); Serial.print("Fix:"); Serial.print((int)GPS.fix); Serial.print(" qualité :"); Serial.println((int)GPS.fixquality); // sortie sur l'écran LCD lcd.setCursor(5,0); // ,0 =première ligne int heure =(GPS.heure) + fuseau horaire ; // formater GPS.heure UTC dans votre fuseau horaire individuel if (heure <10) { lcd.print('0'); } lcd.print(heure, DEC); lcd.print(':'); if (GPS.minute <10) { lcd.print('0'); } lcd.print(GPS.minute, DEC); lcd.print(':'); if (GPS.secondes <10) { lcd.print('0'); } lcd.print(GPS.secondes, DEC); // sortie sur l'écran LCD lcd.setCursor(5,1) ; // ,0 =deuxième ligne if (GPS.day <10) { lcd.print('0'); } lcd.print(GPS.jour, DEC); lcd.print('.'); if (GPS.mois <10) { lcd.print('0'); } lcd.print(GPS.mois, DEC); lcd.print('.'); lcd.print(GPS.année, DEC); if (GPS.fix) { // avons-nous une connexion satellite ? si oui, nous avons plus de valeurs :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("Vitesse (nœuds):"); Serial.println(GPS.speed); Serial.print("Angle :"); Serial.println(GPS.angle); Serial.print("Altitude :"); Serial.println(GPS.altitude); Serial.print("Satellite :"); Serial.println((int)GPS.satellites); lcd.setCursor(0,2) ; // ,2 =troisième ligne // 1 Knoten =1,852 Kilomètre par heure float speed =(GPS.speed) * 1,852 ; // Passer de Vitesse/Knoten> Vitesse/km/h //lcd.print("Vitesse km/h:"); lcd.print(vitesse); // Bewertung der Windstärke nach https://de.wikipedia.org/wiki/Windgeschwindigkeit /* Beschreibung - Geschwindigkeit en 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 (vitesse <=1) {lcd.print(" Windstille");} else if ((vitesse> 1) &&(vitesse <=9)) {lcd.print(" leiser Zug");} else if ((vitesse> 9) &&(vitesse <=46)) {lcd.print(" Brise");} else if ((vitesse> 46) &&(vitesse <=56)) {lcd.print(" vent plus fort ");} else if ((vitesse> 56) &&(vitesse <=74)) {lcd.print(" stuerm. Wind");} else if ((vitesse> 74) &&(vitesse <=83)) { lcd.print(" Sturm");} else if ((vitesse> 83) &&(vitesse <=102)) {lcd.print(" schwerer Sturm");} else if (vitesse> 102) {lcd.print( " Orkan");} else {lcd.print(" ohne Bewertung");} lcd.setCursor(0,3) ; // ,3 =quatrième ligne lcd.print("Hoehe:"); lcd.print(GPS.altitude); } }}

Processus de fabrication

  1. contrôleur de gants et voiture à hélice bricolage bon marché
  2. Capteur DHT11 avec LED et haut-parleur piézo
  3. Enregistreur de données GPS, analyse spatiale et Azure IoT Hub.
  4. Enregistreur de données de température et d'humidité
  5. Arduino Temp. Moniteur et horloge en temps réel avec affichage 3.2
  6. Horloge POV LED de style analogique
  7. Joyeux anniversaire :lumières et sons
  8. Automates cellulaires basés sur Arduino et OLED
  9. Pédale de vitesse et pédale pour guitare !