Плоттер читает последовательный порт через Web Serial — стандарт WHATWG, по которому страница получает доступ только к тому порту, который вы сами выбрали в окне браузера. Каждая строка с числами становится точкой на графике; ряды подписываются по меткам или по номеру столбца. Всё остаётся в браузере: на сервер плоттер ничего не отправляет.
Коротко
- Формат строки: числа через запятую, пробел или табуляцию, конец — LF или CR LF.
- Метки: пары «имя:значение» или «имя=значение»; строка из одних имён перед первой строкой данных с тем же числом столбцов — заголовок.
- Ряды: до 8; каждый можно скрыть.
- Окно: последние 100–5000 точек; пауза замораживает график, запись продолжается.
- Масштаб: автоматический по видимым рядам или свои пределы.
- Экспорт: CSV по RFC 4180 со временем в секундах.
Как подключиться
- Загрузите в плату программу, которая печатает числа по строкам (пример ниже).
- Выберите ту же скорость, что в
Serial.begin(), и нажмите «Подключиться». - Выберите порт в окне браузера: CH340, CP210x, FTDI или USB-порт самой платы.
Формат кадра — 8N1, его используют Arduino и ESP32 по умолчанию. Если нужен другой формат, управление линиями DTR и RTS или отправка команд, откройте терминал COM-порта: он работает с тем же портом, только по очереди — один порт открывает одна страница или программа.
| Браузер | Web Serial |
|---|---|
| Chrome, Edge | с версии 89 |
| Opera | с версии 75 |
| Firefox | с версии 151 |
| Chrome для Android | с версии 148 |
| Safari | нет — график строится по вставленному тексту |
Что печатать на плате
Достаточно одной строки на точку. Для Arduino:
void setup() {
Serial.begin(115200);
}
void loop() {
int raw = analogRead(A0);
float volts = raw * 5.0 / 1023;
Serial.print("raw:");
Serial.print(raw);
Serial.print(",volts:");
Serial.println(volts, 3);
delay(20);
}
Строки выглядят так: raw:512,volts:2.502. Плоттер распознаёт форматы:
| Строка | Что получится |
|---|---|
512 | один ряд с именем 1 |
512 498 3.3 или 512,498,3.3 | три ряда: 1, 2, 3 |
raw:512,volts:2.502 | ряды raw и volts |
temp: 21.5 hum: 40 | ряды temp и hum |
t,u,i перед первой строкой 0.1,5.02,0.31 | заголовок: ряды t, u и i |
Start или OK между строками данных | строка пропущена |
Connecting to WiFi... | строка пропущена |
Числа — как их печатает C: -12, 3.14, 1e-3. Значения nan, inf и ovf, которые печатает Serial.print() вместо числа, на график не попадают — в этом ряду остаётся разрыв, остальные числа строки рисуются. Если в строке не хватает какого-то ряда, его линия тоже прерывается, остальные ряды рисуются как обычно.
На ESP32 с ESP-IDF то же самое даёт printf("temp:%.2f,hum:%.1f\n", t, h);. Загрузочные сообщения ESP32 (rst:0x1 (POWERON_RESET), load:0x3fff0030,len:1344) и строки журнала ESP_LOGI плоттер пропускает: строка берётся только целиком, а в них есть слова без числа или значения в шестнадцатеричном виде.
Скорость и сколько точек в секунду
Каждый байт в формате 8N1 — 10 бит на линии, поэтому на 115 200 бод проходит не больше 11 520 байт в секунду. Строка raw:512,volts:2.502 с CR LF — 21 байт, значит, до 548 строк в секунду. На 9600 бод тот же поток — 45 строк в секунду; если плата печатает чаще, у Arduino на AVR заполняется буфер передачи на 64 байта, и Serial.print() ждёт, пока байты уйдут в линию: программа замедляется до скорости порта, а точки приходят реже, чем задумано. Подробнее — в ответе «Почему Serial.print замедляет программу Arduino». Сколько байт в секунду даёт другая скорость и формат, считает калькулятор кадра UART.
Плоттер перерисовывает график не чаще 20 раз в секунду, а в памяти держит от 100 000 до 125 000 последних точек: лишние удаляются пачкой, а не по одной. В окне видны последние 100–5000, в CSV попадает всё, что в памяти. Строки длиннее 4096 символов данными не считаются и пропускаются.
Масштаб, пауза и статистика
В автоматическом режиме ось подстраивается под видимые ряды: деления выбираются кратными 1, 2 или 5, а ровная линия рисуется посередине. Свой масштаб удобен, когда нужно сравнивать с пределами: для 10-битного АЦП Arduino это 0 и 1023, для 12-битного АЦП ESP32 — 0 и 4095, о его нелинейности — в калькуляторе АЦП ESP32.
Под графиком — последнее значение, минимум, максимум и среднее каждого ряда по точкам в окне. Так удобно оценить шум датчика: разница максимума и минимума на неподвижном сигнале — размах шума в единицах АЦП. Пересчитать отсчёты термистора в температуру поможет калькулятор NTC.
Кнопка «Пауза» останавливает график, чтобы рассмотреть всплеск, а данные продолжают записываться. «Сохранить CSV» выгружает всё записанное, а не только окно.
CSV для таблиц и Python
Файл начинается строкой заголовка: time_s и имена рядов. Время — секунды от первой точки с точностью до миллисекунды по часам компьютера, а не платы: на него влияют буферы USB, поэтому для точного шага по времени печатайте millis() отдельным рядом. Разделитель — запятая, десятичная точка, конец строки CR LF, как требует RFC 4180; имя ряда с запятой или кавычкой берётся в кавычки.
import csv
with open("serial-plot.csv", newline="") as f:
rows = list(csv.DictReader(f))
print(rows[0]["time_s"], rows[0]["raw"])
Частые вопросы
Что должна печатать плата, чтобы получился график?
Одну строку на каждую точку: числа через запятую, пробел или табуляцию и перевод строки в конце — Serial.println() добавляет его сам. Например, Serial.print(t); Serial.print(','); Serial.println(h); даёт два ряда с именами 1 и 2. Чтобы ряды были подписаны, печатайте пары «имя:значение»: temp:21.5,hum:40. Это тот же формат, что у Serial Plotter в Arduino IDE 2.
Почему график не появляется, хотя в мониторе порта числа есть?
Чаще всего не совпадает скорость: в программе Serial.begin(9600), а плоттер слушает на 115 200. Вторая причина — порт занят монитором порта Arduino IDE или другой программой: закройте их. Третья — в строке есть слова: строки вроде «Temp 21» — без двоеточия или знака равенства между именем и числом — плоттер пропускает. Последние строки из порта видны под графиком.
Можно ли использовать десятичную запятую?
Нет: запятая разделяет значения, поэтому 21,5 станет двумя числами — 21 и 5. Печатайте числа с точкой, как это делают Serial.print() и printf() в C. В таблице статистики и на осях плоттер показывает числа с запятой, по-русски.
В каком формате сохраняется CSV?
Первый столбец — время в секундах от первой точки (для вставленного текста — номер точки), дальше по столбцу на каждый ряд. Разделитель — запятая, десятичный разделитель — точка, строки заканчиваются CR LF по RFC 4180. Пропущенное значение — пустое поле. Файл открывается в LibreOffice Calc, Excel, Python и любой программе для таблиц; в русской версии Excel при открытии укажите разделитель «запятая».
Источники
- Arduino. Using the Serial Plotter Tool (Arduino IDE 2 documentation) — пример со строкой Variable_1:<значение>,Variable_2:<значение> и println; конец строки — LF или CR LF; разделители — запятая, табуляция или пробел; метка ряда — префикс «имя:», без меток подписи создаются автоматически; ряды можно скрывать флажками
- WHATWG. WebSerial Standard, Living Standard (обновлён 8 октября 2026) — requestPort() — выбор порта пользователем, open() с baudRate; ошибки чтения BreakError, FramingError, ParityError, BufferOverrunError, отключение — NetworkError; только защищённый контекст; функция политики разрешений serial для iframe
- MDN. browser-compat-data: api/Serial.json (коммит 1d670c0, 8 октября 2026) — Serial — Chrome и Edge с версии 89, Opera с 75, Firefox с 151, Chrome для Android с 148; Safari — нет
- IETF. RFC 4180: Common Format and MIME Type for Comma-Separated Values (CSV) Files, 2005 — строки CSV заканчиваются CR LF, первая строка может быть заголовком, поле с запятой, кавычкой или переводом строки берётся в кавычки, кавычка внутри удваивается
Где пригодится
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/serial-plotter/" title="Плоттер COM-порта в браузере" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write; serial"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/serial-plotter/">Плоттер COM-порта в браузере</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?