/********* Código basado en tutoriales para ESP32 con NEO-6M GPS y temporizadores (API 3.x). Utiliza interrupciones de temporizador para lecturas periódicas cada 1 segundo. Imprime datos GPS parseados en el Monitor Serial. *********/ #include // Pines para UART2 (Serial2) #define RX_PIN 16 // RX del ESP32 conectado a TX del GPS #define TX_PIN 17 // TX del ESP32 conectado a RX del GPS #define GPS_BAUD 115200 // Objeto TinyGPS++ TinyGPSPlus gps; // Serial para GPS HardwareSerial gpsSerial(2); // Bandera volátil para interrupción volatile bool gpsFlag = false; int i =0; // Función ISR para el temporizador (debe ser ARDUINO_ISR_ATTR para ejecución rápida) void ARDUINO_ISR_ATTR onTimer(void) { gpsFlag = true; // Activa bandera para procesar GPS en el loop } void setup() { // Iniciar Serial para depuración Serial.begin(115200); Serial.println("Iniciando prueba de GPS con temporizador (API 3.x)..."); // Iniciar Serial2 para GPS gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RX_PIN, TX_PIN); // Configurar temporizador hardware con frecuencia de 1 MHz (tick cada 1 us) hw_timer_t *timer = timerBegin(1000000); // Frecuencia en Hz // Adjuntar interrupción al temporizador timerAttachInterrupt(timer, &onTimer); // Configurar alarma para 1 segundo (1,000,000 ticks), autoreload activado, unlimited timerAlarm(timer, 1000000, true, 0); // No se necesita timerAlarmEnable; timerAlarm lo habilita automáticamente } void loop() { // Procesar solo cuando la interrupción active la bandera if (gpsFlag) { // Leer y codificar datos disponibles del GPS while (gpsSerial.available() > 0) { gps.encode(gpsSerial.read()); } // Mostrar información si hay datos actualizados if (gps.location.isValid()) { Serial.print("Latitud: "); Serial.println(gps.location.lat(), 6); Serial.print("Longitud: "); Serial.println(gps.location.lng(), 6); Serial.print("Altitud (m): "); Serial.println(gps.altitude.meters()); Serial.print("Velocidad (km/h): "); Serial.println(gps.speed.kmph()); Serial.print("Satélites: "); Serial.println(gps.satellites.value()); Serial.print("HDOP (precisión): "); Serial.println(gps.hdop.hdop()); Serial.print("Fecha/Hora UTC: "); Serial.print(gps.date.year()); Serial.print("/"); Serial.print(gps.date.month()); Serial.print("/"); Serial.print(gps.date.day()); Serial.print(" "); Serial.print(gps.time.hour()); Serial.print(":"); Serial.print(gps.time.minute()); Serial.print(":"); Serial.println(gps.time.second()); Serial.println("-------------------"); } else { i++; Serial.print("Esperando fix GPS..."); Serial.println(i); } // Resetear bandera gpsFlag = false; } }