跳转到内容

可编程传感器

可编程传感器是一种普通的自定义芯片,其读数由您在仿真运行期间通过滑块驱动。一个CO2传感器,您通过扫描其ppm值来测试报警阈值。一个温度探头,您将其推过85摄氏度以观察固件的反应。一个您手动调暗的光线传感器。

芯片本身没有任何变化:它是在入门指南中描述的同一个WebAssembly组件。本页新增的内容是将滑块值传入已运行芯片的线路,无需重新编译或重启任何内容。

每个可编程传感器都由以下三部分组成,仅此而已。

1. 一个属性 保存可调值。

S.ppm = vx_attr_register("ppm", 1000);

2. chip.json 中的 controls 条目 在屏幕上放置一个滑块。它通过相同的id来寻址该属性:

"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时读取该映射。无需消息传递,无需重启
QEMU下的ESP32 芯片位于工作线程中,因此该值作为属性更新转发给它并在那里应用
每250毫秒静默期 最后的值被镜像到组件的已保存属性中,因此滑块位置在保存和重新加载后得以保留

有两个值得了解的后果:

  • 没有“应用”步骤。 下一次vx_attr_read将返回新值。如果您的芯片每秒只读取一次属性,那么滑块需要那么长时间才能产生可见效果。
  • 面板是每个实例独立的。 画布上同一芯片的两个副本具有独立的滑块,因为控件是根据每个实例自身的清单合成的。

它们是不同的界面,人们常常混淆:

  • 停止状态:右键单击芯片以打开部件检查器。您在此处设置的是属性的已保存默认值,即芯片启动时的值。
  • 运行状态:单击芯片。滑块面板打开。您在此处设置的是实时值,立即生效。

每种模式在示例库中都有一个可运行的电路。按下 Run(运行),然后点击芯片:

示例 它教授的内容
CO2传感器(实时滑块) 模拟配方:滑块到电压再到analogRead
I2C环境传感器(实时滑块) 位于0x44寄存器映射后的两个滑块
运动传感器(模拟按钮) button控件:瞬时触发加保持滑块
夜灯(对数勒克斯滑块) scale: "log":一个滑块上跨越五个数量级的勒克斯值,低于50 lx时灯触发
SPI温度计(实时滑块) SPI从机时序:在CS下降沿锁存
UART空气传感器(实时滑块) 推式串行传感器接入SoftwareSerial