Tornar
Logo de l'empresa

Manual d'Usuari de l'AquaPulse Marine Tracker

Sistema de Telemetria Marítima i Estimació d'Estat de Mar basat en FireBeetle 2 ESP32-E

Índex de Continguts

1. Introducció

L'AquaPulse Marine Tracker és un dispositiu de telemetria marítima compacte basat en el microcontrolador DFRobot FireBeetle 2 ESP32-E. A diferència del seu germà GeoPulse (orientat a la integració completa amb pantalla Nextion, autopilot i AIS), l'AquaPulse està dissenyat com una unitat headless de telemetria contínua, amb un focus especial en l'estimació de l'estat de mar mitjançant un IMU de 9 graus de llibertat.

Característiques Principals:
Diferències respecte a GeoPulse: L'AquaPulse no incorpora pantalla Nextion, ni LEDs WS2812B de navegació, ni autopilot, ni AIS, ni sensors ambientals (BME280), ni mòdem extern, ni control de bateria/corrent (ADS1115/INA260), ni detector de llamps (AS3935). En canvi, ofereix capacitats avançades d'IMU/heave/brúixola que GeoPulse no té.

2. Components del Sistema

2.1 Unitat Principal de Processament

FireBeetle 2 ESP32-E (DFR1139)

EspecificacióValor
ProcessadorDual-core Xtensa LX6 @ 240 MHz
Memòria RAM520 KB SRAM
Memòria Flash4 MB (LittleFS per a credencials i geofences)
WiFi802.11 b/g/n (2.4 GHz) — power saving desactivat
BluetoothBLE 4.2 (no utilitzat en aquesta versió)
GPIO disponibles0,1,2,3,4,12,13,14,15,17,18,19,21,22,23,25,26
Pins NC (No Connectats)GPIO16 i GPIO27 — NO utilitzar!
Voltatge d'operació3.3 V
Sortida PWMLEDC hardware @ 5 kHz, 8-bit

2.2 Sensors

BN-880 — GPS Multi-constel·lació

  • Constel·lacions: GPS, GLONASS, Galileo, SBAS, QZSS, IMES
  • Velocitat sèrie: 115200 baud (NMEA)
  • Freqüència d'actualització: 5 Hz (200 ms)
  • Buffer Serial1 RX: 512 bytes (per a multi-constel·lació)
  • Llibreria: TinyGPS++ v1.0.3
  • Dades: Posició, velocitat, rumb (COG), satèl·lits, hora UTC, HDOP

ICM-20948 — IMU 9-DoF

  • Acceleròmetre: 3 eixos
  • Giroscopi: 3 eixos
  • Magnetòmetre: 3 eixos (compass)
  • Fusió: Madgwick AHRS (quaternió)
  • Freqüència de mostreig: 25 Hz
  • Interfície: I2C (default 0x69)
  • Llibreria: SparkFun ICM-20948 v1.3.2

2.3 Indicadors

Sistema de 4 LEDs Discrets (anode comú / catode comú segons cablejat)

L'AquaPulse usa 4 LEDs independents controlats per hardware PWM (LEDC) a 5 kHz amb resolució 8-bit. Cada LED té un canal LEDC dedicat, eliminant qualsevol càrrega de CPU per als patrons. Cada LED té un significat semàntic concret:

LEDGPIOCanal LEDCSignificat
Blanc250Estat del MCU (boot, WiFi, sistema preparat)
Blau261Estat GPS (qualitat del fix per nombre de satèl·lits)
Verd182Estat IMU/Mar (sea state index, calibració heading)
Vermell143Errors (WiFi, GPS, memòria, OTA, watchdog)

3. Especificacions Tècniques

3.1 Especificacions de Programari

ParàmetreValor
Versió FirmwareAquaPulse-2.0.9_UDP_MUTEX
Identificador del Dispositiuaquapulse
Plataforma BuildPlatformIO + Arduino-ESP32
Sistema d'ArxiusLittleFS
LoggingUDP a backend (LOG_DEBUG / INFO / WARNING / ERROR)
ComunicacióUDP (telemetria/logs) + HTTPS (comandes/login)
MQTTEliminat — substituït per UDP + HTTP polling

