| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- /*********
- 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 <TinyGPSPlus.h>
- // 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;
- }
- }
|