Формат схемы: diagram.json

Схема проекта — это не картинка, а текст. Тот же самый, что вы собираете мышью на холсте: вкладка diagram.json рядом с файлами показывает его целиком, и там его можно править.

Текстом задаётся то, для чего на холсте нет кнопки: поворот корпуса, замок, подпись под деталью, точные координаты, свойство детали, которого нет в панели свойств. Плюс схему в таком виде можно скопировать, переслать в письме или положить в репозиторий рядом со скетчем.

Как это работает

Правка применяется по кнопке Применить к схеме (или Ctrl+Enter), а не по каждому нажатию клавиши: текст в процессе набора почти всегда сломан — скобка ещё не закрыта, — и перерисовывать по нему схему значило бы гасить её на каждом символе.

После применения текст пересобирается из принятой схемы. Так сразу видно, как редактор понял написанное: какие поля добавились, во что превратилась сокращённая запись. Если вы двигали детали мышью, пока вкладка была открыта, текст догоняет холст сам — но только если в нём нет неприменённой правки. Чужую работу редактор не затирает.

Что в файле

{
  "version": 1,
  "editor": "esplab",
  "parts": [
    { "id": "esp", "type": "esp32-devkit-v1", "x": 60, "y": 60, "attrs": {} },
    { "id": "led1", "type": "led", "x": 320, "y": 120, "attrs": { "color": "red" } },
    { "id": "r1", "type": "resistor", "x": 320, "y": 200, "attrs": { "value": 220 } }
  ],
  "connections": [
    ["esp:D2", "r1:1", "green", []],
    ["r1:2", "led1:A", "green", []],
    ["led1:C", "esp:GND", "black", []]
  ]
}

Обязательного здесь два поля: parts и connections. Всё остальное — включая version, editor и любые ваши собственные ключи — сохраняется как есть и возвращается при следующей выгрузке. Это сделано намеренно: если в файл дописали заметку или служебное поле, первое же перетаскивание детали не должно его стирать.

Деталь

ПолеЧто это
idИмя детали. По нему на неё ссылаются провода. Должно быть своим у каждой детали и без двоеточия внутри.
typeТип детали: led, resistor, lcd1602 и так далее. Полный список — в выпадающем списке «добавить деталь».
x, yЛевый верхний угол корпуса на холсте. Холст 900×620.
rotateПоворот корпуса вокруг центра: 0, 90, 180 или 270. Только в файле.
locktrue — деталь нельзя сдвинуть мышью. Только в файле.
labelПодпись под деталью на схеме. Только в файле.
attrsСвойства детали: цвет светодиода, адрес на шине, показания датчика.

Промежуточные углы поворота не поддерживаются. Провода прокладываются по прямоугольной сетке, и деталь, повёрнутая на 37°, ломала бы и прокладку, и попадание мышью по выводу — ради случая, которого на реальной схеме не бывает.

Свойства деталей

В attrs лежит то же, что показывает панель свойств выбранной детали, — под теми же ключами. Часто нужное:

ДетальКлючи
ledcolor: red, green, blue, yellow, white
rgb-ledcommon: cathode или anode
resistorvalue — сопротивление в омах
photoresistorlux — освещённость
dht22temperature, humidity
hc-sr04distance — расстояние в сантиметрах
bme280address, temperature, humidity, pressure
mpu6050address, pitch, roll, g, gyroX, gyroY, gyroZ
ds3231address, temperature
lcd1602, ssd1306address — адрес на шине I²C
max7219kind: matrix или seg; count — модулей в цепочке
st7735size: 128x160 или 128x128
neopixel-strippixels — число светодиодов
hx711weight — вес на тензодатчике
ir-receivercode — код кнопки пульта, шестнадцатеричный

Неизвестный ключ в attrs не отбрасывается: он сохранится в файле и уедет с проектом. Это способ положить в схему то, чего редактор пока не умеет, — например заготовку под свойство, которое появится позже.

Провод

["esp:D2", "led1:A", "green", []]

По порядку: откуда, куда, цвет, путь. Концы записываются как деталь:вывод — имена выводов подписаны на корпусе и видны при наведении. Цвета: green, black, red, blue, yellow, white; по умолчанию цвет выбирается сам — земля чёрная, питание красное.

Четвёртое поле — путь. Пустой массив значит «проложи сам, в обход деталей». Массив точек — путь, заданный вручную; тогда пятым полем идёт "manual":

["esp:GND", "led1:C", "black", [{ "x": 280, "y": 300 }, { "x": 280, "y": 180 }], "manual"]

В точках перечисляются только повороты — концы провода известны и так. Ручной путь редактор не пересчитывает: он останется таким, каким его задали, даже если деталь сдвинуть.

Провод можно записать и объектом — так читается лучше, когда путь длинный:

{ "from": "esp:D4", "to": "buzzer1:1", "color": "blue", "path": [], "routing": "auto" }

Что происходит при ошибке

Разбор делит замечания надвое.

Ошибка означает, что применить нельзя, и схема остаётся прежней: сломанный JSON, деталь без id или без type, два одинаковых id, координата не числом, недопустимый угол поворота.

Предупреждение — «сделаем, но посмотрите»: неизвестный тип детали (нарисуется прямоугольником, но останется в схеме и в проекте), провод к выводу, которого у детали нет. Запрещать такое нельзя, иначе схему нельзя было бы собирать по частям — вставили деталь, потом провода.

Ошибка про несуществующий вывод заодно перечисляет те, что есть. Это самый быстрый способ узнать имена выводов незнакомой детали: напишите наугад и прочитайте ответ.

Чем это отличается от Wokwi

Формат похож, но не тот же, и файлы напрямую не переносятся:

  • координаты называются x и y и считаются от левого верхнего угла

корпуса, а не top/left;

  • типы деталей называются короче: lcd1602, а не wokwi-lcd1602;

плата — esp32-devkit-v1;

  • отдельного $serialMonitor среди деталей нет: монитор порта в ESPLab

привязан к UART0 всегда и в схеме не участвует;

  • dependencies нет: библиотеки проекта живут в своей вкладке, потому

что их ещё нужно установить на сервер сборки.

Перенести схему из Wokwi проще всего руками: деталей на учебной схеме единицы, а имена выводов у одинаковых модулей совпадают.