3.2 Intervals i Temporitzacions

FuncióInterval (ms)Descripció
Telemetria UDP1000Per defecte 1 s (configurable: 500 ms a 10 s)
Mostreig IMU4025 Hz per al càlcul de heave/sea state
Sondeig de comandes (API)30000Polling HTTPS cada 30 s
Flush de logs5000Buida el buffer de logs cada 5 s
Monitor de sistema15000Comprovació heap i salut
Avaluació geofences5000Comprova entrada/sortida de zones
Persistència geofences15000Guarda canvis a LittleFS
Comprovació Internet (no auth)45000HTTP HEAD a Google 204
Comprovació Internet (auth)1200002 min quan ja hi ha sessió activa
Publicació wave data UDP60000Configurable 10-3600 s
Recol·lecció heading cal5000Mostra cada 5 s si SOG ≥ 7 nusos
Auto-save deviation table300000Cada 5 minuts si hi ha noves mostres
Heartbeat loop principal60000LOG_D amb heap, WiFi, sys ready
Watchdog timeout120000Reinici si SysMon no s'alimenta en 2 min

3.3 Llindars de Plausibilitat GPS

ParàmetreValorDescripció
Mínim de satèl·lits4Per acceptar un fix
Velocitat màxima plausible30 m/sFiltre de salts impossibles
Tolerància base de salt30 m+ velocitat·temps
HDOP màxim acceptat5.0Per qualitat de fix
Mínim sentències bones consecutives3Per acceptar nou fix
Velocitat de detecció estàtica0.3 nusosLlindar "parat"
Tolerància posició estàtica10 mMarge en mode estàtic
Temps per entrar mode estàtic30 sSota llindar de velocitat
Speed deadband0.4 nusosSota aquest valor → 0.0 (filtra deriva)
Anys vàlids GPS2020-2030Validació de data

3.4 Llindars de Memòria

LlindarValorAcció
Heap baix< 20 KBLED Vermell RED_MEMORY_WARNING + log [WARNING]
Heap crític< 12 KBLED Vermell RED_MEMORY_CRITICAL + reinici
OTA mínim> 20 KBAvortat si heap insuficient
Buffer de logs2048 bytesFIFO amb truncament del més antic

4. Connexions i Pinout

4.1 Mapa de Pins ESP32 (FireBeetle 2 ESP32-E)

ComponentPin ESP32Funció
LED Blanc (MCU State)GPIO25LEDC Canal 0 — PWM
LED Blau (GPS Status)GPIO26LEDC Canal 1 — PWM
LED Verd (IMU/Wave)GPIO18LEDC Canal 2 — PWM
LED Vermell (Errors)GPIO14LEDC Canal 3 — PWM
GPS RX (cap a ESP32)GPIO17UART1 RX — rep dades NMEA del BN-880
GPS TX (cap al GPS)GPIO4UART1 TX — opcional, per configuració
I2C SDAGPIO21Dades I2C (ICM-20948)
I2C SCLGPIO22Rellotge I2C (ICM-20948)
USB Serial DebugUSB115200 baud (logs locals)
⚠️ ATENCIÓ pinout FireBeetle 2 ESP32-E:

4.2 Bus I2C

El bus I2C s'inicialitza dins de seaStateCalc.begin() via imu.begin() i és gestionat per la llibreria de SparkFun. Només hi ha un dispositiu I2C en aquest disseny:

DispositiuAdreça I2CFunció
ICM-209480x69 (configurable a 0x68)IMU 9-DoF i magnetòmetre

5. Funcionament i Arrencada

