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

Um relógio barato e preciso baseado em GPS

Componentes e suprimentos

Arduino UNO
× 1
Adafruit RGB Backlight LCD - 16x2
no meu caso, um nobrand LCD 20x4 Display com adaptador I2C para fácil conectividade
× 1
Breadboard (genérico)
× 1
Fios de jumpers (genérico)
× 1
Receptor GPS (genérico)
GY-GPS6Mv2 com ublox NEO-6M
× 1

Aplicativos e serviços online

Arduino IDE

Sobre este projeto





Até agora, usei vários relógios RTC para projetos de relógio ou obtive o tempo de servidores NTP. Neste projeto, apresento outra fonte para vocês:análise da sequência NMEA de satélites GPS ao redor do mundo.

Fiquei surpreso com o quão barato é um receptor GPS hoje:compre um (no meu caso é usado o GY-GPS6Mv2).

a.) um primeiro - opcional - teste em um PC com Windows:Instale "u-center" como um download do U-Blox.

Com a ajuda de um adaptador FTDI, o GPS breakout encontra seu caminho para a porta COM do seu PC e mostra a fixação (a conexão) para a órbita após cerca de 1 minuto. Para isso, uma lâmpada de controle vermelha pisca no breakout.

Os gráficos gerados automaticamente fazem você querer experimentar mais com GPS. Com F8 - Console de texto no menu Exibir, você obtém as várias sequências NMEA fornecidas.

b.) Você pode realizar um teste de decodificação em serviços online gratuitos:https://rl.se/gprmc

Agora que está garantido que você tem um receptor GPS funcionando - certifique-se de que haja uma visão do céu - podemos extrair as informações desejadas da string para seus próprios desejos.

Usamos uma biblioteca Adafruit "Adafruit GPS Library" - se você a instalou no IDE do Arduino, pode experimentar um pouco com os exemplos.

c.) Circuito

Arduino A4> Display SDA Arduino A5> Display SCL

#include #include LiquidCrystal_I2C lcd (0x3F, 20, 4); // definir o endereço LCD> frequentemente 0x27 ou 0x3F

> usar um display que fica ao redor, talvez um 16x2?

#include #include

Conecte o pino de energia do GPS a 5V Conecte o pino de aterramento do GPS ao aterramento Conecte o pino GPS TX (transmissão) ao Digital 8 Conecte o pino GPS RX (receba) ao Digital 7 // você pode alterar os números dos pinos para corresponder à sua fiação:SoftwareSerial mySerial (8 , 7); Adafruit_GPS GPS (&mySerial);

> o receptor GPS é tolerante a 3,3 / 5V.

d.) Nosso relógio deve dar a hora, a data, uma indicação da velocidade do vento e digamos a altitude. Não precisamos de um local porque meu relógio parará na janela.

Uma string NMEA fornece a hora no padrão UTC. A conversão para o fuso horário local depende de nós. Contanto que ninguém faça uma proposta melhor, adiciono +1 para meu fuso horário (Europa Berlim).
  int fuso horário =+1; // Europa / Berlim (UTC +0100)> NMEA é orientado para UTC  

Ajuste o fuso horário de acordo com sua preferência. A hora variável é então usada no código para a saída no display LCD em vez de GPS.hour - o valor UTC.
  // saída para display LCD 
lcd.setCursor (5,0); //, 0 =primeira linha
int hora =(GPS.horas) + fuso horário; // formatar GPS.horas UTC para seu fuso horário individual
if (hora <10) {lcd.print ('0'); }
lcd.print (hora, DEC); lcd.print (':');

Na Europa, usamos "km / h" em vez de nós para a velocidade do vento. Então, primeiro converti o valor de nós para km / h usando uma constante e, em seguida, agrupei-o. > 1 nó =1,852 quilômetro por hora
  float speed =(GPS.speed) * 1.852; // Mudar de Velocidade / Knoten> Velocidade / km / h  

