参考:
ASI Connection Listener - ticalc.org
ASI Temperature - ticalc.org
ポテンショメーターとして SoftPot を使う。とにかく矢継ぎ早にデータを読み取る。
画面の数字はアナログ入力電圧の AD 変換値(0 ~ 1023)。
.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
-- 矢継ぎ早にアナログデータを読み取る。 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 PORT = nil DATA = 0 ------------------------------------------------------------------- -- シリアルデータの読み取り要求函数(合図として文字 "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() requestData() port:setReadListener(readListener) elseif event == asi.DISCONNECTED then DATA = 0 asi.startScanning(portScanner) platform.window:invalidate() end end ---------------------------------------------------------------------------- -- 読み取りリスナーを定義する(データを取得し、またデータ読み取り要求を出す) ---------------------------------------------------------------------------- function readListener(port) local data = port:getValue() if data then DATA = data else DATA = 0 end platform.window:invalidate() requestData() end --------------------------------- -- ASI ステートリスナーを登録する --------------------------------- function on.construction() asi.addStateListener(stateListener) end ------------------------------------------------------------------------------- function on.paint(gc) gc:setFont("sansserif", "r", fontSize) gc:setColorRGB(color.white) gc:drawString(" "..DATA, 0, 0) gc:fillRect(0, H/2, W*(tonumber(DATA) or 0)/1023, H/5) end