5.1 Seqüència de setup()

  1. Serial USB a 115200 baud + delay 2 s per estabilització.
  2. LittleFS mount (amb format on fail). Carrega /wifi.txt si existeix.
  3. Mutexes FreeRTOS: ledStateMutex, gpsDataMutex, seaStateMutex, logBufferMutex, geofencesMutex, systemReadyMutex, udpMutex.
  4. Estats LED inicials: Blanc=BOOTING (breathe 2 s), Blau/Verd/Vermell=OFF.
  5. Serial1 (GPS): 115200 baud, RX=GPIO17, TX=GPIO4, buffer 512 B.
  6. WiFi.onEvent: registra WiFiEventHandler per a esdeveniments STA.
  7. Watchdog seed: lastSysMonFeedMs = millis().
  8. Creació de tasques FreeRTOS (vegeu §15).
  9. Cua geofences: xQueueCreate(16, sizeof(GeofenceEvent)).
  10. Càrrega de geofences des de /geofences.json.
  11. Taula de tasques gestionades (per a comandes task_status).

5.2 Estats del Sistema

El sistema utilitza un flag systemReadyForServices protegit per mutex. Aquest flag controla si:

El flag s'activa només quan: WiFi connectat I (xarxa no captiva amb Internet OK O autenticació captiva exitosa).

5.3 Anuncia de Firmware

A la primera connexió WiFi+API, el dispositiu publica via UDP:

LOG,aquapulse,[INFO] Firmware: AquaPulse-2.0.9_UDP_MUTEX

6. Sistema d'Indicadors LED (4 canals)

Els 4 LEDs s'actualitzen en una única tasca ledTask (prioritat 1, stack 2 KB). Les transicions d'estat les fan altres tasques mitjançant les funcions setWhiteLedState(), setBlueLedState(), setGreenLedState(), setRedLedState(), totes thread-safe via ledStateMutex.

Els estats GPS i IMU s'auto-actualitzen cada 500 ms cridant updateGpsLedState() i updateImuLedState().

6.1 LED Blanc — Estat del MCU

EstatPatróSignificat
WHITE_OFFapagatLED desactivat manualment
WHITE_BOOTINGbreathe 2 sBoot inicial (PWM fade in/out)
WHITE_WIFI_CONNECTINGheartbeat 2 sDoble batec ràpid + pausa 2 s
WHITE_WIFI_CONNECTED500 ms ON / 500 ms OFFWiFi connectat però servei encara no llest
WHITE_CAPTIVE_AUTH300 ms ON / 700 ms OFFAutenticació al portal captiu en curs
WHITE_SYSTEM_READYsòlid ONSistema completament operatiu
WHITE_STANDBY100 ms ON / 4 s OFFMode estalvi
WHITE_OTA_PROGRESS2× 120 ms / pausa 500 msActualització de firmware en curs

6.2 LED Blau — Estat GPS

EstatPatróCondició
BLUE_OFFapagatCap dada GPS rebuda (mòdul mort)
BLUE_NO_FIX200 ms ON / 2 s OFFRep dades però sense fix vàlid
BLUE_FIX_POOR2× 150 ms / pausa 1.5 s< 5 satèl·lits
BLUE_FIX_MODERATE3× 150 ms / pausa 1.2 s5-7 satèl·lits
BLUE_FIX_GOOD250 ms ON / 250 ms OFF8-10 satèl·lits
BLUE_FIX_EXCELLENTsòlid ON≥ 11 satèl·lits
BLUE_STATIC_MODEbreathe 3 sVaixell aturat (fondejat/amarrat)
BLUE_MONITOR_ACTIVE5× 50 ms / pausa 2 sMode monitor GPS actiu (60 s)

6.3 LED Verd — IMU i Estat de Mar

EstatPatróSea State (Douglas/WMO)
GREEN_OFFapagatIMU no inicialitzat
GREEN_IMU_INIT500 ms ON / 2 s OFFIniciant ICM-20948
GREEN_SEA_0_11 s ON / 1 s OFFCalm / Rippled (0–0.1 m)
GREEN_SEA_2_3500 ms ON / 500 ms OFFSmooth / Slight (0.1–1.25 m)
GREEN_SEA_4_5250 ms ON / 250 ms OFFModerate / Rough (1.25–4 m)
GREEN_SEA_6_7120 ms ON / 120 ms OFFVery Rough / High (4–9 m)
GREEN_SEA_8_PLUS80 ms strobeVery High / Phenomenal (≥ 9 m)
GREEN_HEADING_CAL2× 100 ms / pausa 800 msCalibració de rumb activa

