Protocolo UDP implementado

This commit is contained in:
adrigongv23 2026-02-11 11:04:41 +01:00
parent 15562e1b50
commit 57494f02e5
2 changed files with 50 additions and 57 deletions

View file

@ -1,60 +1,54 @@
#include "include/data_processor.hpp" #include "include/data_processor.hpp"
#include "include/can.hpp" #include "include/can.hpp"
#include "include/common_libraries.hpp" //Librerias Wifi y credenciales #include "include/common_libraries.hpp"
DataProcessor dataProcessor; DataProcessor dataProcessor;
CAN canController; CAN canController;
// Cliente seguro para HTTPS // Objeto UDP para manejar la conexión UDP
WiFiClientSecure wifiClient; WifiUDP udp;
// --- ENVIO DE DATOS A TRAVÉS DE WIFI --- //Configuración destino
// Esta función se ejecutará en paralelo sin bloquear el CAN //Se debe de poner la IP del portatil trás conectar al Wifi del móvil
void TaskWifiSender(void *pvParameters) { const char* pc_ip = "192.168.43.155"; //Pongo una de prueba
Serial.println("[WIFI-TASK] Iniciando tarea de envío..."); //Envio de datos a través de UDP
void TaskUdpSender(void *pvParameters){
while (true) { Serial.println("Iniciando tarea de envío...");
// 1. Verificamos conexión WiFi
(while true){
if(WiFi.status() == WL_CONNECTED){ if(WiFi.status() == WL_CONNECTED){
HTTPClient http; //Obtenemos el dato actual
wifiClient.setInsecure(); // Importante para Firebase sin certificados complejos
// 2. Preparamos el JSON
// Leemos la variable 'volatile' del dataProcessor
int tempActual = dataProcessor.current_ect_value; int tempActual = dataProcessor.current_ect_value;
// Creamos la URL completa //Pasamos el dato actual a mensaje para enviarlo
String url = String(FIREBASE_HOST) + String(FIREBASE_PATH); String mensaje = String(tempActual);
// Creamos el payload JSON: {"valor": 95, "ts": 123456...} //Enviamos el paquete a través de UDP
String jsonPayload = "{\"valor\":" + String(tempActual) + "}"; udp.beginPacket(pc_ip, UDP_PORT);
udp.print(mensaje);
udp.endPacket();
// 3. Enviamos PUT o POST //Para comprobar que el paquete se está enviado correctamente podemos usar estos prints
http.begin(wifiClient, url); //Serial.print("UDP Enviado: ");
int httpResponseCode = http.PUT(jsonPayload); // Usamos PUT para sobreescribir el valor actual //Serial.println(mensaje);
if (httpResponseCode > 0) {
Serial.printf("[WIFI] Enviado ECT: %d C° | Resp: %d\n", tempActual, httpResponseCode);
} else {
Serial.printf("[WIFI] Error envío: %s\n", http.errorToString(httpResponseCode).c_str());
} }
http.end();
} else { else {
Serial.println("[WIFI] Desconectado. Reintentando..."); //Si no hay Wifi o no se consigue conectar, lo intentamos reconectar
// Si se desconecta, intentar reconectar (opcionalmente) Serial.println("[WIFI] Desconectado...");
WiFi.disconnect(); WiFi.disconnect();
WiFi.reconnect(); WiFi.reconnect();
} }
// 4. Esperar X tiempo antes del siguiente envío (ej. 1000ms = 1seg) //Ponemos de velocidad de envio 50ms, es ajustable
// Usamos vTaskDelay en lugar de delay() para no bloquear vTaskDelay(50 / portTICK_PERIOD_MS);
vTaskDelay(1000 / portTICK_PERIOD_MS);
} }
} }
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
@ -67,34 +61,35 @@ void setup() {
// 2. INICIAR WIFI // 2. INICIAR WIFI
Serial.println("--- CONECTANDO WIFI ---"); Serial.println("--- CONECTANDO WIFI ---");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
int intentos = 0; int intentos = 0;
while (WiFi.status() != WL_CONNECTED && intentos < 20) { while (WiFi.status() != WL_CONNECTED && intentos < 20) {
delay(500); delay(500);
Serial.print("."); Serial.print(".");
intentos++; intentos++;
} }
if(WiFi.status() == WL_CONNECTED){ if(WiFi.status() == WL_CONNECTED){
Serial.println("\n[OK] WiFi Conectado."); Serial.println("\n[OK] WiFi Conectado.");
} else { } else {
Serial.println("\n[ERR] No se pudo conectar WiFi (Continuando offline)."); Serial.println("\n[ERR] No se pudo conectar WiFi (Continuando offline).");
} }
// 3. CREAR TAREA WIFI (Multitasking) //Creamos la tarea UDP para el envio de datos
// Esto lanza la función TaskWifiSender en un núcleo aparte o hilo paralelo //Usaremos el núcleo 1 o 0 ya que la ESP32 es Dual Core
xTaskCreatePinnedToCore( xTaskCreatePinnedToCore(
TaskWifiSender, // Función de la tarea TaskUdpSender, // Función que debe de ejecutar
"WifiSender", // Nombre "UdpSender", // Nombre de la tarea
8192, // Tamaño de pila (Stack size) 4096, // Stack size
NULL, // Parámetros NULL, // Parámetros extras?
1, // Prioridad (Baja, para que el CAN tenga prioridad) 1, // Prioridad (1 = Baja, 10 = Alta, la ponemos 1 ya que el CAN debe de tener más prioridad)
NULL, // Handle NULL, // Handle
0 // Núcleo (0 o 1) 0 // Núcleo
); );
Serial.println("[OK] Sistema ONLINE (CAN + Pantalla + WiFi)."); Serial.println("OK CAN + UDP Sender ");
} }
void loop(){ void loop(){
// El loop se queda SOLO para la interfaz gráfica (LVGL)
vTaskDelay(5 / portTICK_PERIOD_MS); vTaskDelay(5 / portTICK_PERIOD_MS);
} }

View file

@ -6,17 +6,15 @@
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <vector> #include <vector>
//Librerías WiFi y HTTP --- //Librerías WiFi y UDP ---
#include <WiFi.h> #include <WiFi.h>
#include <HTTPClient.h> #include <WifiUdp.h>
#include <WiFiClientSecure.h>
// --- CONFIGURACIÓN WIFI Y FIREBASE --- //CONFIGURACIÓN WIFI Y FIREBASE
#define WIFI_SSID "test" #define WIFI_SSID "test"
#define WIFI_PASSWORD "12345678" #define WIFI_PASSWORD "12345678"
#define FIREBASE_HOST "https://iot-formula-gades-default-rtdb.europe-west1.firebasedatabase.app" //CONFIGURACIÓN WIFI Y FIREBASE
// La ruta dentro de la base de datos donde guardaremos la temperatura #define UDP_PORT 4210
#define FIREBASE_PATH "/telemetria/temperatura.json"
#endif #endif