TI-Nspire & Arduino アナログ入力を使う 2 of 2、一定の周期でデータを読み取る
参考:
ASI Connection Listener - ticalc.org
ASI Temperature - ticalc.org
温度センサー LM35DZ を使う。
Enter キーで ASI を起動し、ASI の準備が整ったらすぐに初回データを読み取って timer をスタートさせ、そのあとは一定周期でデータを読み取る。
接続は下のとおりきわめて単純である。
.ino
#define sensorPin 5 void setup() { Serial.begin(115200); } void loop() { if(Serial.available() > 0) { char c = Serial.read(); switch(c) { case 'T': Serial.print(analogRead(sensorPin)); break; default: Serial.print('0'); } } }
.lua
-- Enter キーで ASI を起動し、ASI の準備が整ったらすぐに初回データを読み取って timer をスタートさせ、そのあとは一定周期でデータを読み取る。 require "asi" require "color" platform.window:setBackgroundColor(color.dodgerblue) function on.resize() W, H = platform.window:width(), platform.window:height() fontSize = W/13.25 end function map(var, inMin, inMax, outMin, outMax) return (var - inMin) * (outMax - outMin) / (inMax - inMin) + outMin end PORT = nil DATA = 0 gotInitialData = false INTERVAL = 3 ------------------------------------------------------------------- -- シリアルデータの読み取り要求函数(合図として文字 "T" を送信する) ------------------------------------------------------------------- function requestData() if PORT then PORT:write('T') PORT:read() end end -------------------------------------------------------------------------------- -- ASI ステートリスナーを定義する(ASI の準備が整ったらポートスキャンを開始する) -------------------------------------------------------------------------------- function stateListener(state) if state == asi.ON then asi.startScanning(portScanner) end end ---------------------------------------------------------------- -- ポートスキャナーを定義する(見つかったポートに接続要求を出す) ---------------------------------------------------------------- function portScanner(port) port:connect(portConnector) end ----------------------------- -- ポートコネクターを定義する ----------------------------- function portConnector(port, event) PORT = port if event == asi.CONNECTED then asi.stopScanning() port:setReadListener(readListener) if not gotInitialData then gotInitialData = true requestData() timer.start(INTERVAL) end elseif event == asi.DISCONNECTED then DATA = 0 asi.startScanning(portScanner) platform.window:invalidate() end end ---------------------------------------------------------------------------- -- 読み取りリスナーを定義する ---------------------------------------------------------------------------- function readListener(port) DATA = port:getValue() or 0 platform.window:invalidate() end --------------------------------- -- ASI ステートリスナーを登録する --------------------------------- function on.enterKey() asi.addStateListener(stateListener) end ------------------------------------------------------------------------------- function on.timer() requestData() end function on.paint(gc) gc:setFont("sansserif", "r", fontSize) gc:setColorRGB(color.white) gc:drawString(string.format(" AD %d", DATA), 0, 0) local temperature = map(DATA, 0, 1023, 0, 500) gc:drawString(string.format(" %4.1f °C", temperature), 0, fontSize * 2) local bar = math.max(map(temperature, 20, 40, 0, W), 0) gc:fillRect(0, H/2, bar, H/5) end