6.4 LED Vermell — Errors (alta prioritat)

EstatPatróCausa
RED_OFFapagatSense errors
RED_WIFI_FAILED1× 200 ms / pausa 2 sNo s'ha pogut unir a cap xarxa
RED_GPS_UNHEALTHY2× 100 ms / pausa 1 s60 s sense fix vàlid
RED_MEMORY_WARNING3× 100 ms / pausa 1 sHeap < 20 KB
RED_MEMORY_CRITICAL5× 80 ms / pausa 1 sHeap < 12 KB (reinici imminent)
RED_OTA_FAILEDsòlid ON (3 s)Actualització fallida
RED_WATCHDOGSOS MorseWatchdog disparat — reinici en 2 s
RED_CAPTIVE_FAILEDstrobe 50/50 msTotes les credencials captives han fallat

6.5 Control de Brillantor i Master Enable

VariableTipusDescripció
ledMaxBrightnessuint8_t (0-255)Per defecte 127 (50%). Multiplicador global.
ledsEnabledboolPer defecte true. Master switch global.

Comandes relacionades: led_brightness <0-255>, led_on, led_off, led_status.

7. Connectivitat WiFi i Captives

7.1 Xarxes Suportades (en ordre d'intent)

  1. Credencials desades a LittleFS /wifi.txt (línia 1: SSID, línia 2: password).
  2. Xarxa per defecte hardcodejada al firmware (privada).
  3. Crew (Stena Line) — captiu amb 3 credencials rotatives.
  4. Balearia guest — captiu basat en voucher (getwifi.no).
Configuració general WiFi:

7.2 Portal Captiu "Crew" (Stena Line)

ParàmetreValor
SSIDCrew
PasswordKerryLighthouse
URL portalhttps://internet.stenaline.com/portal_api.php
MètodePOST application/x-www-form-urlencoded
Credencials rotatives3 jocs (rotació automàtica per quota exhausted)
Timeout HTTP15 s (xarxa lenta)

7.3 Portal Captiu "Balearia guest" (getwifi.no)

ParàmetreValor
SSIDBalearia guest (minúscula 'g' — case-sensitive)
Password(xarxa oberta)
Voucher38042784 (Surf Premium: 3 GB / 168 h)
API statushttps://getwifi.no/api.php/GetClientStatus
API voucherhttps://getwifi.no/api.php/UseVoucher?Code=...
URL authhttps://ac.getwifi.no:8003/index.php?zone=pax
Telemetria de quotaCada 10 minuts (data% i time%)

Flux d'autenticació Balearia: (A) Status pre-check → si MAC ja és activa, no es crema cap voucher; (B) UseVoucher → obté formulari; (C) Form POST a l'AC; (D) Status verify per confirmar.

7.4 Comprovació d'Internet

Es fa una petició HTTP HEAD a http://clients3.google.com/generate_204 amb timeout de 5 s. Es considera Internet OK si la resposta és 204 o 200.

8. Sistema GPS i Filtratge

8.1 Estructura de Dades GPS

struct GPSData { double latitude; // Graus decimals (6 decimals) double longitude; // Graus decimals (6 decimals) double speed; // En nusos (per defecte) o km/h int course; // 0-359° (COG) int satellites; // 0-64 (clamped) int day, month, year; // Data UTC int hour, minute; // Hora UTC bool isValid; // True si fix passa filtres unsigned long lastUpdateMs; };

8.2 Filtres Aplicats a Cada Sentència

  1. Coordenades sospitoses: rebutja punts coneguts com a falsos (e.g. 0.366667, 0.450000) i punts ambigus prop de l'origen.
  2. Rang vàlid: lat ∈ [-90, 90], lon ∈ [-180, 180], i no ambdós zero.
  3. Mínim de satèl·lits: ≥ 4.
  4. HDOP acceptable: < 5.0 (si vàlid).
  5. Validació data/hora: any 2020-2030.
  6. Mode estàtic: si està parat > 30 s, només accepta canvis < 10 m.
  7. Salt màxim: distància < 30 m + 30 m/s × dt entre fixes.
  8. Mínim sentències consecutives bones: 3 abans d'acceptar canvi.
  9. Speed deadband: velocitats < 0.4 nusos s'arrodoneixen a 0 (filtra deriva GPS).

8.3 Mode Estàtic

El sistema detecta automàticament si el vaixell està aturat (velocitat < 0.3 nusos durant > 30 s). En aquest mode:

8.4 Mode Monitor GPS

Comanda gps_monitor (o alias GPS_STATUS_MQTT): activa durant 60 s un mode on:

9. IMU, Heave i Estat de Mar

9.1 Pipeline de Càlcul

L'AquaPulse utilitza un enfocament físic per estimar l'estat de mar (BBN wave period approach), basat en:

  1. Adquisició de l'ICM-20948 a 25 Hz (acc + gyro + mag).
  2. Madgwick AHRS: fusió quaterniònica per a orientació absoluta lliure de drift.
  3. Compensació de gravetat: extracció de l'acceleració vertical pura (eix mundial Z).
  4. Filtre passa-baixos sobre el senyal vertical i càlcul de RMS.
  5. Filtre Aranovskiy: estimació no-paramètrica del període dominant d'ona.
  6. Mapatge físic: conversió RMS → alçada d'ona → estat de mar segons llindars WMO.

9.2 Estructura SeaStateData

struct SeaStateData { int seaStateIndex; // 0-9 codi WMO float waveHeightM; // Alçada estimada en metres float wavePeriodSec; // Període dominant (Aranovskiy) float waveFrequencyHz; // Freqüència dominant float rmsAccelG; // RMS de l'acceleració filtrada (g) float filteredAccelG; // Acceleració filtrada actual (g) float rawAccelG; // Magnitud crua (g) float pitchDegrees; // Capcineig float rollDegrees; // Balanceig float headingDegrees; // Rumb magnètic float verticalAccelMps2; // Acc. vertical en m/s² float signalVariance; // Variància del senyal bool hasWaveMotion; // True si hi ha moviment d'ona detectat bool isInitialized; // IMU inicialitzat correctament unsigned long sampleCount; // Comptador de mostres };

9.3 Escala WMO / Douglas Sea Scale

CodiDescripcióAlçada d'ona (m)
0Calm (glassy)0
1Calm (rippled)0–0.1
2Smooth0.1–0.5
3Slight0.5–1.25
4Moderate1.25–2.5
5Rough2.5–4
6Very rough4–6
7High6–9
8Very high9–14
9Phenomenal> 14
Sortida Serial: Cada 30 s s'imprimeix una línia compacta amb l'estat de mar, i cada 2 minuts una sortida de debug completa (heave, pitch/roll, RMS, període, variància).

10. Brúixola i Calibració de Desviació

L'AquaPulse implementa dues estratègies de correcció de la brúixola magnètica:

10.1 Offset Simple (mode bàsic)

Un sol valor d'offset (-180° a +180°) que es sumarà al rumb magnètic cru. Suficient si la desviació és aproximadament constant.

Recol·lecció automàtica activada per heading_cal_start:

10.2 Taula de Desviació de 36 Punts (mode avançat)

Una deviation card tradicional amb 36 buckets (cada 10°), com les que es porten al pont de comandament:

10.3 Càlcul del Rumb Final

A publishTelemetryOnce(), el rumb a enviar es decideix així:

  1. Si la taula de desviació està calibrada → s'usa el rumb corregit per bucket.
  2. Si només l'offset simple està calibrat → s'usa el rumb magnètic + offset.
  3. Altrament → s'usa el COG GPS directe.

11. Geofencing

11.1 Estructura

struct Geofence { String category; // Ex: "port", "marina", "warning" String name; // Identificador únic (case-insensitive) double lat, lon; // Centre en graus decimals float radius; // Radi en metres bool notifyEnter; // Generar event en entrar bool notifyExit; // Generar event en sortir String alias; // Nom amigable opcional bool isInside; // Estat actual (no es persisteix) };

11.2 Persistència

Les geofences es guarden a /geofences.json al LittleFS. Format:

[ { "category": "marina", "name": "PortVell", "lat": 41.376388, "lon": 2.181111, "radius": 200.0, "notifyEnter": true, "notifyExit": true, "alias": "Port Vell de Barcelona" } ]

11.3 Tasques de Geofencing

TascaIntervalFunció
geofenceEvalTask5 sAvalua entrada/sortida amb fórmula haversine
geofenceEventPublishTask250 ms (cua)Envia events via UDP
geofencePersistenceTask15 sGuarda canvis si geofencesDirty

11.4 Comandes

ComandaDescripció
geofence_listLlista totes les geofences
geofence_add <cat> <name> <lat> <lon> <radius> <notifyEnter> <notifyExit> [alias]Afegeix una nova geofence (mínim 7 args)
geofence_remove <name>Elimina per nom (case-insensitive)

12. Telemetria UDP i Protocols

12.1 Configuració del Servidor

ParàmetreValor
IP del servidor188.166.104.124
Port UDP5052
SincronitzacióudpMutex (semàfor FreeRTOS)
Pre-condicióisSystemReadyForServices() == true

12.2 Format de Telemetria GPS

Paquet UDP amb 16 camps separats per coma:

AquaPulse,<lat>,<lon>,<speed>,<unit>,<course>,<sats>,0,0.0,0,0.0,<day>,<month>,<year>,<hour>,<minute>,<seaState>
CampFormatDescripció
0AquaPulseIdentificador fix
1, 2float (6 dec.)Latitud i longitud
3float (2 dec.)Velocitat (arrodonida a centèsims)
4kts / kmhUnitat de velocitat
5intRumb (0-359°), corregit per IMU si cal·librat
6intNombre de satèl·lits
7-100,0.0,0,0.0Reservats (compatibilitat)
11-13intDia, mes, any UTC
14-15intHora i minut UTC
16int (0-9)Sea State Index (WMO)

12.3 Format de Logs

LOG,aquapulse,[LEVEL] message

On [LEVEL][DEBUG], [INFO], [WARNING], [ERROR]. Filtre actiu via globalLogLevel (per defecte INFO).

12.4 Format de Wave Data

WAVE,aquapulse,<seaState>,<heightM>,<periodSec>,<freqHz>,<rmsG>,<filteredG>,<rawG>,<variance>,<hasMotion>,<sampleCount>

12.5 Format de Geofence Events

GEO,aquapulse,<event>,<fence>,<category>,<lat>,<lon>[,<alias>]

event = enter o exit.

13. NMEA 0183 per OpenCPN

L'AquaPulse genera sentències NMEA estàndard a partir de les dades GPS i les envia via UDP per integració amb plotters com OpenCPN. Es fan servir prefixos GN (multi-constel·lació).

13.1 Format del Paquet UDP

NMEA,aquapulse,$GNRMC,...,*XX|$GNGGA,...,*XX

Les dues sentències es separen per un caràcter |. El backend pot reconstruir-les amb \r\n i reenviar-les a OpenCPN.

13.2 $GNRMC (Recommended Minimum)

$GNRMC,hhmmss.00,A,llll.llll,N,yyyyy.yyyy,W,sss.s,ccc.c,ddmmyy,,,D*hh

13.3 $GNGGA (Fix Data)

$GNGGA,hhmmss.00,llll.llll,N,yyyyy.yyyy,W,2,ss,1.0,0.0,M,0.0,M,,*hh

Els checksums NMEA es calculen amb XOR de tots els caràcters entre $ i *.

14. API, Comandes i OTA

14.1 API GeoPulse Backend

ParàmetreValor
URL Basehttps://api.geopulse.systems
LoginPOST /login amb { username, password }
Endpoint comandesGET /api/device/aquapulse/commands
AutenticacióAuthorization: Bearer <apiKey>
PollingCada 30 s (COMMAND_POLL_INTERVAL_MS)
Refresh API keyAutomàtic en rebre HTTP 401
TLSWiFiClientSecure::setInsecure() (sense verificació de cert)

14.2 OTA (Over-The-Air)

ParàmetreValor
URL fixahttp://updates.geopulse.systems/aquapulse/firmware.bin
Buffer de descàrrega128 bytes
Timeout HTTP20 s
Heap mínim per iniciar20 KB
Suport HTTPSSí (setInsecure)
RedirectsStrict follow
Indicador visualBlanc OTA_PROGRESS (2× 120 ms)
En cas d'errorVermell OTA_FAILED sòlid 3 s

14.3 Inventari Complet de Comandes

14.3.1 Sistema

ComandaDescripció
rebootReinici immediat (sempre permès)
set_standby / resumeMode estalvi (sempre permès)
get_standby_statusConsulta estat (sempre permès)
status / connectivity_statusImprimeix estat de WiFi i autenticació
get_statusResum DEVICE / NETWORK / GPS / WAVE / RUNTIME
versionVersió firmware i data de build
task_statusEstat i últim run de cada tasca
force_reauthForça re-autenticació al portal captiu
set_log_level_<debug|info|warning|error>Filtra el nivell de logs

14.3.2 GPS i Telemetria

ComandaDescripció
set_knots / set_kmhUnitat de velocitat
set_interval_500msTelemetria a 500 ms (alta precisió)
set_interval_1sTelemetria a 1 s (per defecte)
set_interval_2sTelemetria a 2 s (normal)
set_interval_5sTelemetria a 5 s (estalvi)
set_interval_10sTelemetria a 10 s (baix ample de banda)
gps_monitor / GPS_STATUS_MQTTMonitor GPS durant 60 s
enable_gps_readReprèn la tasca GPS si està suspesa
force_gps_sendForça un enviament de telemetria immediat

14.3.3 Wave Data / IMU

ComandaDescripció
wave_status / get_wave_dataImprimeix dades d'ona detallades
wave_debugDebug complet a Serial
wave_send / send_wave_dataForça enviament UDP de wave data
wave_interval <seconds>Estableix interval de publicació (10-3600 s)

14.3.4 Calibració de Rumb (Offset Simple)

ComandaDescripció
heading_cal_start / heading_calibrateActiva recol·lecció automàtica
heading_cal_stopAtura recol·lecció
heading_cal_statusMostra mostres, offset i spread
heading_cal_applyAplica calibració (mín. 10 mostres)
heading_offset <deg>Estableix offset manual (-180° a +180°)
heading_cal_sampleAfegeix una mostra manual (req. SOG ≥ 7 kt)
heading / get_headingMostra rumb cru i corregit + comparació COG

14.3.5 Taula de Desviació (36 punts)

ComandaDescripció
deviation / deviation_statusEstat de la calibració (X/36 buckets)
deviation_table / deviation_cardImprimeix la deviation card completa
deviation_saveGuarda la taula a NVS
deviation_clearEsborra calibració de NVS
deviation_enable / deviation_onActiva auto-recol·lecció
deviation_disable / deviation_offDesactiva auto-recol·lecció
deviation_sampleMostra forçada (bypassa rate limit)

14.3.6 LEDs

ComandaDescripció
led_statusEstat actual dels 4 LEDs + brillantor
led_brightness <0-255>Brillantor global
led_offMaster disable (PWM=0 a tots)
led_onMaster enable

14.3.7 OTA

ComandaDescripció
ota_updateOTA des de la URL fixa
remote_ota_update <url>OTA des d'una URL arbitrària (http/https)

14.3.8 Geofencing

ComandaDescripció
geofence_listLlista totes les geofences
geofence_add <cat> <name> <lat> <lon> <radius> <enter> <exit> [alias]Afegeix nova geofence
geofence_remove <name>Elimina geofence per nom
Limitació en cas de memòria baixa: Si el heap és < 20 KB, només s'accepten reboot, set_standby, resume i get_standby_status. La resta es rebutgen amb [WARNING] Memory low - only critical commands.

15. Tasques FreeRTOS

El sistema executa 13 tasques concurrents sobre el dual-core de l'ESP32. Totes són monitoritzades per updateTaskRun() i visibles via task_status.

TascaStackPrioFunció
LED2 KB1Patrons dels 4 LEDs (PWM hardware)
WiFi8 KB1Connexió i reconnexió a 4 xarxes
GPS4 KB2Lectura Serial1 + filtres TinyGPS++
CmdPoll8 KB1Telemetria UDP + polling de comandes HTTPS
Accel4 KB2IMU 25 Hz + càlcul d'estat de mar
LogFlush4 KB1Buidat periòdic del buffer de logs
SysMon4 KB1Monitorització de heap + alimenta watchdog
OTA8 KB1Descàrrega i flash del firmware
Internet20 KB1TLS pesat: portal captiu + status checks
GeoEval4 KB2Avalua geofences cada 5 s
GeoPub4 KB3Envia events de geofence (cua FIFO)
GeoPersist4 KB1Guarda geofences a LittleFS
Watchdog2 KB1Reinici si SysMon no s'alimenta > 120 s

15.1 Sincronització

Mutexes utilitzats per protegir estructures compartides:

MutexProtegeix
gpsDataMutexEstructura currentGPSData
seaStateMutexVariable seaStateIndex
ledStateMutexEstats dels 4 LEDs
logBufferMutexBuffer de logs (FIFO 2 KB)
geofencesMutexVector de geofences i flag dirty
systemReadyMutexFlag systemReadyForServices
udpMutexClient UDP (multi-tasca segur)

16. Manteniment i Diagnòstic

16.1 Diagnòstic per Patró de LED

SímptomaLEDCausa ProbableAcció
Sense fix GPS prolongat Blau parpelleja únic + Vermell 2× ràpidAntena obstruïda o sense visió del celVerificar antena GPS
Boot infinit Blanc breathe permanentWiFi no connectaVerificar credencials/abast
Estat de mar sempre 0 Verd 1 s lentIMU no detecta moviment o calibracióEsperar 2-5 minuts perquè el filtre estabilitzi
SOS Morse permanent Vermell SOSWatchdog disparat (bloqueig del SysMon)El sistema es reiniciarà sol en 2 s
Strobe ràpid vermell Vermell 50/50 msTotes les credencials captives han fallatProvar force_reauth o canviar de xarxa
5 flashes vermells Vermell 5×Heap < 12 KB — reinici imminentCap acció — auto-recuperació
Blanc parpelleja sense LED Verd Blanc + Verd OFFICM-20948 no detectat al bus I2CVerificar cablejat SDA=21, SCL=22, alimentació

16.2 Logs i Debug

Els logs es poden veure simultàniament a:

16.3 Heartbeat del Loop Principal

[DEBUG] HEARTBEAT: Heap=<bytes> WiFi=<yes|no> SysReady=<yes|no> [DEBUG] IMU: P=<pitch>° R=<roll>° H=<heading>° Acc=<raw>g RMS=<rms>g Vert=<vAcc>m/s² SS=<index>

16.4 Recuperació Automàtica

El sistema implementa diversos mecanismes de recuperació:

⚠️ ADVERTÈNCIES IMPORTANTS:
✅ Bones Pràctiques d'Instal·lació:

16.5 Suport Tècnic

API i actualitzacions: api.geopulse.systems
Servidor de telemetria UDP: 188.166.104.124:5052
OTA endpoint: http://updates.geopulse.systems/aquapulse/firmware.bin

AquaPulse Marine Tracker — Manual d'Usuari v2.0.9
Firmware: AquaPulse-2.0.9_UDP_MUTEX | Basat en FireBeetle 2 ESP32-E
Document generat: Maig 2026
© 2026 GeoPulse Systems — Tots els drets reservats