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

Définir DS3231 par GPS

Composants et fournitures

Arduino Nano R3
× 1
Module d'horloge DS3231
× 1
MODULE GPS NEO 6M
× 1
CHANGEUR DE NIVEAU BI DIRECTIONNEL
× 1
AFFICHAGE LCD 16*2
× 1
SAC À DOS LCD I2C
× 1
Douilles 0,1 pouce 15 voies
× 2
Douilles 6 voies 0,1 pouce
× 2
Douille 4 voies 0,1 pouce
× 1
Prise 0,1 pouce à 5 broches
× 1
Bande à broches à 4 voies de 0,1 pouce
× 1
Stripboard 24 bandes * 37 colonnes
× 1
Résistances 4K7
× 2
Bouton poussoir (unipolaire momentané 6m carré)
× 1

À propos de ce projet

Mon DS3231 dérive, je faisais la chose normale en le mettant à jour en compilant du code en utilisant l'heure système, mais cela s'est avéré un peu inexact car la compilation et le téléchargement étaient interrompus par d'autres processus se produisant sur mon ordinateur.

Après avoir découvert que le GPS donnait l'heure (UTC) et la date exactes, j'ai décidé de l'utiliser pour régler mon DS3231.

Circuit :

Sac à dos LCD pour Arduino :

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

Module d'horloge DS3231 vers Arduino :

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

LEVEL SHIFTER d'Arduino :

5V - 5V

GND - GND

D3 - AUTOBUS

D4 - AUTOBUS

NEO 6M GPS de level shifter :

3V - VCC

GND - GND

BUS - TXD (se termine à J3)

BUS - RXD (se termine à J4)

CHANGER DE CONTACT :

COMMUTATEUR - D9

COMMUTATEUR - MASSE

Puissance :

J'alimente mon circuit via le câble USB.

Logiciel :

Le 99% du logiciel est l'exemple parsing.ino dans la bibliothèque GPS Adafruit. J'ai ajouté une petite quantité de code pour transmettre la date et l'heure GPS extraites au DS3231 et du code supplémentaire pour afficher l'heure du DS3231 sur un écran LCD.

Bibliothèque utilisée :

Adafruit GPSLibrary par Adafruit version 1.0.3

RTCLib par Adafruit version 1.2.0

NouveauLiquidCrystalpour le sac à dos display I2C.

Opération :

Allumez l'appareil.

L'écran LCD affichera les valeurs de date et d'heure actuellement dans les registres DS3231.

Attendez un moment que le GPS se verrouille.

Appuyez sur le bouton pour régler l'heure via le signal GPS.

L'écran LCD affichera la nouvelle heure.

Limitations de fonctionnement :

L'unité GPS prend du temps à se verrouiller et il n'y a aucun indicateur que le verrouillage a été réalisé. En appuyant sur le bouton de réglage sans verrouillage, ma date DS3231 a été réglée sur 2000:0:0 et l'heure sur 0:0:0.

Une fois que la LED rouge de l'unité GPS commence à clignoter, il semble que ce soit le meilleur moment pour appuyer sur le bouton de réglage - cela peut être dans 10 minutes (à l'intérieur).

Initialement, l'unité DS3231 que j'ai utilisée avait une batterie à plat, en appuyant sur Set, la date a été réglée sur 2000:0:0 et l'heure sur 0:164:164. Il a fallu un certain temps pour que la batterie soit suffisamment chargée pour accepter les données GPS et continuer à fonctionner correctement par elle-même.

Bizarreries GPS :

La carte que j'ai achetée disait simplement NEO 6M GPS et a les broches de connexion marquées avec leurs fonctions. J'ai jeté un coup d'œil à la fiche technique de l'appareil [1] et cela indiquait que l'appareil fonctionnait sur environ 3V, d'où mon utilisation d'un décaleur de niveau. Cependant, en y regardant de plus près, j'ai trouvé une puce 4A2D soudée à la carte, une recherche sur Internet montre qu'il s'agit d'un régulateur de tension mais cela ne garantit pas que les lignes de communication sont décalées de niveau (mon appareil est livré sans schéma de circuit).

