V1.ino 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*********
  2. Código basado en tutoriales para ESP32 con NEO-6M GPS y temporizadores (API 3.x).
  3. Utiliza interrupciones de temporizador para lecturas periódicas cada 1 segundo.
  4. Imprime datos GPS parseados en el Monitor Serial.
  5. *********/
  6. #include <TinyGPSPlus.h>
  7. // Pines para UART2 (Serial2)
  8. #define RX_PIN 16 // RX del ESP32 conectado a TX del GPS
  9. #define TX_PIN 17 // TX del ESP32 conectado a RX del GPS
  10. #define GPS_BAUD 115200
  11. // Objeto TinyGPS++
  12. TinyGPSPlus gps;
  13. // Serial para GPS
  14. HardwareSerial gpsSerial(2);
  15. // Bandera volátil para interrupción
  16. volatile bool gpsFlag = false;
  17. int i =0;
  18. // Función ISR para el temporizador (debe ser ARDUINO_ISR_ATTR para ejecución rápida)
  19. void ARDUINO_ISR_ATTR onTimer(void) {
  20. gpsFlag = true; // Activa bandera para procesar GPS en el loop
  21. }
  22. void setup() {
  23. // Iniciar Serial para depuración
  24. Serial.begin(115200);
  25. Serial.println("Iniciando prueba de GPS con temporizador (API 3.x)...");
  26. // Iniciar Serial2 para GPS
  27. gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RX_PIN, TX_PIN);
  28. // Configurar temporizador hardware con frecuencia de 1 MHz (tick cada 1 us)
  29. hw_timer_t *timer = timerBegin(1000000); // Frecuencia en Hz
  30. // Adjuntar interrupción al temporizador
  31. timerAttachInterrupt(timer, &onTimer);
  32. // Configurar alarma para 1 segundo (1,000,000 ticks), autoreload activado, unlimited
  33. timerAlarm(timer, 1000000, true, 0);
  34. // No se necesita timerAlarmEnable; timerAlarm lo habilita automáticamente
  35. }
  36. void loop() {
  37. // Procesar solo cuando la interrupción active la bandera
  38. if (gpsFlag) {
  39. // Leer y codificar datos disponibles del GPS
  40. while (gpsSerial.available() > 0) {
  41. gps.encode(gpsSerial.read());
  42. }
  43. // Mostrar información si hay datos actualizados
  44. if (gps.location.isValid()) {
  45. Serial.print("Latitud: ");
  46. Serial.println(gps.location.lat(), 6);
  47. Serial.print("Longitud: ");
  48. Serial.println(gps.location.lng(), 6);
  49. Serial.print("Altitud (m): ");
  50. Serial.println(gps.altitude.meters());
  51. Serial.print("Velocidad (km/h): ");
  52. Serial.println(gps.speed.kmph());
  53. Serial.print("Satélites: ");
  54. Serial.println(gps.satellites.value());
  55. Serial.print("HDOP (precisión): ");
  56. Serial.println(gps.hdop.hdop());
  57. Serial.print("Fecha/Hora UTC: ");
  58. Serial.print(gps.date.year()); Serial.print("/");
  59. Serial.print(gps.date.month()); Serial.print("/");
  60. Serial.print(gps.date.day()); Serial.print(" ");
  61. Serial.print(gps.time.hour()); Serial.print(":");
  62. Serial.print(gps.time.minute()); Serial.print(":");
  63. Serial.println(gps.time.second());
  64. Serial.println("-------------------");
  65. } else {
  66. i++;
  67. Serial.print("Esperando fix GPS...");
  68. Serial.println(i);
  69. }
  70. // Resetear bandera
  71. gpsFlag = false;
  72. }
  73. }