Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Configurar DS3231 por GPS

Componentes y suministros

Arduino Nano R3
× 1
Módulo de reloj DS3231
× 1
MÓDULO GPS NEO 6M
× 1
CAMBIADOR DE NIVEL DIRECCIONAL BI
× 1
PANTALLA LCD 16 * 2
× 1
MOCHILA LCD I2C
× 1
enchufes de 15 vías de 0,1 pulgadas
× 2
enchufes de 6 vías de 0,1 pulgadas
× 2
Enchufe de 4 vías de 0,1 pulgadas
× 1
Enchufe de 5 vías de 0,1 pulgadas
× 1
tira de clavijas de 4 vías de 0,1 pulgadas
× 1
Stripboard 24 tiras * 37 columnas
× 1
resistencias 4K7
× 2
Botón pulsador (unipolar momentáneo cuadrado de 6 m)
× 1

Acerca de este proyecto

Mi DS3231 se desvía, estaba haciendo lo normal al actualizarlo compilando algo de código usando la hora del sistema, pero esto resultó un poco inexacto ya que la compilación y la carga seguían siendo interrumpidas por otros procesos que ocurrían en mi computadora.

Después de descubrir que el GPS dio la hora exacta (UTC) y la fecha, decidí usar eso para configurar mi DS3231.

Circuito:

Mochila LCD para Arduino:

GND - GND

VCC - 5 V

SDA - SDA (A4)

SCL - SCL (A5)

Módulo de reloj DS3231 para Arduino:

GND - GND

VCC - 5 V

SDA - SDA (A4)

SCL - SCL (A5)

LEVEL SHIFTER de Arduino:

5V - 5V

GND - GND

D3 - AUTOBÚS

D4 - AUTOBÚS

GPS NEO 6M de la palanca de cambios:

3V - VCC

GND - GND

BUS - TXD (termina en D3)

BUS - RXD (termina en D4)

CAMBIAR CONTACTOS:

INTERRUPTOR - D9

INTERRUPTOR - TIERRA

Poder:

Suministro la energía a mi circuito a través del cable USB.

Software:

El 99% del software es el ejemplo parsing.ino en la biblioteca de Adafruit GPS. Agregué una pequeña cantidad de código para pasar la fecha y hora extraídas del GPS al DS3231 y un código adicional para mostrar la hora del DS3231 en una pantalla LCD.

Biblioteca utilizada:

Adafruit GPSLibrary de Adafruit versión 1.0.3

RTCLib de Adafruit versión 1.2.0

NewLiquidCrystal para la mochila de exhibición I2C.

Operación:

Encienda la unidad.

La pantalla LCD mostrará los valores de fecha y hora actualmente en los registros DS3231.

Espere un momento a que se bloquee el GPS.

Presione el botón para configurar la hora a través de la señal de GPS.

La pantalla LCD mostrará la nueva hora.

Limitaciones de operación:

La unidad GPS tarda en bloquearse y no hay ningún indicador de que se haya logrado el bloqueo. Al presionar el botón de configuración sin bloqueo, la fecha de mi DS3231 se estableció en 2000:0:0 y la hora en 0:0:0.

Una vez que el LED rojo de la unidad GPS comienza a parpadear, parece que es el mejor momento para presionar el botón de configuración; esto puede ser en decenas de minutos (en interiores).

Inicialmente, la unidad DS3231 que usé tenía una batería descargada, al presionar establecer, la fecha se estableció en 2000:0:0 y la hora en 0:164:164. La batería tardó bastante en cargarse lo suficiente para aceptar los datos del GPS y continuar funcionando correctamente por sí sola.

Peculiaridades del GPS:

La placa que compré decía simplemente NEO 6M GPS y tiene los pines de conexión marcados con sus funciones. Eché un vistazo a la hoja de datos del dispositivo [1] y eso indicaba que el dispositivo funcionaba con alrededor de 3V, de ahí mi uso de un cambiador de nivel. Sin embargo, en una inspección más cercana, encontré un chip 4A2D soldado a la placa, una búsqueda en Internet muestra que es un regulador de voltaje, pero esto no garantiza que las líneas de comunicación estén niveladas (mi unidad vino sin diagrama de circuito).

También he leído en línea que los diferentes módulos de GPS varían en su capacidad para recibir una buena señal en interiores, de ahí mi adición de una pantalla LCD para poder llevarla al exterior.

Extravagancia de la pantalla LCD:

Estoy usando uno de los bichos raros que tiene una dirección I2C de 0x3F, la mayoría usa la dirección 0x27, así que si no ve nada, intente alterar eso primero.

Peculiaridad de la biblioteca:

