TI-Nspire will receive range data from a Leo who has opened a serial port, and will show those data on its screen.
.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