チュートリアル:アナログCO2センサー
最も短い完全なプログラマブルセンサー:400〜5000 ppmのスライダー、ピン上の電圧、そしてそれを読み取るArduino。最初から最後まで10分で完了し、今後すべてのアナログセンサーでコピーする形です。
構築するもの
Section titled “構築するもの” [ CO2センサーチップ ] [ Arduino Uno ] VCC o------------------------o 5V GND o------------------------o GND OUT o------------------------o A0
スライダー 400..5000 ppm -> OUT 0..5 V -> analogRead(A0)ステップ1:チップを作成する
Section titled “ステップ1:チップを作成する”エディタのファイルエクスプローラーからカスタムチップを追加します。ダイアログには組み込みテンプレートとStart from blankが表示されます。チュートリアルに沿って進めるには、空白のものを選択してください。どちらの場合も、マニフェスト(chip.json)とソース(chip.c)の2つのファイルが作成されます。
ステップ2:マニフェスト
Section titled “ステップ2:マニフェスト”3つのピン、1つの属性、1つのコントロール。コントロールのidと属性のnameは一致している必要があります。それがそれらを結び付けます。
{ "schema": "velxio-chip/v1", "name": "CO2 Sensor", "description": "Analog CO2 sensor with a live ppm slider. OUT maps 400-5000 ppm to 0-5 V.", "pins": ["VCC", "GND", "OUT"], "attributes": [ { "name": "ppm", "label": "CO2 (ppm)", "type": "int", "default": 1000, "min": 400, "max": 5000, "step": 10 } ], "controls": [ { "id": "ppm", "label": "CO2 (ppm)", "type": "range", "min": 400, "max": 5000, "step": 10, "unit": "ppm" } ]}ステップ3:ソース
Section titled “ステップ3:ソース”繰り返しタイマーがppmをボルトに変換してピンを駆動します。vx_attr_readがコールバック内にあることに注目してください。これにより、毎回のティックでスライダーの現在位置を確認できます。
#include "velxio-chip.h"
#define PPM_MIN 400.0#define PPM_MAX 5000.0#define VOLTS_MAX 5.0
typedef struct { vx_pin out; vx_attr ppm; vx_timer timer;} chip_state_t;
static chip_state_t S;
static void on_tick(void *user_data) { (void)user_data; double ppm = vx_attr_read(S.ppm); /* ライブスライダー値 */ if (ppm < PPM_MIN) ppm = PPM_MIN; if (ppm > PPM_MAX) ppm = PPM_MAX; double volts = (ppm - PPM_MIN) / (PPM_MAX - PPM_MIN) * VOLTS_MAX; vx_pin_dac_write(S.out, volts);}
void chip_setup(void) { S.out = vx_pin_register("OUT", VX_ANALOG); S.ppm = vx_attr_register("ppm", 1000); S.timer = vx_timer_create(on_tick, 0); vx_timer_start(S.timer, 50000000ULL, true); /* 50 ms、ナノ秒単位 */ on_tick(0); /* 初期レベルを駆動 */ vx_log("co2 sensor ready");}重要な3つの詳細:
- ピン上の
VX_ANALOG。デジタルピンは中間電圧を伝送できず、vx_pin_dac_writeを実行しても意図した動作になりません。 vx_timer_startはナノ秒を受け取ります。50000000ULLは50 msです。これは最初のチップで最も一般的なタイプミスです。- 戻る前の裸の
on_tick(0)。これがないと、最初のタイマーが発火するまでピンは0 Vのままで、高速なスケッチはそれを誤った400 ppmとして読み取ります。
Compileを押します。
ステップ4:配線する
Section titled “ステップ4:配線する”Arduino Unoの隣のキャンバスにチップをドロップし、VCCを5Vに、GNDをGNDに、OUTをA0に接続します。

ステップ5:スケッチ
Section titled “ステップ5:スケッチ”void setup() { Serial.begin(115200);}
void loop() { int raw = analogRead(A0); float volts = raw * (5.0f / 1023.0f); float ppm = 400.0f + volts / 5.0f * 4600.0f; Serial.print("raw="); Serial.print(raw); Serial.print(" ppm="); Serial.println(ppm, 0); delay(500);}ステップ6:実行してドラッグする
Section titled “ステップ6:実行してドラッグする”Runを押し、チップをクリックします。スライダーパネルが開きます:

ドラッグすると、シリアル出力が1つのdelay(500)以内で追従します:
![]()
これが全体のループです:スライダーが属性を書き込み、タイマーが毎秒20回それを読み取り、ピン電圧が変化し、analogReadがそれを確認します。
うまくいかない場合
Section titled “うまくいかない場合”| 表示される内容 | ほぼ確実な原因 |
|---|---|
| チップをクリックしても何も開かない | シミュレーションが停止している:パネルは実行中のみ開きます |
| スライダーは表示されるが読み取り値が動かない | vx_attr_readがchip_setup()内で呼び出されてキャッシュされ、on_tick内で呼び出されていない |
analogReadが0または1023のみを返す |
ピンがVX_ANALOGではなくデジタルモードとして登録されている |
| 値が一度更新されてフリーズする | vx_timer_startがrepeat falseで呼び出されたか、間隔がミリ秒で記述されたため次のティックが50000秒後になっている |
| シリアルが最初の瞬間に400 ppmを表示する | 初期のon_tick(0)呼び出しが欠落している |
- デジタルプロトコルの背後にある同じアイデア: I2C経由の温度と湿度。
controlsに入れられるすべてのフィールド: リファレンス。- 他のプロジェクト用に保存:My Chips。