Формат схемы: 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. Только в файле. |
lock | true — деталь нельзя сдвинуть мышью. Только в файле. |
label | Подпись под деталью на схеме. Только в файле. |
attrs | Свойства детали: цвет светодиода, адрес на шине, показания датчика. |
Промежуточные углы поворота не поддерживаются. Провода прокладываются по прямоугольной сетке, и деталь, повёрнутая на 37°, ломала бы и прокладку, и попадание мышью по выводу — ради случая, которого на реальной схеме не бывает.
Свойства деталей
В attrs лежит то же, что показывает панель свойств выбранной детали, — под теми же ключами. Часто нужное:
| Деталь | Ключи |
|---|---|
led | color: red, green, blue, yellow, white |
rgb-led | common: cathode или anode |
resistor | value — сопротивление в омах |
photoresistor | lux — освещённость |
dht22 | temperature, humidity |
hc-sr04 | distance — расстояние в сантиметрах |
bme280 | address, temperature, humidity, pressure |
mpu6050 | address, pitch, roll, g, gyroX, gyroY, gyroZ |
ds3231 | address, temperature |
lcd1602, ssd1306 | address — адрес на шине I²C |
max7219 | kind: matrix или seg; count — модулей в цепочке |
st7735 | size: 128x160 или 128x128 |
neopixel-strip | pixels — число светодиодов |
hx711 | weight — вес на тензодатчике |
ir-receiver | code — код кнопки пульта, шестнадцатеричный |
Неизвестный ключ в 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 проще всего руками: деталей на учебной схеме единицы, а имена выводов у одинаковых модулей совпадают.