SerialPulse Studio v1.0

WebSerial & WebBluetooth Studio — Monitor Série e Plotter em Tempo Real

Ligue placas Arduino, ESP32, RP2040 ou STM32 via USB UART / BLE ou clique em Start Demo Signal (50Hz) para testar sem hardware.

Documentação de Engenharia & Referência de Protocolo

Guia Completo: Monitor Série e Plotter com WebSerial & WebBluetooth

Aprenda a enviar telemetria em tempo real a partir de microcontroladores Arduino, ESP32, RP2040 (Raspberry Pi Pico) e STM32 diretamente para o navegador sem necessidade de instalar drivers adicionais ou aplicações desktop.

1. Como usar o WebSerial com Arduino & ESP32 (C++)

USB CDC / UART

O parser automático do SerialPulse Studio reconhece pares Chave:Valor e atribui automaticamente os nomes às variáveis na legenda do gráfico. Utilize 115200 baud (ou superior) para minimizar a latência de transmissão série:

// Exemplo C++ para Arduino / ESP32 (50Hz Telemetry)
#include <Arduino.h>

unsigned long lastSampleMs = 0;
const unsigned long SAMPLE_INTERVAL_MS = 20; // 50 Hz

void setup() {
  Serial.begin(115200);
  while (!Serial) { delay(10); }
  Serial.println("[SYS] Sensor Node Initialized @ 115200 baud");
}

void loop() {
  unsigned long now = millis();
  if (now - lastSampleMs >= SAMPLE_INTERVAL_MS) {
    lastSampleMs = now;
    float t = now / 1000.0f;

    // Leituras de sensores reais ou sinais de teste
    float tempC = 24.5f + 2.5f * sin(2.0f * PI * 0.5f * t);
    float humPct = 55.0f + 5.0f * cos(2.0f * PI * 0.25f * t);
    int adcRaw = analogRead(A0);

    // Formato Key:Value (Recomendado para multi-canal)
    Serial.print("Temp:");
    Serial.print(tempC, 2);
    Serial.print(" Hum:");
    Serial.print(humPct, 2);
    Serial.print(" ADC:");
    Serial.println(adcRaw);
  }
}

2. Telemetria Sem Fios via WebBluetooth (ESP32 BLE NUS)

BLE GATT 6E400001

Para monitorizar robôs móveis, drones ou sistemas isolados galvanicamente, configure o ESP32 ou nRF52 com os UUIDs standard do Nordic UART Service (NUS):

// UUIDs Padrão Nordic UART Service (NUS)
#define SERVICE_UUID           "6e400001-b5a3-f393-e0a9-e50e24dcca9e"
#define CHARACTERISTIC_UUID_RX "6e400002-b5a3-f393-e0a9-e50e24dcca9e"
#define CHARACTERISTIC_UUID_TX "6e400003-b5a3-f393-e0a9-e50e24dcca9e"

// Enviar string terminada por '\n' via BLE Notify:
char payload[64];
snprintf(payload, sizeof(payload), "Vbat:%.2f Roll:%.1f\n", vbat, roll);
pTxCharacteristic->setValue((uint8_t*)payload, strlen(payload));
pTxCharacteristic->notify();
Nota sobre MTU no BLE: O pacote BLE padrão comporta 20 bytes de payload útil (ou até 247/512 bytes negociando esp_ble_gatt_set_local_mtu(247)). O nosso acumulador de linhas reconstrói pacotes fragmentados automaticamente até encontrar \n ou \r\n.

3. Formato de Dados Suportados pelo Serial Plotter Automático

O motor de parsing analisa cada linha recebida através do LineBreakTransformer em menos de 0,02 ms e classifica-a automaticamente num dos quatro formatos de telemetria numérica ou como mensagem de log na consola:

A. Chave:Valor (Key-Value)
Temp:23.5 Hum:45.1 PWM:128

Compatível com o Serial Plotter do Arduino IDE 2.x. Aceita separadores : ou =.

B. CSV (Vírgulas)
23.50, 45.12, -9.81, 1013.25

Gera automaticamente os canais CH1, CH2, CH3, CH4 com sobrecarga mínima de bytes na UART.

C. Espaços / Tabs
23.50 45.12 1023

Ideal para saídas rápidas printf("%f %f\n", a, b) em STM32 HAL ou C puro.

D. JSON Single-Line
{"v":3.31,"i":0.42,"t":38.5}

Extrai automaticamente todas as propriedades numéricas de objetos JSON enviados linha a linha.

4. Privacidade, Segurança e Arquitetura Anti-Crash (Por que razão os seus dados nunca saem do navegador)

🔒 Comunicação Direta USB/BLE → Browser

As APIs navigator.serial e navigator.bluetooth comunicam diretamente com o subsistema USB/Bluetooth do sistema operativo mediante permissão explícita por dispositivo. Nenhum byte lido da porta série é transmitido pela rede ou para servidores externos.

🔄 Ring Buffer Circular Sem Memory Leaks

Ferramentas baseadas no DOM tradicional acumulam milhões de nós HTML e esgotam a memória RAM após poucos minutos a 115200 baud. O SerialPulse Studio utiliza arrays tipados (Float64Array) em estrutura circular (ex: últimos 5.000 pontos e 1.000 linhas), mantendo o consumo de RAM constante durante dias.

⚡ Renderização Desacoplada a 60 FPS

A leitura da stream binária da UART ocorre de forma assíncrona em pacotes contínuos, enquanto o desenho gráfico em HTML5 Canvas 2D (uPlot) é sincronizado com a taxa de atualização do monitor via requestAnimationFrame.