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

Un reloj barato y preciso basado en GPS

Componentes y suministros

Arduino UNO
× 1
LCD retroiluminado Adafruit RGB - 16x2
en mi caso, una pantalla LCD 20x4 de nobrand con adaptador I2C para una fácil conectividad
× 1
Breadboard (genérico)
× 1
Cables de puente (genéricos)
× 1
Receptor GPS (genérico)
GY-GPS6Mv2 con ublox NEO-6M
× 1

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto


Hasta ahora he usado varios relojes RTC para proyectos de reloj u obtuve la hora de servidores NTP. En este proyecto, les presento otra fuente:análisis de la cadena NMEA de satélites GPS de todo el mundo.

Me sorprendió lo barato que es hoy un receptor GPS:consíguelo (en mi caso se usa el GY-GPS6Mv2).

a.) una primera prueba (opcional) en una PC con Windows:instale "u-center" como una descarga desde U-Blox.

Con la ayuda de un adaptador FTDI, la ruptura del GPS llega al puerto COM de su PC y muestra la fijación (la conexión) a la órbita después de aproximadamente 1 minuto. Para este propósito, una lámpara de control roja en la fuga parpadea.

Los gráficos generados automáticamente le dan ganas de experimentar más con el GPS. Con F8 - Text Console en el menú Ver, obtienes las diversas cadenas NMEA entregadas.

b.) Puede realizar una prueba de decodificación en servicios online gratuitos:https://rl.se/gprmc

Ahora que está seguro de que tiene un receptor GPS en funcionamiento, asegúrese de que haya una vista del cielo, podemos extraer la información deseada de la cadena para sus propios deseos.

Usamos una biblioteca Adafruit "Adafruit GPS Library"; si la ha instalado en el IDE de Arduino, puede probar un poco con los ejemplos.

c.) Circuito

Arduino A4> Pantalla SDA Arduino A5> Pantalla SCL

#include #include LiquidCrystal_I2C lcd (0x3F, 20, 4); // establece la dirección LCD> a menudo 0x27 o 0x3F

> ¿usar una pantalla que esté extendida, tal vez una de 16x2?

#include #include

Conecte el pin de alimentación del GPS a 5V Conecte el pin de tierra del GPS a tierra Conecte el pin de GPS TX (transmisión) a Digital 8 Conecte el pin de GPS RX (recepción) a Digital 7 // puede cambiar los números de pin para que coincidan con su cableado:SoftwareSerial mySerial (8 , 7); Adafruit_GPS GPS (&mySerial);

> el receptor GPS es tolerante a 3.3 / 5V.

d.) Nuestro reloj debe dar la hora, la fecha, una indicación de la velocidad del viento y digamos la altitud. No necesitamos una ubicación porque mi reloj se detendrá en la ventana.

Una cadena NMEA proporciona la hora en el estándar UTC. La conversión a la zona horaria local depende de nosotros. Siempre que nadie haga una propuesta mejor, agrego +1 para mi zona horaria (Europa Berlín).

  int timezone =+1; // Europa / Berlín (UTC +0100)> NMEA está orientado a UTC  

Ajusta la zona horaria a tu gusto. La hora variable se utiliza en el código para la salida en la pantalla LCD en lugar de GPS.hour - el valor UTC.

  // salida a pantalla LCD 
lcd.setCursor (5,0); //, 0 =primera línea
int hora =(GPS.hora) + zona horaria; // formatea GPS.hour UTC a tu zona horaria individual
if (hour <10) {lcd.print ('0'); }
lcd.print (hora, DEC); lcd.print (':');

En Europa usamos "km / h" en lugar de nudos para la velocidad del viento. Entonces, primero convertí el valor de nudos a km / h usando una constante y luego lo agrupé. > 1 nudo =1.852 kilómetros por hora

  velocidad de flotación =(GPS.speed) * 1.852; // Cambiar de Velocidad / Knoten> Velocidad / km / h  

Evaluación según Wikipedia:

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

El resultado se muestra en la pantalla de la siguiente manera y, por supuesto, se puede adaptar a sus propios deseos:

Dejé la frecuencia de actualización en 2 segundos dentro del bucle. Incluso tiendo a renunciar a los segundos y las alturas a favor de una pantalla de 16x2.

¡Diviértete explorando las diversas opciones de GPS!

En Europa también tenemos disponible la evaluación de una señal de radio DCF77. Sin embargo, esto es significativamente más caro y se dice que su manejo es muy sensible.

Código

  • GPS_SoftwareSerial_Parsing_ilo
