IoT センサーデータ収集
NagiScript で IoT センサーデータを収集するシステムを開発するチュートリアルです。
現行仕様(v0.2.0)
この例は現行仕様の構文(string 型、-> と明示 return、while true、extern "C" fn、enum + match)で書かれており、文法としては現行コンパイラー v0.2.0 で動作する形です。
概要
このチュートリアルでは、NagiScript で温度・湿度センサーデータを収集するシステムを作成します。
- 温度・湿度センサーの読み取り(
extern "C" fn) - 構造体と固定長配列によるデータ保持
- データ送信(ネットワークはロードマップ)
実装(単一ファイル)
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
学べること
- ハードウェア操作:
extern "C" fnでの C 関数呼び出し - 構造体: センサー値のまとめ
- 固定長配列:
[SensorData; N]によるデータ保持 - ループ:
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...")
}