La biblioteca RTCLib (Adafruit versión 1.2.0) establece los registros de fecha y hora, pero no el registro de día del DS3231. La biblioteca tiene una función para devolver el día de la semana que se calcula sobre la marcha utilizando los valores en el registro de fechas.

Encontré esto extraño, pero finalmente me di cuenta de que tiene sentido, configurar el registro de día requeriría que su código esté configurado para alterarlo en años bisiestos mientras que generar el día mediante una fórmula evita esto.

UTC y hora local:

Hice una búsqueda en UTC y descubrí que no se requería ningún cambio para mi hora local, por lo que si lo necesita, tendrá que agregar ese fragmento de código usted mismo.

Referencias:

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

Código

  • Establecer archivo de código DS3231
Establecer archivo de código DS3231 Arduino
 // Funciones de fecha y hora usando un RTC DS3231 conectado a través de I2C y Wire lib # incluyen  #include "RTClib.h" // Aadafruit versión 1.2.0 en mi máquina RTC_DS3231 RTC; char daysOfTheWeek [7] [12] ={"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"}; const int days_string_length =12; // final del reloj // para lcd display // # include  // ya se ha incluido (arriba) // Obtenga la biblioteca LCD I2C aquí:// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include  // Observe la dirección inusual de 0x3F, la dirección de uso de la mayoría de lcd de 0x27, así que si no ve nada, intente alterar ese primer lcd de cristal líquido_I2C (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVO); // Establecer la dirección LCD I2C // fin de para pantalla lcd // para botón # definir botón 9 // Código de prueba para módulos GPS Adafruit usando el controlador MTK3329 / MTK3339 //// Este código muestra cómo escuchar el módulo GPS en una interrupción // que permite que el programa tenga más 'libertad' - ¡simplemente analice // cuando esté disponible una nueva sentencia NMEA! Luego acceda a los datos cuando // lo desee.//// Probado y funciona muy bien con el módulo GPS Adafruit Ultimate // usando el chipset MTK33x9 // ------> http://www.adafruit.com/products/746/ / ¡Compre uno hoy en la tienda de electrónica Adafruit // y ayude a respaldar el hardware y software de código abierto! -ada # include  #include  // Si está usando un módulo GPS:// Conecte el pin de alimentación del GPS a 5V // Conecte el pin de tierra del GPS a tierra // Si usa software serial (ejemplo de boceto predeterminado):// Conecte el pin GPS TX (transmisión) a Digital 3 // Conecte el pin GPS RX (recepción) a Digital 2 // Si usa hardware serial (por ejemplo, Arduino Mega):// Conecte el GPS Pin TX (transmisión) a Arduino RX1, RX2 o RX3 // Conecte el pin GPS RX (recepción) a TX1, TX2 o TX3 correspondiente // Si está utilizando el protector de GPS Adafruit, cambie // SoftwareSerial mySerial (3, 2 ); -> SoftwareSerial mySerial (8, 7); // y asegúrese de que el interruptor esté configurado en SoftSerial // Si usa el software en serie, mantenga esta línea habilitada // (puede cambiar los números de pin para que coincidan con su cableado):SoftwareSerial mySerial ( 3, 2); // Si usa hardware serial (por ejemplo, Arduino Mega), comente la // línea anterior SoftwareSerial y habilite esta línea en su lugar // (puede cambiar el número de serie para que coincida con su cableado):// HardwareSerial mySerial =Serial1; Adafruit_GPS GPS (&mySerial); // Establezca GPSECHO en 'falso' para desactivar el eco de los datos GPS en la consola Serial // Establezca en 'verdadero' si desea depurar y escuchar las sentencias GPS sin procesar. #define GPSECHO false // ---------> desactivado // esto realiza un seguimiento de si estamos usando la interrupción // desactivado por defecto! boolean usingInterrupt =false; void useInterrupt (boolean); // El prototipo Func mantiene a Arduino 0023 happyvoid setup () {// conecta en 115200 para que podamos leer el GPS lo suficientemente rápido y hacer eco sin dejar caer caracteres // también escupir Serial.begin (115200); Serial.println ("¡Prueba básica de la biblioteca de Adafruit GPS!"); // 9600 NMEA es la velocidad en baudios predeterminada para Adafruit MTK GPS; algunos usan 4800 GPS.begin (9600); // Quite el comentario de esta línea para activar RMC (mínimo recomendado) y GGA (fijar datos), incluida la altitud GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // descomente esta línea para activar solo los datos "mínimos recomendados" //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); // Para analizar datos, no sugerimos usar nada más que RMC solamente o RMC + GGA ya que // al analizador no le importan otras oraciones en este momento // Establezca la velocidad de actualización GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // Tasa de actualización de 1 Hz // Para que el código de análisis funcione bien y tenga tiempo para clasificar los datos, y // imprimirlo, no sugerimos usar nada superior a 1 Hz // Solicite actualizaciones sobre el estado de la antena, comente fuera para guardar silencio GPS.sendCommand (PGCMD_ANTENNA); // Lo bueno de este código es que puede hacer que se active una interrupción del temporizador0 // cada 1 milisegundo y leer los datos del GPS por usted. ¡Eso hace que el código de ciclo // sea mucho más fácil! useInterrupt (verdadero); retraso (1000); // Solicite la versión de firmware mySerial.println (PMTK_Q_RELEASE); // iniciar lcd lcd.begin (16,2); LCD luz de fondo(); lcd.clear (); // botón de configuración pinMode (botón, INPUT_PULLUP); } // La interrupción se llama una vez por milisegundo, busca cualquier dato GPS nuevo y lo almacena.SIGNAL (TIMER0_COMPA_vect) {char c =GPS.read (); // si quieres depurar, ¡es un buen momento para hacerlo! #ifdef UDR0 if (GPSECHO) if (c) UDR0 =c; // escribir directamente en UDR0 es mucho más rápido que Serial.print // pero solo se puede escribir un carácter a la vez. #endif} void useInterrupt (boolean v) {if (v) {// Timer0 ya se usa para millis () - simplemente interrumpiremos en algún lugar // en el medio y llamaremos a la función "Comparar A" arriba OCR0A =0xAF; TIMSK0 | =_BV (OCIE0A); usingInterrupt =verdadero; } else {// no llame más a la función de interrupción COMPA TIMSK0 &=~ _BV (OCIE0A); usingInterrupt =falso; }} uint32_t timer =millis (); void loop () // ejecutar una y otra vez {// en caso de que no estés usando la interrupción anterior, // necesitarás 'consultar manualmente' el GPS, no sugerido:(if (! usingInterrupt) {// lee datos del GPS en el 'bucle principal' char c =GPS.read (); // si quieres depurar, ¡es un buen momento para hacerlo! if (GPSECHO) if (c) Serial.print (c);} // si se recibe una oración, podemos comprobar la suma de comprobación, analizarla ... if (GPS.newNMEAreceived ()) {// algo complicado aquí es si imprimimos la oración NMEA, o datos // ¡terminamos sin escuchar y captando otras oraciones! // así que tenga mucho cuidado si usa OUTPUT_ALLDATA e intenta imprimir datos //Serial.println (GPS.lastNMEA ()); // esto también establece el indicador newNMEAreceived () en falso if (! GPS.parse (GPS.lastNMEA ())) // esto también establece el indicador newNMEAreceived () en falso retorno; // podemos fallar al analizar una oración, en cuyo caso deberíamos solo espera otro} // si millis () o el temporizador se completa, simplemente lo restableceremos if (timer> millis ()) timer =millis (); static bool second_time_round =false; // aproximadamente cada 2 segundos más o menos, imprime las estadísticas actuales // if (millis () - timer> 2000) {// timer =millis (); // restablecer el temporizador // Escribir datos en el reloj si se presiona el botón - botón normalmente mantenido alto por pullup interno if (! digitalRead (button)) {// Nota:RTClib no establece explícitamente el registro del día de la semana en DS3231.// En cambio, cuando usa dayOfTheWeek (), el día se calcula mediante una fórmula basada en la fecha. // El domingo se toma como cero.//(basado en mi lectura del encabezado de la biblioteca y los archivos ccp) // set rtc RTC.adjust (DateTime (GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minuto, GPS.seconds)); // lcd lcd.clear (); lcd.setCursor (2,0); lcd.print ("Conjunto presionado"); retraso (5000); lcd.clear (); } DateTime ahora =RTC.now (); lcd.setCursor (4,0); lcd.print (ahora.año (), DEC); lcd.print ('/'); lcd.print (ahora.mes (), DEC); lcd.print ('/'); lcd.print (ahora.día (), DEC); lcd.print (''); lcd.setCursor (4,1); lcd.print (ahora.hora (), DEC); lcd.print (':'); lcd.print (ahora.minuto (), DEC); lcd.print (':'); lcd.print (ahora.segundo (), DEC); lcd.print ("");} 

Esquemas


Proceso de manufactura

  1. ¿Qué son los tornillos de fijación?
  2. Conjuntos y diagramas de Venn
  3. Dejando un legado duradero
  4. SMRP publica un conjunto de definiciones de métricas de M&R
  5. Java 10 - Configuración del entorno
  6. ¿Qué es un cuadrado fijo?
  7. Rectificado de superficies a la antigua usanza
  8. La mejor opción:un torno CNC con forma de caja
  9. ¿Qué es un juego de punzones?
  10. ¿Qué es un torno CNC de vía lineal?
  11. Descripción del conjunto de herramientas mecánicas