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

TI-Nspire & Arduino / 温度・湿度・気圧計 4 of 4 / Graphs アプリケーションでグラフ化する

Nspired-Lua hands off the received data to the Nspire's native applications by using var.store().



.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


.tns
bme280_3.tns - Google ドライブ

広告を非表示にする