GPS_SoftwareSerial_Parsing_ilo C / C ++
Ejemplo de Adafruits ajustado un poco
 // 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 // lo que permite que el programa tenga más 'libertad' - ¡simplemente analice // cuando haya una nueva oración NMEA disponible! 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 // modificado 01.02.2020 - Ingo Lohs // Decodificador GPRMC y GPGGA:https://rl.se/gprmc#include  #include  LiquidCrystal_I2C lcd (0x3F, 20,4); // establece la dirección LCD en 0x27 para una pantalla de 16 caracteres y 2 líneas> 0x3F en mi caso para una pantalla lcd de 2004 # incluye  #include  // Conecta el pin de alimentación del GPS a 5V / / Conecte el pin GPS Ground a tierra // Conecte el pin GPS TX (transmisión) a Digital 8 // Conecte el pin GPS RX (recepción) a Digital 7 // puede cambiar los números de pin para que coincidan con su cableado:SoftwareSerial mySerial ( 8, 7); 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 oraciones de GPS sin procesar # definir GPSECHO trueint timezone =+1; // Europa / Berlín (UTC +0100)> NMEA está orientado a UTC void setup () {lcd.init (); LCD luz de fondo(); // conectar 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); retraso (5000); 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); //> en mi caso utilizo UBLOX 6M:GY-GPS6Mv2 // descomenta esta línea para encender RMC (mínimo recomendado) y GGA (fijar datos) incluyendo 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 ordenar 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); retraso (1000); // Solicita la versión de firmware mySerial.println (PMTK_Q_RELEASE);} uint32_t timer =millis (); void loop () // ejecuta una y otra vez {char c =GPS.read (); // si quieres depurar, ¡este es un buen momento para hacerlo! if ((c) &&(GPSECHO)) Serial.write (c); // si se recibe una sentencia, podemos comprobar la suma de comprobación, analizarla ... if (GPS.newNMEAreceived ()) {// algo complicado aquí es si imprimimos la sentencia NMEA, o los datos // terminamos no escuchar y captar 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 esperar otra} // si millis () o el temporizador se reinicia, simplemente lo restableceremos if (timer> millis ()) timer =millis (); // aproximadamente cada 2 segundos más o menos, imprime las estadísticas actuales if (millis () - timer> 2000) {timer =millis (); // reinicia el temporizador Serial.print ("\ nTime:"); if (GPS.hora <10) {Serial.print ('0'); } Serial.print (GPS.hour, DEC); Serial.print (':'); if (GPS.minuto <10) {Serial.print ('0'); } Serial.print (GPS.minute, DEC); Serial.print (':'); if (GPS.seconds <10) {Serial.print ('0'); } Serial.print (GPS.seconds, DEC); Serial.print ('.'); if (GPS.milliseconds <10) {Serial.print ("00"); } else if (GPS.millisegundos> 9 &&GPS.millisegundos <100) {Serial.print ("0"); } Serial.println (GPS.milliseconds); Serial.print ("Fecha:"); Serial.print (GPS.day, DEC); Serial.print ('/'); Impresión de serie (GPS.mes, DEC); Serial.print ("/ 20"); Serial.println (GPS.year, DEC); Serial.print ("Arreglar:"); Serial.print ((int) GPS.fix); Serial.print ("calidad:"); Serial.println ((int) GPS.fixquality); // salida a pantalla LCD lcd.setCursor (5,0); //, 0 =primera línea int hora =(GPS.hora) + zona horaria; // formatea GPS.hour UTC a tu zona horaria individual if (hour <10) {lcd.print ('0'); } lcd.print (hora, DEC); lcd.print (':'); si (GPS.minuto <10) {lcd.print ('0'); } lcd.print (GPS.minute, DEC); lcd.print (':'); if (GPS.seconds <10) {lcd.print ('0'); } lcd.print (GPS.seconds, DEC); // salida a la pantalla LCD lcd.setCursor (5,1); //, 0 =segunda línea if (GPS.day <10) {lcd.print ('0'); } lcd.print (GPS.day, DEC); lcd.print ('.'); si (GPS.mes <10) {lcd.print ('0'); } lcd.print (GPS.mes, DEC); lcd.print ('.'); lcd.print (GPS.year, DEC); if (GPS.fix) {// ¿tenemos una conexión satelital? si es así, tenemos más valores:Serial.print ("Ubicación:"); Impresión serial (GPS.latitude, 4); Serial.print (GPS.lat); Serial.print (","); Impresión serial (GPS.longitude, 4); Serial.println (GPS.lon); Serial.print ("Velocidad (nudos):"); Serial.println (GPS.speed); Serial.print ("Ángulo:"); Serial.println (GPS.angle); Serial.print ("Altitud:"); Serial.println (GPS.altitude); Serial.print ("Satélites:"); Serial.println ((int) GPS.satellites); lcd.setCursor (0,2); //, 2 =tercera línea // 1 Knoten =1,852 Kilómetros por hora velocidad de flotación =(GPS.speed) * 1.852; // Cambiar de Velocidad / Knoten> Velocidad / km / h //lcd.print("Velocidad km / h:"); lcd.print (velocidad); // 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 (velocidad <=1) {lcd.print ("Windstille");} else if ((velocidad> 1) &&(velocidad <=9)) {lcd.print ("leiser Zug");} más if ((velocidad> 9) &&(velocidad <=46)) {lcd.print ("Brise");} else if ((velocidad> 46) &&(velocidad <=56)) {lcd.print ("Starker Wind ");} else if ((velocidad> 56) &&(velocidad <=74)) {lcd.print (" stuerm. Viento ");} else if ((velocidad> 74) &&(velocidad <=83)) { lcd.print ("Sturm");} else if ((velocidad> 83) &&(velocidad <=102)) {lcd.print ("schwerer Sturm");} else if (velocidad> 102) {lcd.print ( "Orkan");} else {lcd.print ("ohne Bewertung");} lcd.setCursor (0,3); //, 3 =cuarta línea lcd.print ("Hoehe:"); lcd.print (GPS.altitude); }}} 

Proceso de manufactura

  1. Controlador de guante barato y coche de hélice para bricolaje
  2. Sensor DHT11 con LED y altavoz piezoeléctrico
  3. Registrador de datos GPS, análisis espacial y Azure IoT Hub.
  4. Registrador de datos de temperatura y humedad
  5. Arduino Temp. Monitor y reloj en tiempo real con pantalla 3.2
  6. Reloj POV LED de estilo analógico
  7. Feliz cumpleaños:luces y sonidos
  8. Módulo GPS u-blox LEA-6H 02 con Arduino y Python
  9. Autómatas celulares basados ​​en Arduino y OLED
  10. Contador de RPM basado en Arduino con un algoritmo nuevo y más rápido
  11. ¡Púa de velocidad de guitarra y pedal Stomp!