Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Definir DS3231 por GPS

Componentes e suprimentos

Arduino Nano R3
× 1
Módulo de relógio DS3231
× 1
MÓDULO NEO 6M GPS
× 1
BI DIRECTIONAL LEVEL SHIFTER
× 1
VISOR LCD 16 * 2
× 1
BACKPACK I2C LCD
× 1
Soquetes de 15 vias 0,1 polegada
× 2
Soquetes de 6 vias 0,1 polegada
× 2
Soquete de 0,1 polegada de 4 vias
× 1
Soquete de 5 vias 0,1 polegada
× 1
Pin strip de 4 vias 0,1 polegada
× 1
Stripboard 24 tiras * 37 colunas
× 1
resistores de 4 K7
× 2
Botão (pólo único momentâneo 6m quadrado)
× 1

Sobre este projeto


Meu DS3231 oscila, eu estava fazendo a coisa normal ao atualizá-lo, compilando algum código usando o tempo do sistema, mas isso provou ser um pouco impreciso, pois a compilação e o upload continuaram sendo interrompidos por outros processos que aconteciam no meu computador.

Depois que descobri que o GPS fornecia a hora exata (UTC) e a data, decidi usar isso para configurar meu DS3231.





Circuito:


Mochila LCD para Arduino:

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

Módulo de relógio DS3231 para Arduino:

GND - GND

VCC - 5V

SDA - SDA (A4)

SCL - SCL (A5)

MUDANÇA DE NÍVEL do Arduino:

5V - 5V

GND - GND

D3 - BUS

D4 - BUS

NEO 6M GPS do deslocador de nível:

3V - VCC

GND - GND

BUS - TXD (termina em D3)

BUS - RXD (termina em D4)

MUDAR DE CONTATOS:

SWITCH - D9

SWITCH - GND





Potência:


Eu forneço energia ao meu circuito por meio do cabo USB.





Software:


99% do software é o exemplo parsing.ino da biblioteca Adafruit GPS. Eu adicionei uma pequena quantidade de código para passar a data e hora do GPS extraída para o DS3231 e algum código adicional para exibir a hora do DS3231 em um display LCD.





Biblioteca usada:


Adafruit GPSLibrary por Adafruit versão 1.0.3

RTCLib por Adafruit versão 1.2.0

NewLiquidCrystalpara a mochila com visor I2C.





Operação:


Ligue a unidade.

O LCD exibirá os valores de data e hora atualmente nos registros DS3231.

Espere um pouco até o GPS travar.

Pressione o botão para definir a hora através do sinal GPS.

O LCD exibirá a nova hora.





Limitações da operação:


A unidade GPS leva tempo para travar e não há nenhum indicador de que o travamento foi alcançado. Pressionar o botão set sem travar resultou na configuração da data do meu DS3231 para 2000:0:0 e o tempo para 0:0:0.

Depois que o LED vermelho na unidade GPS começa a piscar, parece ser o melhor momento para pressionar o botão set - isso pode durar 10 minutos (dentro de casa).

Inicialmente, a unidade DS3231 que usei estava com a bateria descarregada, ao pressionar definir a data foi definida para 2000:0:0 e a hora para 0:164:164. Demorou um pouco para que a bateria recebesse carga suficiente para aceitar os dados do GPS e continuar funcionando corretamente por conta própria.





Peculiaridades do GPS:


A placa que comprei dizia simplesmente NEO 6M GPS e tem os pinos de conexão marcados com suas funções. Dei uma olhada na folha de dados do dispositivo [1] e disse que o dispositivo funcionava em torno de 3V, daí o meu uso de um deslocador de nível. No entanto, em uma inspeção mais detalhada, encontrei um chip 4A2D soldado à placa, uma pesquisa na Internet mostra que é um regulador de tensão, mas isso não garante que as linhas de comunicação estejam com nível de deslocamento (minha unidade veio sem diagrama de circuito).

Também li na Internet que diferentes módulos GPS variam em sua capacidade de receber um bom sinal em ambientes internos, por isso adicionei um display LCD para que eu pudesse levá-lo para fora.





Peculiaridade do LCD:


Estou usando um daqueles estranhos que têm um endereço I2C de 0x3F, a maioria usa o endereço 0x27, portanto, se você não vir nada, tente alterá-lo primeiro.





Peculiaridade da biblioteca:


A libraryRTCLib (Adafruit versão 1.2.0) define os registros de hora e data, mas não o registro de dia do DS3231. A biblioteca tem a função de devolver o dia da semana que é calculado em tempo real a partir dos valores do registo de datas.

