Программируемые датчики
Программируемый датчик — это обычный пользовательский чип, показания которого вы управляете с помощью ползунка во время симуляции. Датчик CO2, чьи ppm вы изменяете для проверки порога срабатывания сигнализации. Температурный зонд, который вы поднимаете выше 85 °C, чтобы посмотреть, что делает прошивка. Датчик освещенности, который вы приглушаете вручную.
В самом чипе ничего не меняется: это тот же компонент WebAssembly, описанный в разделе Начало работы. Что добавляет эта страница, так это провод, который передает значение ползунка в уже работающий чип, без перекомпиляции или перезапуска чего-либо.
Контракт из трех частей
Заголовок раздела «Контракт из трех частей»Каждый программируемый датчик состоит из этих трех частей, и ничего больше.
1. Атрибут хранит настраиваемое значение.
S.ppm = vx_attr_register("ppm", 1000);2. Запись controls в chip.json помещает ползунок на экран. Она обращается к атрибуту по тому же идентификатору:
"controls": [ { "id": "ppm", "label": "CO2 (ppm)", "type": "range", "min": 400, "max": 5000, "step": 10, "unit": "ppm" }]3. Ваш код перечитывает атрибут каждый раз, когда ему нужно значение:
double ppm = vx_attr_read(S.ppm); /* текущее значение ползунка */Нажмите Run, щелкните по чипу, и откроется это:

Этот третий пункт — то, на чем люди спотыкаются. Прочитайте атрибут один раз в chip_setup() и сохраните его в переменную, и ползунок появится, будет двигаться, но абсолютно ничего не делать. vx_attr_read — дешевая операция; вызывайте ее внутри вашего таймерного колбэка, обработчика чтения I2C, везде, где значение действительно нужно.
Как значение достигает вашего чипа
Заголовок раздела «Как значение достигает вашего чипа»Это стоит понять, потому что два симуляционных движка используют разные пути, и режимы отказа различаются.
| Шаг | Что происходит |
|---|---|
| Вы перетаскиваете ползунок | Панель записывает в реестр обновлений датчиков, ключом является этот экземпляр чипа |
| Движок браузера (AVR, RP2040, ESP32 в браузере) | Значение записывается напрямую в карту атрибутов, которую работающий WebAssembly читает при каждом vx_attr_read. Никакой передачи сообщений, никакого перезапуска |
| ESP32 под QEMU | Чип находится в воркере, поэтому значение пересылается ему как обновление атрибута и применяется там |
| Каждые 250 мс простоя | Последние значения зеркалируются в сохраненные свойства компонента, поэтому позиция ползунка переживает сохранение и перезагрузку |
Два следствия, о которых стоит знать:
- Здесь нет шага «Применить». Следующий
vx_attr_readвернет новое значение. Если ваш чип читает атрибут только раз в секунду, именно столько времени потребуется ползунку, чтобы визуально что-то изменить. - Панель создается для каждого экземпляра. Две копии одного и того же чипа на одном холсте имеют независимые ползунки, потому что элементы управления синтезируются из манифеста каждого экземпляра.
Значения по умолчанию в режиме проектирования и живые значения
Заголовок раздела «Значения по умолчанию в режиме проектирования и живые значения»Это разные поверхности, и люди их путают:
- Остановлено: щелкните правой кнопкой мыши по чипу, чтобы открыть инспектор компонентов. То, что вы установите там, является сохраненным значением атрибута по умолчанию, с которым чип запускается.
- Работает: щелкните по чипу. Откроется панель с ползунком. То, что вы установите там, является живым значением и применяется немедленно.
Попробуйте сначала один
Заголовок раздела «Попробуйте сначала один»Каждый шаблон имеет рабочую схему в галерее. Нажмите Run, затем щелкните по чипу:
| Пример | Чему он учит |
|---|---|
| CO2 Sensor (live slider) | Аналоговый рецепт: ползунок к напряжению к analogRead |
| I2C Env Sensor (live sliders) | Два ползунка за картой регистров по адресу 0x44 |
| Motion Sensor (simulate button) | Элемент управления button: мгновенный триггер плюс ползунок удержания |
| Night Light (log lux slider) | scale: "log": пять декад люкс на одном ползунке, лампа срабатывает ниже 50 лк |
| SPI Thermometer (live slider) | Тайминги ведомого SPI: фиксация по спадающему фронту CS |
| UART Air Sensor (live slider) | Push-стиль последовательного датчика в SoftwareSerial |
Куда двигаться дальше
Заголовок раздела «Куда двигаться дальше»- Учебник: аналоговый датчик CO2
— самый короткий полный пример, от пустого чипа до отслеживания ползунка через
analogRead. - Учебник: температура и влажность по I2C — шаблон для любого датчика с цифровым протоколом, с двумя ползунками и картой регистров.
- Справочник по
controls— все поля, автоматические правила резервирования и что проверить, когда ползунок ничего не делает.