Avaliação de acordo com a Wikipedia:
  if (speed <=1) {lcd.print ("Windstille");} 
else if ((speed> 1) &&(speed <=9)) {lcd.print (" leiser Zug ");}
else if ((velocidade> 9) &&(velocidade <=46)) {lcd.print (" Brise ");}
else if ((velocidade> 46) &&(velocidade <=56)) {lcd.print ("starker Wind");}
else if ((speed> 56) &&(speed <=74)) {lcd.print ("stuerm. Wind");}
else if ((velocidade> 74) &&(velocidade <=83)) {lcd.print ("Sturm");}
else if ((velocidade> 83) &&(velocidade <=102)) {lcd.print ("schwerer Sturm");}
else if (speed> 102) {lcd.print ("Orkan");}
else {lcd.print ("ohne Bewertung ");}

O resultado é mostrado no visor da seguinte forma e pode, obviamente, ser adaptado aos seus próprios desejos:

Eu deixei a frequência de atualização em 2 segundos dentro do loop. Eu mesmo tendo a abrir mão dos segundos e alturas em favor de uma tela de 16x2.

Divirta-se explorando as diversas opções de GPS!

Na Europa também temos a avaliação de um sinal de rádio DCF77 disponível. No entanto, isso é significativamente mais caro e seu manuseio é considerado muito sensível.

Código

  • GPS_SoftwareSerial_Parsing_ilo