Achei isso estranho, mas percebi eventualmente que faz sentido, definir o registro do dia exigiria que seu código fosse configurado para alterá-lo em anos bissextos, enquanto a geração do dia por meio de uma fórmula evita isso.





UTC e hora local:


Eu fiz uma pesquisa no UTC e descobri que nenhuma alteração foi necessária para o meu horário local, então se você precisar, você mesmo terá que adicionar esse trecho de código.





Referências:


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

Código

  • Definir arquivo de código DS3231
Definir arquivo de código DS3231 Arduino
 // Funções de data e hora usando um DS3231 RTC conectado via I2C e Wire lib # include  #include "RTClib.h" // Aadafruit versão 1.2.0 em minha máquinaRTC_DS3231 RTC; char daysOfTheWeek [7] [12] ={"Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"}; const int days_string_length =12; // fim do relógio // para LCD display // # include  // já foi incluído (acima) // Obtenha a Biblioteca I2C do LCD aqui:// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include  // Observe o endereço incomum de 0x3F a maioria dos lcd's usa o endereço de 0x27, então se você não vir nada, tente alterar aquele lcd firstLiquidCrystal_I2C (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVO); // Definir o endereço I2C do LCD // fim do display lcd // para o botão # definir o botão 9 // Código de teste para módulos Adafruit GPS usando driver MTK3329 / MTK3339 //// Este código mostra como ouvir o módulo GPS em uma interrupção // que permite ao programa ter mais 'liberdade' - apenas analise // quando uma nova sentença NMEA estiver disponível! Em seguida, acesse os dados quando // desejado.//// Testado e funciona muito bem com o módulo GPS Adafruit Ultimate // usando o chipset MTK33x9 // ------> http://www.adafruit.com/products/746/ / Escolha um hoje na loja de eletrônicos da Adafruit // e ajude a oferecer suporte a hardware e software de código aberto! -ada # include  #include  // Se você estiver usando um módulo GPS:// Conecte o pino de energia do GPS a 5V // Conecte o pino de aterramento do GPS ao solo // Se estiver usando software serial (esboço de exemplo padrão):// Conecte o pino GPS TX (transmissão) ao Digital 3 // Conecte o pino GPS RX (recebimento) ao Digital 2 // Se estiver usando hardware serial (por exemplo, Arduino Mega):// Conecte o GPS Pino TX (transmitir) para Arduino RX1, RX2 ou RX3 // Conecte o pino GPS RX (receber) para combinar TX1, TX2 ou TX3 // Se você estiver usando o escudo Adafruit GPS, mude // SoftwareSerial mySerial (3, 2 ); -> SoftwareSerial mySerial (8, 7); // e certifique-se de que a chave está definida para SoftSerial // Se estiver usando o software serial, mantenha esta linha habilitada // (você pode alterar os números dos pinos para corresponder à sua fiação):SoftwareSerial mySerial ( 3, 2); // Se estiver usando serial de hardware (por exemplo, Arduino Mega), comente a // linha SoftwareSerial acima e habilite esta linha // (você pode alterar o número de série para corresponder à sua fiação):// HardwareSerial mySerial =Serial1; Adafruit_GPS GPS (&mySerial); // Defina GPSECHO como 'falso' para desligar a eco de dados GPS para o console Serial // Defina como 'verdadeiro' se você deseja depurar e ouvir as frases de GPS brutas. #define GPSECHO false // ---------> desativado // mantém o controle se estamos usando a interrupção // desativada por padrão! boolean usingInterrupt =false; void useInterrupt (boolean); // O protótipo Func mantém o Arduino 0023 happyvoid setup () {// conecta-se a 115200 para que possamos ler o GPS rápido o suficiente e ecoar sem eliminar os caracteres // também expele Serial.begin (115200); Serial.println ("Teste básico da biblioteca Adafruit GPS!"); // 9600 NMEA é a taxa de transmissão padrão para GPS Adafruit MTK - alguns usam 4800 GPS.begin (9600); // descomente esta linha para ligar RMC (mínimo recomendado) e GGA (dados fixos) incluindo altitude GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // descomente esta linha para ativar apenas os dados "mínimos recomendados" //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); // Para analisar dados, não sugerimos usar nada além de RMC apenas ou RMC + GGA, pois // o analisador não se preocupa com outras sentenças neste momento // Defina a taxa de atualização GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // Taxa de atualização de 1 Hz // Para que o código de análise funcione bem e tenha tempo para classificar os dados e // imprimi-los, não sugerimos usar nada superior a 1 Hz // Solicite atualizações no status da antena, comente para fora para manter o silêncio GPS.sendCommand (PGCMD_ANTENNA); // a coisa boa sobre este código é que você pode ter uma interrupção timer0 disparada // a cada 1 milissegundo, e ler os dados do GPS para você. isso torna o // código de loop muito mais fácil! useInterrupt (true); atraso (1000); // Solicita a versão do firmware mySerial.println (PMTK_Q_RELEASE); // iniciar lcd lcd.begin (16,2); lcd.backlight (); lcd.clear (); // botão de configuração pinMode (botão, INPUT_PULLUP); } // A interrupção é chamada uma vez por milissegundo, procura por novos dados GPS e armazena itSIGNAL (TIMER0_COMPA_vect) {char c =GPS.read (); // se você deseja depurar, este é um bom momento para fazê-lo! #ifdef UDR0 if (GPSECHO) if (c) UDR0 =c; // escrever diretamente para UDR0 é muito mais rápido do que Serial.print // mas apenas um caractere pode ser escrito por vez. #endif} void useInterrupt (boolean v) {if (v) {// Timer0 já é usado para millis () - vamos apenas interromper em algum lugar // no meio e chamar a função "Compare A" acima de OCR0A =0xAF; TIMSK0 | =_BV (OCIE0A); usingInterrupt =true; } else {// não chama mais a função de interrupção COMPA TIMSK0 &=~ _BV (OCIE0A); usingInterrupt =false; }} uint32_t timer =millis (); void loop () // executar continuamente {// caso você não esteja usando a interrupção acima, você // precisará 'consultar manualmente' o GPS, não sugerido:(if (! usingInterrupt) {// ler dados do GPS no 'loop principal' char c =GPS.read (); // se você deseja depurar, este é um bom momento para fazê-lo! if (GPSECHO) if (c) Serial.print (c);} // se uma frase for recebida, podemos verificar a soma de verificação, analisá-la ... if (GPS.newNMEAreceived ()) {// uma coisa complicada aqui é se imprimirmos a frase NMEA, ou dados // acabamos não ouvindo e captando outras frases! // Portanto, seja muito cauteloso se usar OUTPUT_ALLDATA e tentar imprimir dados //Serial.println (GPS.lastNMEA ()); // isso também define o sinalizador newNMEAreceived () como falso if (! GPS.parse (GPS.lastNMEA ())) // isso também define o sinalizador newNMEAreceived () como false return; // podemos falhar ao analisar uma frase, caso em que devemos apenas espere por outro} // se millis () ou timer encerrar, vamos apenas redefini-lo se (timer> millis ()) temporizador =milis (); bool estático second_time_round =false; // aproximadamente a cada 2 segundos ou mais, imprime as estatísticas atuais // if (millis () - timer> 2000) {// timer =millis (); // redefine o cronômetro // Grava dados no relógio se o botão for pressionado - botão normalmente mantido alto por pullup interno if (! digitalRead (botão)) {// Observação:RTClib não define explicitamente o registro do dia da semana no DS3231.// Em vez disso, quando você usa dayOfTheWeek (), o dia é calculado por uma fórmula baseada na data. // Domingo é considerado zero.//( com base na minha leitura do cabeçalho da biblioteca e dos arquivos ccp) // set rtc RTC.adjust (DateTime (GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minuto, GPS.segundos)); // lcd lcd.clear (); lcd.setCursor (2,0); lcd.print ("Conjunto pressionado"); atraso (5000); lcd.clear (); } DateTime agora =RTC.now (); lcd.setCursor (4,0); lcd.print (now.year (), DEC); lcd.print ('/'); lcd.print (now.month (), DEC); lcd.print ('/'); lcd.print (now.day (), DEC); lcd.print (''); lcd.setCursor (4,1); lcd.print (now.hour (), DEC); lcd.print (':'); lcd.print (now.minute (), DEC); lcd.print (':'); lcd.print (now.second (), DEC); lcd.print ("");} 

Esquemas


Processo de manufatura

  1. O que são parafusos de fixação?
  2. Deixando um legado duradouro
  3. SMRP publica conjunto de definições de métricas M&R ​​
  4. Java 10 - Configuração do Ambiente
  5. O que é um quadrado fixo?
  6. Lixamento de superfície à moda antiga
  7. A melhor escolha:Torno CNC Box Way
  8. O que é um conjunto de socos?
  9. O que é um torno CNC de via linear?
  10. Entendendo o conjunto de ferramentas mecânicas