5.4.1 Herramientas Software
Sistema de diagnóstico automático:
#include "esp_log.h"
#include "esp_system.h"
static const char* TAG = "DIAGNOSTICO";
enum TipoDiagnostico {
DIAGNOSTICO_WIFI,
DIAGNOSTICO_BLUETOOTH,
DIAGNOSTICO_MEMORIA,
DIAGNOSTICO_ALIMENTACION,
DIAGNOSTICO_TEMPERATURA,
DIAGNOSTICO_GPIO
};
struct ResultadoDiagnostico {
TipoDiagnostico tipo;
bool resultado;
String mensaje;
int codigo_error;
};
void ejecutarDiagnosticoCompleto() {
Serial.println("=== Diagnóstico Completo del Sistema ===");
ResultadoDiagnostico resultados[6];
int total_diagnosticos = 6;
int diagnosticos_exitosos = 0;
// Ejecutar diagnósticos
resultados[0] = diagnosticarWiFi();
resultados[1] = diagnosticarBluetooth();
resultados[2] = diagnosticarMemoria();
resultados[3] = diagnosticarAlimentacion();
resultados[4] = diagnosticarTemperatura();
resultados[5] = diagnosticarGPIO();
// Mostrar resultados
for (int i = 0; i < total_diagnosticos; i++) {
Serial.printf("Diagnóstico %d: %s\n", i+1, resultados[i].mensaje.c_str());
if (resultados[i].resultado) {
diagnosticos_exitosos++;
}
}
// Resumen
Serial.printf("Diagnósticos exitosos: %d/%d\n", diagnosticos_exitosos, total_diagnosticos);
if (diagnosticos_exitosos == total_diagnosticos) {
Serial.println("ESTADO: Sistema funcionando correctamente");
} else {
Serial.println("ESTADO: Se detectaron problemas");
generarReporteProblemas(resultados, total_diagnosticos);
}
}
ResultadoDiagnostico diagnosticarWiFi() {
ResultadoDiagnostico resultado;
resultado.tipo = DIAGNOSTICO_WIFI;
if (WiFi.status() == WL_CONNECTED) {
int rssi = WiFi.RSSI();
if (rssi > -80) {
resultado.resultado = true;
resultado.mensaje = "WiFi: OK (RSSI: " + String(rssi) + " dBm)";
resultado.codigo_error = 0;
} else {
resultado.resultado = false;
resultado.mensaje = "WiFi: RSSI bajo (" + String(rssi) + " dBm)";
resultado.codigo_error = 1;
}
} else {
resultado.resultado = false;
resultado.mensaje = "WiFi: Desconectado";
resultado.codigo_error = 2;
}
return resultado;
}
ResultadoDiagnostico diagnosticarMemoria() {
ResultadoDiagnostico resultado;
resultado.tipo = DIAGNOSTICO_MEMORIA;
int memoria_libre = ESP.getFreeHeap();
int memoria_minima = ESP.getMinFreeHeap();
if (memoria_libre > 50000 && memoria_minima > 10000) {
resultado.resultado = true;
resultado.mensaje = "Memoria: OK (" + String(memoria_libre) + " bytes libres)";
resultado.codigo_error = 0;
} else {
resultado.resultado = false;
resultado.mensaje = "Memoria: Baja (" + String(memoria_libre) + " bytes libres)";
resultado.codigo_error = 3;
}
return resultado;
}
ResultadoDiagnostico diagnosticarTemperatura() {
ResultadoDiagnostico resultado;
resultado.tipo = DIAGNOSTICO_TEMPERATURA;
float temperatura = temperatureRead();
if (temperatura < 70.0) {
resultado.resultado = true;
resultado.mensaje = "Temperatura: OK (" + String(temperatura, 1) + " °C)";
resultado.codigo_error = 0;
} else {
resultado.resultado = false;
resultado.mensaje = "Temperatura: Alta (" + String(temperatura, 1) + " °C)";
resultado.codigo_error = 4;
}
return resultado;
}
void generarReporteProblemas(ResultadoDiagnostico* resultados, int total) {
Serial.println("=== Reporte de Problemas ===");
for (int i = 0; i < total; i++) {
if (!resultados[i].resultado) {
Serial.printf("PROBLEMA %d: %s\n", resultados[i].codigo_error, resultados[i].mensaje.c_str());
// Sugerir soluciones
switch (resultados[i].codigo_error) {
case 1:
Serial.println(" SOLUCIÓN: Verificar antena y orientación");
break;
case 2:
Serial.println(" SOLUCIÓN: Verificar configuración WiFi");
break;
case 3:
Serial.println(" SOLUCIÓN: Optimizar uso de memoria");
break;
case 4:
Serial.println(" SOLUCIÓN: Verificar ventilación");
break;
}
}
}
}
5.4.2 Herramientas Hardware
Integración con herramientas de medición externas:
// Interfaz con herramientas hardware externas
void configurarHerramientasHardware() {
Serial.println("=== Configuración de Herramientas Hardware ===");
// Configurar comunicación con osciloscopio
configurarOsciloscopio();
// Configurar comunicación con analizador de espectro
configurarAnalizadorEspectro();
// Configurar comunicación con multímetro
configurarMultimetro();
Serial.println("Herramientas hardware configuradas");
}
void configurarOsciloscopio() {
Serial.println("Configurando osciloscopio...");
// Configurar parámetros de osciloscopio
float escala_tiempo = 1e-3; // 1ms/div
float escala_voltaje = 1.0; // 1V/div
float frecuencia_muestreo = 1e6; // 1 MS/s
Serial.printf("Escala tiempo: %.0f ms/div\n", escala_tiempo * 1000);
Serial.printf("Escala voltaje: %.1f V/div\n", escala_voltaje);
Serial.printf("Frecuencia muestreo: %.0f MS/s\n", frecuencia_muestreo / 1e6);
}
void configurarAnalizadorEspectro() {
Serial.println("Configurando analizador de espectro...");
// Configurar parámetros de analizador
float frecuencia_central = 2400.0; // MHz
float ancho_banda = 20.0; // MHz
float resolucion = 0.1; // MHz
Serial.printf("Frecuencia central: %.1f MHz\n", frecuencia_central);
Serial.printf("Ancho de banda: %.1f MHz\n", ancho_banda);
Serial.printf("Resolución: %.1f MHz\n", resolucion);
}
void configurarMultimetro() {
Serial.println("Configurando multímetro...");
// Configurar parámetros de multímetro
String modo = "DC Voltage";
float rango = 20.0; // V
int precision = 4; // dígitos
Serial.printf("Modo: %s\n", modo.c_str());
Serial.printf("Rango: %.1f V\n", rango);
Serial.printf("Precisión: %d dígitos\n", precision);
}
void ejecutarMedicionesHardware() {
Serial.println("=== Ejecutando Mediciones Hardware ===");
// Medir con osciloscopio
float amplitud = medirConOsciloscopio();
Serial.printf("Amplitud medida: %.2f V\n", amplitud);
// Medir con analizador de espectro
float potencia = medirConAnalizadorEspectro();
Serial.printf("Potencia medida: %.2f dBm\n", potencia);
// Medir con multímetro
float voltaje = medirConMultimetro();
Serial.printf("Voltaje medido: %.2f V\n", voltaje);
}
float medirConOsciloscopio() {
// Simulación de medición con osciloscopio
return 3.3; // V
}
float medirConAnalizadorEspectro() {
// Simulación de medición con analizador de espectro
return 15.0; // dBm
}
float medirConMultimetro() {
// Simulación de medición con multímetro
return 3.28; // V
}