TI-Nspire & Arduino アナログ入力を使う 2 of 2、一定の周期でデータを読み取る

参考:
ASI Connection Listener - ticalc.org
ASI Temperature - ticalc.org

温度センサー LM35DZ を使う。

Enter キーで ASI を起動し、ASI の準備が整ったらすぐに初回データを読み取って timer をスタートさせ、そのあとは一定周期でデータを読み取る。

接続は下のとおりきわめて単純である。
f:id:ti-nspire:20160725133152p:plain:w400



.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