Перейти к содержимому

Программируемые датчики

Программируемый датчик — это обычный пользовательский чип, показания которого вы управляете с помощью ползунка во время симуляции. Датчик 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, щелкните по чипу, и откроется это:

Живая панель управления работающего чипа датчика CO2: один ползунок от 400 до 5000 ppm

Этот третий пункт — то, на чем люди спотыкаются. Прочитайте атрибут один раз в 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