GPS_SoftwareSerial_Parsing_ilo C / C ++
Exemplo Adafruits ajustado um pouco
 // Código de teste para módulos GPS Adafruit usando driver MTK3329 / MTK3339 //// Este código mostra como ouvir o módulo GPS em uma interrupção // o que permite que o programa tenha mais 'liberdade' - apenas analise // quando uma nova frase 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 // modificado 01.02.2020 - Ingo Lohs // Decodificador GPRMC e GPGGA:https://rl.se/gprmc#include  #include  LiquidCrystal_I2C lcd (0x3F, 20,4); // defina o endereço LCD para 0x27 para um display de 16 caracteres e 2 linhas> 0x3F no meu caso para um display LCD de 2004 # include  #include  // Conecte o pino de energia do GPS a 5V / / Conecte o pino terra do GPS ao terra // Conecte o pino GPS TX (transmissão) ao Digital 8 // Conecte o pino GPS RX (recepção) ao Digital 7 // você pode alterar os números dos pinos para corresponder à sua fiação:SoftwareSerial mySerial ( 8, 7); 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 # definir fuso horário GPSECHO trueint =+1; // Europa / Berlim (UTC +0100)> NMEA é orientado a UTC para evitar a configuração () {lcd.init (); lcd.backlight (); // conecte em 115200 para que possamos ler o GPS rápido o suficiente e ecoar sem descartar caracteres // também expele Serial.begin (115200); atraso (5000); 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); //> no meu caso eu uso UBLOX 6M:GY-GPS6Mv2 // 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); atraso (1000); // Solicita a versão do firmware mySerial.println (PMTK_Q_RELEASE);} uint32_t timer =millis (); void loop () // executar continuamente {char c =GPS.read (); // se você deseja depurar, este é um bom momento para fazê-lo! if ((c) &&(GPSECHO)) Serial.write (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 // terminarmos não ouvir e captar outras frases! // portanto, tenha muito cuidado ao 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 falso return; // podemos falhar na análise de uma sentença, caso em que devemos apenas esperar por outra} // se millis () ou cronômetro encerrar, iremos redefini-lo if (timer> millis ()) timer =millis (); // aproximadamente a cada 2 segundos ou mais, imprime as estatísticas atuais if (millis () - timer> 2000) {timer =millis (); // zera o cronômetro Serial.print ("\ nTime:"); if (GPS.horas <10) {Serial.print ('0'); } Serial.print (GPS.hour, DEC); Serial.print (':'); if (GPS.minuto <10) {Serial.print ('0'); } Serial.print (GPS.minuto, DEC); Serial.print (':'); if (GPS.segundos <10) {Serial.print ('0'); } Serial.print (GPS.segundos, DEC); Serial.print ('.'); if (GPS.milissegundos <10) {Serial.print ("00"); } else if (GPS.milliseconds> 9 &&GPS.milliseconds <100) {Serial.print ("0"); } Serial.println (GPS.milliseconds); Serial.print ("Data:"); Serial.print (GPS.dia, DEC); Serial.print ('/'); Serial.print (GPS.month, DEC); Serial.print ("/ 20"); Serial.println (GPS.ano, DEC); Serial.print ("Fix:"); Serial.print ((int) GPS.fix); Serial.print ("qualidade:"); Serial.println ((int) GPS.fixquality); // saída para o display LCD lcd.setCursor (5,0); //, 0 =primeira linha int hora =(GPS.hour) + fuso horário; // formatar GPS.horas UTC para seu fuso horário individual if (hora <10) {lcd.print ('0'); } lcd.print (hora, DEC); lcd.print (':'); if (GPS.minuto <10) {lcd.print ('0'); } lcd.print (GPS.minuto, DEC); lcd.print (':'); if (GPS.segundos <10) {lcd.print ('0'); } lcd.print (GPS.segundos, DEC); // saída para display LCD lcd.setCursor (5,1); //, 0 =segunda linha if (GPS.day <10) {lcd.print ('0'); } lcd.print (GPS.dia, DEC); lcd.print ('.'); if (GPS.mês <10) {lcd.print ('0'); } lcd.print (GPS.mês, DEC); lcd.print ('.'); lcd.print (GPS.ano, DEC); if (GPS.fix) {// temos uma conexão por satélite? se sim, temos mais valores: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 ("Velocidade (nós):"); Serial.println (GPS.speed); Serial.print ("Ângulo:"); Serial.println (GPS.angle); Serial.print ("Altitude:"); Serial.println (GPS.altitude); Serial.print ("Satélites:"); Serial.println ((int) GPS.satellites); lcd.setCursor (0,2); //, 2 =terceira linha // 1 Knoten =1.852 quilômetros por hora float speed =(GPS.speed) * 1.852; // Mudar de Velocidade / Knoten> Velocidade / km / h //lcd.print("Speed ​​km / h:"); lcd.print (velocidade); // Bewertung der Windstärke nach https://de.wikipedia.org/wiki/Windgeschwindigkeit / * Beschreibung - Geschwindigkeit em 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");} if ((speed> 9) &&(speed <=46)) {lcd.print ("Brise");} else if ((speed> 46) &&(speed <=56)) {lcd.print ("Starker Wind ");} else if ((speed> 56) &&(speed <=74)) {lcd.print (" stuerm. Wind ");} else if ((speed> 74) &&(speed <=83)) { lcd.print ("Sturm");} else if ((velocidade> 83) &&(velocidade <=102)) {lcd.print ("schwerer Sturm");} else if (velocidade> 102) {lcd.print ( "Orkan");} else {lcd.print ("ohne Bewertung");} lcd.setCursor (0,3); //, 3 =quarta linha lcd.print ("Hoehe:"); lcd.print (GPS.altitude); }}} 

Processo de manufatura

  1. Controlador de luva barato faça você mesmo e carro de hélice
  2. Sensor DHT11 com LEDs e um alto-falante Piezo
  3. Registrador de dados GPS, análise espacial e Hub IoT do Azure.
  4. Registrador de dados de temperatura e umidade
  5. Arduino Temp. Monitor e relógio em tempo real com tela 3.2
  6. Relógio POV de LED estilo analógico
  7. Feliz Aniversário:Luzes e sons
  8. u-blox LEA-6H 02 Módulo GPS com Arduino e Python
  9. Arduino e autômatos celulares baseados em OLED
  10. Speed ​​Pick e pedal de pedal da guitarra!