IoT センサーデータ収集

NagiScript で IoT センサーデータを収集するシステムを開発するチュートリアルです。

現行仕様(v0.2.0)

この例は現行仕様の構文(string 型、-> と明示 return、while true、extern "C" fn、enum + match)で書かれており、文法としては現行コンパイラー v0.2.0 で動作する形です。


概要

このチュートリアルでは、NagiScript で温度・湿度センサーデータを収集するシステムを作成します。


実装(単一ファイル)

main.ngs
// ハードウェア制御は C 関数を extern "C" fn で宣言
extern "C" fn adc_read(channel: i32) -> i32
extern "C" fn delay(ms: i32)

struct SensorData {
    temperature: f64
    humidity: f64
}

fn read_temperature(pin: i32) -> f64 {
    val raw = adc_read(pin)
    val voltage = (raw as f64) * 3.3 / 1023.0
    return (voltage - 0.5) * 100.0
}

fn read_humidity(pin: i32) -> f64 {
    val raw = adc_read(pin)
    val voltage = (raw as f64) * 3.3 / 1023.0
    return voltage * 100.0 / 3.3
}

struct SensorLog {
    entries: [SensorData; 1000]
    count: i32
}

fn main() {
    // サンプル値で動作確認(実際のハードウェアはロードマップ)
    val temp = read_temperature(0)
    val hum = read_humidity(1)

    println(temp)
    println(hum)
}
ロードマップ

実機の GPIO / ADC 操作や、std:time によるタイムスタンプ、std:http によるクラウド送信、std:fs によるファイル保存は、標準ライブラリが未実装のため現行では利用できません。上記の extern "C" fn による読み取りだけが現行の文法です。


実行例

bash
# ビルドと実行(サンプル値)
nagiscript build main.ngs -o iot
./iot

# 出力例
23.5
65.2

学べること

  1. ハードウェア操作: extern "C" fn での C 関数呼び出し
  2. 構造体: センサー値のまとめ
  3. 固定長配列: [SensorData; N] によるデータ保持
  4. ループ: while true による定期収集(将来)

トラブルシューティング

文法(現行)での確認

debug.ngs
extern "C" fn adc_read(channel: i32) -> i32

fn main() {
    val raw = adc_read(0)
    println(raw)
}

クラウド送信(ロードマップ)

ロードマップ

HTTP 送信は std:http(未実装)の API です。現行では利用できません。下記は将来仕様です。

debug.ngs
// ロードマップ: std:http は未実装
fn send_cloud(data: SensorData) {
    println("sending...")
}