エラーは出ない、不安定にもならない、という前提で前回のコードを極力削った。
.ino
#include <OneWire.h> #include <DallasTemperature.h> const int ONE_WIRE_BUS = 10; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup() { Serial.begin(115200); sensors.begin(); } void loop() { if (Serial.read() == 'T') { sensors.requestTemperatures(); Serial.print(sensors.getTempCByIndex(0)); } }
.lua
-- Tiny thermometer using TI-Nspire and Leonardo require "asi" require "color" platform.window:setBackgroundColor(color.dodgerblue) function on.resize() W = platform.window:width() fontSize = W/13.25 end PORT = nil DATA = "--.--" -------------------------------------------------------------------------- -- シリアルデータの読み取り要求函数(合図として文字 "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 platform.window:invalidate() end ---------------------------------------------------------------- -- ポートスキャナーを定義する(見つかったポートに接続要求を出す) ---------------------------------------------------------------- function portScanner(port) port:connect(portConnector) end ----------------------------------------------------------------------------------------------------- -- ポートコネクターを定義する --(入出力の準備が整ったらポートスキャンを停止し、読み取りリスナーをセットし、データ読み取り要求を出す) --(接続が外れていたらポートスキャンを開始する) ----------------------------------------------------------------------------------------------------- function portConnector(port, event) PORT = port if event == asi.CONNECTED then asi.stopScanning() PORT:setReadListener(readListener) requestData() elseif event == asi.DISCONNECTED then DATA = "--.--" platform.window:invalidate() asi.startScanning(portScanner) end end ---------------------------------------------------------------------------------------- -- 読み取りリスナーを定義する(xx.xx 形式のデータを取得し、またデータ読み取り要求を出す) ---------------------------------------------------------------------------------------- function readListener(port) local data = port:getValue() if data then DATA = data else DATA = "--.--" end platform.window:invalidate() requestData() end --------------------------------- -- ASI ステートリスナーを登録する --------------------------------- function on.construction() timer.start(5) asi.addStateListener(stateListener) end ------------------------------------------------------------------------------- function on.timer() requestData() end function on.paint(gc) gc:setFont("sansserif", "r", fontSize) gc:setColorRGB(color.white) gc:drawString(" "..DATA.." °C", 0, 0) end