TI-Nspire & Arduino / 温度・湿度・気圧計 4 of 4 / Graphs アプリケーションでグラフ化する
The Lua script below will use the var.store() function to store the received data in the Nspire's native applications.
.ino
#include <Adafruit_BME280.h> boolean gotInitData = false; unsigned long initTime; Adafruit_BME280 bme; void setup() { Serial.begin(115200); bme.begin(); } void loop() { while (Serial.read() == 't') { if (!gotInitData) { initTime = millis(); gotInitData = true; } float elapsedSeconds = (millis() - initTime) / 1000.0; Serial.print(elapsedSeconds) ; Serial.print(" "); Serial.print(bme.readTemperature()) ; Serial.print(" "); Serial.print(bme.readHumidity()) ; Serial.print(" "); Serial.print(bme.readPressure() / 100.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/19.875 end function on.construction() SECONDS, TEMPERATURE, HUMIDITY, PRESSURE = {}, {}, {}, {} PORT = nil DATA = "" gotInitialData = false INTERVAL = 1 --〔sec〕 end ------------------------------------------------------------------- -- シリアルデータの読み取り要求函数(合図として文字 "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() if DATA then local suteSeconds, suteTemperature, suteHumidity, sutePressure = unpack(string.split(DATA)) SECONDS[#SECONDS + 1] = tonumber(suteSeconds) TEMPERATURE[#TEMPERATURE + 1] = tonumber(suteTemperature) HUMIDITY[#HUMIDITY + 1] = tonumber(suteHumidity) PRESSURE[#PRESSURE + 1] = tonumber(sutePressure) var.store("seconds", SECONDS) var.store("temperature", TEMPERATURE) var.store("humidity", HUMIDITY) var.store("pressure", PRESSURE) end 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(DATA or "NO DATA", 0, 0) end