読者です 読者をやめる 読者になる 読者になる

TI-Nspire & Arduino を利用した温度計 2、少しコードを削る。

エラーは出ない、不安定にもならない、という前提で前回のコードを極力削った。
f:id:ti-nspire:20160720074559p:plain:w500

.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
広告を非表示にする