J'ai également lu en ligne que différents modules GPS varient dans leur capacité à recevoir un bon signal à l'intérieur, d'où mon ajout d'un écran LCD pour que je puisse l'emmener à l'extérieur.

bizarrerie de l'écran LCD :

J'utilise l'un de ceux qui ont une adresse I2C de 0x3F, la plupart utilisent l'adresse 0x27, donc si vous ne voyez rien, essayez d'abord de la modifier.

Bizarrerie de la bibliothèque :

La bibliothèqueRTCLib (Adafruit version 1.2.0) définit les registres d'heure et de date mais pas le registre de jour du DS3231. La bibliothèque a une fonction pour retourner le jour de la semaine qui est calculé à la volée en utilisant les valeurs du registre de date.

J'ai trouvé cela étrange mais j'ai finalement réalisé que cela avait du sens, la définition du registre des jours nécessiterait que votre code soit configuré pour le modifier les années bissextiles tout en générant le jour par une formule évite cela.

UTC et heure locale :

J'ai fait une recherche sur UTC et j'ai trouvé qu'aucun changement n'était nécessaire pour mon heure locale, donc si vous en avez besoin, vous devrez ajouter ce morceau de code vous-même.

Références :

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

Code

  • Définir le fichier de code DS3231
Définir le fichier de code DS3231Arduino
// Fonctions date et heure utilisant un DS3231 RTC connecté via I2C et Wire lib#include #include "RTClib.h"//Aadafruit version 1.2.0 sur ma machineRTC_DS3231 RTC;char daysOfTheWeek[7] [12] ={"dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"};const int days_string_length =12;//truc de fin d'horloge//pour lcd display//#include //a déjà été inclus (ci-dessus) // Obtenez la bibliothèque LCD I2C ici :// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include //Notez l'adresse inhabituelle de 0x3F, l'adresse d'utilisation de la plupart des écrans LCD de 0x27, donc si vous ne voyez rien, essayez de modifier cette premièreLiquidCrystal_I2C lcd (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Définir l'adresse LCD I2C//fin de l'affichage lcd//pour le bouton #définir le bouton 9// Code de test pour les modules GPS Adafruit à l'aide du pilote MTK3329/MTK3339 //// Ce code montre comment écouter le module GPS dans une interruption // 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#include #include // Si vous utilisez un module GPS:// Connectez la broche d'alimentation GPS à 5V// Connectez la broche de terre GPS à la terre// Si vous utilisez un logiciel série (exemple d'esquisse par défaut):// Connectez la broche GPS TX (transmission) à Digital 3// Connectez la broche GPS RX (réception) à Digital 2// Si vous utilisez une série matérielle (par exemple Arduino Mega):// Connectez le GPS Broche TX (transmission) à Arduino RX1, RX2 ou RX3// Connectez la broche GPS RX (réception) à la correspondance TX1, TX2 ou TX3// Si vous utilisez le bouclier GPS Adafruit, changez // SoftwareSerial mySerial (3, 2 ); -> SoftwareSerial mySerial(8, 7);// et assurez-vous que le commutateur est réglé sur SoftSerial// Si vous utilisez une série logicielle, gardez cette ligne activée// (vous pouvez modifier les numéros de broche pour qu'ils correspondent à votre câblage):SoftwareSerial mySerial( 3, 2);// Si vous utilisez une série matérielle (par exemple Arduino Mega), commentez la// ligne SoftwareSerial ci-dessus et activez cette ligne à la place// (vous pouvez modifier le numéro de série pour qu'il corresponde à votre câblage)://HardwareSerial mySerial =Serial1;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 souhaitez déboguer et écouter les phrases GPS brutes. #define GPSECHO false //--------->désactivé// cela permet de savoir si nous utilisons l'interruption// désactivé par défaut !boolean usingInterrupt =false;void useInterrupt(boolean); // Le prototype Func conserve Arduino 0023 happyvoid setup () { // 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); 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); // 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); // la bonne chose à propos de ce code est que vous pouvez déclencher une interruption timer0 // toutes les millisecondes et lire les données du GPS pour vous. cela rend le // code de boucle beaucoup plus facile ! useInterrupt(true); retard(1000); // Demander la version du firmware mySerial.println(PMTK_Q_RELEASE); //démarrer l'écran lcd.begin(16,2) ; LCD rétro-éclairage(); lcd.clear(); // bouton de configuration pinMode (bouton, INPUT_PULLUP); }// L'interruption est appelée une fois par milliseconde, recherche de nouvelles données GPS et les stocke SIGNAL(TIMER0_COMPA_vect) { char c =GPS.read(); // si vous voulez déboguer, c'est le bon moment pour le faire !#ifdef UDR0 if (GPSECHO) if (c) UDR0 =c; // écrire directement sur UDR0 est beaucoup plus rapide que Serial.print // mais un seul caractère peut être écrit à la fois. #endif}void useInterrupt(boolean v) { if (v) { // Timer0 est déjà utilisé pour millis() - nous allons simplement interrompre // au milieu et appeler la fonction "Comparer A" au-dessus de OCR0A =0xAF ; TIMSK0 |=_BV(OCIE0A); usingInterrupt =true; } else { // ne plus appeler la fonction d'interruption COMPA TIMSK0 &=~_BV(OCIE0A); usingInterrupt =false; }}uint32_t timer =millis();void loop() // exécuter encore et encore{ // dans le cas où vous n'utilisez pas l'interruption ci-dessus, vous devrez // "interroger manuellement" le GPS, ce qui n'est pas suggéré :( if (! usingInterrupt) { // lit les données du GPS dans la 'boucle principale' char c =GPS.read(); // si vous voulez déboguer, c'est le bon moment pour le faire ! if (GPSECHO) if (c) Serial.print(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 par ne 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 aussi définit l'indicateur newNMEAreceived() sur false if (!GPS.parse(GPS.lastNMEA())) // cela définit également l'indicateur newNMEAreceived() sur false return ; // nous pouvons échouer à analyser une phrase auquel cas nous devrions attendez juste un autre } // si millis () ou la minuterie se termine, nous le réinitialiserons simplement si (minuterie> millis ()) timer =millis();static bool second_time_round=false; // environ toutes les 2 secondes environ, affiche les statistiques actuelles //if (millis() - timer> 2000) { // timer =millis(); // réinitialiser la minuterie // Écrire les données sur l'horloge si le bouton est enfoncé - le bouton est normalement maintenu haut par le pullup interne if(!digitalRead(button)){//Remarque :RTClib ne définit pas explicitement le registre du jour de la semaine sur DS3231.// Au lieu de cela, lorsque vous utilisez dayOfTheWeek(), le jour est calculé par une formule basée sur la date. //Dimanche est considéré comme zéro.//(basé sur ma lecture de l'en-tête de la bibliothèque et des fichiers ccp) //set rtc RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minute, GPS.secondes)); //lcd lcd.clear(); lcd.setCursor(2,0) ; lcd.print("Ensemble pressé"); retard (5000); lcd.clear(); } DateHeure maintenant =RTC.now(); lcd.setCursor(4,0); lcd.print(maintenant.année(), DEC); lcd.print('/'); lcd.print(maintenant.mois(), DEC); lcd.print('/'); lcd.print(now.day(), DEC); lcd.print(' '); lcd.setCursor(4,1) ; lcd.print(maintenant.heure(), DEC); lcd.print(':'); lcd.print(maintenant.minute(), DEC); lcd.print(':'); lcd.print(now.second(), DEC); lcd.print(" ");}

Schémas


Processus de fabrication

  1. Laisser un héritage durable
  2. SMRP publie un ensemble de définitions de métriques M&R
  3. Java 10 - Configuration de l'environnement
  4. Qu'est-ce qu'une équerre ?
  5. Meulage de surface à l'ancienne
  6. Le meilleur choix :un tour CNC Box Way
  7. Qu'est-ce qu'un jeu de poinçons ?
  8. Qu'est-ce qu'un tour CNC à voie linéaire ?
  9. Comprendre l'ensemble d'outils mécaniques