Advertisement
Paco_G_DAW

GPS

Apr 1st, 2023 (edited)
729
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 4.70 KB | Source Code | 0 0
  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266HTTPClient.h>
  3. #include <TinyGPS++.h>
  4. #include <SoftwareSerial.h>
  5.  
  6.  
  7. // Definir la clave API y el número de canal de ThingSpeak
  8. const char* apiKey = "DEQILIFKWUF5UIF5";
  9. const char* serverUrl = "http://api.thingspeak.com/update";
  10.  
  11. // Configura los pines GPIO5 y GPIO4 como pines de comunicación serial para el GPS
  12. SoftwareSerial gpsSerial(5, 4);
  13.  
  14. // Crea un objeto TinyGPS++ para manejar los datos del GPS
  15. TinyGPSPlus gps;
  16.  
  17. // Variables para controlar el tiempo
  18. unsigned long lastUpdate = 0;
  19. const int updateInterval = 30000; // Intervalo de actualización en milisegundos (30 segundos)
  20. const char* ssid1 = "nombre_de_la_red_1";
  21. const char* password1 = "contraseña_de_la_red_1";
  22. const char* ssid2 = "PacoMov";
  23. const char* password2 = "123456789";
  24. const char* ssid3 = "MiFibra-B460";
  25. const char* password3 = "WuSAp49X";
  26.  
  27. void setup() {
  28.  // Inicializa la comunicación serial a 9600 baudios para el GPS
  29.   gpsSerial.begin(9600);
  30.   Serial.begin(115200);
  31.   connectToWiFi();
  32.   // Espera a que el GPS se inicie y envíe datos
  33.   delay(1000);
  34. }
  35. void loop() {
  36.   if (WiFi.status() != WL_CONNECTED) {
  37.     Serial.println("Conexión perdida, intentando reconectar...");
  38.     connectToWiFi();
  39.   }
  40.   // Controla el tiempo para tomar la posición cada 30 segundos
  41.   unsigned long currentTime = millis();
  42.   if (currentTime - lastUpdate >= updateInterval) {
  43.     lastUpdate = currentTime;
  44.  
  45.     // Lee los datos del GPS y los almacena en el objeto TinyGPS++
  46.     while (gpsSerial.available() > 0) {
  47.       gps.encode(gpsSerial.read());
  48.     }
  49.  
  50.     // Si el objeto TinyGPS++ ha recibido una nueva posición válida del GPS
  51.     if (gps.location.isValid()) {
  52.       // Obtiene la posición actual del GPS
  53.       float lat = gps.location.lat();
  54.       float lon = gps.location.lng();
  55.  
  56.       // Imprime la posición actual del GPS en el monitor serial
  57.       Serial.print("Latitud: ");
  58.       Serial.println(lat, 6);
  59.       Serial.print("Longitud: ");
  60.       Serial.println(lon, 6);
  61.  
  62.       // Envía la posición actual del GPS al servidor web
  63.       enviarPosicion(lat, lon);
  64.     }
  65.   }
  66.  
  67.   // Espera un momento antes de volver a tomar la posición
  68.   delay(100);
  69. }
  70.  
  71. void enviarPosicion(float latitud, float longitud) {
  72.   // Verificar si ha pasado suficiente tiempo para enviar una nueva posición
  73.   static unsigned long ultimaActualizacion = 0; // Variable estática para recordar la última vez que se envió una posición
  74.   const unsigned long intervalo = 30000; // Intervalo de tiempo deseado (30 segundos)
  75.   unsigned long tiempoActual = millis(); // Obtener el tiempo actual en milisegundos
  76.   if (tiempoActual - ultimaActualizacion < intervalo) {
  77.     return; // Todavía no ha pasado suficiente tiempo para enviar una nueva posición
  78.   }
  79.  
  80.   // Crear un objeto HTTPClient
  81.   WiFiClient client;
  82.   HTTPClient http;
  83.  
  84.   // Construir la URL de solicitud
  85.   char latitudStr[15];
  86.   char longitudStr[15];
  87.   dtostrf(latitud, 8, 6, latitudStr);
  88.   dtostrf(longitud, 8, 6, longitudStr);
  89.   String url = String(serverUrl) + "?api_key=" + String(apiKey) + "&field1=" + String(latitudStr) + "&field2=" + String(longitudStr);
  90.  
  91.   // Realizar la solicitud HTTP GET
  92.   http.begin(client, url);
  93.   int httpResponseCode = http.GET();
  94.  
  95.   // Comprobar el código de respuesta HTTP
  96.   if (httpResponseCode == 200) {
  97.     Serial.println("Posición enviada correctamente a ThingSpeak");
  98.     ultimaActualizacion = tiempoActual; // Actualizar la variable para recordar la última vez que se envió una posición
  99.   } else {
  100.     Serial.print("Error al enviar la posición a ThingSpeak. Código de respuesta: ");
  101.     Serial.println(httpResponseCode);
  102.   }
  103.  
  104.   // Liberar el objeto HTTPClient
  105.   http.end();
  106. }
  107. void connectToWiFi() {
  108.   Serial.print("Conectando a la red Wi-Fi...");
  109.   int numSsid = 3; // Número de redes Wi-Fi conocidas
  110.   const char* ssidList[] = { ssid1, ssid2, ssid3 };
  111.   const char* passwordList[] = { password1, password2, password3 };
  112.   WiFi.disconnect(); // Desconectar de la red actual (si se estaba conectado)
  113.   for (int i = 0; i < numSsid; i++) {
  114.     WiFi.begin(ssidList[i], passwordList[i]);
  115.     Serial.print("Intentando conectar a ");
  116.     Serial.println(ssidList[i]);
  117.     unsigned long timeout = millis() + 10000; // Esperar máximo 10 segundos por cada red
  118.     while (WiFi.status() != WL_CONNECTED && millis() < timeout) {
  119.       delay(500);
  120.       Serial.print(".");
  121.     }
  122.     if (WiFi.status() == WL_CONNECTED) {
  123.       Serial.printf("\nConectado a %s, dirección IP: %s\n", ssidList[i], WiFi.localIP().toString().c_str());
  124.       break; // Salir del ciclo si se logra conectar a una red
  125.     } else {
  126.       Serial.println();
  127.       Serial.println("No se pudo conectar a la red");
  128.     }
  129.   }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement