TI-Nspire & Arduino、超音波距離計 2、シリアルポートを使って TI-Nspire の画面に距離を表示する

TI-Nspire will receive range data from a Leo who has opened a serial port, and will show those data on its screen.
 
f:id:ti-nspire:20160903101717p:plain:h315
 
.ino

class Ultrasonic {
  public:
    Ultrasonic(int pin);
    void DistanceMeasure(void);
    float microsecondsToCentimeters(void);
  private:
    int _pin;
    float duration;
};
Ultrasonic::Ultrasonic(int pin) {
  _pin = pin;
}

void Ultrasonic::DistanceMeasure(void) {
  pinMode(_pin, OUTPUT);
  digitalWrite(_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(_pin, HIGH);
  delayMicroseconds(5);
  digitalWrite(_pin, LOW);
  pinMode(_pin, INPUT);
  duration = (float)pulseIn(_pin, HIGH);
}

float Ultrasonic::microsecondsToCentimeters(void) {
  return duration / 29.0 / 2.0;
}

Ultrasonic ultrasonic(7);

void setup() {
  Serial.begin(115200);
}

void loop() {
  while(Serial.available() && Serial.read() == 'T') {
    ultrasonic.DistanceMeasure();
    Serial.print(ultrasonic.microsecondsToCentimeters());
  }
}


.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
function map(var, inMin, inMax, outMin, outMax)
   return (var - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
end

local PORT
local DATA = 0

-----------------------------------
-- シリアルデータの読み取り要求函数
-----------------------------------
function requestData()
      PORT:write('T')
      PORT:read()
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)
   end 
end

----------------------------------------------------------------------------
-- 読み取りリスナーを定義する(データを取得し、またデータ読み取り要求を出す) 
----------------------------------------------------------------------------
function readListener(port)
   DATA = port:getValue() or 0  
   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(string.format("%6.1f", DATA), 0, 0)
   gc:fillRect(0, H/2, map(DATA, 0, 30, 0, W), 50)
end